{"version":3,"file":"app.js","mappings":"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CA,6BACA,oBACA,yBACA,gBACA,uBACA,yBACA,4BACA,0BACA,6BACA,6BACA,oBACA,eACA,yBACA,gBACA,mBACA,iBACA,oBACA,sBACA,2BACA,iBACA,2BACA,6BACA,0BACA,0BACA,0BACA,oCACA,gBACA,2BACA,0BACA,kBACA,qBACA,wBACA,mBACA,sBACA,qBACA,mBACA,sBACA,wBACA,mBACA,mBACA,sBACA,uBACA,8BACA,qBACA,sBACA,uBACA,yBACA,sBACA,8BACA,oBACA,oBACA,kBACA,kBACA,mBACA,sBACA,6BACA,uBACA,6BACA,wBACA,gBACA,0BACA,mBACA,yBACA,oBACA,8BACA,8BACA,iBACA,oBACA,uBACA,4BACA,4BACA,0BACA,6BACA,0BACA,oCACA,wBACA,2BACA,yBACA,6BACA,oCACA,uBACA,qBACA,sBACA,yBACA,4BACA,oBACA,uBACA,2BACA,6BACA,wBACA,2BACA,oBACA,qBACA,wBACA,0BACA,+BACA,oBACA,8BACA,oBACA,+BACA,2BACA,iBACA,2BACA,gBACA,mBACA,cACA,iBACA,uBACA,0BACA,oBACA,+BACA,sBACA,2BACA,wBACA,yBACA,sBACA,wBACA,yBACA,0BACA,qBACA,yBACA,yBACA,8BACA,mBACA,uBACA,wBACA,qBACA,+BACA,mBACA,oBACA,cACA,oBACA,yBACA,oBACA,uBACA,qBACA,uBACA,cACA,oBACA,2BACA,sBACA,mBACA,sBACA,oBACA,uBACA,kBACA,sBACA,6BACA,6BACA,wCACA,uBACA,0BACA,wBACA,0BACA,2BACA,4BACA,yBACA,2BACA,4BACA,0BACA,qBACA,wBACA,8BACA,0BACA,2BACA,kCACA,2BACA,4BACA,gCACA,iCACA,8BACA,kCACA,iBACA,kBACA,4BACA,0BACA,qBACA,sBACA,yBACA,gCACA,sBACA,qCACA,aACA,gBACA,cACA,iBACA,wBACA,cACA,gBACA,iBACA,oBACA,kBACA,wBACA,mBACA,0BACA,6BACA,kCACA,2BACA,uBACA,6BACA,+BACA,6BACA,uCACA,0CACA,0CACA,6BACA,gCACA,qCACA,wBACA,mBACA,mBACA,uBACA,qBACA,wBACA,qBACA,kBACA,kBACA,qBACA,wBACA,sBACA,wBACA,gBACA,mBACA,iBACA,wBACA,cACA,gBACA,4BACA,+BACA,0BACA,6BACA,oCACA,oBACA,6BACA,oCACA,8CACA,wBACA,cACA,iBACA,oBACA,kBACA,wBACA,2BACA,4BACA,2BACA,8BACA,+BACA,iCACA,uBACA,+BACA,sBACA,oBACA,0BACA,mBACA,uBACA,0BACA,wBACA,6BACA,wBACA,2BACA,yBACA,4BACA,wBACA,kBACA,qBACA,mBACA,sBACA,WACA,iBACA,eACA,wBACA,oBACA,qBACA,kBACA,yBACA,uBACA,wBACA,2BACA,wBACA,2BACA,iCACA,wBACA,qBACA,yBACA,yBACA,qBACA,qBACA,+BACA,2BACA,4BACA,sBACA,4BACA,2BACA,yBACA,wBACA,uBACA,2BACA,sBACA,wBACA,6BACA,8BACA,sBACA,yBACA,mBACA,uBACA,8BACA,iCACA,kBACA,wBACA,mCACA,2BACA,mCACA,0BACA,wBACA,4BACA,qBACA,6BAGIivN,EAAuB,IAAIjvN,IAAI,CACnC,qBACA,uBACA,yBACA,0BACA,2BACA,gCACA,yBACA,yBACA,0BACA,6BACA,2BACA,sBACA,kBACA,qBACA,mBACA,sBACA,wBACA,mBACA,8BACA,4BACA,4BACA,6BACA,2BACA,6BACA,mBACA,sBACA,oBACA,uBACA,8BACA,oBACA,iBACA,oBACA,kBACA,qBACA,kBACA,4BACA,2BACA,mBACA,oBACA,+BACA,uBACA,oBACA,sBACA,yBACA,kBACA,qBACA,wBACA,mBACA,6BACA,sCACA,4CACA,sBACA,mBACA,iBACA,oBACA,2BACA,kBACA,6BACA,oBACA,yBACA,gBACA,uBACA,yBACA,4BACA,0BACA,6BACA,6BACA,oBACA,eACA,yBACA,gBACA,mBACA,iBACA,oBACA,sBACA,2BACA,iBACA,2BACA,6BACA,0BACA,0BACA,0BACA,oCACA,gBACA,2BACA,0BACA,kBACA,qBACA,wBACA,mBACA,sBACA,qBACA,mBACA,sBACA,wBACA,mBACA,mBACA,sBACA,uBACA,8BACA,qBACA,sBACA,uBACA,yBACA,sBACA,8BACA,oBACA,oBACA,kBACA,kBACA,mBACA,sBACA,6BACA,uBACA,6BACA,wBACA,gBACA,0BACA,mBACA,yBACA,oBACA,8BACA,8BACA,iBACA,oBACA,uBACA,4BACA,4BACA,0BACA,6BACA,0BACA,oCACA,wBACA,2BACA,yBACA,6BACA,oCACA,uBACA,qBACA,sBACA,yBACA,4BACA,oBACA,uBACA,2BACA,6BACA,wBACA,2BACA,oBACA,qBACA,wBACA,0BACA,+BACA,oBACA,8BACA,oBACA,+BACA,2BACA,iBACA,2BACA,gBACA,mBACA,cACA,iBACA,uBACA,0BACA,oBACA,+BACA,sBACA,2BACA,wBACA,yBACA,sBACA,wBACA,yBACA,0BACA,qBACA,yBACA,yBACA,8BACA,mBACA,uBACA,wBACA,qBACA,+BACA,mBACA,oBACA,cACA,oBACA,yBACA,oBACA,uBACA,qBACA,uBACA,cACA,oBACA,2BACA,sBACA,mBACA,sBACA,oBACA,uBACA,kBACA,sBACA,6BACA,6BACA,wCACA,uBACA,0BACA,wBACA,0BACA,2BACA,4BACA,yBACA,2BACA,4BACA,0BACA,qBACA,wBACA,8BACA,0BACA,2BACA,kCACA,2BACA,4BACA,gCACA,iCACA,8BACA,kCACA,iBACA,kBACA,4BACA,0BACA,qBACA,sBACA,yBACA,gCACA,sBACA,qCACA,aACA,gBACA,cACA,iBACA,wBACA,cACA,gBACA,iBACA,oBACA,kBACA,wBACA,mBACA,0BACA,6BACA,kCACA,2BACA,uBACA,6BACA,+BACA,6BACA,uCACA,0CACA,0CACA,6BACA,gCACA,qCACA,wBACA,mBACA,mBACA,uBACA,qBACA,wBACA,qBACA,kBACA,kBACA,qBACA,wBACA,sBACA,wBACA,gBACA,mBACA,iBACA,wBACA,cACA,gBACA,4BACA,+BACA,0BACA,6BACA,oCACA,oBACA,6BACA,oCACA,8CACA,wBACA,cACA,iBACA,oBACA,kBACA,wBACA,2BACA,4BACA,2BACA,8BACA,+BACA,iCACA,uBACA,+BACA,sBACA,oBACA,0BACA,mBACA,uBACA,0BACA,wBACA,6BACA,wBACA,2BACA,yBACA,4BACA,wBACA,kBACA,qBACA,mBACA,sBACA,WACA,iBACA,eACA,wBACA,oBACA,qBACA,kBACA,yBACA,uBACA,wBACA,2BACA,wBACA,2BACA,iCACA,wBACA,qBACA,yBACA,yBACA,qBACA,qBACA,+BACA,2BACA,4BACA,sBACA,4BACA,2BACA,yBACA,wBACA,uBACA,2BACA,sBACA,wBACA,6BACA,8BACA,sBACA,yBACA,mBACA,uBACA,8BACA,iCACA,kBACA,wBACA,mCACA,2BACA,mCACA,0BACA,wBACA,4BACA,qBACA,6BAGK,SAAS+uN,EAAsBnvP,GACpC,IAAMqzB,EAAYrzB,EAAKqzB,WAAa,aACpC,MAAO,GAAGrzB,EAAKlE,GAAGs4B,kBAAkBf,GAAa,cAAce,eACjE,CAEO,SAAS4D,EAA0Bh4B,EAAqBwkB,GAC7D,MAAgB,UAATA,EACH4qO,EAAqBpyN,IAAImyN,EAAsBnvP,IAC/CqvP,EAAqBryN,IAAImyN,EAAsBnvP,GACrD,CAEO,SAAS+8E,EACd/8E,EACAwkB,EACA8qO,EACA71O,GAEA,IAAM8lE,EAAiB9lE,GAAUuV,YAAYhvB,EAAKlE,IAC5CyzP,EACK,UAAT/qO,EAAmB+6D,GAAgBE,cAAiBF,GAAgBG,eAAiBH,GAAgBE,cACvG,OAAO6vK,KAAiBC,GAAU1zO,WAAW,OAAQ0zO,GAAUr5P,SAAS,oBAAsBq5P,CAChG,C,kGC5uBO,SACLC,EACAx6B,GAEA,MAAO,CAAEw6B,qBAAoBtB,WAAYsB,EAAoBx6B,WAAUg6B,YAAa,CAAC,EACvF,E,sCAKO,SACL3uI,EACA9+G,GAEA,IAAMma,GAAQ,EAAA+zO,EAAAA,2BAA0BluP,EAAM8+G,EAAM20G,UAC9Cg6B,EAAc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,cAAG,CAC3B,UACA,cACA,iBACA,gBACA,YACA,cACA,WACA,aACA,sBACA,qBACA,oBACA,cACA,YACA,gBACA,UACA,WACA,sBACA,SACA,iBACA,cACA,gBACA,mBACA,aACA,sBACA,4BACA,WACA,WACA,aACA,SACA,QACA,eACA,oBACA,kBACA,SACA,UACA,WACA,mBACA,oBACA,gBACA,kBACA,oBACA,WACA,gBACA,eACA,aACA,aACA,cACA,mBACA,gBACA,cACA,cACA,YACA,aACA,kBACA,YACA,aACA,kBACA,gBACA,UACA,cACA,cACA,YACA,oBACA,kBACA,oBACA,cACA,aACA,cACA,uBACA,gBACA,iBACA,WACA,YACA,cACA,kBACA,yBACA,gBACA,YACA,mBACA,gBACA,cACA,iBACA,eACA,eACA,WACA,QACA,eACA,kBACA,WACA,gBACA,gBACA,gBACA,UACA,aACA,cACA,QACA,aACA,cACA,eACA,aACA,SACA,WACA,YACA,SACA,gBACA,cACA,aACA,+BACA,wBACA,mBACA,eACA,eACA,mBACA,SACA,eACA,kBACA,gBACA,iBACA,sBACA,yBACA,YACA,oBACA,gBACA,QACA,WACA,aACA,kBACA,gBACA,YACA,kBACA,oBACA,4BACA,+BACA,+BACA,qBACA,QACA,eACA,SACA,aACA,aACA,YACA,QACA,WACA,oBACA,SACA,mBACA,sBACA,eACA,uBACA,WACA,UACA,WACA,YACA,gBACA,kBACA,aACA,mBACA,kBACA,aACA,MACA,aACA,YACA,cACA,gBAE2BA,EAAAA,iBAAG,CAC9B,kBACA,kBACA,kBACA,iBACA,aACA,kBACA,mBACA,kBACA,oBACA,iBACA,gBACA,kBACA,iBACA,aACA,YACA,gBACA,mBACA,mBACA,WACA,aACA,mCACA,gCACA,aACA,mBACA,YACA,oBACA,SACA,WACA,sBACA,uBACA,cACA,cACA,oBACA,yBACA,0BACA,yBACA,kBACA,kBACA,kBAGWypV,EAA4BzpV,EAAAA,mBAAG,CAC1C,OACA,SACA,QACA,WACA,OACA,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","sources":["webpack:///webpack/runtime/chunk loaded","webpack:///webpack/runtime/load script","webpack:///./lambda/utils/mobile.ts","webpack:///./src/api/service.ts","webpack:///./src/components/account.tsx","webpack:///./src/components/actionMenu.tsx","webpack:///./src/components/activeGraphContext.ts","webpack:///./src/components/app.tsx","webpack:///./src/components/appContext.tsx","webpack:///./src/components/bottomSheet.tsx","webpack:///./src/components/bottomSheetCustomExercise.tsx","webpack:///./src/components/bottomSheetEditProgramV2.tsx","webpack:///./src/components/bottomSheetEditTarget.tsx","webpack:///./src/components/bottomSheetItem.tsx","webpack:///./src/components/bottomSheetMonthCalendar.tsx","webpack:///./src/components/bottomSheetMuscleGroupMusclePicker.tsx","webpack:///./src/components/bottomSheetMusclesOverride.tsx","webpack:///./src/components/bottomSheetNextWorkout.tsx","webpack:///./src/components/bottomSheetOrModal.tsx","webpack:///./src/components/bottomSheetWorkoutSuperset.tsx","webpack:///./src/components/builtinProgramsList.tsx","webpack:///./src/components/button.tsx","webpack:///./src/components/chooseProgram.tsx","webpack:///./src/components/confetti.tsx","webpack:///./src/components/contentGrowingTextarea.tsx","webpack:///./src/components/customProgramsList.tsx","webpack:///./src/components/datePicker.tsx","webpack:///./src/components/draggableList2.tsx","webpack:///./src/components/dropdownMenu.tsx","webpack:///./src/components/editDetailsForm.tsx","webpack:///./src/components/editProgram/editProgram.tsx","webpack:///./src/components/editProgram/editProgramCustomErrorCta.tsx","webpack:///./src/components/editProgram/editProgramDaysList.tsx","webpack:///./src/components/editProgram/editProgramGrid/editProgramGrid.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridActionDock.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridAddButton.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridAppNavigation.ts","webpack:///./src/components/editProgram/editProgramGrid/gridBadge.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridCell.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridDragAutoScroll.ts","webpack:///./src/components/editProgram/editProgramGrid/gridDragGhost.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridDragHandle.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridLaneRow.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridPinch.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridResizeHandle.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridReusePill.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridRow.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridSelectionContext.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridSelectionSummary.ts","webpack:///./src/components/editProgram/editProgramGrid/gridStickyHeader.tsx","webpack:///./src/components/editProgram/editProgramGrid/gridWeekHeaderRow.tsx","webpack:///./src/components/editProgram/editProgramGrid/useAppGridHost.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridActions.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridDayDrag.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridDragSession.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridDrags.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridEditDetails.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridLaneDrag.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridReuseLocator.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridSelectionState.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridStickyHeader.ts","webpack:///./src/components/editProgram/editProgramGrid/useGridWeekDrag.ts","webpack:///./src/components/editProgram/editProgramSets.tsx","webpack:///./src/components/editProgram/editProgramUi/editProgramUiHelpers.ts","webpack:///./src/components/editProgram/editProgramUiDay.tsx","webpack:///./src/components/editProgram/editProgramUiExercise.tsx","webpack:///./src/components/editProgram/editProgramUiExerciseDescriptions.tsx","webpack:///./src/components/editProgram/editProgramUiExerciseSetVariations.tsx","webpack:///./src/components/editProgram/editProgramUiProgress.tsx","webpack:///./src/components/editProgram/editProgramUiUpdate.tsx","webpack:///./src/components/editProgram/editProgramUiWeek.tsx","webpack:///./src/components/editProgram/editProgramUtils.ts","webpack:///./src/components/editProgram/editProgramV2Full.tsx","webpack:///./src/components/editProgram/editProgramV2TextExercises.tsx","webpack:///./src/components/editProgram/screenProgram.tsx","webpack:///./src/components/editProgramExercise/editProgramExerciseAcrossAllWeeks.tsx","webpack:///./src/components/editProgramExercise/progressions/modalCreateStateVariable.tsx","webpack:///./src/components/equipmentSettings.tsx","webpack:///./src/components/exerciseAllTimePRs.tsx","webpack:///./src/components/exerciseDataSettings.tsx","webpack:///./src/components/exerciseHistory.tsx","webpack:///./src/components/exerciseImage.tsx","webpack:///./src/components/exercisePicker/bottomSheetExerciseCloneLibrary.tsx","webpack:///./src/components/exercisePicker/bottomSheetExerciseImageLibrary.tsx","webpack:///./src/components/exercisePicker/bottomSheetExercisePicker.tsx","webpack:///./src/components/exercisePicker/exercisePickerCurrentExercise.tsx","webpack:///./src/components/exercisePicker/exercisePickerCustomExercise.tsx","webpack:///./src/components/exercisePicker/exercisePickerCustomExerciseContent.tsx","webpack:///./src/components/exercisePicker/exercisePickerExerciseItem.tsx","webpack:///./src/components/exercisePicker/exercisePickerFilter.tsx","webpack:///./src/components/exercisePicker/exercisePickerMain.tsx","webpack:///./src/components/exercisePicker/exercisePickerOptions.tsx","webpack:///./src/components/exercisePicker/exercisePickerOptionsMuscles.tsx","webpack:///./src/components/exercisePicker/exercisePickerSettings.tsx","webpack:///./src/components/exercisePicker/exercisePickerTemplate.tsx","webpack:///./src/components/exercisePicker/exercisePickerUtils.ts","webpack:///./src/components/exerciseRm.tsx","webpack:///./src/components/exerciseTooltip.tsx","webpack:///./src/components/exercisesList.tsx","webpack:///./src/components/fadeScrollView.tsx","webpack:///./src/components/fallbackScreen.tsx","webpack:///./src/components/food/barcodeScanner.tsx","webpack:///./src/components/food/foodFields.tsx","webpack:///./src/components/food/foodLabelFields.tsx","webpack:///./src/components/food/foodPicker.tsx","webpack:///./src/components/food/servingPicker.tsx","webpack:///./src/components/footer2.tsx","webpack:///./src/components/footerButton.tsx","webpack:///./src/components/graphExercise.tsx","webpack:///./src/components/graphLegendOverlay.tsx","webpack:///./src/components/graphMuscleGroup.tsx","webpack:///./src/components/graphNutrition.tsx","webpack:///./src/components/graphStats.tsx","webpack:///./src/components/groupHeader.tsx","webpack:///./src/components/hearAboutUs/hearAboutUsConfig.ts","webpack:///./src/components/hearAboutUs/hearAboutUsSurvey.tsx","webpack:///./src/components/help/helpAccount.tsx","webpack:///./src/components/help/helpChooseProgram.tsx","webpack:///./src/components/help/helpChooseProgramFirstTime.tsx","webpack:///./src/components/help/helpEditProgramDaysList.tsx","webpack:///./src/components/help/helpEditProgramV2.tsx","webpack:///./src/components/help/helpExerciseStats.tsx","webpack:///./src/components/help/helpExercises.tsx","webpack:///./src/components/help/helpGraphs.tsx","webpack:///./src/components/help/helpMeasurements.tsx","webpack:///./src/components/help/helpMuscles.tsx","webpack:///./src/components/help/helpMusclesDay.tsx","webpack:///./src/components/help/helpPlates.tsx","webpack:///./src/components/help/helpRegistry.ts","webpack:///./src/components/help/helpSettings.tsx","webpack:///./src/components/help/helpStats.tsx","webpack:///./src/components/help/helpTimers.tsx","webpack:///./src/components/help/helpWorkout.tsx","webpack:///./src/components/historyEntry.tsx","webpack:///./src/components/historyRecord.tsx","webpack:///./src/components/historyRecordSets.tsx","webpack:///./src/components/historyRecordsNullState.tsx","webpack:///./src/components/icons/iconAi.tsx","webpack:///./src/components/icons/iconApple.tsx","webpack:///./src/components/icons/iconArrowDown2.tsx","webpack:///./src/components/icons/iconArrowDown3.tsx","webpack:///./src/components/icons/iconArrowRight.tsx","webpack:///./src/components/icons/iconArrowUp.tsx","webpack:///./src/components/icons/iconBack.tsx","webpack:///./src/components/icons/iconBackspace.tsx","webpack:///./src/components/icons/iconBarbell.tsx","webpack:///./src/components/icons/iconBarbell2.tsx","webpack:///./src/components/icons/iconBarbellPlates.tsx","webpack:///./src/components/icons/iconBarbellSide.tsx","webpack:///./src/components/icons/iconBell.tsx","webpack:///./src/components/icons/iconCalculator.tsx","webpack:///./src/components/icons/iconCalendarSmall.tsx","webpack:///./src/components/icons/iconCamera.tsx","webpack:///./src/components/icons/iconCheckCircle.tsx","webpack:///./src/components/icons/iconClose.tsx","webpack:///./src/components/icons/iconClose2.tsx","webpack:///./src/components/icons/iconCloseCircle.tsx","webpack:///./src/components/icons/iconCloseCircleOutline.tsx","webpack:///./src/components/icons/iconCog2.tsx","webpack:///./src/components/icons/iconCrown.tsx","webpack:///./src/components/icons/iconDayTextMode.tsx","webpack:///./src/components/icons/iconDefaultExercise.tsx","webpack:///./src/components/icons/iconDinoSunglasses.tsx","webpack:///./src/components/icons/iconDiscord.tsx","webpack:///./src/components/icons/iconDoc.tsx","webpack:///./src/components/icons/iconDoc2.tsx","webpack:///./src/components/icons/iconDumbbell.tsx","webpack:///./src/components/icons/iconDuplicate2.tsx","webpack:///./src/components/icons/iconEdit2.tsx","webpack:///./src/components/icons/iconEditSquare.tsx","webpack:///./src/components/icons/iconEditor.tsx","webpack:///./src/components/icons/iconEquipmentBarbell.tsx","webpack:///./src/components/icons/iconEquipmentCable.tsx","webpack:///./src/components/icons/iconEquipmentDumbbell.tsx","webpack:///./src/components/icons/iconEquipmentEzBar.tsx","webpack:///./src/components/icons/iconEquipmentKettlebell.tsx","webpack:///./src/components/icons/iconEquipmentLeverageMachine.tsx","webpack:///./src/components/icons/iconEquipmentSmith.tsx","webpack:///./src/components/icons/iconEquipmentTrapbar.tsx","webpack:///./src/components/icons/iconExternalLink.tsx","webpack:///./src/components/icons/iconEyeClosed.tsx","webpack:///./src/components/icons/iconFilter.tsx","webpack:///./src/components/icons/iconFilter2.tsx","webpack:///./src/components/icons/iconFire.tsx","webpack:///./src/components/icons/iconFood.tsx","webpack:///./src/components/icons/iconFullTextMode.tsx","webpack:///./src/components/icons/iconGoogle.tsx","webpack:///./src/components/icons/iconGooglePlay.tsx","webpack:///./src/components/icons/iconGraphs.tsx","webpack:///./src/components/icons/iconGraphsE.tsx","webpack:///./src/components/icons/iconHandle.tsx","webpack:///./src/components/icons/iconHeart.tsx","webpack:///./src/components/icons/iconHelp.tsx","webpack:///./src/components/icons/iconHome.tsx","webpack:///./src/components/icons/iconInstagram.tsx","webpack:///./src/components/icons/iconKebab.tsx","webpack:///./src/components/icons/iconKettlebell.tsx","webpack:///./src/components/icons/iconKettlebellSmall.tsx","webpack:///./src/components/icons/iconKeyboardClose.tsx","webpack:///./src/components/icons/iconLink.tsx","webpack:///./src/components/icons/iconMagnifyingGlass.tsx","webpack:///./src/components/icons/iconMe.tsx","webpack:///./src/components/icons/iconMuscleSettings.tsx","webpack:///./src/components/icons/iconMuscles2.tsx","webpack:///./src/components/icons/iconMusclesD.tsx","webpack:///./src/components/icons/iconMusclesW.tsx","webpack:///./src/components/icons/iconNotebook.tsx","webpack:///./src/components/icons/iconPause.tsx","webpack:///./src/components/icons/iconPicture.tsx","webpack:///./src/components/icons/iconPlay.tsx","webpack:///./src/components/icons/iconPlayCircle.tsx","webpack:///./src/components/icons/iconPlus2.tsx","webpack:///./src/components/icons/iconPreview.tsx","webpack:///./src/components/icons/iconReddit.tsx","webpack:///./src/components/icons/iconReorder.tsx","webpack:///./src/components/icons/iconSpeaker.tsx","webpack:///./src/components/icons/iconSpinner.tsx","webpack:///./src/components/icons/iconStar.tsx","webpack:///./src/components/icons/iconSvg.tsx","webpack:///./src/components/icons/iconSwap.tsx","webpack:///./src/components/icons/iconSwapSmall.tsx","webpack:///./src/components/icons/iconTiktok.tsx","webpack:///./src/components/icons/iconTimerSmall.tsx","webpack:///./src/components/icons/iconTracker.tsx","webpack:///./src/components/icons/iconTrash.tsx","webpack:///./src/components/icons/iconUiMode.tsx","webpack:///./src/components/icons/iconUndo.tsx","webpack:///./src/components/icons/iconUser.tsx","webpack:///./src/components/icons/iconWatch.tsx","webpack:///./src/components/icons/iconWorkoutProgress.tsx","webpack:///./src/components/icons/iconYoutube.tsx","webpack:///./src/components/importer.tsx","webpack:///./src/components/importerLiftosaurCsv.tsx","webpack:///./src/components/importerProgram.tsx","webpack:///./src/components/importerStorage.tsx","webpack:///./src/components/input.tsx","webpack:///./src/components/inputNumber.tsx","webpack:///./src/components/inputNumber2.tsx","webpack:///./src/components/inputSelect.tsx","webpack:///./src/components/inputWeight.tsx","webpack:///./src/components/inputWeight2.tsx","webpack:///./src/components/inputWeightUnit.tsx","webpack:///./src/components/liftoEditorChrome.tsx","webpack:///./src/components/liftoEditorDock.tsx","webpack:///./src/components/liftoEditorFocus.tsx","webpack:///./src/components/liftoEditorReuse.ts","webpack:///./src/components/liftoEditorStateVarsSheet.tsx","webpack:///./src/components/lineChart.tsx","webpack:///./src/components/lineChartGestures.tsx","webpack:///./src/components/link.tsx","webpack:///./src/components/linkButton.tsx","webpack:///./src/components/locker.tsx","webpack:///./src/components/markdown.tsx","webpack:///./src/components/markdownEditor.tsx","webpack:///./src/components/markdownEditorBorderless.tsx","webpack:///./src/components/menuItem.tsx","webpack:///./src/components/menuItemEditable.tsx","webpack:///./src/components/migrationBanner.tsx","webpack:///./src/components/modal.tsx","webpack:///./src/components/modalAffiliate.tsx","webpack:///./src/components/modalAmrap.tsx","webpack:///./src/components/modalChangeNextDay.tsx","webpack:///./src/components/modalCoupon.tsx","webpack:///./src/components/modalCreateProgram.tsx","webpack:///./src/components/modalDate.tsx","webpack:///./src/components/modalDayFromAdhoc.tsx","webpack:///./src/components/modalEquipment.tsx","webpack:///./src/components/modalGraphs.tsx","webpack:///./src/components/modalImportFromLink.tsx","webpack:///./src/components/modalImportFromOtherApps.tsx","webpack:///./src/components/modalNewEquipment.tsx","webpack:///./src/components/modalNewFixedWeight.tsx","webpack:///./src/components/modalNewGym.tsx","webpack:///./src/components/modalPlates.tsx","webpack:///./src/components/modalProgramInfo.tsx","webpack:///./src/components/modalProgramNextDay.tsx","webpack:///./src/components/modalStats.tsx","webpack:///./src/components/monthCalendar.tsx","webpack:///./src/components/multiselect.tsx","webpack:///./src/components/muscleGroupImage.tsx","webpack:///./src/components/muscleGroupsContent.tsx","webpack:///./src/components/muscleImage.tsx","webpack:///./src/components/muscles/images/backMusclesSvg.tsx","webpack:///./src/components/muscles/images/frontMusclesSvg.tsx","webpack:///./src/components/muscles/musclesView.tsx","webpack:///./src/components/muscles/screenMuscles.tsx","webpack:///./src/components/muscles/screenMusclesDay.tsx","webpack:///./src/components/muscles/screenMusclesProgram.tsx","webpack:///./src/components/nativeCustomKeyboard.native.tsx","webpack:///./src/components/navbar.tsx","webpack:///./src/components/nextDayPicker.tsx","webpack:///./src/components/notification.tsx","webpack:///./src/components/nux.tsx","webpack:///./src/components/personalRecords.tsx","webpack:///./src/components/platesBar.tsx","webpack:///./src/components/preview/programPreviewPlayground.tsx","webpack:///./src/components/preview/programPreviewPlaygroundDay.tsx","webpack:///./src/components/preview/programPreviewPlaygroundExercise.tsx","webpack:///./src/components/preview/programPreviewPlaygroundExerciseEditModal.tsx","webpack:///./src/components/preview/programPreviewPlaygroundInner.tsx","webpack:///./src/components/preview/programPreviewTab.tsx","webpack:///./src/components/preview/programPreviewTabDay.tsx","webpack:///./src/components/preview/programPreviewTabExercise.tsx","webpack:///./src/components/preview/programPreviewWeeks.ts","webpack:///./src/components/preview/webWorkoutModals.tsx","webpack:///./src/components/primitives/fastText.tsx","webpack:///./src/components/primitives/liftoEditorActions.ts","webpack:///./src/components/primitives/liftoEditorBrain.ts","webpack:///./src/components/primitives/liftoEditorHints.ts","webpack:///./src/components/primitives/liftoEditorStateVars.ts","webpack:///./src/components/primitives/pressable.tsx","webpack:///./src/components/primitives/select.tsx","webpack:///./src/components/primitives/slider.tsx","webpack:///./src/components/primitives/svg.tsx","webpack:///./src/components/primitives/switch.tsx","webpack:///./src/components/primitives/text.tsx","webpack:///./src/components/primitives/textInput.tsx","webpack:///./src/components/programHistory.tsx","webpack:///./src/components/programPreview.tsx","webpack:///./src/components/programPreviewOrPlayground.tsx","webpack:///./src/components/programQrCode.tsx","webpack:///./src/components/programShareOutput.tsx","webpack:///./src/components/progressStateChanges.tsx","webpack:///./src/components/repMaxCalculator.tsx","webpack:///./src/components/restTimer.tsx","webpack:///./src/components/restTimerAlertRow.tsx","webpack:///./src/components/screen1RM.tsx","webpack:///./src/components/screenAccount.tsx","webpack:///./src/components/screenApiKeys.tsx","webpack:///./src/components/screenAppleHealthSettings.tsx","webpack:///./src/components/screenEditProgram.tsx","webpack:///./src/components/screenEquipment.tsx","webpack:///./src/components/screenErrorBoundary.tsx","webpack:///./src/components/screenExerciseStats.tsx","webpack:///./src/components/screenExercises.tsx","webpack:///./src/components/screenFinishDay.tsx","webpack:///./src/components/screenFirst.tsx","webpack:///./src/components/screenFood.tsx","webpack:///./src/components/screenFoodAdd.tsx","webpack:///./src/components/screenFoodGoals.tsx","webpack:///./src/components/screenFoodItem.tsx","webpack:///./src/components/screenFoodLibrary.tsx","webpack:///./src/components/screenFoodTemplates.tsx","webpack:///./src/components/screenGoogleHealthSettings.tsx","webpack:///./src/components/screenGraphs.tsx","webpack:///./src/components/screenGyms.tsx","webpack:///./src/components/screenHearAboutUs.tsx","webpack:///./src/components/screenImportPreview.tsx","webpack:///./src/components/screenMeasurements.tsx","webpack:///./src/components/screenMuscleGroups.tsx","webpack:///./src/components/screenProgramPreview.tsx","webpack:///./src/components/screenProgramSelect.tsx","webpack:///./src/components/screenRecentImports.tsx","webpack:///./src/components/screenSettings.tsx","webpack:///./src/components/screenSetupEquipment.tsx","webpack:///./src/components/screenSleepNutrition.tsx","webpack:///./src/components/screenStats.tsx","webpack:///./src/components/screenSubscription.tsx","webpack:///./src/components/screenTimers.tsx","webpack:///./src/components/screenUnitSelector.tsx","webpack:///./src/components/screenWorkout.tsx","webpack:///./src/components/scrollBarrell.tsx","webpack:///./src/components/scrollableTabs.tsx","webpack:///./src/components/scroller.tsx","webpack:///./src/components/selectLink.tsx","webpack:///./src/components/setTimerBanner.tsx","webpack:///./src/components/setTimerEdit.tsx","webpack:///./src/components/simpleMarkdown.tsx","webpack:///./src/components/statsList.tsx","webpack:///./src/components/storySlider.tsx","webpack:///./src/components/subscriptionInfoImages.ts","webpack:///./src/components/systemKeyboardSpacer.tsx","webpack:///./src/components/tabs2.tsx","webpack:///./src/components/textInputModalContent.tsx","webpack:///./src/components/textareaAutogrow.tsx","webpack:///./src/components/timer.tsx","webpack:///./src/components/toast.tsx","webpack:///./src/components/tour/programTourConfig.tsx","webpack:///./src/components/tour/tourConfigs.ts","webpack:///./src/components/tour/tourModal.tsx","webpack:///./src/components/tour/tourTypes.ts","webpack:///./src/components/tour/workoutTourConfig.tsx","webpack:///./src/components/weekCalendar.tsx","webpack:///./src/components/weekCalendarPager.tsx","webpack:///./src/components/weekInsights.tsx","webpack:///./src/components/weightRoundingInfo.tsx","webpack:///./src/components/workout.tsx","webpack:///./src/components/workoutCenterExpandedRow.tsx","webpack:///./src/components/workoutExercise.tsx","webpack:///./src/components/workoutExerciseAllSets.tsx","webpack:///./src/components/workoutExerciseCard.tsx","webpack:///./src/components/workoutExercisePager.tsx","webpack:///./src/components/workoutExerciseSet.tsx","webpack:///./src/components/workoutExerciseSetCompact.tsx","webpack:///./src/components/workoutExerciseSetExpanded.tsx","webpack:///./src/components/workoutExerciseSetFields.tsx","webpack:///./src/components/workoutExerciseThumbnail.tsx","webpack:///./src/components/workoutFinishButton.tsx","webpack:///./src/components/workoutHeartRate.tsx","webpack:///./src/components/workoutLayoutTransition.ts","webpack:///./src/components/workoutMenu.tsx","webpack:///./src/components/workoutPagerHeightContext.ts","webpack:///./src/components/workoutPagerSettle.ts","webpack:///./src/components/workoutShareBottomSheetItem.tsx","webpack:///./src/components/workoutShareButton.tsx","webpack:///./src/components/workoutShareOutput.tsx","webpack:///./src/components/workoutShareOutputWithBg.tsx","webpack:///./src/components/workoutSocialShareSheet.tsx","webpack:///./src/components/workoutTabStopContext.ts","webpack:///./src/ducks/reducer.ts","webpack:///./src/ducks/thunks.ts","webpack:///./src/ducks/types.ts","webpack:///./src/generated/whatsnew.ts","webpack:///./src/index.tsx","webpack:///./src/internalLink.tsx","webpack:///./src/lib/audioInterface.ts","webpack:///./src/lib/healthSync.ts","webpack:///./src/lib/importexporter.ts","webpack:///./src/liftohistory/liftohistorySerializer.ts","webpack:///./src/liftoscript.ts","webpack:///./src/liftoscriptCodemirror.ts","webpack:///./src/liftoscriptEvaluator.ts","webpack:///./src/liftoscriptFns.ts","webpack:///./src/liftoscriptLanguage.ts","webpack:///./src/migrations/migrations.ts","webpack:///./src/migrations/runner.ts","webpack:///./src/models/account.ts","webpack:///./src/models/adminDebug.ts","webpack:///./src/models/builtinPrograms.ts","webpack:///./src/models/editEquipment.ts","webpack:///./src/models/editFood.ts","webpack:///./src/models/editGraphs.ts","webpack:///./src/models/editProgram.ts","webpack:///./src/models/editProgramLenses.ts","webpack:///./src/models/editProgressEntry.ts","webpack:///./src/models/editStats.ts","webpack:///./src/models/equipment.ts","webpack:///./src/models/exercise.ts","webpack:///./src/models/exerciseDraftToProgram.ts","webpack:///./src/models/exerciseImage.ts","webpack:///./src/models/exerciseLiftoEditorDraft.ts","webpack:///./src/models/exerciseLiftoEditorSave.ts","webpack:///./src/models/expenditure.ts","webpack:///./src/models/food.ts","webpack:///./src/models/foodLabel.ts","webpack:///./src/models/foodPick.ts","webpack:///./src/models/foodSearch.ts","webpack:///./src/models/hearAboutUs.ts","webpack:///./src/models/heartRateReading.ts","webpack:///./src/models/history.ts","webpack:///./src/models/importSession.ts","webpack:///./src/models/length.ts","webpack:///./src/models/muscle.ts","webpack:///./src/models/nativeEffects.ts","webpack:///./src/models/nutritionGraph.ts","webpack:///./src/models/onloadModal.ts","webpack:///./src/models/pp.ts","webpack:///./src/models/program.ts","webpack:///./src/models/programDayText.ts","webpack:///./src/models/programExercise.ts","webpack:///./src/models/programExercisePickerChange.ts","webpack:///./src/models/programExercisePreview.ts","webpack:///./src/models/programExerciseSwap.ts","webpack:///./src/models/programExerciseText.ts","webpack:///./src/models/programRewrite.ts","webpack:///./src/models/programSet.ts","webpack:///./src/models/programToPlanner.ts","webpack:///./src/models/progress.ts","webpack:///./src/models/restTimerAlert.ts","webpack:///./src/models/restTimerProgress.ts","webpack:///./src/models/restTimerWidth.ts","webpack:///./src/models/screen.ts","webpack:///./src/models/set.ts","webpack:///./src/models/settings.ts","webpack:///./src/models/share.ts","webpack:///./src/models/state.ts","webpack:///./src/models/stats.ts","webpack:///./src/models/storage.ts","webpack:///./src/models/timedSet.ts","webpack:///./src/models/versionTracker.ts","webpack:///./src/models/versionTracker/types.ts","webpack:///./src/models/versionTracker/utils.ts","webpack:///./src/models/versionTracker/versionTrackerDiffVersions.ts","webpack:///./src/models/versionTracker/versionTrackerExtractByVersions.ts","webpack:///./src/models/versionTracker/versionTrackerFillVersions.ts","webpack:///./src/models/versionTracker/versionTrackerMergeByVersions.ts","webpack:///./src/models/versionTracker/versionTrackerMergeVersions.ts","webpack:///./src/models/versionTracker/versionTrackerUpdateVersions.ts","webpack:///./src/models/watchStorageAccount.ts","webpack:///./src/models/weight.ts","webpack:///./src/models/whatsnew.tsx","webpack:///./src/models/whatsnewParser.ts","webpack:///./src/models/whatsnewUtils.ts","webpack:///./src/models/workoutOutcome.ts","webpack:///./src/models/workoutTimeEstimate.ts","webpack:///./src/navigation/ActiveSheetHeightContext.tsx","webpack:///./src/navigation/AppNavigator.tsx","webpack:///./src/navigation/CustomKeyboardContext.tsx","webpack:///./src/navigation/FormSheet.tsx","webpack:///./src/navigation/KeyboardSheet.tsx","webpack:///./src/navigation/ModalScreenContainer.tsx","webpack:///./src/navigation/ModalStateContext.tsx","webpack:///./src/navigation/NavHeader.tsx","webpack:///./src/navigation/NavScreenContent.tsx","webpack:///./src/navigation/NavScreenScrollContext.ts","webpack:///./src/navigation/SheetScreenContainer.tsx","webpack:///./src/navigation/StateContext.tsx","webpack:///./src/navigation/TrackedStateContext.tsx","webpack:///./src/navigation/TransparentModal.tsx","webpack:///./src/navigation/keyboardActiveId.ts","webpack:///./src/navigation/modals/DayLiftoEditorSheet.tsx","webpack:///./src/navigation/modals/ExerciseLiftoEditorSheet.tsx","webpack:///./src/navigation/modals/NavModal1RM.tsx","webpack:///./src/navigation/modals/NavModalAccount.tsx","webpack:///./src/navigation/modals/NavModalAcrossProgram.tsx","webpack:///./src/navigation/modals/NavModalAffiliate.tsx","webpack:///./src/navigation/modals/NavModalAmrap.tsx","webpack:///./src/navigation/modals/NavModalChangeNextDay.tsx","webpack:///./src/navigation/modals/NavModalChangePassword.tsx","webpack:///./src/navigation/modals/NavModalCorruptedState.tsx","webpack:///./src/navigation/modals/NavModalCoupon.tsx","webpack:///./src/navigation/modals/NavModalCreateProgram.tsx","webpack:///./src/navigation/modals/NavModalCreateStateVar.tsx","webpack:///./src/navigation/modals/NavModalCustomExercise.tsx","webpack:///./src/navigation/modals/NavModalDate.tsx","webpack:///./src/navigation/modals/NavModalDayFromAdhoc.tsx","webpack:///./src/navigation/modals/NavModalDayLiftoEditor.tsx","webpack:///./src/navigation/modals/NavModalDayStats.tsx","webpack:///./src/navigation/modals/NavModalDebug.tsx","webpack:///./src/navigation/modals/NavModalEditDetails.tsx","webpack:///./src/navigation/modals/NavModalEditExerciseChange.tsx","webpack:///./src/navigation/modals/NavModalEditMuscleGroups.tsx","webpack:///./src/navigation/modals/NavModalEditProgramExercisePicker.tsx","webpack:///./src/navigation/modals/NavModalEditProgramMenu.tsx","webpack:///./src/navigation/modals/NavModalEditTarget.tsx","webpack:///./src/navigation/modals/NavModalEmailAuth.tsx","webpack:///./src/navigation/modals/NavModalEquipment.tsx","webpack:///./src/navigation/modals/NavModalExerciseCloneLibrary.tsx","webpack:///./src/navigation/modals/NavModalExerciseImageLibrary.tsx","webpack:///./src/navigation/modals/NavModalExerciseImageSource.tsx","webpack:///./src/navigation/modals/NavModalExerciseLiftoEditor.tsx","webpack:///./src/navigation/modals/NavModalExerciseMusclesPicker.tsx","webpack:///./src/navigation/modals/NavModalExercisePicker.tsx","webpack:///./src/navigation/modals/NavModalExerciseStats.tsx","webpack:///./src/navigation/modals/NavModalExerciseTypesPicker.tsx","webpack:///./src/navigation/modals/NavModalGraphs.tsx","webpack:///./src/navigation/modals/NavModalHearAboutUs.tsx","webpack:///./src/navigation/modals/NavModalHelp.tsx","webpack:///./src/navigation/modals/NavModalImportFromLink.tsx","webpack:///./src/navigation/modals/NavModalImportFromOtherApps.tsx","webpack:///./src/navigation/modals/NavModalInputSelect.tsx","webpack:///./src/navigation/modals/NavModalMonthCalendar.tsx","webpack:///./src/navigation/modals/NavModalMuscleGroupMusclePicker.tsx","webpack:///./src/navigation/modals/NavModalMusclesOverride.tsx","webpack:///./src/navigation/modals/NavModalNewEquipment.tsx","webpack:///./src/navigation/modals/NavModalNewFixedWeight.tsx","webpack:///./src/navigation/modals/NavModalNewGym.tsx","webpack:///./src/navigation/modals/NavModalNextWorkout.tsx","webpack:///./src/navigation/modals/NavModalPhotoPicker.tsx","webpack:///./src/navigation/modals/NavModalPlannerSettings.tsx","webpack:///./src/navigation/modals/NavModalPlates.tsx","webpack:///./src/navigation/modals/NavModalPlaygroundEditExercise.tsx","webpack:///./src/navigation/modals/NavModalProgramImageExport.tsx","webpack:///./src/navigation/modals/NavModalProgramInfo.tsx","webpack:///./src/navigation/modals/NavModalProgramNextDay.tsx","webpack:///./src/navigation/modals/NavModalProgramRevisions.tsx","webpack:///./src/navigation/modals/NavModalRepMaxCalculator.tsx","webpack:///./src/navigation/modals/NavModalRoundingInfo.tsx","webpack:///./src/navigation/modals/NavModalSetSplit.tsx","webpack:///./src/navigation/modals/NavModalSetTimer.tsx","webpack:///./src/navigation/modals/NavModalSetTimerEdit.tsx","webpack:///./src/navigation/modals/NavModalSignupRequest.tsx","webpack:///./src/navigation/modals/NavModalSocialShare.tsx","webpack:///./src/navigation/modals/NavModalStateVars.tsx","webpack:///./src/navigation/modals/NavModalStatsSettings.tsx","webpack:///./src/navigation/modals/NavModalSubscriptionInfo.tsx","webpack:///./src/navigation/modals/NavModalTextInput.tsx","webpack:///./src/navigation/modals/NavModalTour.tsx","webpack:///./src/navigation/modals/NavModalWeekInsightsDetails.tsx","webpack:///./src/navigation/modals/NavModalWeekStats.tsx","webpack:///./src/navigation/modals/NavModalWhatsnew.tsx","webpack:///./src/navigation/modals/NavModalWorkoutShare.tsx","webpack:///./src/navigation/modals/NavModalWorkoutSuperset.tsx","webpack:///./src/navigation/modals/liftoEditorSheetProgram.ts","webpack:///./src/navigation/modals/navModalPlaygroundUtils.ts","webpack:///./src/navigation/navOptionsChanged.ts","webpack:///./src/navigation/navUtils.ts","webpack:///./src/navigation/navigationRef.ts","webpack:///./src/navigation/navigationService.ts","webpack:///./src/navigation/screenRemovalCleanup.ts","webpack:///./src/navigation/screens/NavScreenFood.tsx","webpack:///./src/navigation/screens/NavScreenFooter2.tsx","webpack:///./src/navigation/screens/NavScreenGraphs.tsx","webpack:///./src/navigation/screens/NavScreenHome.tsx","webpack:///./src/navigation/screens/NavScreenMe.tsx","webpack:///./src/navigation/screens/NavScreenOnboarding.tsx","webpack:///./src/navigation/screens/NavScreenProgram.tsx","webpack:///./src/navigation/screens/NavScreenWorkout.tsx","webpack:///./src/navigation/useClearOnModalRemove.ts","webpack:///./src/navigation/useConfirmScreenLeave.ts","webpack:///./src/navigation/useNavOptions.ts","webpack:///./src/navigation/useNavScreenScroll.ts","webpack:///./src/navigation/useOnloadModals.ts","webpack:///./src/navigation/usePlaygroundModalBridges.ts","webpack:///./src/navigation/utils.ts","webpack:///./src/pages/builder/utils/undoredo.ts","webpack:///./src/pages/planner/components/modalPlannerPictureExport.tsx","webpack:///./src/pages/planner/components/modalPlannerSettings.tsx","webpack:///./src/pages/planner/components/plannerCodeBlock.tsx","webpack:///./src/pages/planner/components/plannerDayStats.tsx","webpack:///./src/pages/planner/components/plannerEditorView.tsx","webpack:///./src/pages/planner/components/plannerExerciseStats.tsx","webpack:///./src/pages/planner/components/plannerStats.tsx","webpack:///./src/pages/planner/components/plannerWeekMuscles.tsx","webpack:///./src/pages/planner/components/plannerWeekStats.tsx","webpack:///./src/pages/planner/modalPlannerProgramRevisions.tsx","webpack:///./src/pages/planner/models/plannerDocument.ts","webpack:///./src/pages/planner/models/plannerExerciseSwap.ts","webpack:///./src/pages/planner/models/plannerMode.ts","webpack:///./src/pages/planner/models/plannerNames.ts","webpack:///./src/pages/planner/models/plannerProgram.ts","webpack:///./src/pages/planner/models/plannerProgramExercise.ts","webpack:///./src/pages/planner/models/plannerSidePanelStats.ts","webpack:///./src/pages/planner/models/plannerStateVars.ts","webpack:///./src/pages/planner/models/plannerStatsUtils.ts","webpack:///./src/pages/planner/models/plannerStructure.ts","webpack:///./src/pages/planner/models/programGrid.ts","webpack:///./src/pages/planner/models/programGridGeometry.ts","webpack:///./src/pages/planner/plannerCompletions.ts","webpack:///./src/pages/planner/plannerEditor.ts","webpack:///./src/pages/planner/plannerEvaluator.ts","webpack:///./src/pages/planner/plannerExerciseCodemirror.ts","webpack:///./src/pages/planner/plannerExerciseEvaluator.ts","webpack:///./src/pages/planner/plannerExerciseEvaluatorText.ts","webpack:///./src/pages/planner/plannerExerciseParser.ts","webpack:///./src/pages/planner/plannerExerciseStyles.ts","webpack:///./src/pages/planner/plannerGraph.tsx","webpack:///./src/pages/planner/plannerHighlighter.ts","webpack:///./src/pages/planner/plannerKey.tsx","webpack:///./src/parser.ts","webpack:///./src/programs/basicBeginnerProgram.ts","webpack:///./src/types.ts","webpack:///./src/utils/actionSheet.ts","webpack:///./src/utils/analytics.ts","webpack:///./src/utils/appAttribution.ts","webpack:///./src/utils/appleAuth.ts","webpack:///./src/utils/appliedTheme.ts","webpack:///./src/utils/asyncQueue.ts","webpack:///./src/utils/bundledImages.ts","webpack:///./src/utils/clickTracking.tsx","webpack:///./src/utils/clipboard.tsx","webpack:///./src/utils/collection.ts","webpack:///./src/utils/collector.ts","webpack:///./src/utils/comparer.ts","webpack:///./src/utils/csv.ts","webpack:///./src/utils/date.ts","webpack:///./src/utils/deviceId.ts","webpack:///./src/utils/diagnostics.ts","webpack:///./src/utils/dialog.ts","webpack:///./src/utils/encoder.ts","webpack:///./src/utils/eventManager.ts","webpack:///./src/utils/exporter.ts","webpack:///./src/utils/features.ts","webpack:///./src/utils/fileImport.ts","webpack:///./src/utils/fitText.ts","webpack:///./src/utils/focusedInputFlush.ts","webpack:///./src/utils/fontScale.ts","webpack:///./src/utils/generator.ts","webpack:///./src/utils/geometry.ts","webpack:///./src/utils/googleAccessToken.ts","webpack:///./src/utils/heartRateStore.ts","webpack:///./src/utils/hermesProfile.ts","webpack:///./src/utils/historyDelta.ts","webpack:///./src/utils/historyIds.ts","webpack:///./src/utils/horizontalScroll.ts","webpack:///./src/utils/hostConfig.ts","webpack:///./src/utils/iapHelpers.ts","webpack:///./src/utils/imageCache.ts","webpack:///./src/utils/imagePicker.ts","webpack:///./src/utils/imagePreloader.tsx","webpack:///./src/utils/imageUploader.ts","webpack:///./src/utils/imageshare.ts","webpack:///./src/utils/importFromHevy.ts","webpack:///./src/utils/importFromLiftosaur.ts","webpack:///./src/utils/importFromLink.ts","webpack:///./src/utils/importTypes.ts","webpack:///./src/utils/inAppReview.ts","webpack:///./src/utils/indexeddb.ts","webpack:///./src/utils/keychainStore.ts","webpack:///./src/utils/liveActivityManager.ts","webpack:///./src/utils/log.ts","webpack:///./src/utils/math.ts","webpack:///./src/utils/nativeTimerBridge.ts","webpack:///./src/utils/nativeWatchBridge.ts","webpack:///./src/utils/nativeWorkoutBridge.ts","webpack:///./src/utils/nativeWorkoutMirroringBridge.ts","webpack:///./src/utils/object.ts","webpack:///./src/utils/perfEnabled.ts","webpack:///./src/utils/perfNavTracker.ts","webpack:///./src/utils/perfProbeSubtree.tsx","webpack:///./src/utils/perfProfiler.tsx","webpack:///./src/utils/perfSampling.ts","webpack:///./src/utils/perfScorecard.ts","webpack:///./src/utils/perfSetCompleteProbe.ts","webpack:///./src/utils/perfTracker.ts","webpack:///./src/utils/persistence.ts","webpack:///./src/utils/plannerDispatch.ts","webpack:///./src/utils/platesBarLayout.ts","webpack:///./src/utils/posthog.ts","webpack:///./src/utils/programFilter.ts","webpack:///./src/utils/progressiveReveal.ts","webpack:///./src/utils/pushRegistration.ts","webpack:///./src/utils/rollbar.ts","webpack:///./src/utils/scaledSpacings.generated.ts","webpack:///./src/utils/setCompleteHaptic.ts","webpack:///./src/utils/setUtils.ts","webpack:///./src/utils/shareLog.ts","webpack:///./src/utils/signIn.ts","webpack:///./src/utils/storeRuntime.ts","webpack:///./src/utils/string.ts","webpack:///./src/utils/styledText.ts","webpack:///./src/utils/subscriptionPlan.ts","webpack:///./src/utils/subscriptionReceipts.ts","webpack:///./src/utils/subscriptions.ts","webpack:///./src/utils/sync.ts","webpack:///./src/utils/syncAccountMismatch.ts","webpack:///./src/utils/syncBaseline.ts","webpack:///./src/utils/tailwindConfig.ts","webpack:///./src/utils/textDiff.ts","webpack:///./src/utils/textSize.ts","webpack:///./src/utils/theme.ts","webpack:///./src/utils/throttler.ts","webpack:///./src/utils/time.ts","webpack:///./src/utils/tooltipPlacement.ts","webpack:///./src/utils/undoingFlag.ts","webpack:///./src/utils/url.ts","webpack:///./src/utils/urlPolyfill.ts","webpack:///./src/utils/useEqual.ts","webpack:///./src/utils/useLensReducer.ts","webpack:///./src/utils/useLoopCatcher.ts","webpack:///./src/utils/usePerfRenderCount.ts","webpack:///./src/utils/usePerfRenderTrace.ts","webpack:///./src/utils/usePerfScrollMarkers.ts","webpack:///./src/utils/usePerfWhyRender.ts","webpack:///./src/utils/useProgressiveItems.ts","webpack:///./src/utils/useRem.ts","webpack:///./src/utils/useScreenPerf.ts","webpack:///./src/utils/useScrollProgressiveList.ts","webpack:///./src/utils/useSystemKeyboardHeight.ts","webpack:///./src/utils/useThunkReducer.ts","webpack:///./src/utils/useTimedMemo.ts","webpack:///./src/utils/useWorkoutImpression.ts","webpack:///./src/utils/watchAuthHandoff.ts","webpack:///./src/utils/watchHost.ts","webpack:///./src/utils/webPush.ts","webpack:///./src/utils/weekInsightsUtils.ts","webpack:///./src/utils/workoutCenterScroll.ts","webpack:///./src/utils/workoutExerciseUtils.ts","webpack:///./src/utils/workoutFinish.ts","webpack:///./src/utils/workoutHints.ts","webpack:///./src/utils/workoutHintsDispatch.ts","webpack:///./src/utils/workoutImpressionVisibility.ts","webpack:///./src/utils/workoutMenuActions.ts","webpack:///./src/utils/workoutProgressView.ts","webpack:///./src/utils/workoutSetExpansion.ts","webpack:///./src/utils/workoutSetPlates.ts","webpack:///./src/utils/workoutSetPrevious.ts","webpack:///./src/utils/workoutStripLabel.ts","webpack:///./src/utils/workoutStripReorder.ts","webpack:///./src/utils/workoutStripReveal.ts","webpack:///./src/utils/workoutTabPrune.ts","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/get mini-css chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/css loading","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"liftosaur:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","export function Mobile_isMobileFromWindow(): boolean {\n  return typeof window !== \"undefined\" && window.navigator ? Mobile_isMobile(window.navigator.userAgent) : false;\n}\n\nexport function Mobile_isMobile(userAgent: string): boolean {\n  return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);\n}\n\nexport function Mobile_isPlaywrightFromWindow(): boolean {\n  return typeof window !== \"undefined\" && window.navigator ? Mobile_isPlaywright(window.navigator.userAgent) : false;\n}\n\nexport function Mobile_isPlaywright(userAgent: string): boolean {\n  return userAgent.includes(\"Playwright\");\n}\n","import { Platform } from \"react-native\";\nimport {\n  IStorage,\n  IHistoryRecord,\n  ISettings,\n  IUnit,\n  IMuscleGeneratorResponse,\n  IPlannerProgramWeek,\n  IAffiliateData,\n  IWebEditorSettings,\n} from \"../types\";\nimport { IAccount } from \"../models/account\";\nimport { IEither } from \"../utils/types\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { IStorageUpdate2 } from \"../utils/sync\";\nimport { IExportedProgram, IProgramIndexEntry } from \"../models/program\";\nimport { CollectionUtils_inGroupsOf, CollectionUtils_uniqBy } from \"../utils/collection\";\nimport { Encoder_encode, Encoder_decode } from \"../utils/encoder\";\nimport { IAppleOffer, IGoogleOffer } from \"../models/state\";\nimport {\n  HistoryDelta_apply,\n  HistoryDelta_missingIds,\n  HistoryDelta_unresolvedIds,\n  IHistoryDeltaLocal,\n} from \"../utils/historyDelta\";\nimport { HistoryIds_MAX } from \"../utils/historyIds\";\nimport { IFoodSearchResult } from \"../models/foodSearch\";\nimport { IRestTimerPushRequest } from \"../models/restTimerAlert\";\n\nexport type IPostSyncHistory = { mode: \"page\" } | { mode: \"none\" } | { mode: \"delta\"; local: IHistoryDeltaLocal };\n\nfunction Service_nativeClientHeaders(): Record<string, string> {\n  if (Platform.OS === \"ios\") {\n    return { \"X-Client\": \"liftosaur-native-ios\" };\n  }\n  if (Platform.OS === \"android\") {\n    return { \"X-Client\": \"liftosaur-native-android\" };\n  }\n  return {};\n}\n\nexport interface IServiceError {\n  status?: number;\n  message: string;\n  body?: string;\n}\n\nexport interface IProgramDetail {\n  fullDescription: string;\n  faq?: string;\n  planner: {\n    vtype: \"planner\";\n    name: string;\n    weeks: IPlannerProgramWeek[];\n  };\n}\n\nexport type IEmailAuthResponse =\n  | { type: \"success\"; response: IGetStorageResponse }\n  | { type: \"confirmation_sent\" }\n  | { type: \"error\"; error: string; providers?: string[] };\n\nexport interface IGetStorageResponse {\n  email: string;\n  storage: IStorage;\n  user_id: string;\n  is_new_user: boolean;\n  key?: string;\n  session?: string;\n}\n\nexport type IPostSyncResponse =\n  | {\n      type: \"dirty\";\n      storage: IStorage;\n      email: string;\n      user_id: string;\n      key?: string;\n    }\n  | {\n      type: \"clean\";\n      new_original_id: number;\n      email: string;\n      user_id: string;\n      key?: string;\n    }\n  | {\n      type: \"error\";\n      error: \"account_mismatch\";\n      email: string;\n      user_id: string;\n      key?: string;\n    }\n  | {\n      type: \"error\";\n      error: string;\n      key?: string;\n    };\n\nexport type IPostStorageResponse =\n  | {\n      status: \"success\";\n      newOriginalId: number;\n    }\n  | {\n      status: \"request\";\n      data: (\"programs\" | \"history\" | \"stats\")[];\n    }\n  | {\n      status: \"merged\";\n      storage: IStorage;\n    };\n\ntype IRedeemCouponError =\n  | \"not_authorized\"\n  | \"coupon_not_found\"\n  | \"coupon_already_claimed\"\n  | \"wrong_platform\"\n  | \"coupon_disabled\"\n  | \"unknown\";\n\nexport interface IAiConvertResponse {\n  program: string;\n}\n\nexport type IEventPayload =\n  | {\n      type: \"event\";\n      userId?: string;\n      timestamp: number;\n      name: string;\n      isMobile?: boolean;\n      iOSVersion?: number;\n      androidVersion?: number;\n      iOSOSVersion?: number;\n      androidOSVersion?: number;\n      deviceModel?: string;\n      commithash: string;\n      extra?: Record<string, string | number>;\n    }\n  | {\n      type: \"error\";\n      userId?: string;\n      timestamp: number;\n      message: string;\n      stack: string;\n      commithash: string;\n      isMobile?: boolean;\n      rollbar_id: string;\n    }\n  | {\n      type: \"safesnapshot\";\n      userId?: string;\n      timestamp: number;\n      storage_id: string;\n      commithash: string;\n      isMobile?: boolean;\n      update: string;\n    }\n  | {\n      type: \"mergesnapshot\";\n      userId?: string;\n      timestamp: number;\n      storage_id: string;\n      commithash: string;\n      isMobile?: boolean;\n      update: string;\n    }\n  | {\n      type: \"log\";\n      userId?: string;\n      timestamp: number;\n      action: string;\n      detail?: string;\n      affiliates?: Partial<Record<string, IAffiliateData>>;\n      subscriptions: string[];\n      referrer?: string;\n      landingPage?: string;\n      platform: { name: string; version?: string };\n      commithash: string;\n      isMobile?: boolean;\n    };\n\nconst cachePromises: Partial<Record<string, Promise<{ result: boolean }>>> = {};\n\ndeclare let __API_HOST__: string;\ndeclare let __HOST__: string;\ndeclare let __COMMIT_HASH__: string;\n\nexport interface IRecordResponse {\n  history: IHistoryRecord[];\n  record: IHistoryRecord;\n  settings: ISettings;\n}\n\nexport interface ISubscriptionServerDetails {\n  type: \"apple\" | \"google\";\n  product: string;\n  isActive: boolean;\n  expires: number;\n  autoRenew?: boolean;\n  // The product a queued plan switch will renew as, read authoritatively from Google\n  // subscriptionsv2 `deferredItemReplacement` server-side. Empty when no switch is queued.\n  pendingProduct?: string;\n}\n\nexport interface IServiceAdminTarget {\n  userId: string;\n  adminKey: string;\n}\n\nexport function Service_adminTarget(adminKey?: string, userId?: string): IServiceAdminTarget | undefined {\n  return adminKey != null && userId != null ? { userId, adminKey } : undefined;\n}\n\nfunction Service_withAdminTarget(rawUrl: string, admin?: IServiceAdminTarget): string {\n  if (admin == null) {\n    return rawUrl;\n  }\n  const url = UrlUtils_build(rawUrl);\n  url.searchParams.set(\"userid\", admin.userId);\n  url.searchParams.set(\"key\", admin.adminKey);\n  return url.toString();\n}\n\nexport class Service {\n  public readonly client: Window[\"fetch\"];\n\n  constructor(client: Window[\"fetch\"]) {\n    this.client = client;\n  }\n\n  public async googleSignIn(\n    token: string,\n    id: string,\n    args: { forcedUserEmail?: string }\n  ): Promise<IGetStorageResponse> {\n    const historylimit = 20;\n    const body = JSON.stringify({\n      token,\n      id,\n      forceuseremail: args.forcedUserEmail,\n      historylimit,\n    });\n    const response = await this.client(`${__API_HOST__}/api/signin/google`, {\n      method: \"POST\",\n      body: body,\n      credentials: \"include\",\n      headers: Service_nativeClientHeaders(),\n    });\n    const json: IGetStorageResponse = await response.json();\n    json.storage.history = await this.getAllHistoryRecords({\n      alreadyFetchedHistory: json.storage.history,\n      historyLimit: historylimit,\n    });\n    return {\n      email: json.email,\n      storage: json.storage,\n      user_id: json.user_id,\n      is_new_user: json.is_new_user,\n      session: json.session,\n    };\n  }\n\n  public async getAllHistoryRecords(args: {\n    alreadyFetchedHistory?: IHistoryRecord[];\n    historyLimit?: number;\n    userId?: string;\n    adminKey?: string;\n  }): Promise<IHistoryRecord[]> {\n    let history = args.alreadyFetchedHistory || [];\n    let historyResponse: IHistoryRecord[] | undefined = undefined;\n    let historyLimit = args.historyLimit || 20;\n    while ((historyResponse || history).length > historyLimit - 1) {\n      historyLimit = 100;\n      historyResponse = await this.getHistory({\n        after: history.length > 1 ? history[history.length - 2].id : undefined,\n        limit: historyLimit,\n        userId: args.userId,\n        adminKey: args.adminKey,\n      });\n      if (historyResponse.length > 0) {\n        history = [...history, ...historyResponse];\n      } else {\n        break;\n      }\n    }\n    history = CollectionUtils_uniqBy(history, \"id\");\n    return history;\n  }\n\n  public async getHistory(args: {\n    after?: number;\n    limit?: number;\n    userId?: string;\n    adminKey?: string;\n  }): Promise<IHistoryRecord[]> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/history`);\n    if (args.after) {\n      url.searchParams.set(\"after\", args.after.toString());\n    }\n    if (args.limit) {\n      url.searchParams.set(\"limit\", args.limit.toString());\n    }\n    if (args.userId != null && args.adminKey != null) {\n      url.searchParams.set(\"userid\", args.userId);\n      url.searchParams.set(\"key\", args.adminKey);\n    }\n    const response = await this.client(url.toString(), { credentials: \"include\" });\n    const json: { history: IHistoryRecord[] } = await response.json();\n    return json.history;\n  }\n\n  public async getHistoryByIds(ids: number[]): Promise<IHistoryRecord[]> {\n    const chunks = CollectionUtils_inGroupsOf(HistoryIds_MAX, ids);\n    const pages = await Promise.all(\n      chunks.map(async (chunk) => {\n        const url = UrlUtils_build(`${__API_HOST__}/api/history`);\n        url.searchParams.set(\"ids\", chunk.join(\",\"));\n        const response = await this.client(url.toString(), { credentials: \"include\" });\n        if (response.status !== 200) {\n          throw new Error(`Failed to fetch history records by ids: ${response.status}`);\n        }\n        const json: { history: IHistoryRecord[] } = await response.json();\n        return json.history;\n      })\n    );\n    return pages.flat();\n  }\n\n  public async appleSignIn(code: string, idToken: string, id: string): Promise<IGetStorageResponse> {\n    const historylimit = 20;\n    const response = await this.client(`${__API_HOST__}/api/signin/apple`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        code,\n        idToken,\n        id,\n        historylimit,\n      }),\n      credentials: \"include\",\n      headers: Service_nativeClientHeaders(),\n    });\n    const json: IGetStorageResponse = await response.json();\n    json.storage.history = await this.getAllHistoryRecords({\n      alreadyFetchedHistory: json.storage.history,\n      historyLimit: historylimit,\n    });\n    return {\n      email: json.email,\n      storage: json.storage,\n      user_id: json.user_id,\n      is_new_user: json.is_new_user,\n      session: json.session,\n    };\n  }\n\n  public async emailSignUp(email: string, password: string, id: string): Promise<IEmailAuthResponse> {\n    return this.emailAuth(`${__API_HOST__}/api/signup/email`, { email, password, id });\n  }\n\n  public async emailSignIn(email: string, password: string, id: string): Promise<IEmailAuthResponse> {\n    return this.emailAuth(`${__API_HOST__}/api/signin/email`, { email, password, id });\n  }\n\n  private async emailAuth(url: string, body: Record<string, string>): Promise<IEmailAuthResponse> {\n    const historylimit = 20;\n    let response: Response;\n    let json: IGetStorageResponse & { status?: string; error?: string; providers?: string[] };\n    try {\n      response = await this.client(url, {\n        method: \"POST\",\n        body: JSON.stringify({ ...body, historylimit }),\n        credentials: \"include\",\n        headers: Service_nativeClientHeaders(),\n      });\n      json = await response.json();\n    } catch (e) {\n      return { type: \"error\", error: \"network_error\" };\n    }\n    if (!response.ok) {\n      return { type: \"error\", error: json.error || \"unknown_error\", providers: json.providers };\n    }\n    if (json.status === \"confirmation_sent\") {\n      return { type: \"confirmation_sent\" };\n    }\n    json.storage.history = await this.getAllHistoryRecords({\n      alreadyFetchedHistory: json.storage.history,\n      historyLimit: historylimit,\n    });\n    return {\n      type: \"success\",\n      response: {\n        email: json.email,\n        storage: json.storage,\n        user_id: json.user_id,\n        is_new_user: json.is_new_user,\n        key: json.key,\n        session: json.session,\n      },\n    };\n  }\n\n  public async forgotPassword(email: string): Promise<{ error?: string; providers?: string[] }> {\n    try {\n      const response = await this.client(`${__API_HOST__}/api/auth/forgotpassword`, {\n        method: \"POST\",\n        body: JSON.stringify({ email }),\n        credentials: \"include\",\n        headers: Service_nativeClientHeaders(),\n      });\n      if (response.ok) {\n        return {};\n      }\n      const json = await response.json().catch(() => ({}));\n      return { error: json.error || \"unknown_error\", providers: json.providers };\n    } catch (e) {\n      return { error: \"network_error\" };\n    }\n  }\n\n  public async resetPassword(token: string, password: string): Promise<{ error?: string }> {\n    try {\n      const response = await this.client(`${__API_HOST__}/api/auth/resetpassword`, {\n        method: \"POST\",\n        body: JSON.stringify({ token, password }),\n        credentials: \"include\",\n        headers: Service_nativeClientHeaders(),\n      });\n      if (response.ok) {\n        return {};\n      }\n      const json = await response.json().catch(() => ({}));\n      return { error: json.error || \"unknown_error\" };\n    } catch (e) {\n      return { error: \"network_error\" };\n    }\n  }\n\n  public async verifyEmail(token: string): Promise<{ error?: string }> {\n    try {\n      const response = await this.client(`${__API_HOST__}/api/auth/verifyemail`, {\n        method: \"POST\",\n        body: JSON.stringify({ token }),\n        credentials: \"include\",\n        headers: Service_nativeClientHeaders(),\n      });\n      if (response.ok) {\n        return {};\n      }\n      const json = await response.json().catch(() => ({}));\n      return { error: json.error || \"unknown_error\" };\n    } catch (e) {\n      return { error: \"network_error\" };\n    }\n  }\n\n  public async changePassword(currentPassword: string | undefined, newPassword: string): Promise<string | undefined> {\n    try {\n      const response = await this.client(`${__API_HOST__}/api/auth/changepassword`, {\n        method: \"POST\",\n        body: JSON.stringify({ currentPassword, newPassword }),\n        credentials: \"include\",\n        headers: Service_nativeClientHeaders(),\n      });\n      if (response.ok) {\n        return undefined;\n      }\n      const json = await response.json().catch(() => ({}));\n      return json.error || \"unknown_error\";\n    } catch (e) {\n      return \"network_error\";\n    }\n  }\n\n  public async signout(): Promise<void> {\n    await this.client(`${__API_HOST__}/api/signout`, {\n      method: \"POST\",\n      body: JSON.stringify({}),\n      credentials: \"include\",\n    });\n  }\n\n  public async refreshGoogleSubscription(\n    userId: string,\n    googlePurchaseToken: string\n  ): Promise<ISubscriptionServerDetails | undefined> {\n    // Re-verifies the live purchase token (which also rewrites the server's details row) and returns the\n    // freshly-derived status incl. any queued deferred plan switch. Authorized by possession of the purchase\n    // token, so no userId-based read. Deliberately uncached: each refresh must reflect live Play state.\n    try {\n      const url = UrlUtils_build(`${__API_HOST__}/api/verifygooglepurchasetoken`);\n      const result = await this.client(url.toString(), {\n        method: \"POST\",\n        body: JSON.stringify({ googlePurchaseToken, userId }),\n        credentials: \"include\",\n      });\n      if (result.status === 200) {\n        const json = (await result.json()) as { subscription?: ISubscriptionServerDetails };\n        return json.subscription;\n      }\n    } catch {\n      // Network/parse failure: caller keeps its prior state rather than clearing the pending card.\n    }\n    return undefined;\n  }\n\n  public async getProgramRevisions(\n    programId: string,\n    admin?: IServiceAdminTarget\n  ): Promise<IEither<string[], IServiceError>> {\n    try {\n      const url = Service_withAdminTarget(`${__API_HOST__}/api/programrevisions/${programId}`, admin);\n      const result = await this.client(url, {\n        method: \"GET\",\n        credentials: \"include\",\n      });\n      if (result.ok) {\n        const json = await result.json();\n        return { success: true, data: json.data };\n      } else {\n        const body = await result.text().catch(() => \"\");\n        return {\n          success: false,\n          error: { status: result.status, message: `http_error`, body: body.slice(0, 500) },\n        };\n      }\n    } catch (e) {\n      return { success: false, error: { message: e instanceof Error ? e.message : String(e) } };\n    }\n  }\n\n  public async getProgramRevision(\n    programId: string,\n    revision: string,\n    admin?: IServiceAdminTarget\n  ): Promise<IEither<string, string>> {\n    const url = Service_withAdminTarget(`${__API_HOST__}/api/programrevision/${programId}/${revision}`, admin);\n    const result = await this.client(url, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (result.ok) {\n      const json = await result.json();\n      return { success: true, data: json.text };\n    } else {\n      return { success: false, error: \"error\" };\n    }\n  }\n\n  public async postSync(args: {\n    storageUpdate: IStorageUpdate2;\n    tempUserId: string | undefined;\n    signal?: AbortSignal;\n    deviceId?: string;\n    history?: IPostSyncHistory;\n  }): Promise<IPostSyncResponse> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/sync2`);\n    if (args.tempUserId) {\n      url.searchParams.set(\"tempuserid\", args.tempUserId);\n    }\n    const body = JSON.stringify({\n      storageUpdate: args.storageUpdate,\n      timestamp: Date.now(),\n      historylimit: 20,\n      deviceId: args.deviceId,\n    });\n    const compressedBody = await Encoder_encode(body);\n    const payload = JSON.stringify({ data: compressedBody });\n    const result = await this.client(url.toString(), {\n      method: \"POST\",\n      body: payload,\n      credentials: \"include\",\n      signal: args.signal,\n    });\n    const json: IPostSyncResponse = await result.json();\n    if (json.type === \"dirty\") {\n      json.storage = await this.completeSyncHistory(json.storage, args.history || { mode: \"page\" });\n    }\n    return json;\n  }\n\n  private async completeSyncHistory(storage: IStorage, history: IPostSyncHistory): Promise<IStorage> {\n    if (history.mode === \"none\") {\n      return storage;\n    }\n    const missingIds =\n      history.mode === \"delta\" ? HistoryDelta_missingIds(history.local, storage._versions, storage.history) : undefined;\n    const fetched = missingIds != null && missingIds.length > 0 ? await this.getHistoryByIds(missingIds) : [];\n    if (missingIds == null || HistoryDelta_unresolvedIds(missingIds, fetched).length > 0) {\n      const full = await this.getAllHistoryRecords({ alreadyFetchedHistory: storage.history, historyLimit: 20 });\n      return { ...storage, history: full };\n    }\n    return HistoryDelta_apply(storage, fetched);\n  }\n\n  public async createDebugSession(\n    userId: string,\n    adminKey: string\n  ): Promise<{ session?: string; userId: string; email: string } | undefined> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/admin/debugsession`);\n    url.searchParams.set(\"userid\", userId);\n    url.searchParams.set(\"key\", adminKey);\n    const response = await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify({}),\n      credentials: \"include\",\n    });\n    if (response.status !== 200) {\n      return undefined;\n    }\n    return response.json();\n  }\n\n  public async postSetupTestAccount(apiKey?: string, session?: string): Promise<{ apiKeyBound: boolean; key: string }> {\n    const response = await this.client(`${__API_HOST__}/api/dev/setuptestaccount`, {\n      method: \"POST\",\n      body: JSON.stringify({ apiKey }),\n      credentials: \"include\",\n      headers: {\n        ...Service_nativeClientHeaders(),\n        ...(session ? { authorization: `Bearer ${session}` } : {}),\n      },\n    });\n    const json: { data?: { apiKeyBound: boolean; key: string }; error?: string } = await response\n      .json()\n      .catch(() => ({}));\n    if (response.status !== 200 || json.data == null) {\n      throw new Error(`Test account setup failed (${response.status}): ${json.error || \"unknown error\"}`);\n    }\n    return json.data;\n  }\n\n  public async postDebug(id: string, state: string, meta: Record<string, string>): Promise<boolean> {\n    try {\n      const compressed = await Encoder_encode(JSON.stringify({ state, meta }));\n      const response = await this.client(`${__API_HOST__}/api/debug`, {\n        method: \"POST\",\n        body: JSON.stringify({ id, data: compressed }),\n        credentials: \"include\",\n      });\n      const json = await response.json();\n      return json?.data === \"ok\";\n    } catch (e) {\n      return false;\n    }\n  }\n\n  public async postClaimKey(userid: string): Promise<{ key: string; expires: number } | undefined> {\n    const response = await this.client(`${__API_HOST__}/api/claimkey/${userid}`, {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n    const json = await response.json();\n    return json?.data?.claim;\n  }\n\n  public async checkAdminKey(adminKey: string): Promise<boolean> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/admin/check`);\n    url.searchParams.set(\"key\", adminKey);\n    try {\n      const response = await this.client(url.toString(), { credentials: \"include\" });\n      return response.status === 200;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  public async postAddFreeUser(userid: string, adminKey: string): Promise<void> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/addfreeuser/${userid}`);\n    url.searchParams.set(\"key\", adminKey);\n    await this.client(url.toString(), {\n      method: \"POST\",\n      credentials: \"include\",\n    });\n  }\n\n  public async postSaveProgram(\n    program: IExportedProgram,\n    deviceId?: string,\n    source?: string\n  ): Promise<IEither<string, string>> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/program`);\n    try {\n      const response = await this.client(url.toString(), {\n        method: \"POST\",\n        body: JSON.stringify({ program, deviceId, source }),\n        credentials: \"include\",\n      });\n      if (response.status === 200) {\n        const json = await response.json();\n        return { success: true, data: json.data.id };\n      } else {\n        const json = await response.json();\n        return { success: false, error: json.error };\n      }\n    } catch (error) {\n      const e = error as Error;\n      return { success: false, error: e.message };\n    }\n  }\n\n  public async postSaveSettings(args: {\n    settings: IWebEditorSettings;\n    deletedExerciseDataKeys: string[];\n    deletedStarredExerciseKeys?: string[];\n    version: string;\n    deviceId?: string;\n  }): Promise<IEither<undefined, string>> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/settings`);\n    try {\n      const response = await this.client(url.toString(), {\n        method: \"POST\",\n        body: JSON.stringify(args),\n        credentials: \"include\",\n      });\n      if (response.status === 200) {\n        return { success: true, data: undefined };\n      } else {\n        const json = await response.json();\n        return { success: false, error: json.error };\n      }\n    } catch (error) {\n      const e = error as Error;\n      return { success: false, error: e.message };\n    }\n  }\n\n  public async deleteProgram(id: string): Promise<IEither<string, string>> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/program/${id}`);\n    try {\n      const response = await this.client(url.toString(), {\n        method: \"DELETE\",\n        credentials: \"include\",\n      });\n      if (response.status === 200) {\n        const json = await response.json();\n        return { success: true, data: json.data.id };\n      } else {\n        const json = await response.json();\n        return { success: false, error: json.error };\n      }\n    } catch (error) {\n      const e = error as Error;\n      return { success: false, error: e.message };\n    }\n  }\n\n  public async postClaimCoupon(\n    code: string,\n    platform?: \"ios\" | \"android\"\n  ): Promise<\n    IEither<\n      {\n        key?: string;\n        expires?: number;\n        appleOffer?: IAppleOffer;\n        googleOffer?: IGoogleOffer;\n        affiliate?: string;\n      },\n      IRedeemCouponError\n    >\n  > {\n    const url = UrlUtils_build(`${__API_HOST__}/api/coupon/claim/${code}`);\n    const result = await this.client(url.toString(), {\n      method: \"POST\",\n      credentials: \"include\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({ platform }),\n    });\n    const json = await result.json();\n    if (result.status === 200) {\n      const { key, expires, appleOffer, googleOffer, affiliate } = json.data || {};\n      if (key && expires) {\n        return { success: true, data: { key, expires } };\n      } else if (appleOffer) {\n        return { success: true, data: { appleOffer, affiliate } };\n      } else if (googleOffer) {\n        return { success: true, data: { googleOffer, affiliate } };\n      }\n    } else if (\"error\" in json) {\n      const error = json.error as IRedeemCouponError;\n      if (\n        error === \"not_authorized\" ||\n        error === \"coupon_not_found\" ||\n        error === \"coupon_already_claimed\" ||\n        error === \"coupon_disabled\"\n      ) {\n        return { success: false, error };\n      }\n    }\n    return { success: false, error: \"unknown\" };\n  }\n\n  public async getStorage(\n    tempUserId: string,\n    userId?: string,\n    storageId?: string,\n    adminKey?: string\n  ): Promise<IGetStorageResponse> {\n    const historylimit = 20;\n    const url = UrlUtils_build(`${__API_HOST__}/api/storage`);\n    if (tempUserId) {\n      url.searchParams.set(\"tempuserid\", tempUserId);\n    }\n    if (userId != null && adminKey != null) {\n      url.searchParams.set(\"userid\", userId);\n      url.searchParams.set(\"key\", adminKey);\n      if (storageId) {\n        url.searchParams.set(\"storageid\", storageId);\n      }\n    }\n    url.searchParams.set(\"historylimit\", historylimit.toString());\n    const result = await this.client(url.toString(), { credentials: \"include\" });\n    const json = await result.json();\n    if (json.storage?.history) {\n      json.storage.history = await this.getAllHistoryRecords({\n        alreadyFetchedHistory: json.storage.history,\n        historyLimit: historylimit,\n        userId: userId != null && adminKey != null ? userId : undefined,\n        adminKey: userId != null && adminKey != null ? adminKey : undefined,\n      });\n    }\n    return {\n      email: json.email,\n      storage: json.storage,\n      user_id: json.user_id,\n      key: json.key,\n      is_new_user: json.is_new_user,\n    };\n  }\n\n  public async getDebugSnapshotList(userId: string, adminKey: string): Promise<string[]> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/debuginfo`);\n    url.searchParams.set(\"userid\", userId);\n    url.searchParams.set(\"key\", adminKey);\n    const result = await this.client(url.toString(), { credentials: \"include\" });\n    const json = await result.json();\n    return json.list ?? [];\n  }\n\n  public async getDebugSnapshotStorage(\n    userId: string,\n    adminKey: string,\n    timestamp: string\n  ): Promise<IStorage | undefined> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/debuginfo`);\n    url.searchParams.set(\"userid\", userId);\n    url.searchParams.set(\"key\", adminKey);\n    url.searchParams.set(\"timestamp\", timestamp);\n    const result = await this.client(url.toString(), { credentials: \"include\" });\n    const json = await result.json();\n    if (json.storage == null) {\n      return undefined;\n    }\n    return JSON.parse(await Encoder_decode(json.storage));\n  }\n\n  public async getExceptionData(id: string, key: string): Promise<string | undefined> {\n    const apiUrl = UrlUtils_build(`${__API_HOST__}/api/exception/${id}`);\n    apiUrl.searchParams.set(\"key\", key);\n    try {\n      const result = await this.client(apiUrl.toString(), { credentials: \"include\" });\n      const json = await result.json();\n      const s3Response = await this.client(json.url);\n      return s3Response.text();\n    } catch (_) {\n      return undefined;\n    }\n  }\n\n  // A negative verdict is not cached: the phone re-adds the same receipt after a cleanup, and a page-lifetime\n  // `false` would delete it again on every sync.\n  private async cacheVerdict(key: string, fn: () => Promise<{ result: boolean }>): Promise<boolean> {\n    if (cachePromises[key] == null) {\n      cachePromises[key] = fn();\n    }\n    const result = !!(await cachePromises[key]).result;\n    if (!result) {\n      delete cachePromises[key];\n    }\n    return result;\n  }\n\n  public async postEvent(event: IEventPayload): Promise<void> {\n    const nosync =\n      typeof window !== \"undefined\" && UrlUtils_build(window.location.href).searchParams.get(\"nosync\") === \"true\";\n    if (nosync) {\n      return;\n    }\n    const url = UrlUtils_build(`${__API_HOST__}/api/event`);\n    await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify(event),\n      credentials: \"include\",\n    });\n  }\n\n  public async getUploadedImages(): Promise<string[]> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/uploadedimages`);\n    const response = await this.client(url.toString(), { credentials: \"include\" });\n    if (response.ok) {\n      const json: { data: { images: string[] } } = await response.json();\n      return json.data.images;\n    } else {\n      return [];\n    }\n  }\n\n  public async postImageUploadUrl(\n    fileName: string,\n    contentType: string\n  ): Promise<{ uploadUrl: string; imageUrl: string; key: string }> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/imageuploadurl`);\n    const response = await this.client(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify({ fileName, contentType }),\n      credentials: \"include\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n    });\n\n    if (!response.ok) {\n      const error = await response.text();\n      throw new Error(`Failed to get upload URL: ${error}`);\n    }\n\n    return response.json();\n  }\n\n  public async verifyAppleReceipt(userId: string, appleReceipt: string): Promise<boolean> {\n    return this.cacheVerdict(`verifyAppleReceipt:${userId}:${appleReceipt}`, async () => {\n      try {\n        const url = UrlUtils_build(`${__API_HOST__}/api/verifyapplereceipt`);\n        const result = await this.client(url.toString(), {\n          method: \"POST\",\n          body: JSON.stringify({ appleReceipt, userId }),\n          credentials: \"include\",\n        });\n        return result.status === 200 ? result.json() : { result: true };\n      } catch {\n        return { result: true };\n      }\n    });\n  }\n\n  public async verifyGooglePurchaseToken(userId: string, googlePurchaseToken: string): Promise<boolean> {\n    return this.cacheVerdict(`verifyGooglePurchaseToken:${userId}:${googlePurchaseToken}`, async () => {\n      try {\n        const url = UrlUtils_build(`${__API_HOST__}/api/verifygooglepurchasetoken`);\n        const result = await this.client(url.toString(), {\n          method: \"POST\",\n          body: JSON.stringify({ googlePurchaseToken, userId }),\n          credentials: \"include\",\n        });\n        return result.status === 200 ? result.json() : { result: true };\n      } catch {\n        return { result: true };\n      }\n    });\n  }\n\n  public async verifySubscriptionKey(userId: string, key: string): Promise<{ clear: boolean }> {\n    try {\n      const url = UrlUtils_build(`${__API_HOST__}/api/verifysubscriptionkey`);\n      // The server only verifies keys outside of prod when `enforce` is set — tests rely on it\n      const enforce =\n        typeof window !== \"undefined\" && window.location?.href\n          ? !!UrlUtils_build(window.location.href).searchParams.get(\"enforce\")\n          : false;\n      const result = await this.client(url.toString(), {\n        method: \"POST\",\n        body: JSON.stringify({ user: userId, key, enforce }),\n        credentials: \"include\",\n      });\n      if (result.status !== 200) {\n        return { clear: false };\n      }\n      const json = (await result.json()) as { data?: { clear?: boolean } };\n      return { clear: !!json.data?.clear };\n    } catch {\n      return { clear: false };\n    }\n  }\n\n  public async deleteAccount(): Promise<boolean> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/deleteaccount`);\n    const response = await this.client(url.toString(), { method: \"DELETE\", credentials: \"include\" });\n    const json = await response.json();\n    return json.data === \"ok\";\n  }\n\n  public async postShortUrl(urlToShorten: string, type: string, src?: string): Promise<string> {\n    const url = UrlUtils_build(`${__API_HOST__}/shorturl/${type}`);\n    const result = await this.client(url.toString(), {\n      method: \"POST\",\n      credentials: \"include\",\n      body: JSON.stringify({ url: urlToShorten, src }),\n    });\n    if (result.ok) {\n      const json: { url: string } = await result.json();\n      return UrlUtils_build(json.url, __HOST__).toString();\n    } else {\n      throw new Error(\"Couldn't shorten url\");\n    }\n  }\n\n  public async getDataFromShortUrl(type: \"p\" | \"n\", id: string): Promise<{ data: string; s?: string; u?: string }> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/${type}/${id}`);\n    const result = await this.client(url.toString(), { credentials: \"include\" });\n    if (result.ok) {\n      const json: { data: string; s?: string; u?: string } = await result.json();\n      return json;\n    } else {\n      throw new Error(`Couldn't parse short url: ${url.toString()}`);\n    }\n  }\n\n  public async programsIndex(): Promise<IProgramIndexEntry[]> {\n    const response = await this.client(`${__HOST__}/programdata/index.json?v=${__COMMIT_HASH__}`);\n    return response.json();\n  }\n\n  public async programDetail(id: string, category: string = \"builtin\"): Promise<IProgramDetail> {\n    const response = await this.client(`${__HOST__}/programdata/programs/${category}/${id}.json?v=${__COMMIT_HASH__}`);\n    return response.json();\n  }\n\n  public async getMuscles(exercise: string): Promise<IMuscleGeneratorResponse | undefined> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/muscles`);\n    url.searchParams.set(\"exercise\", exercise);\n    if (typeof window !== \"undefined\" && window.tempUserId) {\n      url.searchParams.set(\"tempuserid\", window.tempUserId);\n    }\n    const response = await this.client(url.toString(), { credentials: \"include\" });\n    if (response.ok) {\n      const json: { data: IMuscleGeneratorResponse } = await response.json();\n      return json.data;\n    } else {\n      return undefined;\n    }\n  }\n\n  public async getUserContext(): Promise<{ account?: IAccount; units?: IUnit }> {\n    const result = await this.client(`${__API_HOST__}/api/usercontext`, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (result.ok) {\n      const json = await result.json();\n      return { account: json.account || undefined, units: json.units || undefined };\n    }\n    return {};\n  }\n\n  public async searchFood(query: string, signal?: AbortSignal): Promise<IFoodSearchResult[] | undefined> {\n    const url = UrlUtils_build(`${__API_HOST__}/api/food/search`);\n    url.searchParams.set(\"q\", query);\n    try {\n      const result = await this.client(url.toString(), { credentials: \"include\", signal });\n      return result.ok ? (await result.json()).data?.results || [] : undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  public async getFoodByBarcode(code: string): Promise<IFoodSearchResult | \"not_found\" | undefined> {\n    try {\n      const result = await this.client(`${__API_HOST__}/api/food/barcode/${encodeURIComponent(code)}`, {\n        credentials: \"include\",\n      });\n      if (result.status === 404) {\n        return \"not_found\";\n      }\n      return result.ok ? (await result.json()).data?.result : undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  public async getUsdaFood(fdcId: string): Promise<IFoodSearchResult | undefined> {\n    try {\n      const result = await this.client(`${__API_HOST__}/api/food/usda/${encodeURIComponent(fdcId)}`, {\n        credentials: \"include\",\n      });\n      return result.ok ? (await result.json()).data?.result : undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  public async getRestTimerPushKey(): Promise<string | undefined> {\n    try {\n      const result = await this.client(`${__API_HOST__}/api/resttimerpush/key`, { credentials: \"include\" });\n      return result.ok ? (await result.json()).data?.key : undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  public async putRestTimerPush(request: IRestTimerPushRequest): Promise<void> {\n    try {\n      await this.client(`${__API_HOST__}/api/resttimerpush`, {\n        method: \"PUT\",\n        body: JSON.stringify(request),\n        credentials: \"include\",\n        headers: { \"Content-Type\": \"application/json\" },\n      });\n    } catch {\n      return;\n    }\n  }\n\n  public async getApiKeys(): Promise<{ key: string; name: string; createdAt: number }[]> {\n    const result = await this.client(`${__API_HOST__}/api/apikeys`, {\n      method: \"GET\",\n      credentials: \"include\",\n    });\n    if (result.ok) {\n      const json = await result.json();\n      return json.data?.keys || [];\n    }\n    return [];\n  }\n\n  public async postPushToken(args: { deviceId: string; platform: \"ios\" | \"android\"; token: string }): Promise<void> {\n    const result = await this.client(`${__API_HOST__}/api/pushtoken`, {\n      method: \"POST\",\n      body: JSON.stringify(args),\n      credentials: \"include\",\n      headers: { \"Content-Type\": \"application/json\" },\n    });\n    if (!result.ok) {\n      throw new Error(`postPushToken failed: ${result.status}`);\n    }\n  }\n\n  public async deletePushToken(deviceId: string): Promise<void> {\n    const result = await this.client(`${__API_HOST__}/api/pushtoken/${encodeURIComponent(deviceId)}`, {\n      method: \"DELETE\",\n      credentials: \"include\",\n    });\n    if (!result.ok) {\n      throw new Error(`deletePushToken failed: ${result.status}`);\n    }\n  }\n\n  public async createApiKey(name: string): Promise<{ key: string; name: string; createdAt: number } | undefined> {\n    const result = await this.client(`${__API_HOST__}/api/apikeys`, {\n      method: \"POST\",\n      body: JSON.stringify({ name }),\n      credentials: \"include\",\n      headers: { \"Content-Type\": \"application/json\" },\n    });\n    if (result.ok) {\n      const json = await result.json();\n      return json.data;\n    }\n    return undefined;\n  }\n\n  public async deleteApiKey(key: string): Promise<boolean> {\n    const result = await this.client(`${__API_HOST__}/api/apikeys/${encodeURIComponent(key)}`, {\n      method: \"DELETE\",\n      credentials: \"include\",\n    });\n    return result.ok;\n  }\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Service } from \"../api/service\";\nimport { IAccount } from \"../models/account\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { getGoogleAccessToken } from \"../utils/googleAccessToken\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconApple } from \"./icons/iconApple\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { IconDumbbell } from \"./icons/iconDumbbell\";\nimport { IconGoogle } from \"./icons/iconGoogle\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState } from \"../models/state\";\nimport {\n  Thunk_googleSignIn,\n  Thunk_appleSignIn,\n  Thunk_emailAuth,\n  Thunk_forgotPassword,\n  Thunk_logOut,\n} from \"../ducks/thunks\";\nimport { IEmailAuthResult } from \"../ducks/thunks\";\nimport { track } from \"../utils/posthog\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { AppleAuth_init, AppleAuth_signIn } from \"../utils/appleAuth\";\nimport { Dialog_alert } from \"../utils/dialog\";\n\ninterface IAccountProps {\n  account?: IAccount;\n  redirectUrl?: string;\n  dispatch?: IDispatch;\n  client: Window[\"fetch\"];\n  onSignIn?: (state: IState) => void;\n  // App-only: renders a \"Sign in with Email\" button opening the email-auth modal\n  // instead of the inline form. Kept as a callback so this (server-rendered)\n  // module never imports react-navigation\n  onOpenEmailAuth?: () => void;\n}\n\nconst isWeb = Platform.OS === \"web\";\n\nexport function Account(props: IAccountProps): JSX.Element {\n  const service = new Service(props.client);\n  return (\n    <View style={{ minWidth: 256, maxWidth: 416, alignSelf: \"center\", width: \"100%\" }}>\n      {props.account ? (\n        <AccountLoggedInView service={service} account={props.account} dispatch={props.dispatch} />\n      ) : (\n        <AccountLoggedOutView\n          service={service}\n          redirectUrl={props.redirectUrl}\n          dispatch={props.dispatch}\n          onSignIn={props.onSignIn}\n          onOpenEmailAuth={props.onOpenEmailAuth}\n        />\n      )}\n    </View>\n  );\n}\n\nconst changePasswordErrorMessages: Record<string, string> = {\n  invalid_credentials: \"Current password is incorrect\",\n  invalid_password: \"Password must be at least 8 characters\",\n  password_too_long: \"Password must be at most 256 characters\",\n  not_authorized: \"You're not signed in\",\n  network_error: \"Network error, please try again\",\n};\n\nexport function ChangePasswordForm(props: { service: Service; onDone: () => void }): JSX.Element {\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const [error, setError] = useState<string | undefined>(undefined);\n  const [done, setDone] = useState(false);\n  const currentRef = useRef(\"\");\n  const newRef = useRef(\"\");\n  const repeatRef = useRef(\"\");\n\n  async function submit(): Promise<void> {\n    setError(undefined);\n    if (newRef.current.length < 8) {\n      setError(changePasswordErrorMessages.invalid_password);\n      return;\n    }\n    if (newRef.current !== repeatRef.current) {\n      setError(\"Passwords don't match\");\n      return;\n    }\n    setIsSubmitting(true);\n    const err = await props.service.changePassword(currentRef.current || undefined, newRef.current);\n    setIsSubmitting(false);\n    if (err) {\n      setError(changePasswordErrorMessages[err] || \"Something went wrong, please try again\");\n    } else {\n      setDone(true);\n    }\n  }\n\n  if (done) {\n    return (\n      <View className=\"items-center py-4\">\n        <Text className=\"text-center text-text-secondary\">Your password has been updated.</Text>\n        <View className=\"items-center mt-4\">\n          <Button name=\"change-password-done\" kind=\"purple\" onClick={() => props.onDone()}>\n            Done\n          </Button>\n        </View>\n      </View>\n    );\n  }\n\n  return (\n    <View>\n      <Input\n        label=\"Current password\"\n        identifier=\"change-password-current\"\n        type=\"password\"\n        changeType=\"oninput\"\n        autoCapitalize=\"none\"\n        autoCorrect={false}\n        changeHandler={(r) => {\n          if (r.success) {\n            currentRef.current = r.data;\n          }\n        }}\n      />\n      <Text className=\"mt-1 text-xs text-text-secondary\">\n        Leave blank if you sign in with Google or Apple and haven't set a password yet.\n      </Text>\n      <View className=\"mt-3\">\n        <Input\n          label=\"New password\"\n          identifier=\"change-password-new\"\n          type=\"password\"\n          changeType=\"oninput\"\n          autoCapitalize=\"none\"\n          autoCorrect={false}\n          changeHandler={(r) => {\n            if (r.success) {\n              newRef.current = r.data;\n            }\n          }}\n        />\n      </View>\n      <View className=\"mt-3\">\n        <Input\n          label=\"Repeat new password\"\n          identifier=\"change-password-repeat\"\n          type=\"password\"\n          changeType=\"oninput\"\n          autoCapitalize=\"none\"\n          autoCorrect={false}\n          changeHandler={(r) => {\n            if (r.success) {\n              repeatRef.current = r.data;\n            }\n          }}\n        />\n      </View>\n      {error && <Text className=\"mt-2 text-xs text-text-error\">{error}</Text>}\n      <View className=\"items-center mt-4\">\n        <Button\n          name=\"change-password-submit\"\n          kind=\"purple\"\n          testID=\"change-password-submit\"\n          data-testid=\"change-password-submit\"\n          className=\"min-w-scaled-32\"\n          disabled={isSubmitting}\n          onClick={() => submit()}\n        >\n          {isSubmitting ? (\n            <IconSpinner width={20} height={20} color={Tailwind_semantic().text.alwayswhite} />\n          ) : (\n            \"Change Password\"\n          )}\n        </Button>\n      </View>\n    </View>\n  );\n}\n\ninterface IAccountLoggedInViewProps {\n  service: Service;\n  account: IAccount;\n  dispatch?: IDispatch;\n}\n\nfunction AccountLoggedInView(props: IAccountLoggedInViewProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState(false);\n  const [showChangePassword, setShowChangePassword] = useState(false);\n  const { account, service } = props;\n\n  if (showChangePassword) {\n    return (\n      <View>\n        <Text className=\"mb-4 text-lg font-bold text-center\">Change Password</Text>\n        <ChangePasswordForm service={service} onDone={() => setShowChangePassword(false)} />\n        <View className=\"items-center mt-4\">\n          <LinkButton name=\"change-password-back\" className=\"text-xs\" onPress={() => setShowChangePassword(false)}>\n            Back\n          </LinkButton>\n        </View>\n      </View>\n    );\n  }\n\n  return (\n    <View>\n      <Text className=\"mb-4 text-lg font-bold text-center\">Current Account</Text>\n      {isLoading ? (\n        <View className=\"items-center my-4\">\n          <IconSpinner width={48} height={48} />\n        </View>\n      ) : (\n        <>\n          <View className=\"flex-row items-center\">\n            <Text className=\"flex-1 mr-2 text-lg\">{account.name || `id: ${account.id}`}</Text>\n            <View className=\"flex-row items-center\">\n              {account.numberOfPrograms != null && (\n                <>\n                  <Text className=\"pr-2\">{account.numberOfPrograms}</Text>\n                  <View className=\"pr-4\">\n                    <IconDoc width={12} height={16} />\n                  </View>\n                </>\n              )}\n              {account.numberOfWorkouts != null && (\n                <>\n                  <Text className=\"pr-2\">{account.numberOfWorkouts}</Text>\n                  <View>\n                    <IconDumbbell width={28} height={19} />\n                  </View>\n                </>\n              )}\n            </View>\n          </View>\n          {account.name && <Text className=\"text-xs text-text-secondary\">id: {account.id}</Text>}\n          {account.email !== \"noemail@example.com\" && (\n            <Text className=\"text-xs text-text-secondary\">\n              Signed in as <Text className=\"text-xs font-bold text-text-secondary\">{account.email}</Text>\n            </Text>\n          )}\n          <View className=\"items-center mt-4\">\n            <Button\n              name=\"account-sign-out\"\n              kind=\"purple\"\n              data-testid=\"menu-item-logout\"\n              testID=\"menu-item-logout\"\n              className=\"ls-logout\"\n              onClick={async () => {\n                setIsLoading(true);\n                if (props.dispatch && !isWeb) {\n                  props.dispatch(Thunk_logOut(() => setIsLoading(false)));\n                  return;\n                }\n                await service.signout();\n                if (isWeb && typeof window !== \"undefined\") {\n                  window.location.reload();\n                } else {\n                  setIsLoading(false);\n                }\n              }}\n            >\n              Sign Out\n            </Button>\n            <View className=\"mt-3\">\n              <LinkButton\n                name=\"account-change-password\"\n                className=\"text-sm\"\n                onPress={() => setShowChangePassword(true)}\n              >\n                Change password\n              </LinkButton>\n            </View>\n          </View>\n        </>\n      )}\n    </View>\n  );\n}\n\ninterface IAccountLoggedOutViewProps {\n  service: Service;\n  redirectUrl?: string;\n  dispatch?: IDispatch;\n  onSignIn?: (state: IState) => void;\n  onOpenEmailAuth?: () => void;\n}\n\nfunction AccountLoggedOutView(props: IAccountLoggedOutViewProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState(false);\n  const [showEmailForm, setShowEmailForm] = useState(false);\n\n  useEffect(() => {\n    if (!isWeb) {\n      return;\n    }\n    AppleAuth_init();\n  }, []);\n\n  return (\n    <View>\n      <Text className=\"mb-4 text-lg font-bold text-center\">Account</Text>\n      {isLoading ? (\n        <View className=\"items-center my-4\">\n          <IconSpinner width={48} height={48} />\n        </View>\n      ) : showEmailForm ? (\n        <View>\n          <EmailAuthForm service={props.service} redirectUrl={props.redirectUrl} onSignIn={props.onSignIn} />\n          <View className=\"items-center mt-4\">\n            <LinkButton name=\"email-auth-back\" className=\"text-xs\" onPress={() => setShowEmailForm(false)}>\n              Back to sign in options\n            </LinkButton>\n          </View>\n        </View>\n      ) : (\n        <View>\n          <Pressable\n            className=\"flex-row items-center w-full px-4 py-2 mt-2 rounded-lg nm-sign-in-with-google bg-background-default\"\n            style={Platform.select({\n              ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.1, shadowRadius: 4 },\n              android: { elevation: 2 },\n              default: { boxShadow: \"0 1px 4px 0 rgba(0,0,0,0.1)\" },\n            })}\n            data-testid=\"menu-item-login\"\n            testID=\"menu-item-login\"\n            onPress={async () => {\n              track({ name: \"SignUp\" });\n              setIsLoading(true);\n              if (props.dispatch) {\n                props.dispatch(\n                  Thunk_googleSignIn((newState) => {\n                    setIsLoading(false);\n                    props.onSignIn?.(newState);\n                  })\n                );\n                return;\n              }\n              const accessToken = await getGoogleAccessToken(true);\n              if (accessToken != null) {\n                const userId = UidFactory_generateUid(8);\n                const result = await props.service.googleSignIn(accessToken, userId, {});\n                if (result.email) {\n                  if (props.redirectUrl && typeof window !== \"undefined\") {\n                    window.location.href = props.redirectUrl;\n                  } else if (typeof window !== \"undefined\") {\n                    window.location.reload();\n                  }\n                } else {\n                  setIsLoading(false);\n                }\n              }\n            }}\n          >\n            <View>\n              <IconGoogle />\n            </View>\n            <Text className=\"flex-1 ml-2 text-base text-center\">Sign in with Google</Text>\n          </Pressable>\n          <Pressable\n            className=\"flex-row items-center w-full px-4 py-3 mt-2 bg-black rounded-lg nm-sign-in-with-apple\"\n            onPress={async () => {\n              track({ name: \"SignUp\" });\n              setIsLoading(true);\n              if (props.dispatch) {\n                props.dispatch(\n                  Thunk_appleSignIn((newState) => {\n                    setIsLoading(false);\n                    props.onSignIn?.(newState);\n                  })\n                );\n                return;\n              }\n              const appleResult = await AppleAuth_signIn();\n              if (appleResult.type !== \"success\") {\n                if (appleResult.type === \"error\") {\n                  Dialog_alert(appleResult.error);\n                }\n                setIsLoading(false);\n                return;\n              }\n              const userId = UidFactory_generateUid(8);\n              try {\n                const result = await props.service.appleSignIn(appleResult.code, appleResult.id_token, userId);\n                if (result.email && typeof window !== \"undefined\") {\n                  window.location.reload();\n                } else {\n                  setIsLoading(false);\n                }\n              } catch (e) {\n                Dialog_alert(\"Couldn't sign in with Apple. Please try again.\");\n                setIsLoading(false);\n              }\n            }}\n          >\n            <View style={{ marginTop: -3 }}>\n              <IconApple />\n            </View>\n            <Text className=\"flex-1 ml-2 text-base text-center text-text-alwayswhite\">Sign in with Apple</Text>\n          </Pressable>\n          <EmailAuthButton onPress={props.onOpenEmailAuth || (() => setShowEmailForm(true))} />\n        </View>\n      )}\n    </View>\n  );\n}\n\nexport function EmailAuthButton(props: { onPress: () => void }): JSX.Element {\n  return (\n    <View className=\"items-center mt-3\">\n      <LinkButton name=\"menu-item-login-email\" className=\"text-xs\" onPress={props.onPress}>\n        or use email login\n      </LinkButton>\n    </View>\n  );\n}\n\nexport type IEmailAuthMode = \"signin\" | \"signup\" | \"forgot\";\n\nconst emailAuthErrorMessages: Record<string, string> = {\n  invalid_email: \"Please enter a valid email address\",\n  invalid_password: \"Password must be at least 8 characters\",\n  password_too_long: \"Password must be at most 256 characters\",\n  account_exists: \"An account with this email already exists - sign in instead\",\n  invalid_credentials: \"Wrong email or password\",\n  account_not_found: \"No account exists with this email\",\n  wrong_password: \"Wrong password\",\n  too_many_attempts: \"Too many attempts, try again in 15 minutes\",\n  email_send_failed: \"Couldn't send the confirmation email, please try again later\",\n  network_error: \"Network error, please try again\",\n};\n\ninterface IEmailAuthFormProps {\n  // Required only for the web no-dispatch path; in-app callers pass dispatch and go through thunks\n  service?: Service;\n  redirectUrl?: string;\n  dispatch?: IDispatch;\n  onSignIn?: (state: IState) => void;\n  onModeChange?: (mode: IEmailAuthMode) => void;\n}\n\nexport function EmailAuthForm(props: IEmailAuthFormProps): JSX.Element {\n  const [mode, setMode] = useState<IEmailAuthMode>(\"signin\");\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const [error, setError] = useState<string | undefined>(undefined);\n  const [info, setInfo] = useState<string | undefined>(undefined);\n  const emailRef = useRef(\"\");\n  const passwordRef = useRef(\"\");\n\n  function switchMode(newMode: IEmailAuthMode): void {\n    setMode(newMode);\n    setError(undefined);\n    setInfo(undefined);\n    props.onModeChange?.(newMode);\n  }\n\n  function handleResult(result: IEmailAuthResult): void {\n    setIsSubmitting(false);\n    if (result.error === \"use_oauth\") {\n      const providers = result.providers?.length ? result.providers : [\"Google\", \"Apple\"];\n      setError(`This email signs in with ${providers.join(\" or \")}`);\n    } else if (result.error) {\n      setError(emailAuthErrorMessages[result.error] || \"Something went wrong, please try again\");\n    } else if (result.confirmationSent) {\n      setInfo(\n        \"This email already has a Liftosaur account. We've emailed you a link to set a password for it - check your email.\"\n      );\n    }\n  }\n\n  async function submit(): Promise<void> {\n    const email = emailRef.current.trim();\n    const password = passwordRef.current;\n    setError(undefined);\n    setInfo(undefined);\n    if (mode === \"forgot\") {\n      if (!email) {\n        setError(emailAuthErrorMessages.invalid_email);\n        return;\n      }\n      setIsSubmitting(true);\n      const onSent = (result: IEmailAuthResult): void => {\n        if (result.error) {\n          handleResult(result);\n        } else {\n          setIsSubmitting(false);\n          setInfo(`We've sent an email with instructions to ${email}.`);\n        }\n      };\n      if (props.dispatch) {\n        props.dispatch(Thunk_forgotPassword(email, onSent));\n      } else if (props.service) {\n        onSent(await props.service.forgotPassword(email));\n      }\n      return;\n    }\n    if (mode === \"signup\") {\n      track({ name: \"SignUp\" });\n    }\n    setIsSubmitting(true);\n    if (props.dispatch) {\n      props.dispatch(\n        Thunk_emailAuth(mode, email, password, (result, newState) => {\n          handleResult(result);\n          if (!result.error && !result.confirmationSent) {\n            props.onSignIn?.(newState);\n          }\n        })\n      );\n      return;\n    }\n    if (!props.service) {\n      setIsSubmitting(false);\n      return;\n    }\n    const userId = UidFactory_generateUid(8);\n    const result =\n      mode === \"signup\"\n        ? await props.service.emailSignUp(email, password, userId)\n        : await props.service.emailSignIn(email, password, userId);\n    if (result.type === \"success\" && typeof window !== \"undefined\") {\n      if (props.redirectUrl) {\n        window.location.href = props.redirectUrl;\n      } else {\n        window.location.reload();\n      }\n      return;\n    }\n    handleResult(\n      result.type === \"error\"\n        ? { error: result.error, providers: result.providers }\n        : result.type === \"confirmation_sent\"\n          ? { confirmationSent: true }\n          : {}\n    );\n  }\n\n  return (\n    <View className=\"mt-2\">\n      <Input\n        label=\"Email\"\n        identifier=\"email-auth-email\"\n        type=\"email\"\n        changeType=\"oninput\"\n        autoCapitalize=\"none\"\n        autoCorrect={false}\n        changeHandler={(r) => {\n          if (r.success) {\n            emailRef.current = r.data;\n          }\n        }}\n      />\n      {mode !== \"forgot\" && (\n        <View className=\"mt-2\">\n          <Input\n            label=\"Password\"\n            identifier=\"email-auth-password\"\n            type=\"password\"\n            changeType=\"oninput\"\n            autoCapitalize=\"none\"\n            autoCorrect={false}\n            changeHandler={(r) => {\n              if (r.success) {\n                passwordRef.current = r.data;\n              }\n            }}\n          />\n        </View>\n      )}\n      {error && <Text className=\"mt-2 text-xs text-text-error\">{error}</Text>}\n      {info && <Text className=\"mt-2 text-xs text-text-secondary\">{info}</Text>}\n      <View className=\"items-center mt-3\">\n        <Button\n          name={`email-auth-${mode}`}\n          kind=\"purple\"\n          testID=\"email-auth-submit\"\n          data-testid=\"email-auth-submit\"\n          className=\"min-w-scaled-32\"\n          disabled={isSubmitting}\n          onClick={() => submit()}\n        >\n          {isSubmitting ? (\n            <IconSpinner width={20} height={20} color={Tailwind_semantic().text.alwayswhite} />\n          ) : mode === \"signin\" ? (\n            \"Sign In\"\n          ) : mode === \"signup\" ? (\n            \"Create Account\"\n          ) : (\n            \"Send Reset Link\"\n          )}\n        </Button>\n      </View>\n      <View className=\"flex-row justify-between mt-4 gap-4\">\n        {mode !== \"signin\" && (\n          <LinkButton name=\"email-auth-mode-signin\" className=\"text-sm\" onPress={() => switchMode(\"signin\")}>\n            Sign in\n          </LinkButton>\n        )}\n        {mode !== \"signup\" && (\n          <LinkButton name=\"email-auth-mode-signup\" className=\"text-sm\" onPress={() => switchMode(\"signup\")}>\n            Create account\n          </LinkButton>\n        )}\n        {mode !== \"forgot\" && (\n          <LinkButton name=\"email-auth-mode-forgot\" className=\"text-sm\" onPress={() => switchMode(\"forgot\")}>\n            Forgot password?\n          </LinkButton>\n        )}\n      </View>\n    </View>\n  );\n}\n","import { JSX, useCallback, useState } from \"react\";\nimport { View, Pressable, Platform, ActionSheetIOS, Modal as RNModal } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { DropdownMenu, DropdownMenuItem } from \"./dropdownMenu\";\n\nexport interface IActionMenuAction {\n  label: string;\n  onPress: () => void;\n  destructive?: boolean;\n  disabled?: boolean;\n  testID?: string;\n}\n\nexport interface IActionMenuProps {\n  renderTrigger: (open: () => void) => JSX.Element;\n  title?: string;\n  actions: IActionMenuAction[];\n  onOpenChange?: (isOpen: boolean) => void;\n}\n\nexport function ActionMenu(props: IActionMenuProps): JSX.Element {\n  const [isOpen, setIsOpen] = useState(false);\n  const { onOpenChange } = props;\n\n  const open = useCallback(() => {\n    if (Platform.OS === \"ios\") {\n      const actions = props.actions;\n      const labels = actions.map((a) => a.label).concat(\"Cancel\");\n      const destructiveIndex = actions.findIndex((a) => a.destructive);\n      ActionSheetIOS.showActionSheetWithOptions(\n        {\n          title: props.title,\n          options: labels,\n          cancelButtonIndex: labels.length - 1,\n          destructiveButtonIndex: destructiveIndex >= 0 ? destructiveIndex : undefined,\n        },\n        (buttonIndex) => {\n          if (buttonIndex != null && buttonIndex < actions.length && !actions[buttonIndex].disabled) {\n            actions[buttonIndex].onPress();\n          }\n        }\n      );\n      return;\n    }\n    setIsOpen(true);\n    onOpenChange?.(true);\n  }, [props.actions, props.title, onOpenChange]);\n\n  const close = useCallback(() => {\n    setIsOpen(false);\n    onOpenChange?.(false);\n  }, [onOpenChange]);\n\n  return (\n    <>\n      {props.renderTrigger(open)}\n      {isOpen && Platform.OS === \"web\" && (\n        <DropdownMenu rightOffset=\"3rem\" onClose={close}>\n          {props.actions.map((a, i) => (\n            <DropdownMenuItem\n              key={a.label}\n              isTop={i === 0}\n              data-testid={a.testID}\n              testID={a.testID}\n              disabled={a.disabled}\n              onClick={() => {\n                close();\n                if (!a.disabled) {\n                  a.onPress();\n                }\n              }}\n            >\n              <Text className={`whitespace-nowrap ${a.destructive ? \"text-text-error\" : \"\"}`}>{a.label}</Text>\n            </DropdownMenuItem>\n          ))}\n        </DropdownMenu>\n      )}\n      {Platform.OS === \"android\" && (\n        <RNModal transparent visible={isOpen} animationType=\"fade\" onRequestClose={close}>\n          <Pressable className=\"justify-end flex-1\" style={{ backgroundColor: \"rgba(0,0,0,0.4)\" }} onPress={close}>\n            <Pressable className=\"pb-8 bg-background-default rounded-t-2xl\" onPress={(e) => e.stopPropagation()}>\n              {props.title && (\n                <View className=\"px-4 py-3 border-b border-border-neutral\">\n                  <Text className=\"text-sm text-center text-text-secondary\">{props.title}</Text>\n                </View>\n              )}\n              {props.actions.map((a) => (\n                <Pressable\n                  key={a.label}\n                  data-testid={a.testID}\n                  testID={a.testID}\n                  disabled={a.disabled}\n                  className=\"px-4 py-4 border-b border-border-neutral\"\n                  onPress={() => {\n                    close();\n                    if (!a.disabled) {\n                      a.onPress();\n                    }\n                  }}\n                >\n                  <Text\n                    className={`text-base ${\n                      a.destructive ? \"text-text-error\" : a.disabled ? \"text-text-disabled\" : \"text-text-primary\"\n                    }`}\n                  >\n                    {a.label}\n                  </Text>\n                </Pressable>\n              ))}\n              <Pressable className=\"px-4 py-4\" onPress={close}>\n                <Text className=\"text-base text-center text-text-secondary\">Cancel</Text>\n              </Pressable>\n            </Pressable>\n          </Pressable>\n        </RNModal>\n      )}\n    </>\n  );\n}\n","import { createContext, useContext } from \"react\";\n\nexport interface IActiveGraphContext {\n  activeId: string | null;\n  setActive: (id: string | null) => void;\n}\n\nexport const ActiveGraphContext = createContext<IActiveGraphContext>({\n  activeId: null,\n  setActive: () => undefined,\n});\n\nexport function useActiveGraph(): IActiveGraphContext {\n  return useContext(ActiveGraphContext);\n}\n","import { JSX, useEffect, useMemo, useRef, useCallback, useState } from \"react\";\nimport { ModalStateProvider } from \"../navigation/ModalStateContext\";\nimport { ActiveSheetHeightProvider } from \"../navigation/ActiveSheetHeightContext\";\nimport { reducerWrapper, defaultOnActions, IAction } from \"../ducks/reducer\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { Program_getProgram } from \"../models/program\";\nimport { useThunkReducer } from \"../utils/useThunkReducer\";\nimport {\n  Thunk_fetchStorage,\n  Thunk_sync2,\n  Thunk_postevent,\n  Thunk_log,\n  Thunk_fetchInitial,\n  Thunk_debugTestLogin,\n} from \"../ducks/thunks\";\nimport { Service } from \"../api/service\";\nimport { NativeEffects_apply } from \"../models/nativeEffects\";\nimport { ITimerBridge } from \"../utils/timerBridge\";\nimport { WorkoutBridge } from \"../utils/nativeWorkoutBridge\";\nimport { WatchBridge } from \"../utils/nativeWatchBridge\";\nimport { Keychain } from \"../utils/keychainStore\";\nimport { WorkoutMirroring } from \"../utils/nativeWorkoutMirroringBridge\";\nimport { HeartRateStore } from \"../utils/heartRateStore\";\nimport { IAudioInterface } from \"../lib/audioInterface\";\nimport { Persistence } from \"../utils/persistence\";\nimport { Progress_getCurrentProgress } from \"../models/progress\";\nimport { IEnv, IState, updateState } from \"../models/state\";\nimport { Notification } from \"./notification\";\nimport { Toast } from \"./toast\";\nimport { useOnloadModals } from \"../navigation/useOnloadModals\";\nimport {\n  Subscriptions_cleanupOutdatedAppleReceipts,\n  Subscriptions_cleanupOutdatedGooglePurchaseTokens,\n} from \"../utils/subscriptions\";\nimport { lb } from \"lens-shmens\";\nimport { RestTimer } from \"./restTimer\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { AsyncQueue } from \"../utils/asyncQueue\";\nimport { useLoopCatcher } from \"../utils/useLoopCatcher\";\nimport RB from \"rollbar\";\nimport { exceptionIgnores } from \"../utils/rollbar\";\n\n// typeof-guarded: Metro/webpack define __DEV__, but this module also runs under node (tests).\ndeclare let __DEV__: boolean | undefined;\nimport { useAppliedTextSize } from \"../utils/textSize\";\nimport { useAppliedTheme } from \"../utils/appliedTheme\";\nimport { AppContext } from \"./appContext\";\nimport { TourConfigs_findTourId } from \"./tour/tourConfigs\";\nimport { NavigationContainer, DefaultTheme, type NavigationState } from \"@react-navigation/native\";\nimport { SafeAreaProvider } from \"react-native-safe-area-context\";\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\nimport { navigationRef } from \"../navigation/navigationRef\";\nimport { ScreenRemovalCleanup_subscribe } from \"../navigation/screenRemovalCleanup\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { getCurrentScreenData } from \"../navigation/navigationService\";\nimport { StateContext } from \"../navigation/StateContext\";\nimport { TrackedStateProvider } from \"../navigation/TrackedStateContext\";\nimport { ClickTrackingContext } from \"../utils/clickTracking\";\nimport { AppNavigator } from \"../navigation/AppNavigator\";\nimport type { IScreen } from \"../models/screen\";\n\ndeclare let Rollbar: RB;\ndeclare let __COMMIT_HASH__: string;\n\ninterface IProps {\n  client: Window[\"fetch\"];\n  audio: IAudioInterface;\n  initialState: IState;\n  queue: AsyncQueue;\n  persistence: Persistence;\n  timer: ITimerBridge;\n}\n\nfunction getScreenNameFromNavState(navState: NavigationState | undefined): IScreen {\n  if (!navState) {\n    return \"main\";\n  }\n  const rootRoute = navState.routes[navState.index ?? 0];\n  if (rootRoute.name === \"onboarding\") {\n    const onboardingState = rootRoute.state as NavigationState | undefined;\n    if (!onboardingState) {\n      return \"first\";\n    }\n    return onboardingState.routes[onboardingState.index ?? 0].name as IScreen;\n  }\n  if (rootRoute.name === \"subscription\") {\n    return \"subscription\";\n  }\n  const mainTabsState = rootRoute.state as NavigationState | undefined;\n  if (!mainTabsState) {\n    return \"main\";\n  }\n  const activeTab = mainTabsState.routes[mainTabsState.index ?? 0];\n  const tabStackState = activeTab.state as NavigationState | undefined;\n  if (!tabStackState) {\n    return \"main\";\n  }\n  return tabStackState.routes[tabStackState.index ?? 0].name as IScreen;\n}\n\nexport function AppView(props: IProps): JSX.Element | null {\n  const { client, audio, queue, persistence } = props;\n  const timerBridge = props.timer;\n  const env = useMemo<IEnv>(() => {\n    const mirroring = new WorkoutMirroring();\n    return {\n      service: new Service(client),\n      audio,\n      queue,\n      persistence,\n      navigationRef,\n      getCurrentScreenData,\n      timer: timerBridge,\n      workout: new WorkoutBridge(),\n      watch: new WatchBridge(),\n      keychain: new Keychain(),\n      mirroring,\n      heartRate: new HeartRateStore(mirroring),\n    };\n  }, [client, audio, queue, persistence, timerBridge]);\n  const service = env.service;\n  const reducer = useMemo(\n    () => reducerWrapper(true, persistence, (effects) => NativeEffects_apply(env, effects)),\n    [persistence, env]\n  );\n  const onActions = useMemo(() => defaultOnActions(env), [env]);\n  const [state, dispatch] = useThunkReducer<IState, IAction, IEnv>(reducer, props.initialState, env, onActions);\n  const stateRef = useRef<IState>(state);\n  useEffect(() => {\n    stateRef.current = state;\n  });\n  useEffect(() => {\n    return ScreenRemovalCleanup_subscribe(dispatch);\n  }, []);\n\n  useEffect(() => {\n    if (typeof __DEV__ !== \"undefined\" && __DEV__) {\n      // setTimeout so a CDP-eval caller returns before the heavy login work saturates the JS\n      // thread — evaluating it inline can segfault Hermes' debugger VM\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (globalThis as any).debugLogin = (apiKey?: string) =>\n        new Promise((resolve) => setTimeout(() => dispatch(Thunk_debugTestLogin(apiKey, resolve)), 0));\n    }\n  }, []);\n\n  useAppliedTextSize(state.storage.settings);\n  useAppliedTheme(state.storage.settings);\n\n  useLoopCatcher();\n\n  const [isNavReady, setIsNavReady] = useState(false);\n\n  useOnloadModals(state, dispatch, isNavReady);\n\n  const showCorruptedState = state.errors.corruptedstorage != null;\n  const prevShowCorruptedState = useRef(false);\n  useEffect(() => {\n    if (!isNavReady) {\n      return;\n    }\n    if (showCorruptedState && !prevShowCorruptedState.current) {\n      navigateToModal(\"corruptedStateModal\");\n    }\n    prevShowCorruptedState.current = showCorruptedState;\n  }, [isNavReady, showCorruptedState]);\n\n  const prevShowSignupRequest = useRef(false);\n  useEffect(() => {\n    if (!isNavReady) {\n      return;\n    }\n    if (state.showSignupRequest && !prevShowSignupRequest.current) {\n      navigateToModal(\"signupRequestModal\");\n    }\n    prevShowSignupRequest.current = !!state.showSignupRequest;\n  }, [isNavReady, state.showSignupRequest]);\n\n  useEffect(() => {\n    if (!isNavReady) {\n      return;\n    }\n    if (state.tour) {\n      navigateToModal(\"tourModal\");\n    }\n  }, [isNavReady, state.tour]);\n\n  const checkToursRef = useRef(() => {\n    const tourId = TourConfigs_findTourId(stateRef.current, true);\n    if (tourId && tourId !== stateRef.current.tour?.id) {\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"tour\").record({ id: tourId, enforced: false, screenData: getCurrentScreenData() })],\n        \"Auto-start a tour\"\n      );\n    }\n  });\n  checkToursRef.current = () => {\n    const tourId = TourConfigs_findTourId(stateRef.current, true);\n    if (tourId && tourId !== stateRef.current.tour?.id) {\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"tour\").record({ id: tourId, enforced: false, screenData: getCurrentScreenData() })],\n        \"Auto-start a tour\"\n      );\n    }\n  };\n\n  useEffect(() => {\n    const url =\n      typeof window !== \"undefined\" ? UrlUtils_build(window.location.href, \"https://liftosaur.com\") : undefined;\n    const urlUserId = url != null ? url.searchParams.get(\"userid\") || undefined : undefined;\n    if (state.adminKey != null && urlUserId != null) {\n      const storageId = url != null ? url.searchParams.get(\"storageid\") || undefined : undefined;\n      dispatch(Thunk_fetchStorage(storageId));\n    } else {\n      dispatch(Thunk_sync2({ force: true }));\n    }\n    window.addEventListener(\"click\", (e) => {\n      let button: HTMLElement | undefined;\n      let el: HTMLElement | undefined = e.target as HTMLElement;\n      while (el != null && el.getAttribute != null) {\n        const element = el as HTMLElement;\n        const classes = (element.getAttribute(\"class\") || \"\").split(/\\s+/);\n        if (classes.some((cl) => cl.startsWith(\"ls-\")) || classes.some((cl) => cl.startsWith(\"nm-\"))) {\n          button = el;\n          break;\n        }\n        el = el.parentNode as HTMLElement | undefined;\n      }\n      if (button != null) {\n        const lsName = (button.getAttribute(\"class\") || \"\")\n          .split(/\\s+/)\n          .map((s) => s.trim())\n          .filter((c) => c.startsWith(\"ls-\"))[0];\n        const nsName = (button.getAttribute(\"class\") || \"\")\n          .split(/\\s+/)\n          .map((s) => s.trim())\n          .filter((c) => c.startsWith(\"nm-\"))[0];\n        const name = lsName || nsName;\n        dispatch(Thunk_postevent(\"click-\" + name));\n        if (lsName) {\n          dispatch(Thunk_log(lsName));\n        }\n      }\n    });\n    const userId = state.user?.id || state.storage.tempUserId;\n    Subscriptions_cleanupOutdatedAppleReceipts(dispatch, userId, service, state.storage.subscription);\n    Subscriptions_cleanupOutdatedGooglePurchaseTokens(dispatch, userId, service, state.storage.subscription);\n    dispatch(Thunk_fetchInitial());\n    const onerror = (event: string | ErrorEvent): void => {\n      console.log(\"Error Event\", event);\n      const error = typeof event === \"string\" ? event : \"error\" in event ? event.error : event;\n      console.log(\"Error\", error);\n      const message = error instanceof Error ? error.message : error;\n      if (message != null) {\n        console.log(\"Error Message\", message);\n        Rollbar.error(error, (_err, data) => {\n          const uuid = data?.result?.uuid;\n          if (exceptionIgnores.every((ignore) => !message.includes(ignore))) {\n            service.postEvent({\n              type: \"error\",\n              commithash: __COMMIT_HASH__,\n              userId: userId,\n              timestamp: Date.now(),\n              message: typeof error === \"string\" ? error : error?.error?.message || \"\",\n              stack: typeof error === \"string\" ? \"\" : error?.error?.stack || \"\",\n              rollbar_id: uuid || \"\",\n            });\n          }\n        });\n      }\n    };\n    const onunhandledexception = (event: PromiseRejectionEvent): void => {\n      const reason = event.reason;\n      const message = typeof reason === \"string\" ? reason : reason.message;\n      if (message != null) {\n        console.log(\"Exception Message\", message);\n        Rollbar.error(reason, (_err, data) => {\n          const uuid = data?.result?.uuid;\n          if (exceptionIgnores.every((ignore) => !message.includes(ignore))) {\n            service.postEvent({\n              type: \"error\",\n              userId: userId,\n              timestamp: Date.now(),\n              commithash: __COMMIT_HASH__,\n              message: message || \"\",\n              stack: reason.stack || \"\",\n              rollbar_id: uuid || \"\",\n            });\n          }\n        });\n      }\n    };\n    if (typeof window !== \"undefined\") {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      window.replaceState = (newState: any) => {\n        dispatch({ type: \"ReplaceState\", state: newState });\n      };\n      window.addEventListener(\"error\", onerror);\n      window.addEventListener(\"unhandledrejection\", onunhandledexception);\n    }\n    const currentProgram =\n      state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n    if (currentProgram != null && currentProgram.planner == null) {\n      Dialog_alert(\n        \"You're using OLD STYLE programs, which won't be supported, and WILL STOP WORKING starting from Feb 3, 2025! Please go to Program screen, and migrate the program to the new style\"\n      );\n    }\n\n    return () => {\n      window.removeEventListener(\"error\", onerror);\n      window.removeEventListener(\"unhandledrejection\", onunhandledexception);\n    };\n  }, []);\n\n  const onNavigationStateChange = useCallback((navState: NavigationState | undefined) => {\n    const screenName = getScreenNameFromNavState(navState);\n    document.body.setAttribute(\"data-screen\", screenName);\n    window.scroll(0, 0);\n    checkToursRef.current();\n  }, []);\n\n  const shouldSkipIntro =\n    typeof window !== \"undefined\" && window?.location\n      ? !!UrlUtils_build(window.location.href).searchParams.get(\"skipintro\")\n      : false;\n  const initialScreen = props.initialState.storage.currentProgramId\n    ? \"main\"\n    : shouldSkipIntro\n      ? \"programselect\"\n      : \"first\";\n\n  const progress = Progress_getCurrentProgress(state);\n  const currentScreenName = navigationRef.isReady()\n    ? (navigationRef.getCurrentRoute()?.name as IScreen | undefined)\n    : undefined;\n  const screensWithoutTimer: IScreen[] = [\"subscription\"];\n\n  return (\n    <GestureHandlerRootView style={{ flex: 1 }}>\n      <SafeAreaProvider>\n        <StateContext.Provider value={{ state, dispatch }}>\n          <TrackedStateProvider state={state} dispatch={dispatch}>\n            <ClickTrackingContext.Provider value={dispatch}>\n              <ModalStateProvider>\n                <ActiveSheetHeightProvider>\n                  <AppContext.Provider value={{ service, isApp: true }}>\n                    <NavigationContainer\n                      ref={navigationRef}\n                      onReady={() => setIsNavReady(true)}\n                      onStateChange={onNavigationStateChange}\n                      documentTitle={{ enabled: false }}\n                      theme={{ ...DefaultTheme, colors: { ...DefaultTheme.colors, background: \"transparent\" } }}\n                    >\n                      <AppNavigator initialScreen={initialScreen} />\n                    </NavigationContainer>\n                  </AppContext.Provider>\n                </ActiveSheetHeightProvider>\n              </ModalStateProvider>\n            </ClickTrackingContext.Provider>\n          </TrackedStateProvider>\n        </StateContext.Provider>\n        {progress && currentScreenName && screensWithoutTimer.indexOf(currentScreenName) === -1 && (\n          <RestTimer\n            progress={progress}\n            dispatch={dispatch}\n            settings={state.storage.settings}\n            subscription={state.storage.subscription}\n          />\n        )}\n        <Notification dispatch={dispatch} notification={state.notification} />\n        <Toast toast={state.toast} dispatch={dispatch} />\n      </SafeAreaProvider>\n    </GestureHandlerRootView>\n  );\n}\n","import { createContext, useContext } from \"react\";\nimport { Service } from \"../api/service\";\nimport { IHeartRateStore } from \"../utils/heartRateStore\";\n\nexport interface IAppContext {\n  service: Service;\n  isApp?: boolean;\n  heartRate?: IHeartRateStore;\n}\n\nexport const AppContext = createContext<Partial<IAppContext>>({});\n\nexport function useAppContext(): IAppContext {\n  const ctx = useContext(AppContext);\n  if (!ctx.service) {\n    throw new Error(\"AppContext.service not provided\");\n  }\n  return ctx as IAppContext;\n}\n","import { JSX, ReactNode, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconCloseCircleOutline } from \"./icons/iconCloseCircleOutline\";\n\ninterface IProps {\n  isHidden: boolean;\n  shouldShowClose?: boolean;\n  children?: ReactNode;\n  zIndex?: number;\n  onClose: () => void;\n}\n\nexport function BottomSheet(props: IProps): JSX.Element {\n  const [bottomShift, setBottomShift] = useState(0);\n  const bottomSheetRef = useRef<HTMLDivElement>(null);\n  const [containerRef, setContainerRef] = useState<HTMLElement | null>(null);\n\n  useEffect(() => {\n    setContainerRef(document.getElementById(\"bottomsheet\"));\n  }, []);\n\n  useEffect(() => {\n    if (!props.isHidden) {\n      window.setTimeout(() => document.body.classList.add(`stop-scrolling-bottom-sheet`), 1000);\n    } else {\n      window.setTimeout(() => document.body.classList.remove(\"stop-scrolling-bottom-sheet\"), 1000);\n    }\n    return () => {\n      document.body.classList.remove(\"stop-scrolling-bottom-sheet\");\n    };\n  }, [props.isHidden]);\n\n  useEffect(() => {\n    const bottomSheet = bottomSheetRef.current;\n    const height = bottomSheet?.clientHeight ?? 0;\n    setBottomShift(height);\n  }, []);\n\n  useEffect(() => {\n    setBottomShift(props.isHidden ? (bottomSheetRef.current?.clientHeight ?? 0) : 0);\n  }, [props.isHidden]);\n\n  const element = (\n    <div\n      className={`fixed inset-0 ${!props.zIndex ? \"z-40\" : \"\"} pointer-events-none`}\n      style={{ zIndex: props.zIndex }}\n      data-testid=\"bottom-sheet-container\"\n    >\n      <div\n        data-name=\"overlay\"\n        className={`pointer-events-auto absolute inset-0 bg-text-secondary will-change-transform ${\n          props.isHidden ? \"invisible opacity-0\" : \"visible opacity-50\"\n        }`}\n        style={{\n          transition: \"visibility 0.2s ease-out, opacity 0.2s ease-out\",\n        }}\n        onClick={props.onClose}\n      ></div>\n      <div\n        ref={bottomSheetRef}\n        className={`bottom-sticked absolute bottom-0 left-0 flex w-full overflow-y-auto bg-background-default pointer-events-auto will-change-transform ${\n          props.isHidden ? \"invisible\" : \"visible\"\n        }`}\n        data-testid=\"bottom-sheet\"\n        style={{\n          transition: \"transform 0.2s ease-out, visibility 0.2s\",\n          transform: `translateY(${bottomShift}px)`,\n          borderRadius: \"16px 16px 0 0\",\n          boxShadow: \"0 -5px 15px rgb(0 0 0 / 30%)\",\n        }}\n      >\n        {props.shouldShowClose && (\n          <button\n            data-testid={`bottom-sheet-close`}\n            onClick={props.onClose}\n            className=\"absolute top-0 right-0 z-20 p-2 nm-bottom-sheet-close\"\n          >\n            <IconCloseCircleOutline size={28} />\n          </button>\n        )}\n        <div className=\"flex flex-col w-full safe-area-inset-bottom\" style={{ maxHeight: \"90vh\" }}>\n          <div className=\"z-10 flex items-center justify-center pt-2 bg-background-default\">\n            <div className=\"w-8 rounded-sm bg-text-disabled\" style={{ height: \"3px\" }} />\n          </div>\n          {props.children}\n        </div>\n      </div>\n    </div>\n  );\n\n  if (!containerRef) {\n    return <></>;\n  }\n  return createPortal(element, containerRef);\n}\n","import type { JSX } from \"react\";\nimport { ISettings, ICustomExercise } from \"../types\";\n\nimport { ExercisePickerCustomExercise } from \"./exercisePicker/exercisePickerCustomExercise\";\nimport { IDispatch } from \"../ducks/types\";\nimport { useLensReducer } from \"../utils/useLensReducer\";\n\ninterface IProps {\n  isHidden: boolean;\n  isLoggedIn: boolean;\n  useInlineModals?: boolean;\n  settings: ISettings;\n  exercise: ICustomExercise;\n  dispatch: IDispatch;\n  onChange: (action: \"upsert\" | \"delete\", exercise: ICustomExercise, notes?: string) => void;\n  onClose: () => void;\n}\n\nexport type IBottomSheetCustomExerciseContentProps = Omit<IProps, \"isHidden\">;\n\nexport function BottomSheetCustomExerciseContent(props: IBottomSheetCustomExerciseContentProps): JSX.Element {\n  const [state, dispatch] = useLensReducer(props.exercise, {}, []);\n  return (\n    <ExercisePickerCustomExercise\n      screenStack={[]}\n      settings={props.settings}\n      useInlineModals={props.useInlineModals}\n      showMuscles={true}\n      isLoggedIn={props.isLoggedIn}\n      dispatch={dispatch}\n      originalExercise={props.exercise}\n      exercise={state}\n      onClose={props.onClose}\n      onChange={(action, exercise, notes) => {\n        props.onChange(action, exercise, notes);\n      }}\n      onGoBack={() => {\n        props.onClose();\n      }}\n    />\n  );\n}\n","import type { JSX } from \"react\";\nimport { Text } from \"./primitives/text\";\n\nimport { BottomSheetItem } from \"./bottomSheetItem\";\nimport { IconLink } from \"./icons/iconLink\";\nimport { IconPicture } from \"./icons/iconPicture\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { IconDoc2 } from \"./icons/iconDoc2\";\n\ninterface IProps {\n  isHidden: boolean;\n  isLoggedIn: boolean;\n  isLoadingRevisions: boolean;\n  isAffiliateEnabled: boolean;\n  onExportProgramToLink: () => void;\n  onShareProgramToLink: () => void;\n  onGenerateProgramImage: () => void;\n  onLoadRevisions: () => void;\n  onClose: () => void;\n}\n\nexport type IBottomSheetEditProgramV2ContentProps = Omit<IProps, \"isHidden\">;\n\nexport function BottomSheetEditProgramV2Content(props: IBottomSheetEditProgramV2ContentProps): JSX.Element {\n  return (\n    <>\n      <BottomSheetItem\n        isFirst={true}\n        name=\"copy-link\"\n        className=\"ls-public-share-program\"\n        title=\"Copy Shareable Link to Program\"\n        icon={<IconLink />}\n        description={\n          <Text className=\"text-xs text-text-secondary\">\n            To share it with somebody\n            {props.isAffiliateEnabled ? (\n              <>\n                ,{\" \"}\n                <Text className=\"px-1 text-xs rounded-md border-border-cardyellow bg-background-yellowdark text-text-purple\">\n                  as an affiliate link\n                </Text>\n              </>\n            ) : null}\n            .\n          </Text>\n        }\n        onClick={props.onShareProgramToLink}\n      />\n      <BottomSheetItem\n        name=\"generate-image\"\n        className=\"ls-generate-image\"\n        title=\"Generate program image\"\n        icon={<IconPicture />}\n        description=\"To share it with somebody.\"\n        onClick={props.onGenerateProgramImage}\n      />\n      {props.isLoggedIn && (\n        <>\n          <BottomSheetItem\n            name=\"copy-link\"\n            className=\"ls-private-export-program\"\n            title=\"Copy Private Link to Program\"\n            icon={<IconLink />}\n            description=\"To edit it on your laptop in a browser.\"\n            onClick={props.onExportProgramToLink}\n          />\n          <BottomSheetItem\n            name=\"show-program-revisions\"\n            className=\"ls-show-program-revisions\"\n            title=\"Show program versions\"\n            icon={props.isLoadingRevisions ? <IconSpinner width={17} height={17} /> : <IconDoc2 />}\n            description=\"See history of changes of your program\"\n            onClick={props.onLoadRevisions}\n          />\n        </>\n      )}\n    </>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Switch } from \"./primitives/switch\";\nimport { BottomSheet } from \"./bottomSheet\";\nimport { IHistoryRecord, IProgressUi, ISettings, ISubscription } from \"../types\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { InputNumber2 } from \"./inputNumber2\";\nimport { IDispatch } from \"../ducks/types\";\nimport { InputWeight2 } from \"./inputWeight2\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { lb } from \"lens-shmens\";\nimport { updateProgress } from \"../models/state\";\nimport { Weight_build, Weight_evaluateWeight, Weight_roundConvertTo } from \"../models/weight\";\nimport { Button } from \"./button\";\nimport { FocusedInputFlush_flush } from \"../utils/focusedInputFlush\";\n\ninterface IBottomSheetEditTargetProps {\n  isHidden: boolean;\n  progress: IHistoryRecord;\n  settings: ISettings;\n  editSetModal: IProgressUi[\"editSetModal\"];\n  subscription?: ISubscription;\n  dispatch: IDispatch;\n  onClose: () => void;\n}\n\nexport type IBottomSheetEditTargetContentProps = Omit<IBottomSheetEditTargetProps, \"isHidden\"> & {\n  editSetModal: Required<IProgressUi>[\"editSetModal\"];\n};\n\nexport function BottomSheetEditTargetContent(props: IBottomSheetEditTargetContentProps): JSX.Element {\n  const set = props.editSetModal.set;\n  const [enableRpe, setEnableRpe] = useState(set.rpe != null);\n  const [enableSetTimer, setEnableSetTimer] = useState(set.setTimer != null);\n  const [enableTimer, setEnableTimer] = useState(set.timer != null);\n  const lbSet = lb<IHistoryRecord>().pi(\"ui\", {}).pi(\"editSetModal\").pi(\"set\");\n  const savedRef = useRef(false);\n\n  return (\n    <View className=\"px-gutter pt-2 pb-4\">\n      <Text className=\"py-2 text-base font-semibold text-center\">Edit Set Target</Text>\n      <MenuItemWrapper name=\"edit-set-target-reps\">\n        <View className=\"flex-row items-center py-2\">\n          <View className=\"flex-1\">\n            <Text className=\"text-sm font-semibold\">Reps</Text>\n          </View>\n          <View className=\"flex-row items-center gap-2\">\n            <Text className=\"text-xs text-text-secondary\">Min</Text>\n            <View className=\"mr-2\">\n              <InputNumber2\n                width={2.5}\n                name=\"target-minreps\"\n                onBlur={(value) => {\n                  if (savedRef.current) {\n                    return;\n                  }\n                  updateProgress(props.dispatch, [lbSet.p(\"minReps\").record(value)], \"target-blur-minreps\");\n                }}\n                onInput={(value) => {\n                  if (savedRef.current) {\n                    return;\n                  }\n                  if (value != null && !isNaN(value) && value >= 0) {\n                    updateProgress(props.dispatch, [lbSet.p(\"minReps\").record(value)], \"target-input-minreps\");\n                  }\n                }}\n                value={set.minReps}\n                min={0}\n                max={9999}\n                step={1}\n              />\n            </View>\n            <Text className=\"text-xs text-text-secondary\">Max</Text>\n            <View className=\"mr-3\">\n              <InputNumber2\n                width={2.5}\n                name=\"target-maxreps\"\n                onBlur={(value) => {\n                  if (savedRef.current) {\n                    return;\n                  }\n                  updateProgress(props.dispatch, [lbSet.p(\"reps\").record(value)], \"target-blur-maxreps\");\n                }}\n                onInput={(value) => {\n                  if (savedRef.current) {\n                    return;\n                  }\n                  if (value == null || (!isNaN(value) && value >= 0)) {\n                    updateProgress(props.dispatch, [lbSet.p(\"reps\").record(value)], \"target-input-maxreps\");\n                  }\n                }}\n                value={set.reps}\n                min={0}\n                max={9999}\n                step={1}\n              />\n            </View>\n            <View className=\"flex-row items-center\">\n              <Text className=\"mr-1 text-xs\">AMRAP?</Text>\n              <Switch\n                value={set.isAmrap}\n                testID=\"edit-target-amrap\"\n                data-testid=\"edit-target-amrap\"\n                onValueChange={() => {\n                  updateProgress(props.dispatch, [lbSet.p(\"isAmrap\").record(!set.isAmrap)], \"amrap-checkbox\");\n                }}\n              />\n            </View>\n          </View>\n        </View>\n      </MenuItemWrapper>\n      <MenuItemWrapper name=\"edit-set-target-weight\">\n        <View className=\"flex-row items-center py-2\">\n          <View className=\"flex-1\">\n            <Text className=\"text-sm font-semibold\">Weight</Text>\n          </View>\n          <View className=\"flex-row items-center gap-2\">\n            <View className=\"flex-row items-center mr-3\">\n              <InputWeight2\n                name=\"target-weight\"\n                subscription={props.subscription}\n                exerciseType={props.editSetModal.exerciseType}\n                inputCommitMode=\"blur\"\n                onBlur={(value) => {\n                  if (savedRef.current) {\n                    return;\n                  }\n                  updateProgress(\n                    props.dispatch,\n                    [lbSet.p(\"originalWeight\").record(value ?? Weight_build(0, \"lb\"))],\n                    \"target-blur-weight\"\n                  );\n                }}\n                onInput={(value) => {\n                  if (savedRef.current) {\n                    return;\n                  }\n                  if (value != null) {\n                    updateProgress(\n                      props.dispatch,\n                      [lbSet.p(\"originalWeight\").record(value ?? Weight_build(0, \"lb\"))],\n                      \"target-input-weight\"\n                    );\n                  }\n                }}\n                units={[\"lb\", \"kg\", \"%\"] as const}\n                value={set.originalWeight}\n                max={9999}\n                min={-9999}\n                settings={props.settings}\n              />\n              <Text className=\"ml-1 text-xs text-text-secondary\">\n                {set.originalWeight?.unit ?? props.settings.units}\n              </Text>\n            </View>\n            <View className=\"flex-row items-center\">\n              <Text className=\"mr-1 text-xs\">Ask?</Text>\n              <Switch\n                value={set.askWeight}\n                testID=\"edit-target-ask-weight\"\n                data-testid=\"edit-target-ask-weight\"\n                onValueChange={() => {\n                  updateProgress(props.dispatch, [lbSet.p(\"askWeight\").record(!set.askWeight)], \"ask-weight-checkbox\");\n                }}\n              />\n            </View>\n          </View>\n        </View>\n      </MenuItemWrapper>\n      {!enableRpe ? (\n        <View className=\"font-semibold\">\n          <MenuItemEditable\n            size=\"sm\"\n            type=\"boolean\"\n            name=\"Enable RPE?\"\n            value={set.rpe != null ? \"true\" : \"false\"}\n            onChange={() => {\n              setEnableRpe(true);\n            }}\n          />\n        </View>\n      ) : (\n        <MenuItemWrapper name=\"edit-set-target-rpe\">\n          <View className=\"flex-row items-center py-1\">\n            <View className=\"flex-1\">\n              <Text className=\"text-sm font-semibold\">RPE</Text>\n            </View>\n            <View className=\"flex-row items-center gap-2\">\n              <View className=\"flex-row items-center mr-3\">\n                <InputNumber2\n                  allowDot={true}\n                  width={2.5}\n                  name=\"target-rpe\"\n                  onBlur={(value) => {\n                    if (savedRef.current) {\n                      return;\n                    }\n                    updateProgress(props.dispatch, [lbSet.p(\"rpe\").record(value)], \"target-blur-rpe\");\n                  }}\n                  onInput={(value) => {\n                    if (savedRef.current) {\n                      return;\n                    }\n                    if (value != null && !isNaN(value) && value >= 0) {\n                      updateProgress(props.dispatch, [lbSet.p(\"rpe\").record(value)], \"target-input-rpe\");\n                    }\n                  }}\n                  value={set.rpe}\n                  min={0}\n                  max={10}\n                  step={0.5}\n                />\n              </View>\n              <View className=\"flex-row items-center\">\n                <Text className=\"mr-1 text-xs\">Log?</Text>\n                <Switch\n                  value={set.logRpe}\n                  testID=\"edit-target-log-rpe\"\n                  data-testid=\"edit-target-log-rpe\"\n                  onValueChange={() => {\n                    updateProgress(props.dispatch, [lbSet.p(\"logRpe\").record(!set.logRpe)], \"log-rpe-checkbox\");\n                  }}\n                />\n              </View>\n              <Pressable\n                className=\"p-2\"\n                style={{ marginRight: -8 }}\n                onPress={() => {\n                  setEnableRpe(false);\n                  updateProgress(\n                    props.dispatch,\n                    [lbSet.p(\"logRpe\").record(false), lbSet.p(\"rpe\").record(undefined)],\n                    \"clear-rpe\"\n                  );\n                }}\n              >\n                <IconTrash width={15} height={20} />\n              </Pressable>\n            </View>\n          </View>\n        </MenuItemWrapper>\n      )}\n      {!enableSetTimer ? (\n        <View className=\"font-semibold\">\n          <MenuItemEditable\n            size=\"sm\"\n            type=\"boolean\"\n            name=\"Enable Set Timer?\"\n            value={set.setTimer != null ? \"true\" : \"false\"}\n            onChange={() => {\n              setEnableSetTimer(true);\n              updateProgress(props.dispatch, [lbSet.p(\"setTimer\").record(30)], \"target-enable-set-timer\");\n            }}\n          />\n        </View>\n      ) : (\n        <MenuItemWrapper name=\"edit-set-target-set-timer\">\n          <View className=\"flex-row items-center py-1\">\n            <View className=\"flex-1\">\n              <Text className=\"text-sm font-semibold\">Set Timer</Text>\n            </View>\n            <View className=\"flex-row items-center gap-2\">\n              <View className=\"flex-row items-center mr-3\">\n                <InputNumber2\n                  width={3.5}\n                  name=\"target-set-timer\"\n                  after={() =>\n                    set.isOverflowSetTimer ? <Text className=\"text-xs text-text-secondary\">+</Text> : undefined\n                  }\n                  keyboardAddon={\n                    <View className=\"flex-row items-center py-2\">\n                      <Text className=\"mr-2 text-sm font-semibold\">Count up past target?</Text>\n                      <Switch\n                        value={!!set.isOverflowSetTimer}\n                        testID=\"edit-target-overflow-set-timer\"\n                        data-testid=\"edit-target-overflow-set-timer\"\n                        onValueChange={(value) => {\n                          updateProgress(\n                            props.dispatch,\n                            [lbSet.p(\"isOverflowSetTimer\").record(value || undefined)],\n                            \"overflow-set-timer-checkbox\"\n                          );\n                        }}\n                      />\n                    </View>\n                  }\n                  onBlur={(value) => {\n                    if (savedRef.current) {\n                      return;\n                    }\n                    updateProgress(props.dispatch, [lbSet.p(\"setTimer\").record(value)], \"target-blur-set-timer\");\n                  }}\n                  onInput={(value) => {\n                    if (savedRef.current) {\n                      return;\n                    }\n                    if (value != null && !isNaN(value) && value >= 0) {\n                      updateProgress(props.dispatch, [lbSet.p(\"setTimer\").record(value)], \"target-input-set-timer\");\n                    }\n                  }}\n                  value={set.setTimer}\n                  min={0}\n                  max={9999}\n                  step={15}\n                />\n                <Text className=\"ml-1 text-xs text-text-secondary\">s</Text>\n              </View>\n              <Pressable\n                className=\"p-2\"\n                style={{ marginRight: -8 }}\n                onPress={() => {\n                  setEnableSetTimer(false);\n                  updateProgress(\n                    props.dispatch,\n                    [lbSet.p(\"setTimer\").record(undefined), lbSet.p(\"isOverflowSetTimer\").record(undefined)],\n                    \"target-clear-set-timer\"\n                  );\n                }}\n              >\n                <IconTrash width={15} height={20} />\n              </Pressable>\n            </View>\n          </View>\n        </MenuItemWrapper>\n      )}\n      {!enableTimer ? (\n        <View className=\"font-semibold\">\n          <MenuItemEditable\n            size=\"sm\"\n            type=\"boolean\"\n            name=\"Enable Custom Rest Timer?\"\n            value={set.timer ? \"true\" : \"false\"}\n            onChange={() => {\n              setEnableTimer(true);\n            }}\n          />\n        </View>\n      ) : (\n        <MenuItemWrapper name=\"edit-set-target-timer\">\n          <View className=\"flex-row items-center py-1\">\n            <View className=\"flex-1\">\n              <Text className=\"text-sm font-semibold\">Rest Timer</Text>\n            </View>\n            <View className=\"flex-row items-center gap-2\">\n              <View className=\"flex-row items-center mr-3\">\n                <InputNumber2\n                  width={2.5}\n                  name=\"target-timer\"\n                  onBlur={(value) => {\n                    if (savedRef.current) {\n                      return;\n                    }\n                    updateProgress(props.dispatch, [lbSet.p(\"timer\").record(value)], \"target-blur-timer\");\n                  }}\n                  onInput={(value) => {\n                    if (savedRef.current) {\n                      return;\n                    }\n                    if (value != null && !isNaN(value) && value >= 0) {\n                      updateProgress(props.dispatch, [lbSet.p(\"timer\").record(value)], \"target-input-timer\");\n                    }\n                  }}\n                  value={set.timer}\n                  min={0}\n                  max={600}\n                  step={5}\n                />\n                <Text className=\"ml-1 text-xs text-text-secondary\">s</Text>\n              </View>\n              <Pressable\n                className=\"p-2\"\n                style={{ marginRight: -8 }}\n                onPress={() => {\n                  setEnableTimer(false);\n                  updateProgress(props.dispatch, [lbSet.p(\"timer\").record(undefined)], \"target-clear-timer\");\n                }}\n              >\n                <IconTrash width={15} height={20} />\n              </Pressable>\n            </View>\n          </View>\n        </MenuItemWrapper>\n      )}\n      <View className=\"my-4\">\n        <Button\n          kind=\"purple\"\n          name=\"edit-set-target-save\"\n          data-testid=\"edit-set-target-save\"\n          testID=\"edit-set-target-save\"\n          className=\"w-full\"\n          onClick={() => {\n            FocusedInputFlush_flush();\n            savedRef.current = true;\n            const entryIndex = props.editSetModal.entryIndex;\n            const setIndex = props.editSetModal.setIndex ?? 0;\n            const exerciseType = props.editSetModal.exerciseType;\n            const settings = props.settings;\n            updateProgress(\n              props.dispatch,\n              [\n                lb<IHistoryRecord>().recordModify((progress) => {\n                  const freshSet = progress.ui?.editSetModal?.set ?? progress.entries[entryIndex]?.sets[setIndex];\n                  if (!freshSet) {\n                    return progress;\n                  }\n                  const evaluatedWeight = freshSet.originalWeight\n                    ? Weight_evaluateWeight(freshSet.originalWeight, exerciseType ?? { id: \"squat\" }, settings)\n                    : undefined;\n                  const weight = evaluatedWeight\n                    ? Weight_roundConvertTo(evaluatedWeight, settings, evaluatedWeight.unit, exerciseType)\n                    : undefined;\n                  const reps = freshSet.minReps != null && freshSet.reps == null ? freshSet.minReps : freshSet.reps;\n                  const minReps = freshSet.minReps != null && freshSet.reps == null ? undefined : freshSet.minReps;\n                  const newSet = { ...freshSet, weight, reps, minReps };\n                  const newEntries = progress.entries.map((entry, i) => {\n                    if (i !== entryIndex) {\n                      return entry;\n                    }\n                    const newSets = entry.sets.map((s, j) => (j === setIndex ? newSet : s));\n                    return { ...entry, sets: newSets };\n                  });\n                  return {\n                    ...progress,\n                    entries: newEntries,\n                    ui: { ...(progress.ui ?? {}), editSetModal: undefined },\n                  };\n                }),\n              ],\n              \"save-target\"\n            );\n          }}\n        >\n          Save\n        </Button>\n      </View>\n    </View>\n  );\n}\n\nexport const BottomSheetEditTarget = (props: IBottomSheetEditTargetProps): JSX.Element => {\n  const editSetModal = props.editSetModal;\n  return (\n    <BottomSheet shouldShowClose={true} onClose={props.onClose} isHidden={props.isHidden}>\n      {editSetModal && (\n        <BottomSheetEditTargetContent\n          editSetModal={editSetModal}\n          subscription={props.subscription}\n          settings={props.settings}\n          progress={props.progress}\n          dispatch={props.dispatch}\n          onClose={props.onClose}\n        />\n      )}\n    </BottomSheet>\n  );\n};\n","import type { JSX } from \"react\";\n\ninterface IProps {\n  title: string;\n  name: string;\n  icon?: JSX.Element;\n  isFirst?: boolean;\n  description?: string | JSX.Element;\n  className?: string;\n  onClick: () => void;\n}\n\nexport function BottomSheetItem(props: IProps): JSX.Element {\n  return (\n    <button\n      data-testid={`bottom-sheet-${props.name}`}\n      style={{ outline: \"none\" }}\n      className={`block text-base w-full text-left ${!props.isFirst ? \"border-t border-border-neutral mt-4\" : \"\"} ${\n        props.className\n      } nm-${props.name}`}\n      onClick={props.onClick}\n    >\n      <div className={`flex items-center ${!props.isFirst ? \"pt-4\" : \"\"}`}>\n        {props.icon && <div>{props.icon}</div>}\n        <div className=\"flex-1 pl-3\">{props.title}</div>\n      </div>\n      {props.description && <div className=\"pt-2 text-xs text-text-secondary\">{props.description}</div>}\n    </button>\n  );\n}\n","import { JSX, useRef } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { MonthCalendar, IMonthCalendarRef } from \"./monthCalendar\";\nimport { LinkButton } from \"./linkButton\";\nimport { IHistoryRecord } from \"../types\";\nimport { IPersonalRecords } from \"../models/history\";\nimport { SheetDragHandle } from \"../navigation/TransparentModal\";\n\nexport interface IBottomSheetMonthCalendarContentProps {\n  firstDayOfWeeks: number[];\n  history: IHistoryRecord[];\n  startWeekFromMonday?: boolean;\n  selectedFirstDayOfWeek: number;\n  prs: IPersonalRecords;\n  visibleRecords: number;\n  onClick: (historyRecord: IHistoryRecord) => void;\n}\n\nexport function BottomSheetMonthCalendarContent(props: IBottomSheetMonthCalendarContentProps): JSX.Element {\n  const monthCalendarRef = useRef<IMonthCalendarRef>(null);\n  const dayNames = props.startWeekFromMonday\n    ? [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"]\n    : [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"];\n  const selectedIndex = props.firstDayOfWeeks.findIndex((date) => date === props.selectedFirstDayOfWeek);\n  return (\n    <>\n      <SheetDragHandle>\n        <View collapsable={false}>\n          <View className=\"px-3 pt-4\">\n            <LinkButton name=\"this-week\" onPress={() => monthCalendarRef.current?.scrollToSelected()}>\n              This week\n            </LinkButton>\n          </View>\n          <View className=\"flex-row justify-around py-2 mx-3 border-b border-background-subtle\">\n            {dayNames.map((day, i) => (\n              <View key={i} className=\"items-center justify-center w-scaled-10 h-scaled-10\">\n                <Text className=\"font-medium text-text-secondary\">{day}</Text>\n              </View>\n            ))}\n          </View>\n        </View>\n      </SheetDragHandle>\n      <MonthCalendar\n        ref={monthCalendarRef}\n        visibleRecords={props.visibleRecords}\n        selectedFirstDayOfWeekIndex={selectedIndex}\n        startWeekFromMonday={props.startWeekFromMonday}\n        prs={props.prs}\n        firstDayOfWeeks={props.firstDayOfWeeks}\n        history={props.history}\n        onClick={props.onClick}\n      />\n    </>\n  );\n}\n","import type { JSX } from \"react\";\nimport { ISettings, IMuscle, IScreenMuscle } from \"../types\";\nimport { Button } from \"./button\";\nimport { ExercisePickerOptionsMuscles } from \"./exercisePicker/exercisePickerOptionsMuscles\";\nimport { BottomSheetOrModal } from \"./bottomSheetOrModal\";\nimport { Muscle_getMusclesFromScreenMuscle } from \"../models/muscle\";\n\ninterface IExercisePickerCustomExerciseContentProps {\n  settings: ISettings;\n  onSelect: (muscle: IMuscle) => void;\n  muscleGroup: IScreenMuscle;\n  onClose: () => void;\n}\n\nexport function BottomSheetMuscleGroupMusclePicker(props: IExercisePickerCustomExerciseContentProps): JSX.Element {\n  const muscles = Muscle_getMusclesFromScreenMuscle(props.muscleGroup, props.settings);\n  return (\n    <BottomSheetOrModal shouldShowClose={true} onClose={props.onClose} isHidden={false} zIndex={60}>\n      <div className=\"flex flex-col h-full px-gutter py-2\" style={{ marginTop: \"-0.5rem\" }}>\n        <h3 className=\"pt-2 pb-3 text-base font-semibold text-center\">Choose Muscles</h3>\n        <div className=\"flex-1 overflow-y-auto\">\n          <div className=\"pb-4\">\n            <ExercisePickerOptionsMuscles\n              dontGroup={true}\n              settings={props.settings}\n              selectedValues={muscles}\n              onSelect={props.onSelect}\n            />\n          </div>\n        </div>\n        <div className=\"py-2 bg-background-default\">\n          <Button\n            kind=\"purple\"\n            data-testid=\"done-selecting-muscles\"\n            testID=\"done-selecting-muscles\"\n            name=\"done-selecting-muscles\"\n            className=\"w-full\"\n            buttonSize=\"md\"\n            onClick={props.onClose}\n          >\n            Done\n          </Button>\n        </div>\n      </div>\n    </BottomSheetOrModal>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, Pressable, ScrollView } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  IExercise,\n  Exercise_defaultTargetMuscles,\n  Exercise_defaultSynergistMuscleMultipliers,\n  Exercise_toKey,\n  Exercise_get,\n} from \"../models/exercise\";\nimport { IExerciseType, IMuscle, IMuscleMultiplier, ISettings } from \"../types\";\nimport { Button } from \"./button\";\nimport { Nux } from \"./nux\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { MuscleImage } from \"./muscleImage\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { IconClose2 } from \"./icons/iconClose2\";\nimport { MathUtils_clamp, MathUtils_roundTo005 } from \"../utils/math\";\nimport { LinkButton } from \"./linkButton\";\nimport { useModal } from \"../navigation/ModalStateContext\";\nimport { Muscle_getScreenMusclesFromMuscle, Muscle_getMuscleGroupName } from \"../models/muscle\";\nimport { ObjectUtils_keys, ObjectUtils_clone, ObjectUtils_isEqual } from \"../utils/object\";\nimport { BottomSheetOrModal } from \"./bottomSheetOrModal\";\nimport { SheetDragHandle } from \"../navigation/TransparentModal\";\n\ninterface IBottomSheetMusclesOverrideProps {\n  exerciseType: IExerciseType;\n  settings: ISettings;\n  helps: string[];\n  isHidden: boolean;\n  onNewExerciseData: (exerciseData: Partial<ISettings[\"exerciseData\"]>) => void;\n  onClose: () => void;\n  dispatch?: IDispatch;\n}\n\nexport function getMultiplierValue(multiplier: number | string | undefined): number {\n  if (multiplier == null) {\n    return 0;\n  } else {\n    let value = 0;\n    if (typeof multiplier === \"string\") {\n      const parsed = parseFloat(multiplier);\n      value = isNaN(parsed) ? 0 : parsed;\n    } else {\n      value = multiplier;\n    }\n    return MathUtils_clamp(MathUtils_roundTo005(value), 0, 1);\n  }\n}\n\nexport type IMuscleAndMultiplierOpt = Omit<IMuscleMultiplier, \"multiplier\"> & {\n  multiplier: number | string | undefined;\n};\n\nexport function getDefaultMusclesAndMultipliers(exercise: IExercise, settings: ISettings): IMuscleAndMultiplierOpt[] {\n  const targets = Exercise_defaultTargetMuscles(exercise, settings).map((m) => ({ muscle: m, multiplier: 1 }));\n  const synergists = Exercise_defaultSynergistMuscleMultipliers(exercise, settings);\n  return CollectionUtils_sort([...targets, ...synergists], (a, b) => a.muscle.localeCompare(b.muscle));\n}\n\nexport function getDefaultMusclesAndMultipliersAsObject(\n  exercise: IExercise,\n  settings: ISettings\n): Partial<Record<string, number>> {\n  const result: Partial<Record<string, number>> = {};\n  for (const mm of getDefaultMusclesAndMultipliers(exercise, settings)) {\n    result[mm.muscle] = getMultiplierValue(mm.multiplier);\n  }\n  return result;\n}\n\nexport function getInitialMusclesAndMultipliers(exercise: IExercise, settings: ISettings): IMuscleAndMultiplierOpt[] {\n  const muscleMultipliers = settings.exerciseData[Exercise_toKey(exercise)]?.muscleMultipliers;\n  if (muscleMultipliers != null) {\n    return (ObjectUtils_keys(muscleMultipliers) as IMuscle[]).map((muscle) => ({\n      muscle,\n      multiplier: muscleMultipliers[muscle],\n    }));\n  } else {\n    return getDefaultMusclesAndMultipliers(exercise, settings);\n  }\n}\n\nexport type IBottomSheetMusclesOverrideContentProps = Omit<IBottomSheetMusclesOverrideProps, \"isHidden\">;\n\nexport function BottomSheetMusclesOverrideContent(props: IBottomSheetMusclesOverrideContentProps): JSX.Element {\n  const exercise = Exercise_get(props.exerciseType, props.settings.exercises);\n  const [musclesAndMultipliers, setMusclesAndMultipliers] = useState(\n    getInitialMusclesAndMultipliers(exercise, props.settings)\n  );\n\n  const openMusclePicker = useModal(\"exerciseMusclesPickerModal\", (selectedMuscles) => {\n    setMusclesAndMultipliers((mms) => {\n      const existing = new Map(mms.map((mm) => [mm.muscle, mm]));\n      const next = selectedMuscles.map((muscle) => existing.get(muscle) ?? { muscle, multiplier: 1 });\n      return CollectionUtils_sort(next, (a, b) => a.muscle.localeCompare(b.muscle));\n    });\n  });\n\n  const handleSave = (): void => {\n    const muscleMultipliers: Partial<Record<string, number>> = {};\n    for (const mm of musclesAndMultipliers) {\n      muscleMultipliers[mm.muscle] = getMultiplierValue(mm.multiplier);\n    }\n    const exerciseData = props.settings.exerciseData;\n    const newExerciseData = ObjectUtils_clone(exerciseData);\n    if (ObjectUtils_isEqual(muscleMultipliers, getDefaultMusclesAndMultipliersAsObject(exercise, props.settings))) {\n      delete newExerciseData[Exercise_toKey(exercise)];\n    } else {\n      const ed = newExerciseData[Exercise_toKey(exercise)] || {};\n      ed.muscleMultipliers = muscleMultipliers;\n      newExerciseData[Exercise_toKey(exercise)] = ed;\n    }\n    props.onNewExerciseData(newExerciseData);\n    props.onClose();\n  };\n\n  return (\n    <View className=\"flex-1\" style={{ marginTop: -12 }}>\n      <SheetDragHandle>\n        <View className=\"flex-row items-center pt-0 pb-4 mt-2\">\n          <Pressable\n            className=\"px-gutter py-2\"\n            hitSlop={12}\n            data-testid=\"muscle-overrides-close\"\n            testID=\"muscle-overrides-close\"\n            onPress={props.onClose}\n          >\n            <IconClose2 size={22} />\n          </Pressable>\n          <View className=\"flex-1\" />\n          <View className=\"px-gutter\">\n            <Button\n              kind=\"purple\"\n              buttonSize=\"md\"\n              name=\"save-muscle-overrides\"\n              data-testid=\"save-muscle-overrides\"\n              onClick={handleSave}\n            >\n              Save\n            </Button>\n          </View>\n          <View className=\"absolute top-0 left-0 right-0 items-center\" pointerEvents=\"box-none\">\n            <View>\n              <Text className=\"font-semibold\">Override Muscles</Text>\n              <View className=\"items-center\">\n                <LinkButton\n                  data-testid=\"toggle-muscle-overrides\"\n                  testID=\"toggle-muscle-overrides\"\n                  name=\"toggle-muscle-overrides\"\n                  className=\"text-xs\"\n                  onClick={() =>\n                    openMusclePicker({\n                      title: \"Toggle Muscles\",\n                      name: \"muscle-override-picker\",\n                      selectedMuscles: musclesAndMultipliers.map((mm) => mm.muscle),\n                    })\n                  }\n                >\n                  + Add Muscles\n                </LinkButton>\n              </View>\n            </View>\n          </View>\n        </View>\n      </SheetDragHandle>\n      <ScrollView\n        className=\"flex-1 pb-4\"\n        keyboardShouldPersistTaps=\"handled\"\n        keyboardDismissMode=\"interactive\"\n        automaticallyAdjustKeyboardInsets\n      >\n        <View className=\"px-gutter\">\n          <MusclesOverrideList\n            musclesAndMultipliers={musclesAndMultipliers}\n            setMusclesAndMultipliers={setMusclesAndMultipliers}\n            helps={props.helps}\n            settings={props.settings}\n            dispatch={props.dispatch}\n          />\n        </View>\n      </ScrollView>\n    </View>\n  );\n}\n\nexport function MusclesOverrideList(props: {\n  musclesAndMultipliers: IMuscleAndMultiplierOpt[];\n  setMusclesAndMultipliers: React.Dispatch<React.SetStateAction<IMuscleAndMultiplierOpt[]>>;\n  helps: string[];\n  settings: ISettings;\n  dispatch?: IDispatch;\n}): JSX.Element {\n  const { musclesAndMultipliers, setMusclesAndMultipliers } = props;\n  return (\n    <>\n      <View style={{ maxWidth: 640 }}>\n        <Nux id=\"muscle-override-help\" helps={props.helps} dispatch={props.dispatch}>\n          <View>\n            <Text className=\"text-xs\">\n              Here you can override the muscles for this exercise. This affects how the volume / number of sets is\n              calculated for this exercise.\n            </Text>\n            <Text className=\"text-xs\">\n              For each muscle, you can set a multiplier - from <Text className=\"text-xs font-bold\">0</Text> to{\" \"}\n              <Text className=\"text-xs font-bold\">1</Text>. If it's 1 - it's a{\" \"}\n              <Text className=\"text-xs font-bold\">target muscle</Text>, and we count each set as a full one when we\n              calculate the volume. If it's less 1 - it's a <Text className=\"text-xs font-bold\">synergist</Text> muscle,\n              and we apply the specified multiplier to the number of sets.\n            </Text>\n            <Text className=\"text-xs\">\n              These multipliers takes precedence over the default target/synergist multiplier.\n            </Text>\n          </View>\n        </Nux>\n      </View>\n      {musclesAndMultipliers.map((mm) => {\n        const muscleGroup = Muscle_getScreenMusclesFromMuscle(mm.muscle, props.settings)[0];\n        if (muscleGroup == null) {\n          return null;\n        }\n        return (\n          <MenuItemWrapper key={mm.muscle} name={`muscle-override-${StringUtils_dashcase(mm.muscle)}`}>\n            <View className=\"py-2\">\n              <View className=\"flex-row items-center gap-2\">\n                <View>\n                  <MuscleImage muscle={mm.muscle} size={61} />\n                </View>\n                <View className=\"flex-1\">\n                  <Text className=\"leading-scaled-5\">{mm.muscle}</Text>\n                  <Text className=\"text-xs text-text-secondary\">\n                    {Muscle_getMuscleGroupName(muscleGroup, props.settings)}\n                  </Text>\n                </View>\n                <View className=\"w-scaled-12\">\n                  <TextInput\n                    testID={`muscle-multiplier-${StringUtils_dashcase(mm.muscle)}-input`}\n                    data-testid={`muscle-multiplier-${StringUtils_dashcase(mm.muscle)}-input`}\n                    className=\"px-2 py-2 text-base text-center border rounded-md bg-background-default border-border-prominent text-text-primary\"\n                    keyboardType=\"decimal-pad\"\n                    value={mm.multiplier != null ? String(mm.multiplier) : \"\"}\n                    onChangeText={(text) => {\n                      setMusclesAndMultipliers((mms) =>\n                        mms.map((x) => (x.muscle === mm.muscle ? { ...x, multiplier: text } : x))\n                      );\n                    }}\n                    onBlur={() => {\n                      const finalValue = getMultiplierValue(mm.multiplier);\n                      setMusclesAndMultipliers((mms) =>\n                        mms.map((x) => (x.muscle === mm.muscle ? { ...x, multiplier: finalValue } : x))\n                      );\n                    }}\n                  />\n                </View>\n                <View className=\"ml-4\">\n                  <Pressable\n                    data-testid={`remove-muscle-override-${StringUtils_dashcase(mm.muscle)}`}\n                    testID={`remove-muscle-override-${StringUtils_dashcase(mm.muscle)}`}\n                    onPress={() => {\n                      setMusclesAndMultipliers((mms) => mms.filter((x) => x.muscle !== mm.muscle));\n                    }}\n                  >\n                    <IconTrash />\n                  </Pressable>\n                </View>\n              </View>\n            </View>\n          </MenuItemWrapper>\n        );\n      })}\n    </>\n  );\n}\n\nexport function BottomSheetMusclesOverride(props: IBottomSheetMusclesOverrideProps): JSX.Element {\n  return (\n    <BottomSheetOrModal shouldShowClose={true} onClose={props.onClose} isHidden={props.isHidden}>\n      <BottomSheetMusclesOverrideContent\n        exerciseType={props.exerciseType}\n        settings={props.settings}\n        helps={props.helps}\n        onNewExerciseData={props.onNewExerciseData}\n        onClose={props.onClose}\n        dispatch={props.dispatch}\n      />\n    </BottomSheetOrModal>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { IProgram, ISettings, IStats } from \"../types\";\nimport {\n  emptyProgramId,\n  Program_evaluate,\n  Program_getProgramDay,\n  Program_nextHistoryRecord,\n  Program_isEmpty,\n} from \"../models/program\";\nimport { HistoryRecordView } from \"./historyRecord\";\nimport { IDispatch } from \"../ducks/types\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconSwap } from \"./icons/iconSwap\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { IconPlus2 } from \"./icons/iconPlus2\";\nimport { Thunk_startProgramDay } from \"../ducks/thunks\";\nimport { navigateToModal } from \"../navigation/navigationService\";\n\nexport interface IBottomSheetNextWorkoutContentProps {\n  currentProgram?: IProgram;\n  allPrograms: IProgram[];\n  settings: ISettings;\n  stats: IStats;\n  dispatch: IDispatch;\n  onClose: () => void;\n}\n\nexport function BottomSheetNextWorkoutContent(props: IBottomSheetNextWorkoutContentProps): JSX.Element {\n  const insets = useSafeAreaInsets();\n  const evaluatedProgram = props.currentProgram ? Program_evaluate(props.currentProgram, props.settings) : undefined;\n\n  const programDay = evaluatedProgram ? Program_getProgramDay(evaluatedProgram, evaluatedProgram.nextDay) : undefined;\n  const nextHistoryRecord = props.currentProgram\n    ? Program_nextHistoryRecord(props.currentProgram, props.settings, props.stats)\n    : undefined;\n\n  const doesProgressNotMatchProgram =\n    nextHistoryRecord &&\n    (nextHistoryRecord.programId !== props.currentProgram?.id ||\n      nextHistoryRecord.day !== props.currentProgram.nextDay);\n\n  return (\n    <View>\n      <Text className=\"pb-4 text-lg font-semibold text-center\">New Workout</Text>\n      {doesProgressNotMatchProgram && (\n        <Text className=\"mb-1 text-xs text-center text-text-secondary\">\n          You currently have ongoing workout. Finish it first to see newly chosen program or a different day.\n        </Text>\n      )}\n      {Program_isEmpty(props.currentProgram) && (\n        <Text className=\"mb-1 text-xs text-center text-text-secondary\">No program currently selected.</Text>\n      )}\n      {programDay && nextHistoryRecord && (\n        <HistoryRecordView\n          historyRecord={nextHistoryRecord}\n          programDay={programDay}\n          isOngoing={false}\n          settings={props.settings}\n          dispatch={props.dispatch}\n        />\n      )}\n      <View\n        className=\"flex-row flex-wrap justify-around pt-4 gap-x-3 gap-y-2 bg-background-default\"\n        style={{ paddingBottom: insets.bottom }}\n      >\n        <LinkButton\n          name=\"change-next-day\"\n          data-testid=\"change-next-day\"\n          testID=\"change-next-day\"\n          onClick={() => navigateToModal(\"changeNextDayModal\")}\n        >\n          <View className=\"flex-row items-center\">\n            <IconSwap color={Tailwind_colors().blue[400]} size={16} />\n            <Text className=\"pl-1 text-sm font-bold underline text-text-link\">Select next workout</Text>\n          </View>\n        </LinkButton>\n        <LinkButton\n          name=\"start-empty-workout\"\n          data-testid=\"start-empty-workout\"\n          testID=\"start-empty-workout\"\n          onClick={() => {\n            props.dispatch(Thunk_startProgramDay(emptyProgramId));\n          }}\n        >\n          <View className=\"flex-row items-center\">\n            <IconPlus2 color={Tailwind_colors().blue[400]} size={16} />\n            <Text className=\"pl-1 text-sm font-bold underline text-text-link\">Ad-Hoc Workout</Text>\n          </View>\n        </LinkButton>\n      </View>\n    </View>\n  );\n}\n","import { JSX, ReactNode, useContext } from \"react\";\nimport { AppContext } from \"./appContext\";\nimport { BottomSheet } from \"./bottomSheet\";\nimport { Modal } from \"./modal\";\n\ninterface IProps {\n  isHidden: boolean;\n  shouldShowClose?: boolean;\n  children: ReactNode;\n  zIndex?: number;\n  onClose: () => void;\n}\n\nexport function BottomSheetOrModal(props: IProps): JSX.Element {\n  const appContext = useContext(AppContext);\n  return appContext.isApp ? <BottomSheet {...props} /> : <Modal {...props} />;\n}\n","import { JSX, Fragment } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Progress_getSupersetGroups } from \"../models/progress\";\nimport { IHistoryRecord, IHistoryEntry, ISettings } from \"../types\";\nimport { ObjectUtils_entriesNonnull } from \"../utils/object\";\nimport { Button } from \"./button\";\nimport { Exercise_get, Exercise_fullName } from \"../models/exercise\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport {\n  PlannerNames_supersetNameMessage,\n  PlannerNames_supersetNamePattern,\n} from \"../pages/planner/models/plannerNames\";\nimport { useModal } from \"../navigation/ModalStateContext\";\n\nexport interface IBottomSheetWorkoutSupersetContentProps {\n  onSelect: (name: string | undefined) => void;\n  progress: IHistoryRecord;\n  entry: IHistoryEntry;\n  settings: ISettings;\n  onClose: () => void;\n}\n\nexport function BottomSheetWorkoutSupersetContent(props: IBottomSheetWorkoutSupersetContentProps): JSX.Element {\n  const supersetGroups = Progress_getSupersetGroups(props.progress.entries);\n\n  const openTextInput = useModal(\"textInputModal\", (name) => {\n    props.onSelect(name);\n    props.onClose();\n  });\n\n  return (\n    <View className=\"flex-1 bg-background-default\">\n      <View className=\"pb-2\">\n        <Text className=\"text-lg font-semibold text-center\">Select Superset Group</Text>\n      </View>\n      <View className=\"pb-4\">\n        <Pressable\n          data-testid=\"superset-group-none\"\n          testID=\"superset-group-none\"\n          className={`${props.entry.superset == null ? \"bg-background-cardpurple\" : \"\"} px-4 py-1 border-b border-border-neutral`}\n          style={{ minHeight: 48, justifyContent: \"center\" }}\n          onPress={() => {\n            props.onSelect(undefined);\n            props.onClose();\n          }}\n        >\n          <Text className=\"font-bold\">None</Text>\n        </Pressable>\n        {ObjectUtils_entriesNonnull(supersetGroups).map(([name, entries]) => {\n          const isSelected = props.entry.superset === name;\n          return (\n            <Pressable\n              key={name}\n              data-testid={`superset-group-${StringUtils_dashcase(name)}`}\n              testID={`superset-group-${StringUtils_dashcase(name)}`}\n              className={`${isSelected ? \"bg-background-cardpurple\" : \"\"} px-4 py-1 border-b border-border-neutral`}\n              style={{ minHeight: 48, justifyContent: \"center\" }}\n              onPress={() => {\n                props.onSelect(name);\n                props.onClose();\n              }}\n            >\n              <Text className=\"text-base font-bold\">{name}</Text>\n              {entries.length > 0 && (\n                <Text className=\"text-xs text-text-secondary\">\n                  {entries.map((e, i) => {\n                    const exercise = Exercise_get(e.exercise, props.settings.exercises);\n                    return (\n                      <Fragment key={`${e.exercise.id}_${e.exercise.equipment}`}>\n                        {i !== 0 ? \", \" : \"\"}\n                        <Text className=\"font-bold\">{Exercise_fullName(exercise, props.settings)}</Text>\n                      </Fragment>\n                    );\n                  })}\n                </Text>\n              )}\n            </Pressable>\n          );\n        })}\n      </View>\n      <View className=\"w-full px-gutter pt-2 pb-2\">\n        <Button\n          className=\"w-full\"\n          name=\"superset-create-group\"\n          kind=\"purple\"\n          buttonSize=\"lg\"\n          onClick={() => {\n            openTextInput({\n              title: \"Enter new group name\",\n              inputLabel: \"Name\",\n              placeholder: \"My Group Name\",\n              submitLabel: \"Add\",\n              dataCyPrefix: \"modal-new-superset\",\n              pattern: PlannerNames_supersetNamePattern,\n              patternMessage: PlannerNames_supersetNameMessage,\n            });\n          }}\n          data-testid=\"superset-create-group\"\n          testID=\"superset-create-group\"\n        >\n          Create New Group\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, memo, useState, useCallback, useMemo } from \"react\";\nimport { useTimedMemo } from \"../utils/useTimedMemo\";\nimport { usePerfScrollMarkers } from \"../utils/usePerfScrollMarkers\";\nimport { View, Pressable } from \"react-native\";\nimport { LegendList } from \"@legendapp/list\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IProgram, ISettings } from \"../types\";\nimport {\n  builtinProgramAges,\n  builtinProgramDurations,\n  builtinProgramFrequencies,\n  builtinProgramGoals,\n} from \"../models/builtinPrograms\";\nimport { IProgramFilter, IProgramSort, ProgramFilter_sort, ProgramFilter_filter } from \"../utils/programFilter\";\nimport { SelectLink } from \"./selectLink\";\nimport { ExerciseImageUtils_exists } from \"../models/exerciseImage\";\nimport { IProgramIndexEntry, Program_exerciseRangeFormat } from \"../models/program\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { IconCalendarSmall } from \"./icons/iconCalendarSmall\";\nimport { IconKettlebellSmall } from \"./icons/iconKettlebellSmall\";\nimport { IconWatch } from \"./icons/iconWatch\";\nimport { equipmentName } from \"../models/exercise\";\nimport { Equipment_currentEquipment } from \"../models/equipment\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { SimpleMarkdown } from \"./simpleMarkdown\";\nimport { useRemScale } from \"../utils/useRem\";\n\ninterface IProps {\n  programs: IProgram[];\n  programsIndex: IProgramIndexEntry[];\n  hasCustomPrograms: boolean;\n  settings: ISettings;\n  dispatch: IDispatch;\n  search?: string;\n}\n\nexport function BuiltinProgramsList(props: IProps): JSX.Element {\n  const [filter, setFilter] = useState<IProgramFilter>({});\n  const [sort, setSort] = useState<IProgramSort>(undefined);\n  const searchLower = (props.search || \"\").toLowerCase();\n  const filtered = useTimedMemo(\n    \"builtinPrograms.filtered\",\n    () => ProgramFilter_sort(ProgramFilter_filter(props.programsIndex, filter), sort),\n    [props.programsIndex, filter, sort]\n  );\n  const entries = useTimedMemo(\n    \"builtinPrograms.searched\",\n    () => (searchLower ? filtered.filter((e) => e.name.toLowerCase().includes(searchLower)) : filtered),\n    [filtered, searchLower]\n  );\n\n  const { settings, hasCustomPrograms } = props;\n  const renderItem = useCallback(\n    ({ item }: { item: IProgramIndexEntry }) => (\n      <BuiltInProgram entry={item} settings={settings} hasCustomPrograms={hasCustomPrograms} />\n    ),\n    [settings, hasCustomPrograms]\n  );\n\n  const keyExtractor = useCallback((item: IProgramIndexEntry) => item.id, []);\n\n  const listHeader = (\n    <View className=\"pt-4\">\n      <Text className=\"pb-4\">\n        I've been lifting for{\" \"}\n        <SelectLink\n          name=\"builtin-filter-age\"\n          className=\"font-semibold\"\n          values={builtinProgramAges}\n          onChange={(age) => setFilter({ ...filter, age })}\n          emptyLabel=\"any time\"\n          value={filter.age}\n        />\n        . I can work out{\" \"}\n        <SelectLink\n          name=\"builtin-filter-frequency\"\n          className=\"font-semibold\"\n          values={builtinProgramFrequencies}\n          onChange={(frequency) => setFilter({ ...filter, frequency })}\n          emptyLabel=\"any number days a week\"\n          value={filter.frequency}\n        />{\" \"}\n        for{\" \"}\n        <SelectLink\n          name=\"builtin-filter-duration\"\n          className=\"font-semibold\"\n          values={builtinProgramDurations}\n          onChange={(duration) => setFilter({ ...filter, duration })}\n          emptyLabel=\"any time\"\n          value={filter.duration}\n        />\n        . My goal is{\" \"}\n        <SelectLink\n          name=\"builtin-filter-goal\"\n          className=\"font-semibold\"\n          values={builtinProgramGoals}\n          onChange={(goal) => setFilter({ ...filter, goal })}\n          emptyLabel=\"strength or hypertrophy\"\n          value={filter.goal}\n        />\n        .\n      </Text>\n      <Text className=\"pb-4\">\n        Sort ascending by:{\" \"}\n        <SelectLink\n          name=\"builtin-sort\"\n          className=\"font-semibold\"\n          values={{ age: \"Age\", frequency: \"Frequency\", duration: \"Duration\" }}\n          onChange={(v) => setSort(v)}\n          emptyLabel=\"None\"\n          value={sort}\n        />\n      </Text>\n    </View>\n  );\n\n  const listEmpty = (\n    <View className=\"px-6 py-8\">\n      <Text className=\"text-lg text-center text-text-secondarysubtle\">No programs found with selected filters</Text>\n    </View>\n  );\n\n  const scrollMarkers = usePerfScrollMarkers(\"BuiltinProgramsList\");\n  const remScale = useRemScale();\n  return (\n    <LegendList\n      style={{ flex: 1 }}\n      data={entries}\n      renderItem={renderItem}\n      keyExtractor={keyExtractor}\n      ListHeaderComponent={listHeader}\n      ListEmptyComponent={listEmpty}\n      // LegendList never grows totalSize past the items it has measured, so an estimate below the\n      // real average makes the tail of the list unreachable - it must err on the high side.\n      estimatedItemSize={260 * remScale}\n      contentContainerStyle={{ paddingHorizontal: 16 }}\n      onScrollBeginDrag={scrollMarkers.onScrollBeginDrag}\n      onScrollEndDrag={scrollMarkers.onScrollEndDrag}\n      onMomentumScrollEnd={scrollMarkers.onMomentumScrollEnd}\n    />\n  );\n}\n\ninterface IBuiltInProgramProps {\n  entry: IProgramIndexEntry;\n  settings: ISettings;\n  hasCustomPrograms: boolean;\n}\n\nconst BuiltInProgram = memo(function BuiltInProgram(props: IBuiltInProgramProps): JSX.Element {\n  const { entry, hasCustomPrograms } = props;\n  const allEquipment = useMemo(() => Equipment_currentEquipment(props.settings), [props.settings]);\n  const equipment = useMemo(\n    () => (entry.equipment ?? []).map((e) => equipmentName(e, allEquipment)),\n    [entry.equipment, allEquipment]\n  );\n  const exercisesRange = entry.exercisesRange;\n  const numberOfWeeks = entry.weeksCount ?? 0;\n  const onPress = useCallback(() => {\n    navigateToModal(\"programInfoModal\", { programId: entry.id, hasCustomPrograms });\n  }, [entry.id, hasCustomPrograms]);\n  const visibleExercises = useMemo(\n    () => (entry.exercises ?? []).filter((e) => ExerciseImageUtils_exists(e, \"small\")),\n    [entry.exercises]\n  );\n\n  return (\n    <Pressable\n      accessibilityRole=\"button\"\n      accessibilityLabel={entry.name}\n      className=\"flex-row items-center w-full p-3 mb-4 border rounded-lg bg-background-cardpurple border-border-cardpurple\"\n      onPress={onPress}\n      data-testid=\"program-list-choose-program\"\n      testID=\"program-list-choose-program\"\n    >\n      <View className=\"flex-1\">\n        <View className=\"flex-row items-center\">\n          <Text className=\"flex-1 mr-2 text-base font-bold\">{entry.name}</Text>\n          {entry.duration && (\n            <View className=\"flex-row items-center\">\n              <IconWatch />\n              <Text className=\"pl-1 text-sm\">{entry.duration} mins</Text>\n            </View>\n          )}\n        </View>\n        {entry.shortDescription && (\n          <SimpleMarkdown value={entry.shortDescription} className=\"text-sm text-text-secondary\" />\n        )}\n        <View className=\"flex-row flex-wrap pb-2\">\n          {visibleExercises.map((e) => (\n            <ExerciseImage\n              key={`${e.id}_${e.equipment}`}\n              settings={props.settings}\n              exerciseType={e}\n              size=\"small\"\n              className=\"w-scaled-6 mr-1\"\n            />\n          ))}\n        </View>\n        <View className=\"flex-row items-center mb-1\">\n          <IconCalendarSmall color={Tailwind_colors().lightgray[600]} className=\"mr-1\" />\n          <Text className=\"text-xs text-text-secondary\">\n            {numberOfWeeks > 1 && `${numberOfWeeks} ${StringUtils_pluralize(\"week\", numberOfWeeks)}, `}\n            {entry.frequency ? `${entry.frequency}x/week, ` : \"\"}\n            {exercisesRange ? Program_exerciseRangeFormat(exercisesRange[0], exercisesRange[1]) : \"\"}\n          </Text>\n        </View>\n        <View className=\"flex-row items-center\">\n          <IconKettlebellSmall color={Tailwind_colors().lightgray[600]} className=\"mr-1\" />\n          <Text className=\"text-xs text-text-secondary\">{equipment.join(\", \")}</Text>\n        </View>\n      </View>\n    </Pressable>\n  );\n});\n","import { JSX, ReactNode } from \"react\";\nimport { GestureResponderEvent, Pressable } from \"react-native\";\nimport { Pressable as StickyPressable } from \"./primitives/pressable\";\nimport { Text } from \"./primitives/text\";\nimport { useTrackClick } from \"../utils/clickTracking\";\n\nfunction containsString(children: ReactNode): boolean {\n  if (typeof children === \"string\" || typeof children === \"number\") {\n    return true;\n  }\n  if (Array.isArray(children)) {\n    return children.some((c) => typeof c === \"string\" || typeof c === \"number\");\n  }\n  return false;\n}\n\ninterface IProps {\n  buttonSize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"lg2\";\n  kind: \"orange\" | \"purple\" | \"grayv2\" | \"red\" | \"transparent-purple\" | \"lightpurple\" | \"lightgrayv3\";\n  name: string;\n  onPress?: (e: GestureResponderEvent) => void;\n  onClick?: (e: GestureResponderEvent) => void;\n  disabled?: boolean;\n  className?: string;\n  children?: ReactNode;\n  testID?: string;\n  type?: string;\n  title?: string;\n  style?: Record<string, unknown>;\n  tabIndex?: number;\n  sticky?: boolean;\n}\n\nexport function Button(props: IProps): JSX.Element {\n  const { children, buttonSize, kind, disabled } = props;\n  const testID = props.testID || props.name;\n\n  // extract classname text size\n  const textSize = props.className\n    ? props.className.includes(\"text-xs\")\n      ? \"text-xs\"\n      : props.className.includes(\"text-sm\")\n        ? \"text-sm\"\n        : props.className.includes(\"text-lg\")\n          ? \"text-lg\"\n          : props.className.includes(\"text-base\")\n            ? \"text-base\"\n            : undefined\n    : undefined;\n\n  let containerCn = \"rounded-lg items-center justify-center\";\n  let textCn = \"text-center \";\n  if (!textSize) {\n    textCn += \"text-xs \";\n  } else {\n    textCn += textSize + \" \";\n  }\n\n  if (disabled) {\n    containerCn += \" bg-background-darkgray opacity-50\";\n    textCn += \" text-text-alwayswhite\";\n  } else if (kind === \"purple\") {\n    containerCn += \" bg-button-primarybackground\";\n    textCn += \" text-text-alwayswhite\";\n  } else if (kind === \"grayv2\") {\n    containerCn += \" bg-background-darkgray\";\n    textCn += \" text-text-alwayswhite\";\n  } else if (kind === \"red\") {\n    containerCn += \" bg-background-darkred\";\n    textCn += \" text-text-alwayswhite\";\n  } else if (kind === \"transparent-purple\") {\n    containerCn += \" bg-transparent\";\n    textCn += \" text-text-purple\";\n  } else if (kind === \"lightpurple\") {\n    containerCn += \" bg-background-purpledark\";\n    textCn += \" text-text-link\";\n  } else if (kind === \"lightgrayv3\") {\n    containerCn += \" bg-background-subtle border border-background-subtle\";\n    textCn += \" text-text-link\";\n  } else {\n    containerCn += \" bg-button-orangebackground\";\n    textCn += \" text-text-primaryinverse\";\n  }\n\n  if (buttonSize === \"sm\") {\n    containerCn += \" px-2 py-1\";\n    textCn += \" font-semibold\";\n  } else if (buttonSize === \"xs\") {\n    containerCn += \" px-1 py-0\";\n    textCn += \" font-normal\";\n  } else if (buttonSize === \"md\") {\n    containerCn += \" px-4 py-2\";\n    textCn += \" font-semibold\";\n  } else if (buttonSize === \"lg2\") {\n    containerCn += \" px-2 py-3\";\n    textCn += \" font-semibold\";\n  } else {\n    containerCn += \" px-8 py-3\";\n    textCn += \" font-semibold\";\n  }\n\n  if (props.className) {\n    containerCn += ` ${props.className}`;\n  }\n  containerCn += ` nm-${props.name}`;\n\n  const accessibilityLabel = typeof children === \"string\" ? children : undefined;\n  const trackClick = useTrackClick();\n  const userOnPress = props.onPress || props.onClick;\n  const onPress = (e: GestureResponderEvent): void => {\n    trackClick(props.name, props.className);\n    userOnPress?.(e);\n  };\n  const PressableComponent = props.sticky ? StickyPressable : Pressable;\n  return (\n    <PressableComponent\n      accessibilityRole=\"button\"\n      accessibilityLabel={accessibilityLabel}\n      className={containerCn}\n      onPress={onPress}\n      disabled={disabled}\n      testID={testID}\n      data-testid={testID}\n    >\n      {containsString(children) ? <Text className={textCn}>{children}</Text> : children}\n    </PressableComponent>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IHistoryRecord, IProgram, ISettings } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { BuiltinProgramsList } from \"./builtinProgramsList\";\nimport { CustomProgramsList } from \"./customProgramsList\";\nimport { emptyProgramId, IProgramIndexEntry, Program_selectProgramAndGoHome } from \"../models/program\";\nimport { IconMagnifyingGlass } from \"./icons/iconMagnifyingGlass\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { useRemScale } from \"../utils/useRem\";\nimport { LinkButton } from \"./linkButton\";\nimport { navigateToModal } from \"../navigation/navigationService\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  programs: IProgram[];\n  programsIndex: IProgramIndexEntry[];\n  progress?: IHistoryRecord;\n  settings: ISettings;\n  customPrograms: IProgram[];\n  editProgramId?: string;\n  navCommon: INavCommon;\n  hasBottomNav?: boolean;\n}\n\nexport function ChooseProgramView(props: IProps): JSX.Element {\n  const [search, setSearch] = useState(\"\");\n  const [selectedTab, setSelectedTab] = useState(0);\n  const hasCustomPrograms = props.customPrograms.length > 0;\n  const remScale = useRemScale();\n\n  useNavOptions({\n    navTitle: \"Choose a program\",\n    navRightButtons: [\n      <LinkButton\n        key=\"import\"\n        className=\"px-2 text-sm no-underline\"\n        name=\"import-program\"\n        onClick={() => navigateToModal(\"importFromLinkModal\")}\n      >\n        Import\n      </LinkButton>,\n    ],\n  });\n\n  return (\n    <View className=\"flex-1 bg-background-default\">\n      <View className=\"px-4 pt-2 pb-2\">\n        <View className=\"relative justify-center\">\n          <View className=\"absolute z-10 left-3\">\n            <IconMagnifyingGlass color={Tailwind_semantic().icon.neutralsubtle} size={16} />\n          </View>\n          <TextInput\n            className=\"w-full py-2 pr-4 border rounded-lg pl-9 border-border-neutral bg-background-default text-text-primary\"\n            style={{ fontSize: 15 * remScale }}\n            placeholder=\"Search by name\"\n            placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n            defaultValue=\"\"\n            onChangeText={(text) => setSearch(text)}\n            data-testid=\"program-search\"\n            testID=\"program-search\"\n            returnKeyType=\"search\"\n          />\n        </View>\n      </View>\n      {hasCustomPrograms ? (\n        <>\n          <View className=\"flex-row border-b border-border-neutral\">\n            {[\"Yours\", \"Built-in\"].map((label, index) => (\n              <Pressable\n                key={label}\n                className=\"items-center flex-1 pb-2\"\n                onPress={() => setSelectedTab(index)}\n                data-testid={`tab-${label.toLowerCase()}`}\n                testID={`tab-${label.toLowerCase()}`}\n              >\n                <Text\n                  className={`text-base ${selectedTab === index ? \"text-icon-yellow\" : \"\"}`}\n                  style={\n                    selectedTab === index\n                      ? { borderBottomWidth: 2, borderBottomColor: Tailwind_semantic().icon.yellow }\n                      : undefined\n                  }\n                >\n                  {label}\n                </Text>\n              </Pressable>\n            ))}\n          </View>\n          {selectedTab === 0 ? (\n            <CustomProgramsList\n              progress={props.progress}\n              programs={props.customPrograms}\n              settings={props.settings}\n              dispatch={props.dispatch}\n              search={search}\n            />\n          ) : (\n            <BuiltinProgramsList\n              hasCustomPrograms={hasCustomPrograms}\n              programs={props.programs}\n              programsIndex={props.programsIndex}\n              settings={props.settings}\n              dispatch={props.dispatch}\n              search={search}\n            />\n          )}\n        </>\n      ) : (\n        <BuiltinProgramsList\n          hasCustomPrograms={false}\n          programs={props.programs}\n          programsIndex={props.programsIndex}\n          settings={props.settings}\n          dispatch={props.dispatch}\n          search={search}\n        />\n      )}\n      <Footer\n        hasBottomNav={props.hasBottomNav}\n        onCreate={() => navigateToModal(\"createProgramModal\")}\n        onEmpty={() => {\n          Program_selectProgramAndGoHome(props.dispatch, emptyProgramId);\n        }}\n      />\n    </View>\n  );\n}\n\ninterface IFooterProps {\n  onCreate: () => void;\n  onEmpty: () => void;\n  hasBottomNav?: boolean;\n}\n\n// At the top of the text size range the two-line labels already fill this footer, and the subtitle\n// pushes it into the tab bar - it only explains the button above it, so it's the part to drop.\nconst FOOTER_SUBTITLE_MAX_SCALE = 1.25;\n\nfunction Footer(props: IFooterProps): JSX.Element {\n  const insets = useSafeAreaInsets();\n  const remScale = useRemScale();\n  return (\n    <View\n      className=\"flex-row items-stretch justify-around gap-2 px-2 pt-4 border-t border-border-neutral bg-background-default\"\n      style={{ paddingBottom: (props.hasBottomNav ? 0 : insets.bottom) + 16 }}\n    >\n      <Pressable\n        className=\"items-center justify-center flex-1\"\n        data-testid=\"create-program\"\n        testID=\"create-program\"\n        onPress={props.onCreate}\n      >\n        <Text className=\"text-sm font-semibold text-text-link\">Create New Program</Text>\n      </Pressable>\n      <View style={{ width: 1 }} className=\"bg-background-subtle\" />\n      <Pressable\n        className=\"items-center justify-center flex-1\"\n        data-testid=\"empty-program\"\n        testID=\"empty-program\"\n        onPress={props.onEmpty}\n      >\n        <Text className=\"text-sm font-semibold text-text-link\">Go Without Program</Text>\n        {remScale <= FOOTER_SUBTITLE_MAX_SCALE && (\n          <Text className=\"text-xs text-gray-500\">and build your program along the way</Text>\n        )}\n      </Pressable>\n    </View>\n  );\n}\n","import { JSX, useEffect, useMemo } from \"react\";\nimport { View, useWindowDimensions, StyleSheet } from \"react-native\";\nimport Animated, { useSharedValue, useAnimatedStyle, withTiming, Easing } from \"react-native-reanimated\";\n\nconst CONFETTI_COLORS = [\n  \"#1E90FF\",\n  \"#6B8E23\",\n  \"#FFD700\",\n  \"#FFC0CB\",\n  \"#6A5ACD\",\n  \"#ADD8E6\",\n  \"#EE82EE\",\n  \"#98FB98\",\n  \"#4682B4\",\n  \"#F4A460\",\n  \"#D2691E\",\n  \"#DC143C\",\n];\n\nconst PARTICLE_COUNT = 120;\n\ninterface IParticleProps {\n  startX: number;\n  startY: number;\n  endY: number;\n  color: string;\n  size: number;\n  duration: number;\n  swayAmplitude: number;\n  swayFrequency: number;\n  initialRotation: number;\n  rotationSpeed: number;\n}\n\nfunction Particle(props: IParticleProps): JSX.Element {\n  const progress = useSharedValue(0);\n\n  useEffect(() => {\n    progress.value = withTiming(1, { duration: props.duration, easing: Easing.linear });\n  }, []);\n\n  const animatedStyle = useAnimatedStyle(() => {\n    const t = progress.value;\n    const y = props.startY + (props.endY - props.startY) * t;\n    const x = props.startX + Math.sin(t * props.swayFrequency * Math.PI * 2) * props.swayAmplitude;\n    const rotate = props.initialRotation + props.rotationSpeed * t;\n    const opacity = t > 0.85 ? 1 - (t - 0.85) / 0.15 : 1;\n    return {\n      transform: [{ translateX: x }, { translateY: y }, { rotate: `${rotate}deg` }],\n      opacity,\n    };\n  });\n\n  return (\n    <Animated.View\n      style={[\n        {\n          position: \"absolute\",\n          width: props.size * 2,\n          height: props.size,\n          backgroundColor: props.color,\n          borderRadius: 1,\n        },\n        animatedStyle,\n      ]}\n    />\n  );\n}\n\nexport function Confetti(): JSX.Element {\n  const { width, height } = useWindowDimensions();\n\n  const particles = useMemo(() => {\n    return Array.from({ length: PARTICLE_COUNT }).map((_, i) => ({\n      key: i,\n      startX: Math.random() * width,\n      startY: Math.random() * height - height,\n      endY: height + 40,\n      color: CONFETTI_COLORS[Math.floor(Math.random() * CONFETTI_COLORS.length)],\n      size: 4 + Math.random() * 6,\n      duration: 2200 + Math.random() * 1600,\n      swayAmplitude: 20 + Math.random() * 60,\n      swayFrequency: 0.5 + Math.random() * 2,\n      initialRotation: Math.random() * 360,\n      rotationSpeed: (Math.random() - 0.5) * 1440,\n    }));\n  }, [width, height]);\n\n  return (\n    <View pointerEvents=\"none\" style={[StyleSheet.absoluteFillObject, { zIndex: 20 }]}>\n      {particles.map((p) => (\n        <Particle\n          key={p.key}\n          startX={p.startX}\n          startY={p.startY}\n          endY={p.endY}\n          color={p.color}\n          size={p.size}\n          duration={p.duration}\n          swayAmplitude={p.swayAmplitude}\n          swayFrequency={p.swayFrequency}\n          initialRotation={p.initialRotation}\n          rotationSpeed={p.rotationSpeed}\n        />\n      ))}\n    </View>\n  );\n}\n","import React, { JSX, useLayoutEffect, useRef, useState } from \"react\";\n\ninterface IContentGrowingTextareaProps {\n  value: string;\n  onInput?: (value: string) => void;\n  className?: string;\n}\n\nexport function ContentGrowingTextarea({ value, onInput, className = \"\" }: IContentGrowingTextareaProps): JSX.Element {\n  const textareaRef = useRef<HTMLTextAreaElement>(null);\n  const mirrorRef = useRef<HTMLDivElement>(null);\n  const [localValue, setLocalValue] = useState(value);\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n\n  useLayoutEffect(() => {\n    mirrorRef.current!.textContent = localValue || \" \";\n    const rect = mirrorRef.current!.getBoundingClientRect();\n    setDimensions({ width: rect.width, height: rect.height });\n  }, [localValue]);\n\n  useLayoutEffect(() => {\n    setLocalValue(value);\n  }, [value]);\n\n  const handleInput = (e: React.FormEvent<HTMLTextAreaElement>): void => {\n    const val = (e.target as HTMLTextAreaElement).value.replace(/[\\r\\n]+/g, \"\");\n    setLocalValue(val);\n    onInput?.(val);\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>): void => {\n    if (e.key === \"Enter\") {\n      e.preventDefault();\n    }\n  };\n\n  const handleBlur = (): void => {\n    if (localValue.trim() === \"\") {\n      setLocalValue(value);\n    }\n  };\n\n  return (\n    <div className=\"relative inline-block align-text-top\">\n      <div\n        ref={mirrorRef}\n        className={`invisible whitespace-pre-wrap break-words inline-block ${className}`}\n        style={{ minHeight: \"1em\", whiteSpace: \"pre-wrap\" }}\n        aria-hidden\n      />\n\n      <textarea\n        ref={textareaRef}\n        value={localValue}\n        onInput={handleInput}\n        onKeyDown={handleKeyDown}\n        onBlur={handleBlur}\n        className={`absolute top-0 left-0 resize-none overflow-hidden bg-transparent border-none outline-none p-0 m-0 text-inherit leading-inherit font-inherit underline ${className}`}\n        style={{\n          width: `${dimensions.width}px`,\n          height: `${dimensions.height}px`,\n        }}\n      />\n    </div>\n  );\n}\n","import { JSX, memo, useCallback } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { LegendList } from \"@legendapp/list\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IEquipment, IHistoryRecord, IProgram, ISettings } from \"../types\";\nimport { IExercise, Exercise_find, Exercise_toKey, equipmentName } from \"../models/exercise\";\nimport { ExerciseImageUtils_exists } from \"../models/exerciseImage\";\nimport {\n  Program_evaluate,\n  Program_getAllUsedProgramExercises,\n  Program_dayAverageTimeMs,\n  Program_editAction,\n  Program_selectProgramAndGoHome,\n  Program_daysRange,\n  Program_exerciseRange,\n} from \"../models/program\";\nimport { CollectionUtils_sort, CollectionUtils_nonnull } from \"../utils/collection\";\nimport { ObjectUtils_values } from \"../utils/object\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { IconCalendarSmall } from \"./icons/iconCalendarSmall\";\nimport { IconKettlebellSmall } from \"./icons/iconKettlebellSmall\";\nimport { IconWatch } from \"./icons/iconWatch\";\nimport { TimeUtils_formatHHMM } from \"../utils/time\";\nimport { Dialog_alert, Dialog_confirm } from \"../utils/dialog\";\nimport { IconEditSquare } from \"./icons/iconEditSquare\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { EditProgram_deleteProgram } from \"../models/editProgram\";\nimport { useTimedMemo } from \"../utils/useTimedMemo\";\nimport { usePerfScrollMarkers } from \"../utils/usePerfScrollMarkers\";\nimport { Equipment_currentEquipment } from \"../models/equipment\";\nimport { useRemScale } from \"../utils/useRem\";\n\ninterface IProps {\n  programs: IProgram[];\n  progress?: IHistoryRecord;\n  settings: ISettings;\n  dispatch: IDispatch;\n  search?: string;\n}\n\nexport function CustomProgramsList(props: IProps): JSX.Element {\n  const searchLower = (props.search || \"\").toLowerCase();\n  const sortedPrograms = useTimedMemo(\n    \"customPrograms.sorted\",\n    () => CollectionUtils_sort(props.programs, (a, b) => a.name.localeCompare(b.name)),\n    [props.programs]\n  );\n  const programs = useTimedMemo(\n    \"customPrograms.filtered\",\n    () => (searchLower ? sortedPrograms.filter((p) => p.name.toLowerCase().includes(searchLower)) : sortedPrograms),\n    [sortedPrograms, searchLower]\n  );\n\n  const { settings, progress, dispatch } = props;\n  const renderItem = useCallback(\n    ({ item }: { item: IProgram }) => (\n      <CustomProgram\n        programs={sortedPrograms}\n        settings={settings}\n        progress={progress}\n        program={item}\n        dispatch={dispatch}\n      />\n    ),\n    [sortedPrograms, settings, progress, dispatch]\n  );\n\n  const keyExtractor = useCallback((item: IProgram) => item.id, []);\n  const scrollMarkers = usePerfScrollMarkers(\"CustomProgramsList\");\n  const remScale = useRemScale();\n\n  return (\n    <LegendList\n      style={{ flex: 1 }}\n      data={programs}\n      renderItem={renderItem}\n      keyExtractor={keyExtractor}\n      // LegendList never grows totalSize past the items it has measured, so an estimate below the\n      // real average makes the tail of the list unreachable - it must err on the high side.\n      estimatedItemSize={240 * remScale}\n      contentContainerStyle={{ paddingHorizontal: 16 }}\n      onScrollBeginDrag={scrollMarkers.onScrollBeginDrag}\n      onScrollEndDrag={scrollMarkers.onScrollEndDrag}\n      onMomentumScrollEnd={scrollMarkers.onMomentumScrollEnd}\n    />\n  );\n}\n\ninterface ICustomProgramProps {\n  programs: IProgram[];\n  program: IProgram;\n  progress?: IHistoryRecord;\n  editProgramId?: string;\n  settings: ISettings;\n  dispatch: IDispatch;\n}\n\nconst CustomProgram = memo(function CustomProgram(props: ICustomProgramProps): JSX.Element {\n  const { program, settings } = props;\n  const aggregates = useTimedMemo(\n    \"customPrograms.row\",\n    () => {\n      const exerciseObj: Partial<Record<string, IExercise>> = {};\n      const equipmentSet: Set<IEquipment | undefined> = new Set();\n      const evaluatedProgram = Program_evaluate(program, settings);\n      const allExercises = Program_getAllUsedProgramExercises(evaluatedProgram);\n      for (const ex of allExercises) {\n        const exercise = Exercise_find(ex.exerciseType, settings.exercises);\n        if (exercise) {\n          exerciseObj[Exercise_toKey(ex.exerciseType)] = exercise;\n          if (exercise.equipment !== \"bodyweight\") {\n            equipmentSet.add(exercise.equipment);\n          }\n        }\n      }\n      const exercises = CollectionUtils_nonnull(ObjectUtils_values(exerciseObj));\n      const allEquipment = Equipment_currentEquipment(settings);\n      const equipment = CollectionUtils_nonnull(Array.from(equipmentSet)).map((e) => equipmentName(e, allEquipment));\n      const time = Program_dayAverageTimeMs(evaluatedProgram, settings);\n      const formattedTime = time > 0 ? TimeUtils_formatHHMM(time) : undefined;\n      const visibleExercises = exercises.filter((e) => ExerciseImageUtils_exists(e, \"small\"));\n      return { evaluatedProgram, exercises, equipment, formattedTime, visibleExercises };\n    },\n    [program, settings]\n  );\n  const { evaluatedProgram, equipment, formattedTime, visibleExercises } = aggregates;\n\n  return (\n    <View className=\"relative\">\n      <View\n        className=\"absolute z-10 flex-row items-center gap-1 px-2 py-1 border rounded-full bg-background-subtle border-border-neutral\"\n        style={{ right: -12, top: 8 }}\n      >\n        <Pressable\n          className=\"px-2 py-1\"\n          data-testid=\"custom-program-edit\"\n          testID=\"custom-program-edit\"\n          onPress={() => {\n            if (props.editProgramId == null || props.editProgramId !== props.program.id) {\n              Program_editAction(props.dispatch, props.program);\n            } else {\n              Dialog_alert(\"You cannot edit the program while that program's workout is in progress\");\n            }\n          }}\n        >\n          <IconEditSquare />\n        </Pressable>\n        <Pressable\n          className=\"px-2 py-1\"\n          data-testid=\"custom-program-delete\"\n          testID=\"custom-program-delete\"\n          onPress={async () => {\n            if (props.progress == null || props.progress.programId !== props.program.id) {\n              if (await Dialog_confirm(\"Are you sure you want to delete this program?\")) {\n                EditProgram_deleteProgram(props.dispatch, props.program, props.programs);\n              }\n            } else {\n              Dialog_alert(\"You cannot delete the program while that program's workout is in progress\");\n            }\n          }}\n        >\n          <IconTrash />\n        </Pressable>\n      </View>\n      <Pressable\n        className=\"flex-row items-center w-full p-3 mt-8 mb-4 border rounded-lg bg-background-cardyellow border-border-cardyellow\"\n        data-testid=\"program-list-choose-program\"\n        testID=\"program-list-choose-program\"\n        onPress={() => {\n          if (props.program.planner == null) {\n            Dialog_alert(\"Old-style programs are not supported anymore\");\n          } else {\n            Program_selectProgramAndGoHome(props.dispatch, props.program.id);\n          }\n        }}\n      >\n        <View className=\"flex-1\">\n          <View className=\"flex-row items-center\">\n            <Text className=\"flex-1 mr-2 text-base font-bold\">{props.program.name}</Text>\n            {formattedTime && (\n              <View className=\"flex-row items-center\">\n                <IconWatch />\n                <Text className=\"pl-1 text-sm\">{formattedTime}h</Text>\n              </View>\n            )}\n          </View>\n          <View className=\"flex-row flex-wrap py-3\">\n            {visibleExercises.map((e) => (\n              <ExerciseImage\n                key={Exercise_toKey(e)}\n                settings={props.settings}\n                exerciseType={e}\n                size=\"small\"\n                className=\"w-scaled-6 mr-1\"\n              />\n            ))}\n          </View>\n          <View className=\"flex-row items-center mb-1\">\n            <IconCalendarSmall color={Tailwind_colors().lightgray[600]} className=\"mr-1\" />\n            <Text className=\"text-xs text-text-secondary\">\n              {evaluatedProgram.weeks.length > 1 &&\n                `${evaluatedProgram.weeks.length} ${StringUtils_pluralize(\"week\", evaluatedProgram.weeks.length)}, `}\n              {Program_daysRange(evaluatedProgram)}, {Program_exerciseRange(evaluatedProgram)}\n            </Text>\n          </View>\n          <View className=\"flex-row items-center\">\n            <IconKettlebellSmall color={Tailwind_colors().lightgray[600]} className=\"mr-1\" />\n            <Text className=\"text-xs text-text-secondary\">{equipment.join(\", \")}</Text>\n          </View>\n        </View>\n      </Pressable>\n    </View>\n  );\n});\n","import type { JSX } from \"react\";\nimport { DateUtils_formatYYYYMMDD } from \"../utils/date\";\n\ninterface IDatePickerProps {\n  value: number;\n  onChange: (timestamp: number) => void;\n  testID?: string;\n}\n\nexport function DatePicker(props: IDatePickerProps): JSX.Element {\n  return (\n    <input\n      data-testid={props.testID}\n      className=\"inline-block py-2 text-text-link bg-background-default\"\n      type=\"date\"\n      value={DateUtils_formatYYYYMMDD(props.value)}\n      onChange={(e) => {\n        const ts = Date.parse(e.currentTarget.value + \"T00:00:00\");\n        if (!isNaN(ts)) {\n          props.onChange(ts);\n        }\n      }}\n    />\n  );\n}\n","import React, { JSX, useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { LayoutChangeEvent, Platform, View } from \"react-native\";\nimport Animated, { useSharedValue, useAnimatedStyle, runOnJS, withTiming } from \"react-native-reanimated\";\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\n\ntype IDraggableMode = \"vertical\" | \"horizontal\";\n\ninterface IDraggableList2Props<T> {\n  items: T[];\n  mode?: IDraggableMode;\n  isDisabled?: boolean;\n  element: (item: T, index: number, dragHandle: (children: React.ReactNode) => JSX.Element) => JSX.Element;\n  onDragEnd: (startIndex: number, endIndex: number) => void;\n  delayMs?: number;\n}\n\nexport function DraggableList2<T>(props: IDraggableList2Props<T>): JSX.Element {\n  const mode: IDraggableMode = props.mode ?? \"vertical\";\n  const sizesRef = useRef<number[]>([]);\n  const [activeIndex, setActiveIndex] = useState<number | null>(null);\n  const [targetIndex, setTargetIndex] = useState<number | null>(null);\n  const [activeSize, setActiveSize] = useState<number>(0);\n\n  const onItemLayout = useCallback((index: number, size: number) => {\n    sizesRef.current[index] = size;\n  }, []);\n\n  const computeTargetIndex = useCallback(\n    (fromIndex: number, translation: number): number => {\n      const sizes = sizesRef.current;\n      let target = fromIndex;\n      let acc = 0;\n      if (translation >= 0) {\n        for (let i = fromIndex + 1; i < props.items.length; i++) {\n          const h = sizes[i] || 0;\n          if (translation > acc + h / 2) {\n            target = i;\n            acc += h;\n          } else {\n            break;\n          }\n        }\n      } else {\n        for (let i = fromIndex - 1; i >= 0; i--) {\n          const h = sizes[i] || 0;\n          if (-translation > acc + h / 2) {\n            target = i;\n            acc += h;\n          } else {\n            break;\n          }\n        }\n      }\n      return target;\n    },\n    [props.items.length]\n  );\n\n  const containerStyle = mode === \"horizontal\" ? { flexDirection: \"row\" as const } : undefined;\n\n  return (\n    <View style={containerStyle}>\n      {props.items.map((item, i) => (\n        <DraggableItem<T>\n          key={i}\n          index={i}\n          item={item}\n          mode={mode}\n          isDisabled={props.isDisabled}\n          element={props.element}\n          activeIndex={activeIndex}\n          targetIndex={targetIndex}\n          activeSize={activeSize}\n          onLayoutSize={onItemLayout}\n          onDragStart={() => {\n            setActiveIndex(i);\n            setTargetIndex(i);\n            setActiveSize(sizesRef.current[i] || 0);\n          }}\n          onDragUpdate={(t) => setTargetIndex(computeTargetIndex(i, t))}\n          onDragEnd={(t) => {\n            const target = computeTargetIndex(i, t);\n            setActiveIndex(null);\n            setTargetIndex(null);\n            setActiveSize(0);\n            props.onDragEnd(i, target);\n          }}\n          delayMs={props.delayMs}\n        />\n      ))}\n    </View>\n  );\n}\n\ninterface IDraggableItemProps<T> {\n  index: number;\n  item: T;\n  mode: IDraggableMode;\n  isDisabled?: boolean;\n  element: (item: T, index: number, dragHandle: (children: React.ReactNode) => JSX.Element) => JSX.Element;\n  activeIndex: number | null;\n  targetIndex: number | null;\n  activeSize: number;\n  onLayoutSize: (index: number, size: number) => void;\n  onDragStart: () => void;\n  onDragUpdate: (translation: number) => void;\n  onDragEnd: (translation: number) => void;\n  delayMs?: number;\n}\n\nfunction DraggableItem<T>(props: IDraggableItemProps<T>): JSX.Element {\n  const translate = useSharedValue(0);\n  const shift = useSharedValue(0);\n  const isDragging = useSharedValue(false);\n  const isHorizontal = props.mode === \"horizontal\";\n\n  const callbacksRef = useRef({\n    onDragStart: props.onDragStart,\n    onDragUpdate: props.onDragUpdate,\n    onDragEnd: props.onDragEnd,\n  });\n  callbacksRef.current = {\n    onDragStart: props.onDragStart,\n    onDragUpdate: props.onDragUpdate,\n    onDragEnd: props.onDragEnd,\n  };\n\n  const handleDragStart = useCallback((): void => {\n    callbacksRef.current.onDragStart();\n  }, []);\n  const handleDragUpdate = useCallback((t: number): void => {\n    callbacksRef.current.onDragUpdate(t);\n  }, []);\n  const handleDragEnd = useCallback((t: number): void => {\n    callbacksRef.current.onDragEnd(t);\n  }, []);\n\n  const onLayout = useCallback(\n    (e: LayoutChangeEvent) => {\n      const size = isHorizontal ? e.nativeEvent.layout.width : e.nativeEvent.layout.height;\n      props.onLayoutSize(props.index, size);\n    },\n    [props.index, props.onLayoutSize, isHorizontal]\n  );\n\n  const { activeIndex, targetIndex, activeSize, index } = props;\n  useLayoutEffect(() => {\n    if (activeIndex !== index) {\n      isDragging.value = false;\n      translate.value = 0;\n    }\n    if (activeIndex == null || activeIndex === index) {\n      shift.value = 0;\n      return;\n    }\n    const effectiveTarget = targetIndex ?? activeIndex;\n    let next = 0;\n    if (activeIndex < index && effectiveTarget >= index) {\n      next = -activeSize;\n    } else if (activeIndex > index && effectiveTarget <= index) {\n      next = activeSize;\n    }\n    shift.value = withTiming(next, { duration: 150 });\n  }, [activeIndex, targetIndex, activeSize, index, shift, translate, isDragging]);\n\n  const pan = useMemo(\n    () =>\n      Gesture.Pan()\n        .activateAfterLongPress(props.delayMs ?? 150)\n        .enabled(!props.isDisabled)\n        .onStart(() => {\n          isDragging.value = true;\n          runOnJS(handleDragStart)();\n        })\n        .onUpdate((e) => {\n          const t = isHorizontal ? e.translationX : e.translationY;\n          translate.value = t;\n          runOnJS(handleDragUpdate)(t);\n        })\n        .onEnd((e) => {\n          const t = isHorizontal ? e.translationX : e.translationY;\n          isDragging.value = false;\n          runOnJS(handleDragEnd)(t);\n        })\n        .onFinalize(() => {\n          if (isDragging.value) {\n            isDragging.value = false;\n            runOnJS(handleDragEnd)(0);\n          }\n        }),\n    [\n      isHorizontal,\n      props.delayMs,\n      props.isDisabled,\n      isDragging,\n      translate,\n      handleDragStart,\n      handleDragUpdate,\n      handleDragEnd,\n    ]\n  );\n\n  const animatedStyle = useAnimatedStyle(() => {\n    const value = isDragging.value ? translate.value : shift.value;\n    const transform = isHorizontal ? [{ translateX: value }] : [{ translateY: value }];\n    return {\n      transform,\n      zIndex: isDragging.value ? 100 : 0,\n    };\n  });\n\n  const isActive = props.activeIndex === props.index;\n\n  const handleRender = useCallback(\n    (children: React.ReactNode): JSX.Element => (\n      <GestureDetector gesture={pan}>\n        <Animated.View style={(Platform.OS === \"web\" ? ({ cursor: \"grab\" } as unknown as object) : undefined) as never}>\n          {children}\n        </Animated.View>\n      </GestureDetector>\n    ),\n    [pan]\n  );\n\n  const content = props.element(props.item, props.index, handleRender);\n\n  return (\n    <Animated.View onLayout={onLayout} className={isActive ? \"bg-background-default\" : undefined} style={animatedStyle}>\n      {content}\n    </Animated.View>\n  );\n}\n","import React, { JSX, ReactNode } from \"react\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\nexport function DropdownMenu(props: {\n  rightOffset?: string;\n  leftOffset?: string;\n  topOffset?: string;\n  children: ReactNode;\n  maxWidth?: string;\n  bgColor?: string;\n  hideTip?: boolean;\n  tipClassName?: string;\n  textAlign?: \"left\" | \"right\";\n  onClose: () => void;\n}): JSX.Element {\n  const color = props.bgColor || Tailwind_semantic().background.subtle;\n  const align = props.textAlign ?? \"right\";\n  const positionStyle: Record<string, string> = {\n    maxWidth: props.maxWidth || \"16rem\",\n    top: props.topOffset ?? \"0\",\n  };\n  if (props.leftOffset != null) {\n    positionStyle.left = props.leftOffset;\n  } else {\n    positionStyle.right = props.rightOffset ?? \"2.5rem\";\n  }\n  return (\n    <section className=\"\" style={{ zIndex: 100 }}>\n      <div data-name=\"overlay\" className=\"fixed inset-0 z-10 overflow-scroll scrolling-touch\" onClick={props.onClose} />\n      <div className={`absolute shadow rounded`} style={positionStyle}>\n        <div\n          className={`relative h-full z-20 rounded p-2 ${align === \"left\" ? \"text-left\" : \"text-right\"}`}\n          style={{ backgroundColor: color }}\n        >\n          {props.children}\n        </div>\n        {!props.hideTip && <div className={props.tipClassName || \"add-tip\"} style={{ backgroundColor: color }} />}\n      </div>\n    </section>\n  );\n}\n\ninterface IDropdownMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  isTop?: boolean;\n  testID?: string;\n}\n\nexport function DropdownMenuItem(props: IDropdownMenuItemProps): JSX.Element {\n  const { className, children, isTop, testID, ...rest } = props;\n  return (\n    <button\n      className={`block w-full px-2 whitespace-nowrap text-base ${\n        !isTop ? \"pt-2 pb-1 mt-2 border-t border-border-neutral\" : \"py-1\"\n      } ${className}`}\n      {...rest}\n    >\n      {children}\n    </button>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { MarkdownEditorBorderless } from \"./markdownEditorBorderless\";\nimport { Button } from \"./button\";\nimport { IEither } from \"../utils/types\";\n\nexport interface IEditDetailsFormData {\n  title: string;\n  nameLabel: string;\n  namePlaceholder: string;\n  descriptionPlaceholder: string;\n  submitLabel: string;\n  dataCyPrefix: string;\n  name: string;\n  description?: string;\n}\n\nexport function EditDetailsForm(props: {\n  data: IEditDetailsFormData;\n  onCancel: () => void;\n  onSubmit: (result: { name: string; description?: string }) => void;\n}): JSX.Element {\n  const { data } = props;\n  const [typedNameResult, setTypedNameResult] = useState<IEither<string, Set<IValidationError>>>();\n  const descriptionRef = useRef<string | undefined>(undefined);\n  const inputHandle = useRef<IInputHandle>(null);\n\n  const name =\n    typedNameResult == null\n      ? data.name.trim()\n      : typedNameResult.success\n        ? typedNameResult.data.trim()\n        : undefined;\n\n  const onSubmit = (): void => {\n    if (!name) {\n      inputHandle.current?.touch();\n      return;\n    }\n    const description = (descriptionRef.current ?? data.description ?? \"\").trim();\n    props.onSubmit({ name, description: description.length > 0 ? description : undefined });\n  };\n\n  return (\n    <>\n      <GroupHeader size=\"large\" name={data.title} />\n      <Input\n        identifier={`${data.dataCyPrefix}-name`}\n        label={data.nameLabel}\n        required\n        requiredMessage={`${data.nameLabel} cannot be empty`}\n        type=\"text\"\n        placeholder={data.namePlaceholder}\n        defaultValue={data.name}\n        changeType=\"oninput\"\n        changeHandler={setTypedNameResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"mt-4\">\n        <MarkdownEditorBorderless\n          value={data.description}\n          placeholder={data.descriptionPlaceholder}\n          onChange={(value) => (descriptionRef.current = value)}\n        />\n      </View>\n      <View className=\"flex-row items-center justify-between gap-4 mt-4\">\n        <Button\n          name={`${data.dataCyPrefix}-cancel`}\n          data-testid={`${data.dataCyPrefix}-cancel`}\n          testID={`${data.dataCyPrefix}-cancel`}\n          type=\"button\"\n          kind=\"grayv2\"\n          className=\"mr-3\"\n          onClick={props.onCancel}\n        >\n          Cancel\n        </Button>\n        <Button\n          kind=\"purple\"\n          name={`${data.dataCyPrefix}-submit`}\n          data-testid={`${data.dataCyPrefix}-submit`}\n          testID={`${data.dataCyPrefix}-submit`}\n          type=\"submit\"\n          onClick={onSubmit}\n        >\n          {data.submitLabel}\n        </Button>\n      </View>\n    </>\n  );\n}\n","import { JSX, memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { View, LayoutChangeEvent } from \"react-native\";\nimport { useRemScale } from \"../../utils/useRem\";\nimport { Pressable } from \"../primitives/pressable\";\nimport { IconUndo } from \"../icons/iconUndo\";\nimport { undo, canUndo, canRedo, redo } from \"../../pages/builder/utils/undoredo\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IconUiMode } from \"../icons/iconUiMode\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { IconDayTextMode } from \"../icons/iconDayTextMode\";\nimport { IconFullTextMode } from \"../icons/iconFullTextMode\";\nimport { Button } from \"../button\";\nimport { EditProgramUiWeekView } from \"./editProgramUiWeek\";\nimport { IProgram, ISettings } from \"../../types\";\nimport { lb } from \"lens-shmens\";\nimport { IconReorder } from \"../icons/iconReorder\";\nimport { EditProgramV2Full } from \"./editProgramV2Full\";\nimport { EditProgramGrid } from \"./editProgramGrid/editProgramGrid\";\nimport { useAppGridHost } from \"./editProgramGrid/useAppGridHost\";\nimport { PlannerMode_isStructureError } from \"../../pages/planner/models/plannerMode\";\nimport { PlannerProgram_evaluate } from \"../../pages/planner/models/plannerProgram\";\nimport { ScrollableTabs } from \"../scrollableTabs\";\nimport { IEvaluatedProgram, Program_cleanPlannerProgram } from \"../../models/program\";\nimport { EditProgram_mode } from \"../../models/editProgram\";\nimport { Thunk_pushScreen, Thunk_log } from \"../../ducks/thunks\";\nimport { updateState, IState } from \"../../models/state\";\nimport { CollectionUtils_setBy } from \"../../utils/collection\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { IPlannerEvalResult } from \"../../pages/planner/plannerExerciseEvaluator\";\nimport { usePerfRenderCount } from \"../../utils/usePerfRenderCount\";\n\ninterface IEditProgramViewProps {\n  evaluatedWeeks: IPlannerEvalResult[][];\n  exerciseFullNames: string[];\n  evaluatedProgram: IEvaluatedProgram;\n  state: IPlannerState;\n  originalProgram: IProgram;\n  programId: string;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  settings: ISettings;\n}\n\nexport const EditProgramView = memo(function EditProgramView(\n  props: IEditProgramViewProps & { hideNavbar?: boolean; hideWeekTabBar?: boolean }\n): JSX.Element {\n  usePerfRenderCount(\"EditProgramView\");\n  const ui = props.state.ui;\n  const mode = EditProgram_mode(ui);\n  const program = props.state.current.program;\n  const planner = program.planner!;\n  const { evaluatedWeeks, exerciseFullNames, plannerDispatch } = props;\n  const weekIndex = Math.min(ui.weekIndex ?? 0, Math.max(0, planner.weeks.length - 1));\n  const gridHost = useAppGridHost(props.programId, props.dispatch);\n\n  const onWeekTabChange = useCallback(\n    (newWeekIndex: number) =>\n      plannerDispatch(\n        lb<IPlannerState>().p(\"ui\").p(\"weekIndex\").record(newWeekIndex),\n        `Change week index to ${newWeekIndex}`\n      ),\n    [plannerDispatch]\n  );\n\n  return (\n    <View className=\"pb-6\">\n      {!props.hideNavbar && (\n        <EditProgramNavbar\n          dispatch={props.dispatch}\n          originalProgram={props.originalProgram}\n          settings={props.settings}\n          state={props.state}\n          evaluatedWeeks={evaluatedWeeks}\n          plannerDispatch={plannerDispatch}\n        />\n      )}\n      {mode === \"grid\" ? (\n        <EditProgramGrid\n          evaluatedProgram={props.evaluatedProgram}\n          settings={props.settings}\n          host={gridHost}\n          scale={ui.gridScale}\n          plannerDispatch={props.plannerDispatch}\n        />\n      ) : mode === \"full\" ? (\n        <EditProgramV2Full\n          plannerProgram={planner}\n          evaluatedProgram={props.evaluatedProgram}\n          ui={ui}\n          lbUi={lb<IPlannerState>().pi(\"ui\")}\n          settings={props.settings}\n          plannerDispatch={props.plannerDispatch}\n        />\n      ) : props.hideWeekTabBar ? (\n        <View className=\"pt-2\">\n          <EditProgramUiWeekView\n            key={weekIndex}\n            evaluatedProgram={props.evaluatedProgram}\n            dispatch={props.dispatch}\n            programId={props.programId}\n            state={props.state}\n            exerciseFullNames={exerciseFullNames}\n            evaluatedWeeks={evaluatedWeeks}\n            plannerDispatch={props.plannerDispatch}\n            settings={props.settings}\n          />\n        </View>\n      ) : (\n        <ScrollableTabs\n          topPadding=\"0.5rem\"\n          className=\"gap-2 px-4\"\n          nonSticky={true}\n          shouldNotExpand={true}\n          defaultIndex={weekIndex}\n          type=\"squares\"\n          onChange={onWeekTabChange}\n          tabs={planner.weeks.map((week, wi) => {\n            return {\n              label: week.name,\n              isInvalid: evaluatedWeeks[wi].some((day) => !day.success),\n              children: () => (\n                <EditProgramUiWeekView\n                  evaluatedProgram={props.evaluatedProgram}\n                  dispatch={props.dispatch}\n                  programId={props.programId}\n                  state={props.state}\n                  exerciseFullNames={exerciseFullNames}\n                  evaluatedWeeks={evaluatedWeeks}\n                  plannerDispatch={plannerDispatch}\n                  settings={props.settings}\n                />\n              ),\n            };\n          })}\n        />\n      )}\n    </View>\n  );\n});\n\nconst NAVBAR_ICON_BUTTONS = 6;\nconst NAVBAR_ICON_PADDING = 8;\n\ninterface IToolbarPadding {\n  padding: number;\n  onRowLayout: (event: LayoutChangeEvent) => void;\n  onGroupLayout: (index: number) => (event: LayoutChangeEvent) => void;\n}\n\n// The icons and the Save label in this toolbar grow with the text size, so at large sizes the row\n// still runs off a narrow screen even with constant padding. Measure the natural width once per\n// text size / screen width, then trim the icon buttons' horizontal padding by just enough to fit.\nfunction useToolbarPadding(): IToolbarPadding {\n  const scale = useRemScale();\n  const basePadding = NAVBAR_ICON_PADDING;\n  const [padding, setPadding] = useState(basePadding);\n  const paddingRef = useRef(padding);\n  paddingRef.current = padding;\n  const rowWidthRef = useRef(0);\n  const groupWidthsRef = useRef<(number | undefined)[]>([]);\n\n  // Padding is constant now, but the icons and label still grow, so a text size change means the\n  // natural width has to be measured again.\n  useEffect(() => {\n    groupWidthsRef.current = [];\n    setPadding(basePadding);\n  }, [scale, basePadding]);\n\n  const fit = useCallback(() => {\n    const groupWidths = groupWidthsRef.current;\n    const rowWidth = rowWidthRef.current;\n    if (rowWidth === 0 || groupWidths.length < 3 || groupWidths.some((w) => w == null)) {\n      return;\n    }\n    const overflow = groupWidths.reduce<number>((acc, w) => acc + (w ?? 0), 0) - rowWidth;\n    const trim = overflow > 0 ? Math.ceil(overflow / (NAVBAR_ICON_BUTTONS * 2)) : 0;\n    setPadding(Math.max(2, basePadding - trim));\n  }, [basePadding]);\n\n  const onRowLayout = useCallback(\n    (event: LayoutChangeEvent) => {\n      const width = event.nativeEvent.layout.width;\n      if (rowWidthRef.current !== 0 && rowWidthRef.current !== width) {\n        groupWidthsRef.current = [];\n        setPadding(basePadding);\n      }\n      rowWidthRef.current = width;\n      fit();\n    },\n    [basePadding, fit]\n  );\n\n  // Group widths are only meaningful while the buttons still have their natural padding -\n  // measuring the trimmed row would shrink it again on every pass.\n  const onGroupLayout = useCallback(\n    (index: number) => (event: LayoutChangeEvent) => {\n      if (paddingRef.current !== basePadding) {\n        return;\n      }\n      groupWidthsRef.current[index] = event.nativeEvent.layout.width;\n      fit();\n    },\n    [basePadding, fit]\n  );\n\n  return { padding, onRowLayout, onGroupLayout };\n}\n\ninterface IEditProgramNavbarProps {\n  state: IPlannerState;\n  originalProgram: IProgram;\n  settings: ISettings;\n  evaluatedWeeks?: IPlannerEvalResult[][];\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\nexport const EditProgramNavbar = memo(function EditProgramNavbar(props: IEditProgramNavbarProps): JSX.Element {\n  const isValidFull = !props.state.ui.fullTextError;\n  const planner = props.state.current.program.planner!;\n  const evaluatedWeeks = useMemo(\n    () => props.evaluatedWeeks ?? PlannerProgram_evaluate(planner, props.settings).evaluatedWeeks,\n    [props.evaluatedWeeks, planner, props.settings]\n  );\n  const isValidPerDay = evaluatedWeeks.every((week) => week.every((day) => day.success)) ?? true;\n  const isValid = isValidFull && isValidPerDay;\n  const mode = EditProgram_mode(props.state.ui);\n  const { padding, onRowLayout, onGroupLayout } = useToolbarPadding();\n\n  return (\n    <View className=\"py-2 pl-2 pr-4 border-b bg-background-default border-background-subtle\" style={{ zIndex: 25 }}>\n      <View className=\"flex-row items-center justify-between\" onLayout={onRowLayout}>\n        <View className=\"flex-row items-center\" onLayout={onGroupLayout(0)}>\n          <Pressable\n            className=\"py-2 nm-program-undo\"\n            style={{ paddingHorizontal: padding }}\n            disabled={!canUndo(props.state)}\n            onPress={() => undo(props.plannerDispatch, props.state)}\n          >\n            <IconUndo\n              width={20}\n              height={20}\n              color={!canUndo(props.state) ? Tailwind_semantic().icon.light : Tailwind_semantic().icon.neutral}\n            />\n          </Pressable>\n          <Pressable\n            className=\"py-2 nm-program-redo\"\n            style={{ paddingHorizontal: padding }}\n            disabled={!canRedo(props.state)}\n            onPress={() => redo(props.plannerDispatch, props.state)}\n          >\n            <View style={{ transform: [{ scaleX: -1 }] }}>\n              <IconUndo\n                width={20}\n                height={20}\n                color={!canRedo(props.state) ? Tailwind_semantic().icon.light : Tailwind_semantic().icon.neutral}\n              />\n            </View>\n          </Pressable>\n        </View>\n        <View className=\"flex-row items-center\" onLayout={onGroupLayout(1)}>\n          <EditProgramModeSwitchButton\n            padding={padding}\n            isSelected={mode === \"grid\"}\n            disabled={!isValid}\n            name=\"editor-v2-grid-program\"\n            onClick={() => {\n              props.dispatch(Thunk_log(\"ls-program-mode-grid\"));\n              props.plannerDispatch([lb<IPlannerState>().p(\"ui\").p(\"mode\").record(\"grid\")], \"Switch to grid mode\");\n            }}\n          >\n            {(color) => <IconReorder color={color} />}\n          </EditProgramModeSwitchButton>\n          <EditProgramModeSwitchButton\n            padding={padding}\n            isSelected={mode === \"ui\"}\n            name=\"editor-v2-ui-program\"\n            disabled={!isValid}\n            onClick={() => {\n              props.dispatch(Thunk_log(\"ls-program-mode-ui\"));\n              props.plannerDispatch([lb<IPlannerState>().p(\"ui\").p(\"mode\").record(\"ui\")], \"Switch to UI mode\");\n            }}\n          >\n            {(color) => <IconUiMode color={color} />}\n          </EditProgramModeSwitchButton>\n          <EditProgramModeSwitchButton\n            padding={padding}\n            isSelected={mode === \"perday\"}\n            disabled={mode === \"full\" && PlannerMode_isStructureError(props.state.ui.fullTextError)}\n            name=\"editor-v2-perday-program\"\n            onClick={() => {\n              props.dispatch(Thunk_log(\"ls-program-mode-perday\"));\n              props.plannerDispatch([lb<IPlannerState>().p(\"ui\").p(\"mode\").record(\"perday\")], \"Switch to per-day mode\");\n            }}\n          >\n            {(color) => <IconDayTextMode color={color} />}\n          </EditProgramModeSwitchButton>\n          <EditProgramModeSwitchButton\n            padding={padding}\n            isSelected={mode === \"full\"}\n            name=\"editor-v2-full-program\"\n            onClick={() => {\n              props.dispatch(Thunk_log(\"ls-program-mode-full\"));\n              props.plannerDispatch([lb<IPlannerState>().p(\"ui\").p(\"mode\").record(\"full\")], \"Switch to full text mode\");\n            }}\n          >\n            {(color) => <IconFullTextMode color={color} />}\n          </EditProgramModeSwitchButton>\n        </View>\n        <View className=\"flex-row items-center\" onLayout={onGroupLayout(2)}>\n          <Button\n            sticky\n            className=\"ls-program-save\"\n            disabled={!isValid}\n            name=\"save-program\"\n            kind=\"purple\"\n            buttonSize=\"md\"\n            data-testid=\"save-program\"\n            testID=\"save-program\"\n            onClick={() => {\n              const newProgram: IProgram = Program_cleanPlannerProgram({ ...props.originalProgram, planner });\n              updateState(\n                props.dispatch,\n                [\n                  lb<IState>()\n                    .p(\"storage\")\n                    .p(\"programs\")\n                    .recordModify((programs) => {\n                      return CollectionUtils_setBy(programs, \"id\", props.originalProgram.id, newProgram);\n                    }),\n                ],\n                `Save program '${newProgram.name}'`\n              );\n              props.dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n            }}\n          >\n            Save\n          </Button>\n        </View>\n      </View>\n    </View>\n  );\n});\n\ninterface IEditProgramModeSwitchButtonProps {\n  isSelected: boolean;\n  name: string;\n  disabled?: boolean;\n  padding: number;\n  children: (color: string) => JSX.Element;\n  onClick: () => void;\n}\n\nconst EditProgramModeSwitchButton = memo(function EditProgramModeSwitchButton(\n  props: IEditProgramModeSwitchButtonProps\n): JSX.Element {\n  const isSelected = props.isSelected;\n  return (\n    <Pressable\n      data-testid={props.name}\n      testID={props.name}\n      className={`py-2 ${isSelected ? \"bg-purplev3-200\" : \"\"} rounded nm-${props.name}`}\n      style={{ opacity: props.disabled && !isSelected ? 0.5 : 1, paddingHorizontal: props.padding }}\n      onPress={() => {\n        if (!props.disabled && !isSelected) {\n          props.onClick();\n        }\n      }}\n    >\n      {props.children(isSelected ? Tailwind_semantic().icon.purple : Tailwind_semantic().icon.neutral)}\n    </Pressable>\n  );\n});\n","import type { JSX } from \"react\";\nimport { Pressable } from \"react-native\";\nimport { lb } from \"lens-shmens\";\nimport { Text } from \"../primitives/text\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IShortDayData } from \"../../types\";\nimport { Exercise_createCustomExercise } from \"../../models/exercise\";\nimport type { IEditorError } from \"../../editorTypes\";\n\ninterface IPlannerEditorCustomCtaProps {\n  err: IEditorError;\n  dayData: IShortDayData;\n  dispatch: ILensDispatch<IPlannerState>;\n  isInvertedColors?: boolean;\n}\n\nexport function EditProgramCustomErrorCta(props: IPlannerEditorCustomCtaProps): JSX.Element {\n  const details = props.err.details;\n  if (details.type !== \"unknownExercise\") {\n    return <></>;\n  }\n  const customExerciseName = details.data.name;\n  return (\n    <Pressable\n      className=\"inline-block nm-planner-add-custom-exercise\"\n      data-testid=\"planner-add-custom-exercise\"\n      testID=\"planner-add-custom-exercise\"\n      onPress={() => {\n        props.dispatch(\n          lb<IPlannerState>()\n            .p(\"ui\")\n            .p(\"exercisePicker\")\n            .record({\n              state: {\n                screenStack: [\"customExercise\"],\n                sort: \"name_asc\",\n                filters: {},\n                selectedExercises: [],\n                mode: \"program\",\n                customExerciseName,\n                editCustomExercise: Exercise_createCustomExercise(customExerciseName, [], [], []),\n              },\n              change: \"all\",\n              dayData: props.dayData,\n            }),\n          \"Open custom exercise modal\"\n        );\n      }}\n    >\n      <Text\n        className={`inline-block underline ${props.isInvertedColors ? \"text-text-alwayswhite\" : \"text-xs text-text-error\"}`}\n      >\n        Add custom exercise\n      </Text>\n    </Pressable>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { INavCommon } from \"../../models/state\";\nimport { IProgram, ISettings } from \"../../types\";\nimport { useNavOptions } from \"../../navigation/useNavOptions\";\nimport { MigrationBanner } from \"../migrationBanner\";\nimport { Thunk_pushScreen } from \"../../ducks/thunks\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { MenuItem } from \"../menuItem\";\n\ninterface IProps {\n  editProgram: IProgram;\n  dispatch: IDispatch;\n  settings: ISettings;\n  navCommon: INavCommon;\n}\n\nexport function EditProgramDaysList(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Edit Program\" });\n\n  const fetchFn =\n    typeof window !== \"undefined\"\n      ? window.fetch.bind(window)\n      : ((): Window[\"fetch\"] => {\n          return (input: RequestInfo | URL, init?: RequestInit) => fetch(input as RequestInfo, init);\n        })();\n\n  return (\n    <View className=\"px-4\">\n      <MigrationBanner program={props.editProgram} settings={props.settings} client={fetchFn} />\n      <GroupHeader name=\"Current Program\" />\n      <MenuItem\n        name=\"Program\"\n        value={props.editProgram.name}\n        expandValue={true}\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"programs\"))}\n      />\n    </View>\n  );\n}\n","import { JSX, memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n  Animated,\n  View,\n  ScrollView,\n  LayoutChangeEvent,\n  NativeScrollEvent,\n  NativeSyntheticEvent,\n  useWindowDimensions,\n} from \"react-native\";\nimport Reanimated from \"react-native-reanimated\";\nimport { lb } from \"lens-shmens\";\nimport { Text } from \"../../primitives/text\";\nimport { IEvaluatedProgram } from \"../../../models/program\";\nimport { ISettings } from \"../../../types\";\nimport { IPlannerState } from \"../../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { useRem } from \"../../../utils/useRem\";\nimport { usePerfRenderCount } from \"../../../utils/usePerfRenderCount\";\nimport { ProgramGrid_build } from \"../../../pages/planner/models/programGrid\";\nimport {\n  GRID_ADD_WEEK_WIDTH,\n  GRID_DAY_BOX_INSET,\n  ProgramGridGeometry_build,\n  ProgramGridGeometry_metrics,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { useGridSelectionPublish, IGridSelectionTarget } from \"./gridSelectionContext\";\nimport { useGridReuseLocator } from \"./useGridReuseLocator\";\nimport { GridReusePillFloat } from \"./gridReusePill\";\nimport { useGridPinch } from \"./gridPinch\";\nimport { useGridActions } from \"./useGridActions\";\nimport { IGridHost } from \"./gridHost\";\nimport { useGridSelectionState } from \"./useGridSelectionState\";\nimport { useGridDragAutoScroll } from \"./gridDragAutoScroll\";\nimport { IGridActiveGhost, useGridDrags } from \"./useGridDrags\";\nimport { WeekHeaderRow } from \"./gridWeekHeaderRow\";\nimport { GridRow } from \"./gridRow\";\nimport { GridDragGhost, GridWeekGhost } from \"./gridDragGhost\";\nimport { AddButton, VerticalAddButton } from \"./gridAddButton\";\nimport { useGridStickyHeader } from \"./useGridStickyHeader\";\nimport { GridStickyHeader, GridStickyHeader_isCss } from \"./gridStickyHeader\";\nimport { useGridEditDetails } from \"./useGridEditDetails\";\n\ninterface IEditProgramGridProps {\n  evaluatedProgram: IEvaluatedProgram;\n  settings: ISettings;\n  host: IGridHost;\n  // Undefined until the user pinches, which is what lets a short program fit the screen by default\n  // without freezing that choice the moment they zoom.\n  scale?: number;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\n// The whole calendar view. This file is composition only: the layout maths lives in\n// programGridGeometry, the edits in plannerStructure via useGridActions, and each drag in\n// useGridDragSession — see lambda/scripts/archdocs/program-grid.md.\nexport const EditProgramGrid = memo(function EditProgramGrid(props: IEditProgramGridProps): JSX.Element {\n  usePerfRenderCount(\"EditProgramGrid\");\n  const rem = useRem();\n  const { evaluatedProgram, settings } = props;\n  const grid = useMemo(() => ProgramGrid_build(evaluatedProgram, settings), [evaluatedProgram, settings]);\n  const windowWidth = useWindowDimensions().width;\n  const [containerWidth, setContainerWidth] = useState(windowWidth);\n  const onLayout = useCallback((e: LayoutChangeEvent) => setContainerWidth(e.nativeEvent.layout.width), []);\n  // What a live pinch is showing, before it is worth writing down. The committed scale is the\n  // remembered one — it outlives the screen — so the preview only ever shadows it.\n  const [previewScale, setPreviewScale] = useState<number | undefined>(undefined);\n  // Memoized so the lane layout it carries keeps its identity between renders — the geometry below\n  // is built from it, and rebuilding that on every render would hand the drags a new row table\n  // mid-gesture.\n  const requestedScale = previewScale ?? props.scale;\n  const weekCount = grid.columns.length;\n  const { columnWidth, totalWidth, lanes, scale } = useMemo(\n    () => ProgramGridGeometry_metrics({ weekCount, containerWidth, scale: requestedScale, rem }),\n    [weekCount, containerWidth, requestedScale, rem]\n  );\n  const showScheme = lanes.showScheme;\n  const fittedScale = useMemo(\n    () => ProgramGridGeometry_metrics({ weekCount, containerWidth, rem }).scale,\n    [weekCount, containerWidth, rem]\n  );\n\n  const plannerDispatch = props.plannerDispatch;\n  const onCommitScale = useCallback(\n    (newScale: number | undefined) => {\n      setPreviewScale(undefined);\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"gridScale\").record(newScale), `Change grid scale to ${newScale}`);\n    },\n    [plannerDispatch]\n  );\n  const { Wrap, scrollAnimatedProps, canPinch, zoomControl } = useGridPinch({\n    scale,\n    isFitted: requestedScale == null,\n    fittedScale,\n    onScalePreview: setPreviewScale,\n    onScaleCommit: onCommitScale,\n  });\n\n  const { selectedDayRows, selectedWeek, selection, selectedLanes, onSelect, onSelectDay, onSelectWeek, onClear } =\n    useGridSelectionState(grid);\n\n  // Two hooks on purpose: everything that changes the program goes through `actions`, and every one\n  // of those goes through a transform. `navigation` changes what is on screen and never touches the\n  // program text.\n  const { host } = props;\n  const navigation = useMemo(\n    () => host.createNavigation({ grid, evaluatedProgram, settings, plannerDispatch }),\n    [host, grid, evaluatedProgram, settings, plannerDispatch]\n  );\n\n  const actions = useGridActions({\n    grid,\n    evaluatedProgram,\n    settings,\n    plannerDispatch,\n    onStructuralChange: onClear,\n  });\n\n  const editDetails = useGridEditDetails({\n    grid,\n    openEditDetails: host.openEditDetails,\n    onSetWeekDetails: actions.onSetWeekDetails,\n    onSetDayDetails: actions.onSetDayDetails,\n  });\n\n  const [collapsedRows, setCollapsedRows] = useState<number[]>([]);\n  const onToggleCollapsed = useCallback((rowIndex: number) => {\n    setCollapsedRows((current) =>\n      current.indexOf(rowIndex) !== -1 ? current.filter((r) => r !== rowIndex) : [...current, rowIndex]\n    );\n  }, []);\n\n  const geometry = useMemo(\n    () => ProgramGridGeometry_build(grid, collapsedRows, lanes, rem),\n    [grid, collapsedRows, lanes, rem]\n  );\n\n  // Every drag's shared values, refs and edge-scrolling live together in one hook rather than in\n  // this component's state — see useGridDrags. What comes back is a bus the rows and columns read,\n  // plus the exercise drag, which is the one the grid owns because it can cross rows.\n  // The scroller belongs to this component, so its refs live here and go into auto-scroll rather\n  // than onto the drag bus. The \"+ Week\" rail sits past the last column, so the content is that\n  // much wider than the grid.\n  const horizontalScrollRef = useRef<ScrollView | null>(null);\n  const horizontalViewportRef = useRef<View | null>(null);\n  const horizontalOffsetRef = useRef(0);\n  const horizontalListenersRef = useRef(new Set<(x: number) => void>());\n  const onHorizontalScroll = useCallback((e: NativeSyntheticEvent<NativeScrollEvent>) => {\n    horizontalOffsetRef.current = e.nativeEvent.contentOffset.x;\n    horizontalListenersRef.current.forEach((listener) => listener(e.nativeEvent.contentOffset.x));\n  }, []);\n  const subscribeHorizontalOffset = useCallback((listener: (x: number) => void) => {\n    horizontalListenersRef.current.add(listener);\n    listener(horizontalOffsetRef.current);\n    return () => {\n      horizontalListenersRef.current.delete(listener);\n    };\n  }, []);\n  const contentWidthRef = useRef(0);\n  contentWidthRef.current = totalWidth + GRID_ADD_WEEK_WIDTH * rem;\n  const containerWidthRef = useRef(0);\n  containerWidthRef.current = containerWidth;\n  const maxHorizontalScroll = useCallback(() => Math.max(0, contentWidthRef.current - containerWidthRef.current), []);\n  const autoScroll = useGridDragAutoScroll({\n    horizontalRef: horizontalScrollRef,\n    horizontalViewportRef,\n    horizontalOffsetRef,\n    maxHorizontalScroll,\n  });\n\n  const sticky = useGridStickyHeader({ isHeaderInContainer: !GridStickyHeader_isCss });\n\n  // Only the ghosts get this, never a row: setting it re-renders the grid at the moment a pan goes\n  // live, and every row has to fall through its memo untouched for the pan to survive.\n  const [activeGhost, setActiveGhost] = useState<IGridActiveGhost | undefined>(undefined);\n\n  const drags = useGridDrags({\n    grid,\n    geometry,\n    selectedDayRows,\n    selectedLanes,\n    autoScroll,\n    onGhostActive: setActiveGhost,\n    onReorderExercisesInDay: actions.onReorderExercisesInDay,\n    onMoveExercisesToDay: actions.onMoveExercisesToDay,\n  });\n\n  const publishSelection = useGridSelectionPublish();\n  const reuse = useGridReuseLocator({\n    grid,\n    geometry,\n    selection,\n    rowsTop: sticky.rowsTop,\n    headerHeight: sticky.headerHeight,\n  });\n  const weekColumn = selectedWeek != null ? grid.columns[selectedWeek] : undefined;\n  const payload = useMemo(() => {\n    const target: IGridSelectionTarget | undefined =\n      selectedWeek != null && weekColumn != null\n        ? {\n            kind: \"week\",\n            weekIndex: selectedWeek,\n            name: weekColumn.name,\n            description: weekColumn.description,\n          }\n        : selectedDayRows.length > 0\n          ? {\n              kind: \"day\",\n              rowIndexes: selectedDayRows,\n              // One day is named; several are counted, because a list of names is what the dock has\n              // the least room for and the least use of.\n              name:\n                selectedDayRows.length === 1\n                  ? (grid.rows[selectedDayRows[0]]?.namePerWeek.find((n) => n != null) ??\n                    `Day ${selectedDayRows[0] + 1}`)\n                  : `${selectedDayRows.length} days`,\n              description:\n                selectedDayRows.length === 1\n                  ? grid.rows[selectedDayRows[0]]?.descriptionPerWeek.find((d) => d != null)\n                  : undefined,\n              placements: grid.placements.filter((p) => selectedDayRows.indexOf(p.rowIndex) !== -1),\n            }\n          : selection != null\n            ? { kind: \"exercises\", placements: selection.placements }\n            : undefined;\n    return target != null\n      ? {\n          target,\n          // Only for an exercise selection: a day or a week is not the thing that reuses anything.\n          reuse: target.kind === \"exercises\" ? reuse : undefined,\n          onEdit: navigation.onEditPlacement,\n          onDuplicate: navigation.onDuplicatePlacement,\n          onSwap: navigation.onSwapPlacement,\n          onDelete: actions.onDeletePlacements,\n          onDuplicateDays: actions.onDuplicateDays,\n          onDeleteDays: actions.onDeleteDays,\n          onDuplicateWeek: actions.onDuplicateWeek,\n          onDeleteWeek: actions.onDeleteWeek,\n          onEditWeek: editDetails.onEditWeek,\n          onEditDay: editDetails.onEditDay,\n          onShowWeekStats: navigation.onShowWeekStats,\n          onShowDayStats: navigation.onShowDayStats,\n          onShowExerciseStats: navigation.onShowExerciseStats,\n          onClear: onClear,\n        }\n      : undefined;\n  }, [\n    grid,\n    selection,\n    reuse,\n    selectedDayRows,\n    selectedWeek,\n    weekColumn,\n    navigation.onEditPlacement,\n    navigation.onDuplicatePlacement,\n    navigation.onSwapPlacement,\n    actions.onDeletePlacements,\n    actions.onDuplicateDays,\n    actions.onDeleteDays,\n    actions.onDuplicateWeek,\n    actions.onDeleteWeek,\n    editDetails.onEditWeek,\n    editDetails.onEditDay,\n    navigation.onShowWeekStats,\n    navigation.onShowDayStats,\n    navigation.onShowExerciseStats,\n    onClear,\n  ]);\n  useEffect(() => {\n    publishSelection(payload);\n  }, [payload, publishSelection]);\n  // Leaving the grid (mode switch, tab change) must take the dock with it.\n  useEffect(() => () => publishSelection(undefined), [publishSelection]);\n\n  const weekHeader = (\n    <>\n      <WeekHeaderRow\n        grid={grid}\n        columnWidth={columnWidth}\n        selectedWeek={selectedWeek}\n        onSelectWeek={onSelectWeek}\n        onMoveWeek={actions.onMoveWeek}\n        drags={drags}\n      />\n      {/* Inside the header rather than over the grid: a week ghost is its name, and this\n          is the row of names it is being dragged among. */}\n      {grid.columns.map((column) => (\n        <GridWeekGhost\n          key={column.weekIndex}\n          weekIndex={column.weekIndex}\n          name={column.name}\n          columnWidth={columnWidth}\n          draggedWeek={drags.draggedWeek}\n          ghostX={drags.ghostX}\n          activeGhost={activeGhost}\n        />\n      ))}\n    </>\n  );\n  const reusePill = reuse?.direction === \"up\" ? <GridReusePillFloat reuse={reuse} /> : undefined;\n\n  return (\n    <View className=\"pb-4\" onLayout={onLayout} ref={horizontalViewportRef}>\n      {zoomControl}\n      {GridStickyHeader_isCss && (\n        <GridStickyHeader\n          top={sticky.pinTop}\n          width={totalWidth}\n          subscribeHorizontalOffset={subscribeHorizontalOffset}\n          onHeightChange={sticky.onHeaderHeight}\n          below={reusePill}\n        >\n          {weekHeader}\n        </GridStickyHeader>\n      )}\n      <Wrap>\n        {/* Reanimated's rather than the plain one so a pinch can freeze it from the UI thread —\n            see gridPinch.native. */}\n        <Reanimated.ScrollView\n          horizontal\n          showsHorizontalScrollIndicator={true}\n          ref={horizontalScrollRef}\n          onScroll={onHorizontalScroll}\n          scrollEventThrottle={16}\n          animatedProps={scrollAnimatedProps}\n        >\n          {/* Deliberately not a Pressable for tap-to-clear. A day name is a gesture detector rather\n              than a Pressable, so it does not consume the touch from an ancestor Pressable: the tap\n              would select the day and the background would immediately clear it, and the same\n              ancestor competed with the long-press drag. Clearing lives on the dock's ✕ and on\n              tapping a selected thing again. */}\n          <View className=\"flex-row\">\n            <View style={{ width: totalWidth }} ref={sticky.containerRef} onLayout={sticky.onContainerLayout}>\n              {/* Rides down with the scroll to stay at the top of the grid, and paints over the rows\n                  it slides across — so it needs a background of its own and an order above them. */}\n              {!GridStickyHeader_isCss && (\n                <Animated.View\n                  className=\"bg-background-default\"\n                  onLayout={sticky.onHeaderLayout}\n                  style={{ transform: [{ translateY: sticky.translateY }], zIndex: 2 }}\n                >\n                  {weekHeader}\n                </Animated.View>\n              )}\n              {/* The rows and the ghosts share one coordinate space — the geometry's — and it\n                  starts here, below the week header. zIndex keeps a ghost dragged past the last row\n                  above the \"+ Day\" strip that follows. */}\n              <View style={{ zIndex: 1 }}>\n                {grid.rows.map((row) => (\n                  <GridRow\n                    key={row.rowIndex}\n                    grid={grid}\n                    rowIndex={row.rowIndex}\n                    columnWidth={columnWidth}\n                    laneTops={geometry[row.rowIndex].laneTops}\n                    showScheme={showScheme}\n                    selection={selection}\n                    onSelect={onSelect}\n                    onAddExercise={navigation.onAddExercise}\n                    onSetRepeatRange={actions.onSetRepeatRange}\n                    onSelectDay={onSelectDay}\n                    onToggleCollapsed={onToggleCollapsed}\n                    isCollapsed={collapsedRows.indexOf(row.rowIndex) !== -1}\n                    isDaySelected={selectedDayRows.indexOf(row.rowIndex) !== -1}\n                    isDayDimmed={selectedDayRows.length > 0 && selectedDayRows.indexOf(row.rowIndex) === -1}\n                    lanes={geometry[row.rowIndex].laneNames.length}\n                    rowHeight={geometry[row.rowIndex].height}\n                    onMoveDayRows={actions.onMoveDayRows}\n                    drags={drags}\n                  />\n                ))}\n                {/* Last, so they paint over every row. Mounted with the grid rather than with the\n                    drag: see GridDragGhost.\n\n                    Rendered on web too. Reanimated is only stubbed in the *server* render\n                    (register-rn-web.js); the app bundle carries the real thing, so the shared\n                    values that drive these reach the DOM. And the stub is harmless where it does\n                    apply: it renders Animated.View as a fragment, and a ghost's contents are null\n                    until a drag starts, which cannot happen during SSR. */}\n                {grid.rows.map((row) => (\n                  <GridDragGhost\n                    key={row.rowIndex}\n                    rowIndex={row.rowIndex}\n                    name={row.namePerWeek.find((n) => n != null) ?? `Day ${row.rowIndex + 1}`}\n                    laneNames={geometry[row.rowIndex].isCollapsed ? [] : geometry[row.rowIndex].laneNames}\n                    width={totalWidth}\n                    top={geometry[row.rowIndex].top}\n                    labelHeight={geometry[row.rowIndex].contentTop - geometry[row.rowIndex].top}\n                    laneTops={geometry[row.rowIndex].laneTops}\n                    draggedRows={drags.draggedRows}\n                    draggedLanes={drags.draggedLanes}\n                    ghostY={drags.ghostY}\n                    activeGhost={activeGhost}\n                  />\n                ))}\n              </View>\n              <View className=\"flex-row\">\n                {grid.columns.map((column) => (\n                  <View\n                    key={column.weekIndex}\n                    style={{ width: columnWidth, padding: GRID_DAY_BOX_INSET * rem }}\n                    className=\"justify-center\"\n                  >\n                    <AddButton\n                      label=\"Day\"\n                      testID={`grid-add-day-${column.weekIndex}`}\n                      onPress={() => actions.onAddDay(column.weekIndex)}\n                    />\n                  </View>\n                ))}\n              </View>\n            </View>\n            <View style={{ width: GRID_ADD_WEEK_WIDTH * rem, padding: GRID_DAY_BOX_INSET * rem }}>\n              <VerticalAddButton label=\"Week\" testID=\"grid-add-week\" onPress={actions.onAddWeek} />\n            </View>\n          </View>\n        </Reanimated.ScrollView>\n      </Wrap>\n      {/* A source that lies above belongs at the top of the screen, under the week names — pointing\n          up from a pill docked at the bottom makes the direction something to reconcile rather than\n          something to read. One that lies below is the dock's, which is already anchored there.\n\n          Outside the horizontal scroller, so it stays put while the weeks scroll under it, and on\n          the header's own translate so it holds the same edge as the week names it hangs from.\n          Above both the header and the rows, since it floats over whatever it covers. */}\n      {!GridStickyHeader_isCss && reusePill != null && (\n        <Animated.View\n          pointerEvents=\"box-none\"\n          className=\"absolute left-0 right-0\"\n          style={{ top: sticky.headerHeight, transform: [{ translateY: sticky.translateY }], zIndex: 3 }}\n        >\n          {reusePill}\n        </Animated.View>\n      )}\n      <Text className=\"px-4 pt-2 text-xs text-text-secondary\">\n        Long-press a day, an exercise or a week to move it{canPinch ? \". Pinch to zoom\" : \"\"}\n      </Text>\n    </View>\n  );\n});\n","import { JSX, memo, useEffect, useRef, useState } from \"react\";\nimport { Animated, Platform, View } from \"react-native\";\nimport { Text } from \"../../primitives/text\";\nimport { Pressable } from \"../../primitives/pressable\";\nimport { IconEdit2 } from \"../../icons/iconEdit2\";\nimport { IconCloseCircleOutline } from \"../../icons/iconCloseCircleOutline\";\nimport { IconKebab } from \"../../icons/iconKebab\";\nimport { DropdownMenu, DropdownMenuItem } from \"../../dropdownMenu\";\nimport { ActionSheet_show } from \"../../../utils/actionSheet\";\nimport { useRemScale } from \"../../../utils/useRem\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { useGridSelection } from \"./gridSelectionContext\";\nimport { GridReusePillFloat } from \"./gridReusePill\";\nimport { GridBadge } from \"./gridBadge\";\nimport { GridSelectionSummary_build, IGridSelectionAction } from \"./gridSelectionSummary\";\n\n// Rendered from NavScreenContent's footer slot, so it is anchored above the tab bar and the scroll\n// content is padded by its height — the selection stays reachable no matter where the tapped strip\n// has scrolled to.\nexport const GridActionDock = memo(function GridActionDock(): JSX.Element | null {\n  const live = useGridSelection();\n  const liveTarget = live?.target;\n  const selection =\n    live != null && !(liveTarget?.kind === \"exercises\" && liveTarget.placements.length === 0) ? live : undefined;\n\n  // The dock appears at the bottom of the screen while the user is looking at the strip they just\n  // tapped, so appearing instantly reads as it having been there all along. It slides and fades in\n  // instead, which is the part the eye catches from the middle of the screen.\n  //\n  // Held in state rather than read straight from the context, because leaving has to be animated\n  // too: the selection is already gone by the time the dock starts sliding out, and something has\n  // to keep rendering it until it has.\n  const [shown, setShown] = useState(selection);\n  const anim = useRef(new Animated.Value(selection != null ? 1 : 0)).current;\n  const isOpen = selection != null;\n  useEffect(() => {\n    if (selection != null) {\n      setShown(selection);\n    }\n  }, [selection]);\n  useEffect(() => {\n    Animated.timing(anim, {\n      toValue: isOpen ? 1 : 0,\n      duration: isOpen ? 180 : 140,\n      // A selection made while the previous one is still sliding out cancels that animation, and a\n      // cancelled one reports `finished: false` — which is what stops it from clearing the dock the\n      // new selection has just filled.\n      useNativeDriver: Platform.OS !== \"web\",\n    }).start(({ finished }) => {\n      if (finished && !isOpen) {\n        setShown(undefined);\n      }\n    });\n  }, [isOpen, anim]);\n\n  // The tab bar's workout button overhangs its own bar by `-mt-scaled-6` (footer2.tsx), and that\n  // overhang grows with the text size while padding does not — plain spacing is deliberately\n  // constant at every size. At 1x the button clears the dock's second line on its own; past that it\n  // starts sitting on top of it, so the dock buys the room back in the same scaled unit the\n  // overhang is measured in, which is what keeps the two tracking each other further up the slider.\n  const isTextLarge = useRemScale() >= 1.25;\n  if (shown == null) {\n    return null;\n  }\n  const props = shown;\n  // Editing is the one thing you do over and over while laying a program out, so it keeps an icon.\n  // The rest are occasional, and four icons plus a name plus badges stopped fitting the strip at\n  // large font scales — the name was being truncated to make room for verbs nobody had reached for.\n  const summary = GridSelectionSummary_build(props);\n\n  return (\n    // Opacity as well as the slide: the dock is opaque and sits over the grid's own content, so a\n    // slide on its own would look like a row of the grid moving rather than a panel arriving.\n    <Animated.View\n      style={{\n        opacity: anim,\n        transform: [{ translateY: anim.interpolate({ inputRange: [0, 1], outputRange: [16, 0] }) }],\n      }}\n    >\n      {/* Only the source that lies further down: one that is above belongs at the top of the\n          screen, under the week header, and the grid renders it there. */}\n      {props.reuse?.direction === \"down\" && (\n        <View className=\"pb-1\">\n          <GridReusePillFloat reuse={props.reuse} />\n        </View>\n      )}\n      {/* The same top edge the editor's dock has (liftoEditorDock.tsx): the dock floats over the\n          grid's own scrolling content, so without a visible edge its background reads as more grid. */}\n      <View\n        className={`flex-row items-center gap-1 px-3 pt-2 border-t bg-background-default border-border-neutral ${\n          isTextLarge ? \"pb-scaled-4\" : \"pb-2\"\n        }`}\n      >\n        <Pressable className=\"p-1 nm-grid-clear-selection\" testID=\"grid-clear-selection\" onPress={props.onClear}>\n          <IconCloseCircleOutline size={20} color={Tailwind_semantic().icon.neutral} />\n        </Pressable>\n        {/* Keyed by what is selected, so picking another week or day starts collapsed again rather\n          than inheriting however far the last one was opened. */}\n        <DockDetails\n          key={summary.detailsKey}\n          name={summary.label}\n          badges={summary.badges}\n          description={summary.description}\n          detail={summary.detail}\n        />\n        {summary.edit && (\n          <DockButton\n            name=\"grid-action-edit\"\n            label={summary.edit.label}\n            disabled={summary.edit.disabled}\n            onPress={summary.edit.onPress}\n          >\n            <IconEdit2 size={24} color={Tailwind_semantic().icon.neutral} />\n          </DockButton>\n        )}\n        <DockOverflow actions={summary.actions} />\n      </View>\n    </Animated.View>\n  );\n});\n\n// A description is as long as its author wanted it to be, and the dock is one strip above the tab\n// bar — so it shows the first line and opens on a tap for the rest. The ellipsis is spelled out\n// rather than left to truncation: a description whose first line happens to fit would otherwise look\n// like the whole of it.\nfunction DockDetails(props: { name: string; badges?: string[]; description?: string; detail?: string }): JSX.Element {\n  const [isExpanded, setIsExpanded] = useState(false);\n  const description = props.description;\n  const firstLine = description?.split(\"\\n\")[0] ?? \"\";\n  const hasMore = description != null && description.trim().length > firstLine.length;\n  const badges = props.badges ?? [];\n  return (\n    <Pressable\n      className=\"flex-1 ml-1 nm-grid-details\"\n      testID=\"grid-details\"\n      disabled={description == null}\n      onPress={() => setIsExpanded((current) => !current)}\n    >\n      <View className=\"flex-row items-center\">\n        {/* Shrinks rather than fills: `flex-1` here would push the badges to the far edge of the\n            dock, where they read as belonging to the buttons instead of to the name. */}\n        <Text className=\"text-sm font-bold shrink text-text-primary\" numberOfLines={2}>\n          {props.name}\n        </Text>\n        {badges.map((badge) => (\n          <GridBadge key={badge} label={badge} />\n        ))}\n      </View>\n      {description != null && (\n        <Text className=\"text-xs text-text-secondary\" numberOfLines={isExpanded ? 6 : 1}>\n          {isExpanded ? description : `${firstLine}${hasMore ? \"…\" : \"\"}`}\n        </Text>\n      )}\n      {props.detail != null && (\n        <Text className=\"text-xs text-text-secondary\" numberOfLines={1}>\n          {props.detail}\n        </Text>\n      )}\n    </Pressable>\n  );\n}\n\n// The same two-platform overflow the workout screen's exercise card uses (workoutExerciseCard.tsx):\n// a native action sheet, a dropdown on web. Vertical dots, because the dock is a horizontal strip\n// and a horizontal ⋯ reads as more of the same row rather than as something that opens.\nfunction DockOverflow(props: { actions: IGridSelectionAction[] }): JSX.Element | null {\n  const [isOpen, setIsOpen] = useState(false);\n  const actions = props.actions;\n  if (actions.length === 0) {\n    return null;\n  }\n  const onPress = (): void => {\n    if (Platform.OS === \"web\") {\n      setIsOpen(true);\n      return;\n    }\n    const labels = actions.map((a) => a.label).concat(\"Cancel\");\n    ActionSheet_show(\n      {\n        options: labels,\n        cancelButtonIndex: labels.length - 1,\n        destructiveButtonIndex: actions.findIndex((a) => a.isDestructive),\n      },\n      (buttonIndex) => {\n        if (buttonIndex != null && buttonIndex < actions.length) {\n          actions[buttonIndex].onPress();\n        }\n      }\n    );\n  };\n  return (\n    <View className=\"relative\">\n      <DockButton name=\"grid-action-more\" label=\"More actions\" onPress={onPress}>\n        <IconKebab isVertical={true} color={Tailwind_semantic().icon.neutral} />\n      </DockButton>\n      {Platform.OS === \"web\" && isOpen && (\n        // The dock sits on the bottom edge, so the menu has to grow upwards — hence a negative top\n        // and no tip, which points the wrong way from down here.\n        <DropdownMenu\n          rightOffset=\"1rem\"\n          topOffset={`-${actions.length * 2.5 + 0.5}rem`}\n          hideTip={true}\n          onClose={() => setIsOpen(false)}\n        >\n          {actions.map((action, i) => (\n            <DropdownMenuItem\n              key={action.label}\n              isTop={i === 0}\n              // Both, because DropdownMenuItem drops `testID` and only spreads DOM attributes.\n              data-testid={`grid-more-${action.label}`}\n              testID={`grid-more-${action.label}`}\n              className={action.isDestructive ? \"text-text-error\" : undefined}\n              onClick={() => {\n                setIsOpen(false);\n                action.onPress();\n              }}\n            >\n              {action.label}\n            </DropdownMenuItem>\n          ))}\n        </DropdownMenu>\n      )}\n    </View>\n  );\n}\n\ninterface IDockButtonProps {\n  name: string;\n  label: string;\n  disabled?: boolean;\n  onPress: () => void;\n  children: JSX.Element;\n}\n\nfunction DockButton(props: IDockButtonProps): JSX.Element {\n  return (\n    <Pressable\n      className={`items-center justify-center p-2 rounded nm-${props.name}`}\n      testID={props.name}\n      // The icons carry the meaning visually; this is what carries it to a screen reader.\n      accessibilityLabel={props.label}\n      disabled={props.disabled}\n      onPress={props.onPress}\n      style={{ opacity: props.disabled ? 0.35 : 1 }}\n    >\n      {props.children}\n    </Pressable>\n  );\n}\n","import { JSX, memo, useCallback, useState } from \"react\";\nimport { LayoutChangeEvent, View } from \"react-native\";\nimport { Text } from \"../../primitives/text\";\nimport { Pressable } from \"../../primitives/pressable\";\nimport { IconPlus2 } from \"../../icons/iconPlus2\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { useRem } from \"../../../utils/useRem\";\n\nexport interface IAddButtonProps {\n  label: string;\n  testID: string;\n  onPress: () => void;\n}\n\nexport const AddButton = memo(function AddButton(props: IAddButtonProps): JSX.Element {\n  return (\n    <Pressable\n      className={`flex-row items-center justify-center px-1 py-1 border rounded nm-${props.testID}`}\n      // A filled placeholder rather than an outline: against the warm day box an unfilled button\n      // reads as part of the box, and \"+ Exercise\" in particular went unnoticed. The pale purple is\n      // the exercise strip's own colour, drained — an empty slot waiting for one.\n      style={{\n        borderStyle: \"dashed\",\n        borderColor: Tailwind_semantic().border.cardpurple,\n        backgroundColor: Tailwind_semantic().background.cardpurple,\n      }}\n      testID={props.testID}\n      accessibilityLabel={`Add ${props.label}`}\n      onPress={props.onPress}\n    >\n      <IconPlus2 size={10} color={Tailwind_semantic().text.link} />\n      <Text className=\"ml-1 text-xs font-semibold text-text-link\" numberOfLines={1}>\n        {props.label}\n      </Text>\n    </Pressable>\n  );\n});\n\nconst VERTICAL_LABEL_LENGTH = 5;\n// Roughly two thirds of a phone's grid viewport, so whatever the vertical scroll position, at least\n// one label is on screen without the rail turning into a column of repeated text.\nconst VERTICAL_LABEL_SPACING = 22;\n\nexport const VerticalAddButton = memo(function VerticalAddButton(props: IAddButtonProps): JSX.Element {\n  const rem = useRem();\n  const [height, setHeight] = useState(0);\n  const onLayout = useCallback((e: LayoutChangeEvent) => setHeight(e.nativeEvent.layout.height), []);\n  // The rail is as tall as the whole grid, which on any real program is taller than the screen, so\n  // one label — wherever it were placed — would be scrolled past. It repeats instead, and how many\n  // times is only knowable once laid out.\n  const labels = Math.max(1, Math.round(height / (VERTICAL_LABEL_SPACING * rem)));\n  return (\n    <Pressable\n      className={`items-center border rounded nm-${props.testID}`}\n      style={{\n        flex: 1,\n        borderStyle: \"dashed\",\n        borderColor: Tailwind_semantic().border.cardpurple,\n        backgroundColor: Tailwind_semantic().background.cardpurple,\n      }}\n      testID={props.testID}\n      accessibilityLabel={`Add ${props.label}`}\n      onPress={props.onPress}\n      onLayout={onLayout}\n    >\n      {Array.from({ length: labels }, (_, i) => i).map((i) => (\n        // The label below is sized for its *unrotated* width, so its box is wider than the rail and\n        // hangs over the grid on one side and past the last column on the other. Clipped, because\n        // once rotated it renders well inside the rail and the overhang is pure layout — left to\n        // stand it added a sliver of horizontal scroll past the right edge of a grid that otherwise\n        // fits exactly. Deaf to the pointer for the same reason: on web the overhang still\n        // hit-tests, and it covered the resize handles of the last week's strips, making a repeat\n        // impossible to drag there. Presses inside the rail still reach its own Pressable.\n        // alignSelf, because the rail centres its children and so sizes them to their content —\n        // which here is the label's unrotated width. Stretching takes the rail's width instead, and\n        // the clip then bites on the label rather than on nothing.\n        <View\n          key={i}\n          pointerEvents=\"none\"\n          className=\"items-center justify-center overflow-hidden\"\n          style={{ flex: 1, alignSelf: \"stretch\" }}\n        >\n          {/* Rotation doesn't change layout, so the label needs its own length along what becomes\n              the vertical axis; it overflows the narrow rail before rotating and fits after. */}\n          <View\n            className=\"flex-row items-center justify-center\"\n            style={{ width: VERTICAL_LABEL_LENGTH * rem, transform: [{ rotate: \"-90deg\" }] }}\n          >\n            <IconPlus2 size={10} color={Tailwind_semantic().text.link} />\n            <Text className=\"ml-1 text-xs font-semibold text-text-link\" numberOfLines={1}>\n              {props.label}\n            </Text>\n          </View>\n        </View>\n      ))}\n    </Pressable>\n  );\n});\n","import { lb } from \"lens-shmens\";\nimport {\n  Program_getNumberOfExerciseInstances,\n  Program_getProgramExerciseForKeyAndShortDayData,\n} from \"../../../models/program\";\nimport { IPlannerState } from \"../../../pages/planner/models/types\";\nimport { IDispatch } from \"../../../ducks/types\";\nimport { Thunk_pushToEditProgramExercise } from \"../../../ducks/thunks\";\nimport { pickerStateFromPlannerExercise } from \"../editProgramUtils\";\nimport {\n  IProgramGridPlacement,\n  ProgramGrid_dayDataAt,\n  ProgramGrid_hasDay,\n} from \"../../../pages/planner/models/programGrid\";\nimport { navigateToModal } from \"../../../navigation/navigationService\";\nimport { IGridNavigation, IGridNavigationContext } from \"./gridHost\";\n\n// Everything the grid does that is *not* an edit: pushing the exercise editor, opening the picker.\n// These belong apart from useGridActions because they don't go through a transform and never can —\n// they change what is on screen, not what the program says.\nexport function GridAppNavigation_create(\n  context: IGridNavigationContext,\n  programId: string,\n  dispatch: IDispatch\n): IGridNavigation {\n  const { grid, evaluatedProgram, settings, plannerDispatch } = context;\n\n  return {\n    onEditPlacement: (placement: IProgramGridPlacement) => {\n      dispatch(\n        Thunk_pushToEditProgramExercise(\n          placement.key,\n          ProgramGrid_dayDataAt(grid, placement.rowIndex, placement.colStart),\n          { editProgramId: programId }\n        )\n      );\n    },\n\n    onDuplicatePlacement: (placement: IProgramGridPlacement) => {\n      const dayData = ProgramGrid_dayDataAt(grid, placement.rowIndex, placement.colStart);\n      const exercise = Program_getProgramExerciseForKeyAndShortDayData(evaluatedProgram, dayData, placement.key);\n      plannerDispatch(\n        lb<IPlannerState>()\n          .p(\"ui\")\n          .p(\"exercisePicker\")\n          .record({\n            state: { ...pickerStateFromPlannerExercise(settings, exercise), hideLabel: true },\n            dayData,\n            exerciseKey: placement.key,\n            change: \"duplicate\",\n          }),\n        \"Open duplicate exercise modal\"\n      );\n    },\n\n    onSwapPlacement: (placement: IProgramGridPlacement) => {\n      const dayData = ProgramGrid_dayDataAt(grid, placement.rowIndex, placement.colStart);\n      const exercise = Program_getProgramExerciseForKeyAndShortDayData(evaluatedProgram, dayData, placement.key);\n      if (exercise != null && Program_getNumberOfExerciseInstances(evaluatedProgram, placement.key) > 1) {\n        plannerDispatch(\n          lb<IPlannerState>().p(\"ui\").p(\"editExerciseModal\").record({ plannerExercise: exercise }),\n          \"Open edit exercise modal\"\n        );\n        navigateToModal(\"editExerciseChangeModal\", { programId });\n        return;\n      }\n      plannerDispatch(\n        lb<IPlannerState>()\n          .p(\"ui\")\n          .p(\"exercisePicker\")\n          .record({\n            state: { ...pickerStateFromPlannerExercise(settings, exercise), hideLabel: true },\n            dayData,\n            exerciseKey: placement.key,\n            change: \"one\",\n          }),\n        \"Open exercise picker modal\"\n      );\n    },\n\n    onAddExercise: (weekIndex: number, rowIndex: number) => {\n      plannerDispatch(\n        lb<IPlannerState>()\n          .p(\"ui\")\n          .p(\"exercisePicker\")\n          .record({\n            dayData: { week: weekIndex + 1, dayInWeek: rowIndex + 1 },\n            change: \"all\",\n            state: { ...pickerStateFromPlannerExercise(settings), hideLabel: true },\n          }),\n        \"Open add exercise picker\"\n      );\n    },\n\n    onShowWeekStats: (weekIndex: number) => {\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"showWeekStats\").record(weekIndex), \"Show week stats\");\n      navigateToModal(\"weekStatsModal\", { programId });\n    },\n\n    // The stats modal reads its week from `ui.weekIndex` and only its day from `showDayStats`, because\n    // everywhere else it opens from there is already inside one week. The grid isn't, so it has to say\n    // which week it means — and it means the first week that has this day.\n    onShowDayStats: (rowIndex: number) => {\n      const row = grid.rows[rowIndex];\n      const weekIndex = grid.columns.findIndex((column) => row != null && ProgramGrid_hasDay(row, column.weekIndex));\n      if (weekIndex === -1) {\n        return;\n      }\n      plannerDispatch(\n        [\n          lb<IPlannerState>().p(\"ui\").p(\"weekIndex\").record(weekIndex),\n          lb<IPlannerState>().p(\"ui\").p(\"showDayStats\").record(rowIndex),\n        ],\n        \"Show day stats\"\n      );\n      navigateToModal(\"dayStatsModal\", { programId });\n    },\n\n    onShowExerciseStats: (placement: IProgramGridPlacement) => {\n      const dayData = ProgramGrid_dayDataAt(grid, placement.rowIndex, placement.colStart);\n      const exercise = Program_getProgramExerciseForKeyAndShortDayData(evaluatedProgram, dayData, placement.key);\n      if (exercise == null) {\n        return;\n      }\n      plannerDispatch(\n        [\n          lb<IPlannerState>().p(\"ui\").p(\"focusedExercise\").record({\n            weekIndex: placement.colStart,\n            dayIndex: placement.rowIndex,\n            exerciseLine: exercise.line,\n          }),\n          lb<IPlannerState>().p(\"ui\").p(\"showExerciseStats\").record(true),\n        ],\n        \"Show exercise stats\"\n      );\n      navigateToModal(\"exerciseStatsModal\", { programId });\n    },\n  };\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../primitives/text\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\n\n// A structural fact about an exercise — what the grid can't draw and the strip has no room to spell\n// out. Shared by the strip and the dock so the same fact reads the same in both places.\n//\n// No vertical padding: the text's own line box sets the height, which keeps the pill proportional to\n// the font scale without needing a fractional spacing step.\n//\n// `isInverse` is for a selected strip, whose fill is the strong end of its color family: the solid\n// grey pill goes muddy on it, so the badge becomes an outline in the same inverse color as the text\n// around it. Android's Uniwind drops utilities from a className that changes with state, so the\n// radius and the border live in `style`.\nexport function GridBadge(props: { label: string; isInverse?: boolean }): JSX.Element {\n  return (\n    <View\n      className={`px-1 ml-1 shrink-0 ${props.isInverse ? \"\" : \"bg-background-darkgray\"}`}\n      style={{\n        borderRadius: 4,\n        borderWidth: props.isInverse ? 1 : 0,\n        borderColor: Tailwind_semantic().text.primaryinverse,\n      }}\n    >\n      <Text\n        className={`text-xs ${props.isInverse ? \"text-text-primaryinverse\" : \"text-text-alwayswhite\"}`}\n        numberOfLines={1}\n      >\n        {props.label}\n      </Text>\n    </View>\n  );\n}\n","import { JSX, memo, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../primitives/text\";\nimport { Pressable } from \"../../primitives/pressable\";\nimport { useRem } from \"../../../utils/useRem\";\nimport { FastText } from \"../../primitives/fastText\";\nimport { IFastTextBuild, StyledText, StyledText_remToPx } from \"../../../utils/styledText\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport {\n  IProgramGridPlacement,\n  IProgramGridSelection,\n  IProgramGridSchemeToken,\n  IProgramGridTokenKind,\n  ProgramGrid_hasResolvedLine,\n  ProgramGrid_orderSuffix,\n} from \"../../../pages/planner/models/programGrid\";\nimport { GRID_CELL_INSET_X, GRID_CELL_INSET_Y } from \"../../../pages/planner/models/programGridGeometry\";\nimport { GridBadge } from \"./gridBadge\";\n\nexport interface IGridCellProps {\n  placement: IProgramGridPlacement;\n  width: number;\n  // One column, which is not `width / span` while a resize is stretching the strip — and it is the\n  // column the resolved sections are laid against, not the strip.\n  columnWidth: number;\n  height: number;\n  showScheme: boolean;\n  selection?: IProgramGridSelection;\n  onSelect: (placementId: string) => void;\n  isResizing: boolean;\n}\n\nfunction buildScheme(tokens: IProgramGridSchemeToken[], isActive: boolean): IFastTextBuild {\n  const builder = new StyledText();\n  // Syntax coloring is legible on a pale fill and illegible on the strong one, so a selected strip\n  // drops it and prints in the inverse text color instead. The colors are what is being given up\n  // for the selection to be unmistakable, and only for as long as it is selected.\n  if (isActive) {\n    for (const token of tokens) {\n      builder.add(token.text, {\n        color: Tailwind_semantic().text.primaryinverse,\n        fontWeight: token.isCurrent ? \"700\" : undefined,\n      });\n    }\n    return builder.build();\n  }\n  // The same palette entries the editor's own highlighting uses (liftoEditorBrain's nodeStyles),\n  // so a strip and the Liftoscript it stands for are the same colors — rather than the workout\n  // screen's reps/weight/rpe family, which is a second opinion about the same tokens.\n  const colorByKind: Record<IProgramGridTokenKind, string> = {\n    setPart: Tailwind_semantic().syntax.atom,\n    weight: Tailwind_semantic().syntax.literal,\n    rpe: Tailwind_semantic().syntax.literal,\n    timer: Tailwind_semantic().syntax.keyword,\n    auto: Tailwind_semantic().syntax.keyword,\n    // The editor leaves a `...name` reference unstyled, so it stays the quiet one here too.\n    reuse: Tailwind_semantic().text.secondary,\n    separator: Tailwind_semantic().text.secondary,\n  };\n  for (const token of tokens) {\n    builder.add(token.text, { color: colorByKind[token.kind], fontWeight: token.isCurrent ? \"700\" : undefined });\n  }\n  return builder.build();\n}\n\nexport const GridCell = memo(function GridCell(props: IGridCellProps): JSX.Element {\n  const rem = useRem();\n  const { placement, selection } = props;\n  const scheme = props.showScheme ? placement.scheme : [];\n  const isSelected = selection?.selectedIds.has(placement.id) ?? false;\n  // Reuse partners and the other runs of the same exercise share one step between them: both answer\n  // \"where else does this go\", and the strip's own family already says which kind of thing it is.\n  const isReached =\n    (selection?.linkedIds.has(placement.id) ?? false) || (selection?.sameExerciseIds.has(placement.id) ?? false);\n  const isActive = isSelected || props.isResizing;\n  // Every strip belongs to one color family, and the family says what kind of thing it is. How far\n  // along that family it is fired says how the current selection relates to it: pale at rest, one\n  // step up when the selection reaches it, the strong end when it *is* the selection — dark on light\n  // themes, light on dark ones.\n  //\n  // All three are fills rather than borders. Selection was a border weight once, and a reuse partner\n  // a border color, and both were nearly invisible next to each other on a strip of the same hue; a\n  // fill is legible from across the grid, which is the distance you actually read this from.\n  //\n  // Resolved values rather than `bg-*` classes so a utility that the scanner never emitted can't\n  // silently fall back to transparent; these still follow the theme.\n  const family = placement.isOverride ? \"override\" : placement.notused ? \"notused\" : \"exercise\";\n  const fills = {\n    override: [\n      Tailwind_semantic().background.gridoverride,\n      Tailwind_semantic().background.gridoverridereached,\n      Tailwind_semantic().background.gridoverrideactive,\n    ],\n    notused: [\n      Tailwind_semantic().background.gridnotused,\n      Tailwind_semantic().background.gridnotusedreached,\n      Tailwind_semantic().background.gridnotusedactive,\n    ],\n    exercise: [\n      Tailwind_semantic().background.gridexercise,\n      Tailwind_semantic().background.gridexercisereached,\n      Tailwind_semantic().background.gridexerciseactive,\n    ],\n  }[family];\n  const background = isActive ? fills[2] : isReached ? fills[1] : fills[0];\n  // A resting border is a couple of steps darker than its own fill in light mode and lighter in\n  // dark, so strips keep a defined edge against both the fill and the day box behind them. The\n  // override's is heavier still — it has to read as a punch-in, not just another card.\n  //\n  // Anything the selection touches borrows the strong tone for its edge as well. On a selected strip\n  // that is its own fill, so it reads as one solid block rather than a filled card in a frame; on a\n  // reached one it sharpens a step that is deliberately gentle — the mid fill is only one rung above\n  // resting, and on its own it was easy to miss.\n  const borderColor =\n    isActive || isReached\n      ? fills[2]\n      : {\n          override: Tailwind_semantic().text.cardyellowsubtle,\n          notused: Tailwind_semantic().border.gridnotused,\n          exercise: Tailwind_semantic().border.gridexercise,\n        }[family];\n  const built = useMemo(() => buildScheme(scheme, isActive), [scheme, isActive]);\n  // Only for a line whose scheme is a `...reference` that resolves to something; `resolved` is empty\n  // for everything else, so an ordinary strip keeps its two lines even in a grid tall enough for\n  // three. The same predicate the geometry used to give this lane its height — a strip that fails it\n  // gets no row at all, rather than a blank line in a lane that was never made room for one.\n  const showScheme = props.showScheme;\n  const builtResolved = useMemo(\n    () =>\n      showScheme && ProgramGrid_hasResolvedLine(placement)\n        ? placement.resolved.map((section) => ({ ...section, built: buildScheme(section.tokens, isActive) }))\n        : [],\n    [placement, showScheme, isActive]\n  );\n\n  const nameColor = isActive\n    ? Tailwind_semantic().text.primaryinverse\n    : placement.notused\n      ? Tailwind_semantic().text.secondary\n      : Tailwind_semantic().text.primary;\n\n  // One node rather than a nested <Text> per rung: the ladder is drawn on every strip of every week,\n  // and on Android a nested span needs its own font family to change weight at all.\n  const name = useMemo(() => {\n    const builder = new StyledText();\n    placement.nameParts.forEach((part, index) => {\n      if (index > 0) {\n        builder.add(\" | \", { fontWeight: \"400\" });\n      }\n      builder.add(part.text, { fontWeight: part.isCurrent ? \"700\" : \"400\" });\n    });\n    return builder.build();\n  }, [placement.nameParts]);\n\n  return (\n    <Pressable\n      style={\n        {\n          width: props.width,\n          height: props.height,\n          paddingHorizontal: GRID_CELL_INSET_X * rem,\n          paddingVertical: GRID_CELL_INSET_Y * rem,\n          // A strip is the most-dragged thing in the grid, so it says \"pick me up\" rather than\n          // \"click me\". Set here rather than inherited from the drag handle above, because\n          // react-native-web gives every Pressable a cursor of its own. `grab` is outside RN's\n          // CursorValue, hence the cast — it is dropped on native, which has no cursor anyway.\n          cursor: \"grab\",\n        } as object\n      }\n      testID={`grid-cell-${placement.fullName}-${placement.colStart}`}\n      onPress={() => props.onSelect(placement.id)}\n    >\n      <View\n        className=\"flex-1 overflow-hidden rounded\"\n        style={{\n          borderColor,\n          borderWidth: isActive || placement.isOverride ? 2 : 1,\n        }}\n      >\n        {/* The fill is translucent so the day boxes underneath stay visible through a strip that\n            spans several of them. On web an absolutely positioned sibling paints above in-flow\n            ones, so the content needs to be positioned too to stay on top. */}\n        {/* Opacity via style, not an `opacity-*` class: the utility is only emitted if the scanner\n            happens to generate that step, and a missing one silently renders fully opaque. */}\n        {/* Translucent only while pale — a selected strip is opaque, because the day box showing\n            through the strong fill is exactly what would mute it back down. */}\n        <View className=\"absolute inset-0\" style={{ opacity: isActive ? 1 : 0.85, backgroundColor: background }} />\n        {/* The same bar the workout screen draws down the side of supersetted entries\n            (historyEntry.tsx), in the same colors — inside the strip rather than beside it, because\n            here there is no gutter to hang it in. It sits above the fill and outside the content's\n            padding, so it reads as part of the strip's edge. */}\n        {placement.supersetColor != null && (\n          <View\n            testID=\"grid-cell-superset-line\"\n            className=\"absolute top-0 bottom-0 left-0\"\n            style={{ width: 3, backgroundColor: placement.supersetColor }}\n          />\n        )}\n        <View className=\"relative justify-center flex-1 px-2\">\n          <View className=\"flex-row items-center\">\n            <FastText\n              text={name.text}\n              fragments={name.fragments}\n              color={nameColor}\n              fontSize={StyledText_remToPx(\"xs\", rem)}\n              numberOfLines={1}\n              style={{ flexShrink: 1 }}\n            />\n            {/* Split off the name rather than written into it, so it is the name that gives way in\n                a narrow column: `Squat, Barb…[1]` still says which exercise runs first, and\n                `Squat, Barbell…` says nothing about order at all. */}\n            {placement.order != null && (\n              <Text className=\"text-xs font-bold shrink-0\" style={{ color: nameColor }} numberOfLines={1}>\n                {ProgramGrid_orderSuffix(placement)}\n              </Text>\n            )}\n            {/* Only what a strip is already shaped to carry. An exercise's tags are just as\n                invisible, but a cell is one column wide and the dock is the whole screen.\n                And it goes at the same width the scheme does: the badge is fixed-size, so a column\n                too narrow for numbers is one where it crowds the name down to nothing rather than\n                sharing the room with it. Zoomed that far out the question is which exercises are\n                where, and the green fill still answers what kind of thing this is. */}\n            {props.showScheme && placement.notused && (\n              <GridBadge label={placement.isTemplate ? \"tmpl\" : \"unused\"} isInverse={isActive} />\n            )}\n          </View>\n          {built.text !== \"\" && (\n            <FastText\n              text={built.text}\n              fragments={built.fragments}\n              numberOfLines={1}\n              fontSize={StyledText_remToPx(\"xs\", rem)}\n            />\n          )}\n          {/* What the reference above resolves to. Laid out as sections against the week columns\n              the strip covers rather than as one line, because a reusing line reads the same every\n              week while what it reuses need not — and one strip printing week 1's numbers over four\n              weeks that run something else is worse than printing none.\n\n              No dividers between them: the strip is one thing, and a rule down the middle of it\n              starts an argument about whether it is still one thing. Where the numbers do change,\n              the change itself is the boundary — and each section clips to its own column, so a\n              section too narrow for its numbers ellipsizes instead of running into the next one's.\n\n              A section is exactly as wide as the columns it covers, NOT that share of the strip's\n              content box. The two are not the same: the content box is inset from the strip by the\n              cell's padding, so splitting *it* proportionally puts section i at\n              `columnWidth * i - padding * i / span` and every section drifts further left than the\n              last — a full column's worth of skew by the far end of a twelve-week strip.\n\n              Whole columns work because a one-week strip in that column is inset by the same\n              padding this one is: both content boxes start `padding` into their column, so a plain\n              multiple of `columnWidth` lines the two up. The last section takes the remainder\n              instead, so it ends on the content box's edge rather than running under the border. */}\n          {builtResolved.length > 0 && (\n            <View className=\"flex-row\" testID=\"grid-cell-resolved\">\n              {builtResolved.map((section, index) => (\n                <View\n                  key={index}\n                  className=\"overflow-hidden\"\n                  style={{\n                    ...(index < builtResolved.length - 1\n                      ? {\n                          width: props.columnWidth * (section.colEnd - section.colStart + 1),\n                          paddingRight: GRID_CELL_INSET_X * rem,\n                        }\n                      : { flex: 1 }),\n                  }}\n                >\n                  <FastText\n                    text={section.built.text}\n                    fragments={section.built.fragments}\n                    numberOfLines={1}\n                    fontSize={StyledText_remToPx(\"xs\", rem)}\n                  />\n                </View>\n              ))}\n            </View>\n          )}\n        </View>\n      </View>\n    </Pressable>\n  );\n});\n","import { RefObject, useCallback, useContext, useEffect, useMemo, useRef } from \"react\";\nimport { ScrollView, View } from \"react-native\";\nimport { NavScreenScrollContext } from \"../../../navigation/NavScreenScrollContext\";\n\n// How close to the edge of the visible area the finger has to get before the page starts following\n// it, and how fast it may run. Same numbers as the editor's reorder, which were tuned on device.\nconst autoScrollZone = 56;\nconst autoScrollMaxStep = 14;\nconst autoScrollIntervalMs = 16;\n\n// Re-runs the drag's own math with the translation the scroll has added to it. The drags work in\n// screen-space translations, so a page that moves under a still finger changes where the finger\n// points without changing the translation at all.\ntype IApplyDrag = (translation: number) => void;\n\n// The whole decision a tick makes, as arithmetic — no refs, no timers, no scroller. Extracted\n// because this is the part that can be wrong in ways nobody notices: an off-by-one edge zone, a\n// clamp that deadlocks, a stall that goes undetected. The hook keeps measurement, the timer and\n// `scrollTo`; everything else about *whether and where to scroll* is here, and tested.\nexport type IGridAutoScrollStep =\n  | { kind: \"idle\" }\n  // The scroller stopped following where it was asked — it ran out of content. Believe it rather\n  // than keep adding scroll that never happens, or the ghost sails away from the finger.\n  | { kind: \"resync\"; to: number }\n  | { kind: \"scroll\"; to: number };\n\nexport function GridDragAutoScroll_toViewport(pagePosition: number, pageScroll: number): number {\n  return pagePosition - pageScroll;\n}\n\nexport function GridDragAutoScroll_step(args: {\n  // Where the finger is, in screen coordinates, and the edges it is measured against.\n  position: number;\n  bounds: { start: number; end: number };\n  zone: number;\n  maxStep: number;\n  // Where the scroller was last asked to be, where it says it is, and where it was asked to go.\n  current: number;\n  reported: number;\n  target: number | undefined;\n  // The furthest it can scroll, or undefined when nothing has reported yet. Undefined leaves the\n  // ceiling open on purpose: clamping an unknown extent to 0 deadlocks, since no scroll means no\n  // scroll event means the maximum is never learned. A known 0 is different — the view genuinely\n  // does not scroll — and conflating the two made a non-scrollable grid report movement that never\n  // happened, which moved the drop target under a still finger.\n  knownMax: number | undefined;\n}): IGridAutoScrollStep {\n  const { position, bounds, zone, maxStep } = args;\n  const overStart = bounds.start + zone - position;\n  const overEnd = position - (bounds.end - zone);\n  const depth = overStart > 0 ? -overStart : overEnd > 0 ? overEnd : 0;\n  if (depth === 0) {\n    return { kind: \"idle\" };\n  }\n  if (args.target != null && Math.abs(args.reported - args.target) > maxStep * 2) {\n    return { kind: \"resync\", to: args.reported };\n  }\n  // Speed ramps with how far past the edge the finger is, up to one full step.\n  const step = Math.sign(depth) * Math.min(maxStep, (Math.abs(depth) / zone) * maxStep);\n  const max = args.knownMax ?? Number.MAX_SAFE_INTEGER;\n  const next = Math.min(Math.max(0, args.current + step), max);\n  return next === args.current ? { kind: \"idle\" } : { kind: \"scroll\", to: next };\n}\n\nexport interface IGridDragAutoScroll {\n  begin: (axis: \"x\" | \"y\", absolute: number, apply: IApplyDrag) => void;\n  move: (translation: number, absolute: number) => void;\n  end: () => void;\n}\n\ninterface IGridDragAutoScrollOptions {\n  // The grid's own horizontal scroller and the box it shows through, for week drags.\n  horizontalRef: RefObject<ScrollView | null>;\n  horizontalViewportRef: RefObject<View | null>;\n  horizontalOffsetRef: RefObject<number>;\n  maxHorizontalScroll: () => number;\n}\n\nexport function useGridDragAutoScroll(options: IGridDragAutoScrollOptions): IGridDragAutoScroll {\n  const scrollCtx = useContext(NavScreenScrollContext);\n  const axisRef = useRef<\"x\" | \"y\">(\"y\");\n  const applyRef = useRef<IApplyDrag | undefined>(undefined);\n  const lastTranslationRef = useRef(0);\n  const absoluteRef = useRef(0);\n  // Where the scroll was when the drag started: everything the drag computes is relative to it.\n  const scrollAtStartRef = useRef(0);\n  // Where auto-scroll has asked the scroller to be. The scroller's own reported offset trails by a\n  // frame or two, which the eye reads as the ghost sliding off the finger.\n  const targetRef = useRef<number | undefined>(undefined);\n  const boundsRef = useRef<{ start: number; end: number } | undefined>(undefined);\n  // Undefined until the screen reports a scroll, which it may never have done when the grid is\n  // opened and dragged straight away. Distinct from a known 0 — see GridDragAutoScroll_step.\n  const maxVerticalRef = useRef<number | undefined>(undefined);\n  const timerRef = useRef<ReturnType<typeof setInterval> | undefined>(undefined);\n\n  useEffect(() => {\n    return scrollCtx?.addScrollListener((e) => {\n      maxVerticalRef.current = Math.max(0, e.nativeEvent.contentSize.height - e.nativeEvent.layoutMeasurement.height);\n    });\n  }, [scrollCtx]);\n\n  const { horizontalOffsetRef, horizontalRef, horizontalViewportRef, maxHorizontalScroll } = options;\n\n  const scrollNow = useCallback(() => {\n    if (targetRef.current != null) {\n      return targetRef.current;\n    }\n    return axisRef.current === \"y\" ? (scrollCtx?.scrollYRef.current ?? 0) : horizontalOffsetRef.current;\n  }, [scrollCtx, horizontalOffsetRef]);\n\n  const stop = useCallback(() => {\n    if (timerRef.current != null) {\n      clearInterval(timerRef.current);\n      timerRef.current = undefined;\n    }\n  }, []);\n\n  const tick = useCallback(() => {\n    const bounds = boundsRef.current;\n    const apply = applyRef.current;\n    const node = axisRef.current === \"y\" ? scrollCtx?.scrollRef.current : horizontalRef.current;\n    if (bounds == null || apply == null || node == null) {\n      return;\n    }\n    const step = GridDragAutoScroll_step({\n      position: absoluteRef.current,\n      bounds,\n      zone: autoScrollZone,\n      maxStep: autoScrollMaxStep,\n      current: scrollNow(),\n      reported: axisRef.current === \"y\" ? (scrollCtx?.scrollYRef.current ?? 0) : horizontalOffsetRef.current,\n      target: targetRef.current,\n      // Vertical is unknown until the screen reports; horizontal is known from the content and\n      // container widths, so a 0 there means it genuinely does not scroll.\n      knownMax: axisRef.current === \"y\" ? maxVerticalRef.current : maxHorizontalScroll(),\n    });\n    if (step.kind === \"idle\") {\n      return;\n    }\n    if (step.kind === \"resync\") {\n      targetRef.current = step.to;\n      return;\n    }\n    targetRef.current = step.to;\n    node.scrollTo(axisRef.current === \"y\" ? { y: step.to, animated: false } : { x: step.to, animated: false });\n    apply(lastTranslationRef.current + (step.to - scrollAtStartRef.current));\n  }, [scrollCtx, horizontalRef, horizontalOffsetRef, maxHorizontalScroll, scrollNow]);\n\n  const begin = useCallback(\n    (axis: \"x\" | \"y\", absolute: number, apply: IApplyDrag) => {\n      axisRef.current = axis;\n      applyRef.current = apply;\n      lastTranslationRef.current = 0;\n      absoluteRef.current = absolute;\n      targetRef.current = undefined;\n      scrollAtStartRef.current = scrollNow();\n      boundsRef.current = undefined;\n      if (axis === \"y\") {\n        // Measured rather than derived from the window: on Android edge-to-edge the window and\n        // measureInWindow don't share an origin. The sticky header and the dock cover the ends of\n        // the scroll area, and dragging into what they cover should still scroll.\n        scrollCtx?.viewportRef.current?.measureInWindow((_x, y, _width, height) => {\n          boundsRef.current = {\n            start: y + (scrollCtx?.stickyHeaderHeight ?? 0),\n            end: y + height - (scrollCtx?.footerHeight ?? 0),\n          };\n        });\n      } else {\n        horizontalViewportRef.current?.measureInWindow((x, _y, width) => {\n          boundsRef.current = { start: x, end: x + width };\n        });\n      }\n      stop();\n      timerRef.current = setInterval(tick, autoScrollIntervalMs);\n    },\n    [scrollCtx, horizontalViewportRef, scrollNow, stop, tick]\n  );\n\n  const move = useCallback(\n    (translation: number, absolute: number) => {\n      lastTranslationRef.current = translation;\n      absoluteRef.current = absolute;\n      applyRef.current?.(translation + (scrollNow() - scrollAtStartRef.current));\n    },\n    [scrollNow]\n  );\n\n  const end = useCallback(() => {\n    stop();\n    applyRef.current = undefined;\n    targetRef.current = undefined;\n    boundsRef.current = undefined;\n  }, [stop]);\n\n  useEffect(() => stop, [stop]);\n\n  return useMemo(() => ({ begin, move, end }), [begin, move, end]);\n}\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport Animated, { useAnimatedStyle, SharedValue } from \"react-native-reanimated\";\nimport { Text } from \"../../primitives/text\";\nimport { useRem } from \"../../../utils/useRem\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport {\n  GRID_CELL_INSET_X,\n  GRID_CELL_INSET_Y,\n  GRID_DAY_BOX_INSET,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { IGridActiveGhost, IGridLaneRef } from \"./useGridDrags\";\n\n// What is being dragged, floating over the grid: one per row for the day drag and one for the\n// exercise drag. The animated *shells* are mounted for the whole life of the grid, because building\n// one when the drag starts would mean a render while the pan is live, which is what cancels the pan.\n// Their contents are not: a ghost is a second copy of a row, and keeping every copy mounted made a\n// zoom re-render the whole grid twice over. So the shells wait empty and fill in at drag start —\n// which is safe as long as the flag reaches only the ghosts, never a row (see EditProgramGrid).\n//\n// A drag can carry several rows or several strips, and each of them lifts from where it already is:\n// the shells sit at their own row's coordinates and the drag only ever contributes a translation.\n//\n// Only `opacity` and `transform` are ever animated. Animating `top`/`height`/`zIndex` instead —\n// which is what the first version did — makes Fabric commit a new shadow tree and reorder subviews\n// on every frame of the drag, right under the finger, and the pan dies exactly as it did before.\n// So every ghost has a static size and sits at the top of the rows, and the drag moves it.\nexport interface IGridDragGhostProps {\n  rowIndex: number;\n  name: string;\n  laneNames: string[];\n  width: number;\n  top: number;\n  labelHeight: number;\n  // Where each lane starts, from the geometry — see IGridGeometryRow.laneTops.\n  laneTops: number[];\n  // Which rows are being dragged as days, and which strips as exercises — the same values that dim\n  // the sources, so a ghost needs nothing of its own to know it is one of the ones on the move.\n  draggedRows: SharedValue<number[]>;\n  draggedLanes: SharedValue<IGridLaneRef[]>;\n  ghostY: SharedValue<number>;\n  // The shells stay mounted; their contents do not. A ghost is a full second copy of the row it\n  // shadows, and mounting all of them at rest made every zoom re-render the grid twice over.\n  activeGhost?: IGridActiveGhost;\n}\n\n// Enough to read what is being carried, sheer enough that the row it is passing over and the drop\n// line under it stay visible through it.\nconst GHOST_OPACITY = 0.75;\n\nexport const GridDragGhost = memo(function GridDragGhost(props: IGridDragGhostProps): JSX.Element {\n  const rem = useRem();\n  const { rowIndex, draggedRows, draggedLanes, ghostY, laneTops, labelHeight } = props;\n  const dayStyle = useAnimatedStyle(() => ({\n    opacity: draggedRows.value.indexOf(rowIndex) !== -1 ? GHOST_OPACITY : 0,\n    transform: [{ translateY: ghostY.value }],\n  }));\n  const laneStyle = useAnimatedStyle(() => ({\n    opacity: draggedLanes.value.some((lane) => lane.row === rowIndex) ? GHOST_OPACITY : 0,\n    transform: [{ translateY: ghostY.value }],\n  }));\n\n  const activeGhost = props.activeGhost;\n  const showDay = activeGhost?.kind === \"day\" && activeGhost.rows.indexOf(rowIndex) !== -1;\n  // Which of this row's strips are on the move. They gather into one card from the topmost of them\n  // rather than each floating at its own lane, so a scattered selection travels as one thing.\n  const movedLanes =\n    activeGhost?.kind === \"lane\"\n      ? activeGhost.lanes.filter((lane) => lane.row === rowIndex).map((lane) => lane.lane)\n      : [];\n\n  const laneStrip = (laneName: string, laneIndex: number): JSX.Element => (\n    <View\n      key={laneIndex}\n      style={{\n        height: laneTops[laneIndex + 1] - laneTops[laneIndex],\n        paddingHorizontal: GRID_CELL_INSET_X * rem,\n        paddingVertical: GRID_CELL_INSET_Y * rem,\n      }}\n    >\n      <View\n        className=\"justify-center flex-1 px-2 rounded\"\n        style={{\n          borderWidth: 1,\n          borderColor: Tailwind_semantic().text.purple,\n          backgroundColor: Tailwind_semantic().background.cardpurpleselected,\n        }}\n      >\n        <Text className=\"text-xs font-bold text-text-primary\" numberOfLines={1}>\n          {laneName}\n        </Text>\n      </View>\n    </View>\n  );\n  // The shadow lives on the outer view of each pair: clipping the lane card to its strips would clip\n  // its shadow away with the rest.\n  const lift = {\n    position: \"absolute\" as const,\n    left: 0,\n    width: props.width,\n    // Also as a style, not only as the prop: a ghost sits over the very day names whose long press\n    // starts the drag, and it must never be what the finger lands on.\n    pointerEvents: \"none\" as const,\n    shadowColor: \"#000\",\n    shadowOffset: { width: 0, height: 4 },\n    shadowOpacity: 0.25,\n    shadowRadius: 8,\n    elevation: 8,\n  };\n  const card = {\n    borderWidth: 2,\n    borderColor: Tailwind_semantic().icon.purple,\n    backgroundColor: Tailwind_semantic().background.cardyellow,\n  };\n\n  return (\n    <>\n      <Animated.View pointerEvents=\"none\" style={[dayStyle, lift, { top: props.top }]}>\n        {showDay ? (\n          <View className=\"overflow-hidden rounded\" style={card}>\n            <View className=\"justify-center px-[0.375rem]\" style={{ height: labelHeight }}>\n              <Text className=\"text-sm font-semibold text-text-primary\" numberOfLines={1}>\n                {props.name}\n              </Text>\n            </View>\n            {props.laneNames.map((laneName, laneIndex) => laneStrip(laneName, laneIndex))}\n          </View>\n        ) : null}\n      </Animated.View>\n      <Animated.View pointerEvents=\"none\" style={[laneStyle, lift, { top: props.top + labelHeight }]}>\n        {movedLanes.length > 0 ? (\n          <View className=\"overflow-hidden rounded\" style={[card, { marginTop: laneTops[Math.min(...movedLanes)] }]}>\n            {movedLanes.map((laneIndex) => laneStrip(props.laneNames[laneIndex] ?? \"\", laneIndex))}\n          </View>\n        ) : null}\n      </Animated.View>\n    </>\n  );\n});\n\n// A week's ghost is its name alone, riding in the sticky header among the other week names: the\n// column it stands for is the whole grid below, and carrying a copy of it under the finger said\n// less than the header row already says, at the cost of covering everything you drop it against.\nexport interface IGridWeekGhostProps {\n  weekIndex: number;\n  name: string;\n  columnWidth: number;\n  draggedWeek: SharedValue<number>;\n  ghostX: SharedValue<number>;\n  // As for the day ghost: mounted empty for the grid's life, filled in when a week drag starts.\n  activeGhost?: IGridActiveGhost;\n}\n\nexport const GridWeekGhost = memo(function GridWeekGhost(props: IGridWeekGhostProps): JSX.Element {\n  const rem = useRem();\n  const { weekIndex, draggedWeek, ghostX } = props;\n  const style = useAnimatedStyle(() => ({\n    opacity: draggedWeek.value === weekIndex ? GHOST_OPACITY : 0,\n    transform: [{ translateX: ghostX.value }],\n  }));\n  const activeGhost = props.activeGhost;\n  const show = activeGhost?.kind === \"week\" && activeGhost.weeks.indexOf(weekIndex) !== -1;\n\n  return (\n    <Animated.View\n      pointerEvents=\"none\"\n      style={[\n        style,\n        {\n          position: \"absolute\",\n          top: 0,\n          bottom: 0,\n          left: weekIndex * props.columnWidth,\n          width: props.columnWidth,\n          justifyContent: \"center\",\n          paddingHorizontal: GRID_DAY_BOX_INSET * rem,\n          pointerEvents: \"none\" as const,\n          shadowColor: \"#000\",\n          shadowOffset: { width: 4, height: 0 },\n          shadowOpacity: 0.25,\n          shadowRadius: 8,\n          elevation: 8,\n        },\n      ]}\n    >\n      {!show ? null : (\n        <View\n          className=\"px-2 py-2 rounded\"\n          style={{\n            borderWidth: 2,\n            borderColor: Tailwind_semantic().icon.purple,\n            backgroundColor: Tailwind_semantic().background.cardyellow,\n          }}\n        >\n          <Text className=\"text-sm font-bold text-text-primary\" numberOfLines={1}>\n            {props.name}\n          </Text>\n        </View>\n      )}\n    </Animated.View>\n  );\n});\n","import { JSX, ReactNode, memo, useCallback, useEffect, useRef } from \"react\";\nimport { View, GestureResponderEvent, PointerEvent } from \"react-native\";\nimport { GridDragAutoScroll_toViewport } from \"./gridDragAutoScroll\";\n\nexport interface IGridDragHandleProps {\n  children: ReactNode;\n  onDragStart: (absolute: number) => void;\n  onDragMove: (translation: number, absolute: number) => void;\n  // False when the touch was terminated rather than released, in which case the drop is dropped.\n  onDragEnd: (commit: boolean) => void;\n  // Handled here rather than by a nested Pressable, so tap and drag come from one place.\n  onTap?: () => void;\n  // Days and exercises stack down the grid, weeks run across it. Same gesture, different axis.\n  axis?: \"y\" | \"x\";\n}\n\n// Kept in step with the native handle's threshold — see gridDragHandle.native.tsx.\nconst LONG_PRESS_MS = 500;\n// Moving further than this before the long press lands means the user is scrolling, not dragging.\nconst SLOP = 8;\n// A mouse never waits: the drag arms as soon as the pointer has clearly moved rather than jittered.\n// Holding still for half a second is a touch idiom, and on a mouse it reads as the grid being dead\n// — you press, you move, and SLOP cancels the press before the timer ever lands.\nconst MOUSE_THRESHOLD = 4;\n\n// On the document rather than on the handle, because a drag is a state of the whole page: the\n// cursor spends most of a drag somewhere else entirely, over rows this handle knows nothing about.\n// Written straight to the DOM rather than through a style prop so that saying \"you are dragging\"\n// costs no render — a re-render here would rebuild every cell in the row under the cursor.\nfunction setDocumentCursor(cursor: string): void {\n  if (typeof document !== \"undefined\") {\n    document.body.style.cursor = cursor;\n  }\n}\n\n// react-native-gesture-handler is stubbed to no-ops on web (utils/rnStubs/gestureHandler.js), so the\n// press-then-drag is built from the responder system, which react-native-web implements.\n//\n// Two things about that system shape everything below. Start negotiation is won by the *deepest*\n// view that wants the touch, so a cell's Pressable takes the press before this handle can see it —\n// which is why a mouse drag arms by stealing the responder on move rather than by being granted it\n// on press. And a responder is taken away by events that have nothing to do with the gesture, so\n// the drag has to decline that; see onResponderTerminationRequest.\nexport const GridDragHandle = memo(function GridDragHandle(props: IGridDragHandleProps): JSX.Element {\n  const { onDragStart, onDragMove, onDragEnd, onTap, axis } = props;\n  const startRef = useRef(0);\n  const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const isDraggingRef = useRef(false);\n  // Which kind of pointer started this press, so the two idioms can differ without guessing from\n  // the device. `pointerdown` is also the only place that says — a responder event has been\n  // normalised into a fake touch by the time it arrives.\n  const isMouseRef = useRef(false);\n\n  const cancelTimer = useCallback(() => {\n    if (timerRef.current != null) {\n      clearTimeout(timerRef.current);\n      timerRef.current = undefined;\n    }\n  }, []);\n\n  // The auto-scroll bounds come from measureInWindow, which is viewport-relative on the web. On a\n  // page that scrolls the window (the web planner), page coordinates drift from them by the scroll.\n  const positionOf = useCallback(\n    (e: { nativeEvent: { pageX: number; pageY: number } }) =>\n      axis === \"x\"\n        ? GridDragAutoScroll_toViewport(e.nativeEvent.pageX, window.scrollX)\n        : GridDragAutoScroll_toViewport(e.nativeEvent.pageY, window.scrollY),\n    [axis]\n  );\n\n  // Where the press began, recorded whether or not this handle ends up owning it. That matters for\n  // exercise strips: the cell's Pressable wins the press, so onResponderGrant may not arrive until\n  // the drag is already several pixels along, and by then the grant's own coordinates are no use as\n  // an origin. A DOM event doesn't care who the responder is.\n  const onPointerDown = useCallback(\n    (e: PointerEvent) => {\n      isMouseRef.current = e.nativeEvent.pointerType === \"mouse\";\n      startRef.current = positionOf(e);\n      isDraggingRef.current = false;\n      cancelTimer();\n    },\n    [cancelTimer, positionOf]\n  );\n\n  const beginDrag = useCallback(() => {\n    isDraggingRef.current = true;\n    setDocumentCursor(\"grabbing\");\n    // From where the press began, not from wherever the drag armed: the translation the drop\n    // resolves against has to share an origin with the long-press path, or a mouse drag lands short\n    // of the cursor by however far it travelled before arming.\n    onDragStart(startRef.current);\n  }, [onDragStart]);\n\n  // A drag outlives the element it started on — the cursor travels over other rows, the footer, the\n  // window's edge — so the grabbing cursor has to be released whatever ends it, including an unmount\n  // mid-drag. Only when this handle is the one holding it: a row unmounting after some *other*\n  // drag's commit must not clear a cursor it never set.\n  useEffect(() => {\n    return () => {\n      if (isDraggingRef.current) {\n        setDocumentCursor(\"\");\n      }\n    };\n  }, []);\n\n  const onGrant = useCallback(\n    (e: GestureResponderEvent) => {\n      if (isDraggingRef.current) {\n        return;\n      }\n      if (isMouseRef.current) {\n        // Granted after a move means this handle stole the responder from a nested Pressable, which\n        // it only does past the threshold — so the drag starts here. Granted at the press itself\n        // (a day name, with nothing nested to compete) leaves it to onMove, which arms on distance.\n        if (Math.abs(positionOf(e) - startRef.current) > MOUSE_THRESHOLD) {\n          beginDrag();\n        }\n        return;\n      }\n      timerRef.current = setTimeout(beginDrag, LONG_PRESS_MS);\n    },\n    [beginDrag, positionOf]\n  );\n\n  const onMove = useCallback(\n    (e: GestureResponderEvent) => {\n      const absolute = positionOf(e);\n      const delta = absolute - startRef.current;\n      if (!isDraggingRef.current) {\n        if (!isMouseRef.current) {\n          if (Math.abs(delta) > SLOP) {\n            cancelTimer();\n          }\n          return;\n        }\n        if (Math.abs(delta) <= MOUSE_THRESHOLD) {\n          return;\n        }\n        beginDrag();\n      }\n      onDragMove(delta, absolute);\n    },\n    [beginDrag, cancelTimer, onDragMove, positionOf]\n  );\n\n  // Taking the responder off whoever holds it — for a strip, the cell's Pressable, whose press is\n  // cancelled by the theft, so a completed drag can't also register as a tap.\n  const onMoveShouldSetResponder = useCallback(\n    (e: GestureResponderEvent) => {\n      if (isDraggingRef.current) {\n        return true;\n      }\n      // Touch keeps the long press: stealing on distance would take every scroll with it.\n      return isMouseRef.current && Math.abs(positionOf(e) - startRef.current) > MOUSE_THRESHOLD;\n    },\n    [positionOf]\n  );\n\n  const onRelease = useCallback(\n    (commit: boolean) => {\n      cancelTimer();\n      if (isDraggingRef.current) {\n        isDraggingRef.current = false;\n        setDocumentCursor(\"\");\n        onDragEnd(commit);\n      } else if (commit) {\n        // Released before the drag armed, so it was a tap.\n        onTap?.();\n      }\n    },\n    [cancelTimer, onDragEnd, onTap]\n  );\n  const onResponderRelease = useCallback(() => onRelease(true), [onRelease]);\n  const onResponderTerminate = useCallback(() => onRelease(false), [onRelease]);\n  // The other reason a drag survives on web. The responder system hands the responder to whoever\n  // asks, and three things ask in the middle of every drag: the text selection the cursor drags out\n  // (`selectionchange`), the grid's own edge-scrolling (`scroll`), and a right-click\n  // (`contextmenu`). Each arrives as a *termination*, which this component reads as \"cancelled\" and\n  // throws the drop away. Refusing while a drag is live is the only hook RNW offers to say no —\n  // see ResponderSystem.js, where these three are the only events a responder may decline.\n  //\n  // A mouse press refuses from the moment it lands, not from the moment the drag arms. The first\n  // few pixels of a mouse drag cross whatever the handle wraps, and crossing from one text node to\n  // the next starts a selection — which asked for the responder and got it, four pixels before the\n  // drag would have armed. A touch press still yields, because that is how a scroll begins.\n  const onResponderTerminationRequest = useCallback(() => !isDraggingRef.current && !isMouseRef.current, []);\n\n  return (\n    <View\n      // userSelect is belt and braces with the refusal above: it stops the selection ever starting,\n      // so the drag neither has to decline termination nor leaves a trail of highlighted text\n      // behind the cursor. The cursor says the surface can be picked up — inherited by the day and\n      // week names, which are plain views; a cell sets its own, since it is a Pressable.\n      style={{ userSelect: \"none\", cursor: \"grab\" } as object}\n      onPointerDown={onPointerDown}\n      onStartShouldSetResponder={() => true}\n      onMoveShouldSetResponder={onMoveShouldSetResponder}\n      onResponderGrant={onGrant}\n      onResponderMove={onMove}\n      onResponderRelease={onResponderRelease}\n      onResponderTerminate={onResponderTerminate}\n      onResponderTerminationRequest={onResponderTerminationRequest}\n    >\n      {props.children}\n    </View>\n  );\n});\n","import { JSX, memo, useCallback, useMemo, useRef, useState } from \"react\";\nimport { View, Platform } from \"react-native\";\nimport Animated, { useAnimatedStyle, useSharedValue } from \"react-native-reanimated\";\nimport { useRem } from \"../../../utils/useRem\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { IProgramGrid, IProgramGridPlacement, IProgramGridSelection } from \"../../../pages/planner/models/programGrid\";\nimport {\n  GRID_CELL_INSET_Y,\n  GRID_CELL_INSET_X,\n  ProgramGridGeometry_canResize,\n  ProgramGridGeometry_clampWeek,\n  ProgramGridGeometry_laneSegments,\n  ProgramGridGeometry_resizeHitLeft,\n  ProgramGridGeometry_resizeHitWidth,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { GridDragHandle } from \"./gridDragHandle\";\nimport { GridResizeHandle } from \"./gridResizeHandle\";\nimport { GridCell } from \"./gridCell\";\n\nexport interface ILaneRowProps {\n  grid: IProgramGrid;\n  rowIndex: number;\n  laneIndex: number;\n  columnWidth: number;\n  laneHeight: number;\n  showScheme: boolean;\n  selection?: IProgramGridSelection;\n  onSelect: (placementId: string) => void;\n  onSetRepeatRange: (placement: IProgramGridPlacement, toWeekIndex: number) => void;\n  laneCount: number;\n  onLaneDragStart: (rowIndex: number, laneIndex: number, absolute: number) => void;\n  onLaneDragMove: (rowIndex: number, laneIndex: number, translation: number, absolute: number) => void;\n  onLaneDragEnd: (commit: boolean) => void;\n}\n\nexport const LaneRow = memo(function LaneRow(props: ILaneRowProps): JSX.Element {\n  const rem = useRem();\n  const { grid, rowIndex, laneIndex, onLaneDragStart, onLaneDragMove, columnWidth } = props;\n  // Stable for the same reason the day handlers are: a rebuilt gesture drops the drag.\n  const onDragStartLane = useCallback(\n    (absolute: number) => onLaneDragStart(rowIndex, laneIndex, absolute),\n    [onLaneDragStart, rowIndex, laneIndex]\n  );\n  const onDragMoveLane = useCallback(\n    (dy: number, absolute: number) => onLaneDragMove(rowIndex, laneIndex, dy, absolute),\n    [onLaneDragMove, rowIndex, laneIndex]\n  );\n  // The live preview rides shared values on native: the finger is on the resize handle, and a\n  // re-render of the subtree under it cancels the pan. Web keeps a state-driven preview — Reanimated\n  // is stubbed there and its handle uses the responder system, which has no pan to cancel.\n  const resizePreviewEnd = useSharedValue(-1);\n  const resizeHandleOffset = useSharedValue(0);\n  const [webResize, setWebResize] = useState<{ id: string; colEnd: number } | undefined>(undefined);\n  const segments = useMemo(\n    () => ProgramGridGeometry_laneSegments(grid, rowIndex, laneIndex),\n    [grid, rowIndex, laneIndex]\n  );\n\n  // Only the lane's last run can be dragged: extending a run that has another after it would have\n  // to move that one's start too, which is a different (v2) operation. And only when it has a week\n  // to be dragged to — undefined here takes the handle off the strip entirely.\n  const resizablePlacement = useMemo(() => {\n    const withPlacement = segments.filter((s) => s.placement != null);\n    const placement = withPlacement[withPlacement.length - 1]?.placement;\n    return placement != null && ProgramGridGeometry_canResize(grid, placement) ? placement : undefined;\n  }, [segments, grid]);\n\n  // The pending drag is mirrored in a ref so the commit can read it from an event handler, and so\n  // the end/finalize pair is idempotent — the first one clears it.\n  const resizeRef = useRef<{ id: string; colEnd: number } | undefined>(undefined);\n  const onSetRepeatRange = props.onSetRepeatRange;\n\n  const onResizeStart = useCallback(\n    (deltaWeeks: number) => {\n      if (resizablePlacement == null) {\n        return;\n      }\n      // Clamping happens here rather than in the preview, so what is drawn is exactly what a\n      // release would commit.\n      const colEnd = ProgramGridGeometry_clampWeek(grid, resizablePlacement, deltaWeeks);\n      resizeRef.current = { id: resizablePlacement.id, colEnd };\n      resizePreviewEnd.value = colEnd;\n      resizeHandleOffset.value = columnWidth * (colEnd - resizablePlacement.colEnd);\n      if (Platform.OS === \"web\") {\n        setWebResize({ id: resizablePlacement.id, colEnd });\n      }\n    },\n    [grid, resizablePlacement, columnWidth, resizePreviewEnd, resizeHandleOffset]\n  );\n\n  const onResizeEnd = useCallback(\n    (commit: boolean) => {\n      const current = resizeRef.current;\n      resizeRef.current = undefined;\n      resizePreviewEnd.value = -1;\n      resizeHandleOffset.value = 0;\n      if (Platform.OS === \"web\") {\n        setWebResize(undefined);\n      }\n      if (!commit || current == null) {\n        return;\n      }\n      const placement = grid.placements.find((p) => p.id === current.id);\n      if (placement != null && current.colEnd !== placement.colEnd) {\n        onSetRepeatRange(placement, current.colEnd);\n      }\n    },\n    [grid, onSetRepeatRange, resizePreviewEnd, resizeHandleOffset]\n  );\n\n  // Width rather than a transform, deliberately: this is one leaf node with no children, and the\n  // rule it bends (\"animate opacity and transform only\") exists to stop per-frame layout commits\n  // across the whole grid. Nothing under the finger re-renders either way.\n  const previewColStart = resizablePlacement?.colStart ?? 0;\n  const previewInset = 2 * GRID_CELL_INSET_X * rem;\n  const previewStyle = useAnimatedStyle(() => {\n    const end = resizePreviewEnd.value;\n    return end < 0\n      ? { opacity: 0, width: 0 }\n      : { opacity: 1, width: columnWidth * (end - previewColStart + 1) - previewInset };\n  });\n\n  // Where the resize handle sits: centred on the right edge of the last run's card, following the\n  // preview while a resize is in flight.\n  const resizeLeft =\n    resizablePlacement == null\n      ? 0\n      : ProgramGridGeometry_resizeHitLeft({\n          colEnd: webResize?.id === resizablePlacement.id ? webResize.colEnd : resizablePlacement.colEnd,\n          columnWidth: props.columnWidth,\n          rem,\n        });\n\n  return (\n    // The resize handle is deliberately a sibling of the drag detector rather than a child of a\n    // cell inside it. Nested, the two competed for the same touch: holding still on the handle for\n    // the long press started an exercise drag instead of a resize. Outside it, which gesture you\n    // get is decided by where the finger lands, which is the whole point of a handle.\n    <View>\n      <GridDragHandle onDragStart={onDragStartLane} onDragMove={onDragMoveLane} onDragEnd={props.onLaneDragEnd}>\n        <View className=\"flex-row\">\n          {segments.map((segment, i) =>\n            segment.placement != null ? (\n              <GridCell\n                key={i}\n                placement={segment.placement}\n                width={\n                  props.columnWidth *\n                  (webResize?.id === segment.placement.id\n                    ? webResize.colEnd - segment.placement.colStart + 1\n                    : segment.span)\n                }\n                columnWidth={props.columnWidth}\n                height={props.laneHeight}\n                showScheme={props.showScheme}\n                selection={props.selection}\n                onSelect={props.onSelect}\n                isResizing={webResize?.id === segment.placement.id}\n              />\n            ) : (\n              <View key={i} style={{ width: props.columnWidth * segment.span, height: props.laneHeight }} />\n            )\n          )}\n        </View>\n      </GridDragHandle>\n      {resizablePlacement != null && Platform.OS !== \"web\" && (\n        <Animated.View\n          pointerEvents=\"none\"\n          className=\"absolute rounded\"\n          style={[\n            {\n              left: props.columnWidth * resizablePlacement.colStart + GRID_CELL_INSET_X * rem,\n              top: GRID_CELL_INSET_Y * rem,\n              height: props.laneHeight - 2 * GRID_CELL_INSET_Y * rem,\n              borderWidth: 2,\n              borderColor: Tailwind_semantic().icon.purple,\n            },\n            previewStyle,\n          ]}\n        />\n      )}\n      {resizablePlacement != null && (\n        <GridResizeHandle\n          width={ProgramGridGeometry_resizeHitWidth(props.columnWidth, rem)}\n          columnWidth={props.columnWidth}\n          onResize={onResizeStart}\n          onResizeEnd={onResizeEnd}\n          left={resizeLeft}\n          offsetX={resizeHandleOffset}\n          top={GRID_CELL_INSET_Y * rem}\n          height={props.laneHeight - 2 * GRID_CELL_INSET_Y * rem}\n        />\n      )}\n    </View>\n  );\n});\n","import { JSX, ReactNode, useCallback } from \"react\";\nimport { ScrollViewProps, View } from \"react-native\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\n\nexport const GRID_SCALE_MIN = 0.45;\nexport const GRID_SCALE_MAX = 2.2;\nconst SCALE_STEP = 0.05;\n\nexport interface IGridPinchArgs {\n  scale: number;\n  isFitted: boolean;\n  fittedScale: number;\n  onScalePreview: (scale: number) => void;\n  onScaleCommit: (scale: number | undefined) => void;\n}\n\nexport interface IGridPinchResult {\n  Wrap: (props: { children: ReactNode }) => JSX.Element;\n  scrollAnimatedProps?: Partial<ScrollViewProps>;\n  // Whether there is a pinch to tell the user about. Answered here rather than by a `Platform`\n  // check at the hint, so the two platforms' answer stays in the two files that implement it.\n  canPinch: boolean;\n  zoomControl?: JSX.Element;\n}\n\n// Gesture handler is known to eat scrolling inside the mobile webview, so web zooms with a slider.\nexport function useGridPinch(args: IGridPinchArgs): IGridPinchResult {\n  const Wrap = useCallback((props: { children: ReactNode }): JSX.Element => <View>{props.children}</View>, []);\n  const { onScalePreview, onScaleCommit } = args;\n  const commit = (e: { currentTarget: HTMLInputElement }): void => onScaleCommit(Number(e.currentTarget.value));\n  const zoomControl = (\n    <div className=\"flex items-center justify-end gap-2 px-4 pb-2 text-xs text-text-secondary\">\n      <button\n        type=\"button\"\n        className={`px-2 py-1 rounded ${args.isFitted ? \"text-text-disabled\" : \"text-text-link\"}`}\n        disabled={args.isFitted}\n        onClick={() => onScaleCommit(undefined)}\n      >\n        Fit\n      </button>\n      <span>Week width</span>\n      <input\n        type=\"range\"\n        aria-label=\"Week width\"\n        data-testid=\"grid-zoom\"\n        className=\"w-32 cursor-pointer\"\n        style={{ accentColor: Tailwind_semantic().icon.purple }}\n        min={GRID_SCALE_MIN}\n        max={Math.max(GRID_SCALE_MAX, args.fittedScale)}\n        step={SCALE_STEP}\n        value={args.scale}\n        onInput={(e) => onScalePreview(Number(e.currentTarget.value))}\n        onPointerUp={commit}\n        onKeyUp={commit}\n      />\n    </div>\n  );\n  return { Wrap, canPinch: false, zoomControl };\n}\n","import { JSX, memo, useCallback, useRef } from \"react\";\nimport { View, GestureResponderEvent } from \"react-native\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\n\ninterface IGridResizeHandleProps {\n  width: number;\n  // Whole weeks the drag currently spans, positive to the right. Reported live so the strip can\n  // show the extent it would commit to, and once more on release to commit it.\n  onResize: (deltaWeeks: number) => void;\n  // False when the gesture was terminated rather than released — see the native variant.\n  onResizeEnd: (commit: boolean) => void;\n  columnWidth: number;\n  // Placed by the lane rather than hugging a cell — see the native variant.\n  left: number;\n  top: number;\n  height: number;\n  // Unused on web: Reanimated is stubbed here, and the responder-based handle below has no pan for\n  // a re-render to cancel, so the preview stays state-driven and `left` moves with it.\n  offsetX: unknown;\n}\n\n// react-native-gesture-handler is stubbed to no-ops on web (utils/rnStubs/gestureHandler.js), so\n// this uses the responder system, which react-native-web implements in full.\nexport const GridResizeHandle = memo(function GridResizeHandle(props: IGridResizeHandleProps): JSX.Element {\n  const { columnWidth, onResize, onResizeEnd } = props;\n  const startXRef = useRef(0);\n  const isResizingRef = useRef(false);\n\n  const onGrant = useCallback((e: GestureResponderEvent) => {\n    startXRef.current = e.nativeEvent.pageX;\n    isResizingRef.current = true;\n  }, []);\n\n  const onMove = useCallback(\n    (e: GestureResponderEvent) => {\n      onResize(Math.round((e.nativeEvent.pageX - startXRef.current) / columnWidth));\n    },\n    [columnWidth, onResize]\n  );\n\n  const onEnd = useCallback(\n    (commit: boolean) => {\n      isResizingRef.current = false;\n      onResizeEnd(commit);\n    },\n    [onResizeEnd]\n  );\n  const onRelease = useCallback(() => onEnd(true), [onEnd]);\n  const onTerminate = useCallback(() => onEnd(false), [onEnd]);\n  // Same trap as the drag handle: dragging the cursor sideways selects the text it crosses, and\n  // react-native-web treats that selection as grounds to take the responder away mid-resize — which\n  // arrives here as a cancel, so the new range is thrown out. See gridDragHandle.tsx.\n  const onTerminationRequest = useCallback(() => !isResizingRef.current, []);\n\n  return (\n    <View\n      className=\"absolute items-center justify-center\"\n      style={\n        {\n          width: props.width,\n          left: props.left,\n          top: props.top,\n          height: props.height,\n          cursor: \"col-resize\",\n          userSelect: \"none\",\n        } as object\n      }\n      testID=\"grid-resize-handle\"\n      accessibilityLabel=\"Drag to change how many weeks this repeats for\"\n      onStartShouldSetResponder={() => true}\n      onMoveShouldSetResponder={() => true}\n      onResponderGrant={onGrant}\n      onResponderMove={onMove}\n      onResponderRelease={onRelease}\n      onResponderTerminate={onTerminate}\n      onResponderTerminationRequest={onTerminationRequest}\n    >\n      <View\n        style={{\n          width: 3,\n          height: \"45%\",\n          borderRadius: 2,\n          backgroundColor: Tailwind_semantic().icon.purple,\n        }}\n      />\n    </View>\n  );\n});\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../primitives/text\";\nimport { Pressable } from \"../../primitives/pressable\";\nimport { IconArrowUp } from \"../../icons/iconArrowUp\";\nimport { IconArrowDown2 } from \"../../icons/iconArrowDown2\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { IGridReuseLocator } from \"./useGridReuseLocator\";\n\n// Where the selected exercise's reuse source went, when it is off screen. Only as wide as its\n// words, so it reads as a note attached to the selection rather than as another bar.\n//\n// It is rendered at whichever edge it points to — under the week header when the source is above,\n// over the dock when it is below (see EditProgramGrid and GridActionDock). Pointing up from the\n// bottom of the screen makes the reader work out the direction twice: once from the arrow, and\n// once to reconcile it with where the arrow is.\n//\n// Tappable, because \"which way is it\" and \"take me there\" are the same question a beat apart.\nexport const GridReusePill = memo(function GridReusePill(props: { reuse: IGridReuseLocator }): JSX.Element {\n  const { reuse } = props;\n  return (\n    <Pressable\n      className=\"flex-row items-center gap-1 px-2 py-1 border rounded-full nm-grid-reuse-locator\"\n      // The template strip's own green (gridCell's `notused` family), because that is what the pill\n      // is pointing at — a reuse source is nearly always a template, and matching it lets the eye\n      // go from the pill to the thing it names without changing what it is looking for.\n      //\n      // Resolved values rather than `bg-*` classes, for the same reason the strips use them: a\n      // utility the scanner never emitted falls back to transparent without saying so.\n      style={{\n        borderColor: Tailwind_semantic().border.gridnotused,\n        backgroundColor: Tailwind_semantic().background.gridnotused,\n      }}\n      testID=\"grid-reuse-locator\"\n      accessibilityLabel={`Scroll to ${reuse.name}, ${reuse.direction === \"up\" ? \"above\" : \"below\"}`}\n      onPress={reuse.onGoTo}\n    >\n      {/* The app's own chevrons rather than \"↑\"/\"↓\": an arrow glyph is at the mercy of whether\n          Poppins carries it, and a fallback font would put a stranger's arrow in the middle of a\n          pill. */}\n      {reuse.direction === \"up\" ? (\n        <IconArrowUp color={Tailwind_semantic().icon.green} />\n      ) : (\n        <IconArrowDown2 color={Tailwind_semantic().icon.green} />\n      )}\n      <Text className=\"text-xs font-semibold text-text-success\" numberOfLines={1}>\n        {reuse.name}\n      </Text>\n    </Pressable>\n  );\n});\n\n// The pill floating over the grid at one of its edges, rather than sitting in a row of its own. A\n// row would push the grid down by its height the moment a selection was made, which moves the very\n// strip that was just tapped.\nexport function GridReusePillFloat(props: { reuse: IGridReuseLocator }): JSX.Element {\n  return (\n    // box-none, not none: the strip underneath has to stay tappable everywhere the pill isn't, and\n    // this band covers the full width of the grid.\n    <View pointerEvents=\"box-none\" className=\"items-center\">\n      <GridReusePill reuse={props.reuse} />\n    </View>\n  );\n}\n","import { JSX, memo, useCallback } from \"react\";\nimport { View } from \"react-native\";\nimport Animated, { useAnimatedStyle } from \"react-native-reanimated\";\nimport { Text } from \"../../primitives/text\";\nimport { Pressable } from \"../../primitives/pressable\";\nimport { useRem } from \"../../../utils/useRem\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { IconArrowDown2 } from \"../../icons/iconArrowDown2\";\nimport { IconArrowRight } from \"../../icons/iconArrowRight\";\nimport {\n  IProgramGrid,\n  IProgramGridPlacement,\n  IProgramGridSelection,\n  ProgramGrid_errorAt,\n  ProgramGrid_hasDay,\n} from \"../../../pages/planner/models/programGrid\";\nimport {\n  GRID_ADD_ROW_HEIGHT,\n  GRID_CELL_INSET_X,\n  GRID_DAY_BOX_INSET,\n  GRID_MARGIN_BETWEEN_ROWS,\n  ProgramGridGeometry_dayLabelHeight,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { TimeUtils_formatHOrMin } from \"../../../utils/time\";\nimport { GridDragHandle } from \"./gridDragHandle\";\nimport { IGridDrags } from \"./useGridDrags\";\nimport { useGridDayDrag } from \"./useGridDayDrag\";\nimport { LaneRow } from \"./gridLaneRow\";\nimport { AddButton } from \"./gridAddButton\";\n\nexport interface IGridRowProps {\n  grid: IProgramGrid;\n  rowIndex: number;\n  columnWidth: number;\n  // Where each of this row's lanes starts, from the geometry — see IGridGeometryRow.laneTops.\n  laneTops: number[];\n  showScheme: boolean;\n  selection?: IProgramGridSelection;\n  onSelect: (placementId: string) => void;\n  onAddExercise: (weekIndex: number, rowIndex: number) => void;\n  onSetRepeatRange: (placement: IProgramGridPlacement, toWeekIndex: number) => void;\n  onSelectDay: (rowIndex: number) => void;\n  onToggleCollapsed: (rowIndex: number) => void;\n  isCollapsed: boolean;\n  isDaySelected: boolean;\n  isDayDimmed: boolean;\n  lanes: number;\n  rowHeight: number;\n  onMoveDayRows: (rows: number[], insertAt: number) => void;\n  // The shared drag bus; see useGridDrags.\n  drags: IGridDrags;\n}\n\nexport const GridRow = memo(function GridRow(props: IGridRowProps): JSX.Element {\n  const rem = useRem();\n  const { grid, rowIndex, lanes, rowHeight } = props;\n  const row = grid.rows[rowIndex];\n  const addHeight = GRID_ADD_ROW_HEIGHT * rem;\n  const isCollapsed = props.isCollapsed;\n  const showsDuration = !isCollapsed && props.showScheme;\n  const labelHeight = ProgramGridGeometry_dayLabelHeight(rem, { isCollapsed, showScheme: props.showScheme });\n\n  const { drags, onMoveDayRows } = props;\n  const { draggedRows, dropBoundary, draggedLanes, dropLaneRow, dropLaneGap } = drags;\n  const onSelectDay = props.onSelectDay;\n  const onTapDay = useCallback(() => onSelectDay(rowIndex), [onSelectDay, rowIndex]);\n\n  const dayDrag = useGridDayDrag({ rowIndex, drags, onMoveDayRows });\n\n  // An empty set means no drag, so an idle grid keeps whatever the selection styling asked for.\n  const rowOverlayStyle = useAnimatedStyle(() => {\n    return { opacity: draggedRows.value.indexOf(rowIndex) !== -1 ? 0.18 : 0 };\n  });\n  // Each row owns the gap above it; the last row owns the one below it too, so a drop at the very\n  // end has somewhere to draw.\n  const dropLineStyle = useAnimatedStyle(() => {\n    return { opacity: dropBoundary.value === rowIndex ? 1 : 0 };\n  });\n  const isLastRow = rowIndex === grid.rows.length - 1;\n  const dropLineBottomStyle = useAnimatedStyle(() => {\n    return { opacity: isLastRow && dropBoundary.value === rowIndex + 1 ? 1 : 0 };\n  });\n\n  // An exercise can be dropped into any day, so both the strip being dragged and the line showing\n  // where it will land are drawn here, over the row, from shared values the grid writes. The lanes\n  // themselves stay out of it: giving them drag props would re-render the one under the finger.\n  // Several strips of this row can be on the move at once, and they gather into one card from the\n  // topmost of them — so what is dimmed here is that same span, not each strip where it sits.\n  const laneTops = props.laneTops;\n  const draggedLaneStyle = useAnimatedStyle(() => {\n    const dragged = draggedLanes.value.filter((lane) => lane.row === rowIndex);\n    if (dragged.length === 0) {\n      return { opacity: 0, top: 0, height: 0 };\n    }\n    let first = dragged[0].lane;\n    let height = 0;\n    for (const lane of dragged) {\n      first = Math.min(first, lane.lane);\n      height += laneTops[lane.lane + 1] - laneTops[lane.lane];\n    }\n    // The heights of the strips on the move, stacked from the topmost of them — the same block the\n    // ghost gathers them into, rather than the lanes they came out of.\n    return { opacity: 0.25, top: labelHeight + laneTops[first], height };\n  });\n  const dropLaneStyle = useAnimatedStyle(() => {\n    if (dropLaneRow.value !== rowIndex) {\n      return { opacity: 0, top: 0 };\n    }\n    // A collapsed row hides its lanes, so the line sits right under the day name — the whole row is\n    // the target.\n    return {\n      opacity: 1,\n      top: isCollapsed ? labelHeight : labelHeight + (laneTops[dropLaneGap.value] ?? 0) - 1.5,\n    };\n  });\n\n  return (\n    // Selecting a day tames the other rows rather than hiding them, so the program's shape stays\n    // readable while it is clear which row an action is about to restructure.\n    <View\n      style={{\n        height: rowHeight,\n        opacity: props.isDayDimmed ? 0.35 : 1,\n        marginBottom: GRID_MARGIN_BETWEEN_ROWS * rem,\n      }}\n    >\n      {/* The day boxes sit behind the strips, which are translucent enough to keep the box edges\n          readable where a strip spans several weeks. Drawing them in front instead would put a\n          line through the exercise names. */}\n      <View className=\"absolute inset-0 flex-row\">\n        {grid.columns.map((column) => {\n          const error = ProgramGrid_errorAt(grid, rowIndex, column.weekIndex);\n          const exists = ProgramGrid_hasDay(row, column.weekIndex);\n          return (\n            <View key={column.weekIndex} style={{ width: props.columnWidth, padding: GRID_DAY_BOX_INSET * rem }}>\n              {exists && (\n                // The day box itself is what a day selection highlights — the exercises inside are\n                // not what is selected, so they keep their own borders.\n                <View\n                  className={`flex-1 rounded ${error != null ? \"bg-background-lighterror\" : \"bg-background-cardyellow\"}`}\n                  style={{\n                    borderWidth: props.isDaySelected ? 2 : 1,\n                    borderColor: props.isDaySelected\n                      ? Tailwind_semantic().icon.purple\n                      : Tailwind_semantic().border.prominent,\n                  }}\n                />\n              )}\n            </View>\n          );\n        })}\n      </View>\n      <View className=\"flex-row\" style={{ height: labelHeight }}>\n        {grid.columns.map((column) => {\n          const name = row.namePerWeek[column.weekIndex];\n          const error = ProgramGrid_errorAt(grid, rowIndex, column.weekIndex);\n          const exists = ProgramGrid_hasDay(row, column.weekIndex);\n          // An empty day takes no time, and \"0 min\" under its name is a fact nobody was missing.\n          const durationMs = row.durationMsPerWeek[column.weekIndex] ?? 0;\n          const duration = showsDuration && durationMs > 0 ? TimeUtils_formatHOrMin(durationMs) : undefined;\n          return (\n            <View\n              key={column.weekIndex}\n              className=\"flex-row items-center px-[0.375rem]\"\n              style={{ width: props.columnWidth }}\n            >\n              {exists && (\n                <>\n                  {/* Collapsing is a property of the row, not of one week's day — the columns have\n                      to keep the same height to stay a grid — so every week's chevron toggles the\n                      whole row, and whichever one you have scrolled to is the one you can reach. */}\n                  <Pressable\n                    // The chevron itself stays small — it is a hint, not a control — so the target\n                    // is padding around it plus slop beyond that. The left padding is also what\n                    // keeps it off the day box's border, which it otherwise sits right on top of.\n                    className=\"p-2 nm-grid-toggle-day\"\n                    hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}\n                    testID={`grid-toggle-day-${rowIndex}`}\n                    accessibilityLabel={isCollapsed ? \"Expand day\" : \"Collapse day\"}\n                    onPress={() => props.onToggleCollapsed(rowIndex)}\n                  >\n                    {isCollapsed ? (\n                      <IconArrowRight width={8} height={11} color={Tailwind_semantic().icon.neutral} />\n                    ) : (\n                      <IconArrowDown2 width={11} height={8} color={Tailwind_semantic().icon.neutral} />\n                    )}\n                  </Pressable>\n                  {/* Tap selects the day, long press starts the drag — both on the name, since one\n                      gesture detector arbitrates them (Exclusive: the pan gets first refusal, and a\n                      quick release falls through to the tap). A nested Pressable would instead\n                      claim the touch before the long press could promote it. */}\n                  <View className=\"flex-1\">\n                    <GridDragHandle\n                      onTap={onTapDay}\n                      onDragStart={dayDrag.onDragStart}\n                      onDragMove={dayDrag.onDragMove}\n                      onDragEnd={dayDrag.onDragEnd}\n                    >\n                      <View\n                        className={`nm-grid-select-day ${duration != null ? \"pt-1\" : \"py-1\"}`}\n                        testID={`grid-select-day-${column.weekIndex}-${rowIndex}`}\n                      >\n                        <Text\n                          className={`text-sm font-semibold ${error != null ? \"text-text-error\" : \"text-text-primary\"}`}\n                          numberOfLines={1}\n                        >\n                          {error != null ? \"⚠ \" : \"\"}\n                          {name ?? \"\"}\n                        </Text>\n                        {duration != null && (\n                          <Text className=\"text-xs text-text-secondary\" numberOfLines={1}>\n                            {duration.value} {duration.unit}\n                          </Text>\n                        )}\n                      </View>\n                    </GridDragHandle>\n                  </View>\n                </>\n              )}\n            </View>\n          );\n        })}\n      </View>\n      {!isCollapsed &&\n        Array.from({ length: lanes }, (_, laneIndex) => (\n          <LaneRow\n            key={laneIndex}\n            grid={grid}\n            rowIndex={rowIndex}\n            laneIndex={laneIndex}\n            columnWidth={props.columnWidth}\n            laneHeight={laneTops[laneIndex + 1] - laneTops[laneIndex]}\n            showScheme={props.showScheme}\n            selection={props.selection}\n            onSelect={props.onSelect}\n            onSetRepeatRange={props.onSetRepeatRange}\n            laneCount={lanes}\n            onLaneDragStart={drags.lane.onLaneDragStart}\n            onLaneDragMove={drags.lane.onLaneDragMove}\n            onLaneDragEnd={drags.lane.onLaneDragEnd}\n          />\n        ))}\n      {/* One per week rather than one per row: adding an exercise targets a specific week's day,\n          and a ragged week that lacks this day gets no button at all. */}\n      {!isCollapsed && (\n        <View className=\"flex-row\" style={{ height: addHeight }}>\n          {grid.columns.map((column) => (\n            <View\n              key={column.weekIndex}\n              style={{ width: props.columnWidth, paddingHorizontal: GRID_CELL_INSET_X * rem }}\n              className=\"justify-center\"\n            >\n              {ProgramGrid_hasDay(row, column.weekIndex) && (\n                <AddButton\n                  label=\"Exercise\"\n                  testID={`grid-add-exercise-${column.weekIndex}-${rowIndex}`}\n                  onPress={() => props.onAddExercise(column.weekIndex, rowIndex)}\n                />\n              )}\n            </View>\n          ))}\n        </View>\n      )}\n      {/* Both are absolutely positioned so the web stub — which renders Animated.View as a fragment\n          — drops them without disturbing the layout. Last in the row so they paint on top. */}\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          rowOverlayStyle,\n          {\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            backgroundColor: Tailwind_semantic().icon.purple,\n          },\n        ]}\n      />\n      {/* Orange, where everything else about a drag is purple: these say where the drop *lands*, and\n          have to be told apart at a glance from the purple that says what is on the move. */}\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          dropLineStyle,\n          {\n            position: \"absolute\",\n            top: -2,\n            left: 0,\n            right: 0,\n            height: 3,\n            borderRadius: 2,\n            backgroundColor: Tailwind_semantic().graph.orange,\n          },\n        ]}\n      />\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          dropLineBottomStyle,\n          {\n            position: \"absolute\",\n            bottom: -2,\n            left: 0,\n            right: 0,\n            height: 3,\n            borderRadius: 2,\n            backgroundColor: Tailwind_semantic().graph.orange,\n          },\n        ]}\n      />\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          draggedLaneStyle,\n          {\n            position: \"absolute\",\n            left: 0,\n            right: 0,\n            backgroundColor: Tailwind_semantic().icon.purple,\n          },\n        ]}\n      />\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          dropLaneStyle,\n          {\n            position: \"absolute\",\n            left: GRID_CELL_INSET_X * rem,\n            right: GRID_CELL_INSET_X * rem,\n            height: 3,\n            borderRadius: 2,\n            backgroundColor: Tailwind_semantic().graph.orange,\n          },\n        ]}\n      />\n    </View>\n  );\n});\n","import { createContext, JSX, ReactNode, useCallback, useContext, useMemo, useState } from \"react\";\nimport { IProgramGridPlacement } from \"../../../pages/planner/models/programGrid\";\nimport { IGridReuseLocator } from \"./useGridReuseLocator\";\n\n// What the grid's current selection offers. The grid publishes it because that is where the program,\n// settings and dispatch live; the dock only renders it, from NavScreenContent's footer slot so it\n// sits above the tab bar instead of scrolling away with the row that was tapped.\n// A selected day is a day, not the bag of exercises inside it: its actions restructure the program\n// (and do so across every week), while exercise actions edit content. Same dock, different verbs.\nexport type IGridSelectionTarget =\n  | { kind: \"exercises\"; placements: IProgramGridPlacement[] }\n  | {\n      kind: \"day\";\n      rowIndexes: number[];\n      name: string;\n      // Only for one selected row, and only the first week that has this day: several rows have no\n      // one description, and neither does a row the weeks describe differently.\n      description?: string;\n      placements: IProgramGridPlacement[];\n    }\n  | { kind: \"week\"; weekIndex: number; name: string; description?: string };\n\nexport interface IGridSelectionPayload {\n  target: IGridSelectionTarget;\n  // Which way the selection's reuse source lies, when it has one and it has scrolled out of sight.\n  // Rendered by the dock rather than by the grid because it has to stay put while the grid scrolls,\n  // and the footer slot is already the place that does that.\n  reuse?: IGridReuseLocator;\n  onEdit?: (placement: IProgramGridPlacement) => void;\n  onDuplicate: (placement: IProgramGridPlacement) => void;\n  onSwap: (placement: IProgramGridPlacement) => void;\n  onDelete: (placements: IProgramGridPlacement[]) => void;\n  onDuplicateDays: (rowIndexes: number[]) => void;\n  onDeleteDays: (rowIndexes: number[]) => void;\n  onDuplicateWeek: (weekIndex: number) => void;\n  onDeleteWeek: (weekIndex: number) => void;\n  onEditWeek: (weekIndex: number) => void;\n  onEditDay: (rowIndex: number) => void;\n  onShowWeekStats: (weekIndex: number) => void;\n  onShowDayStats: (rowIndex: number) => void;\n  onShowExerciseStats: (placement: IProgramGridPlacement) => void;\n  onClear: () => void;\n}\n\ninterface IGridSelectionContextValue {\n  payload?: IGridSelectionPayload;\n  publish: (payload: IGridSelectionPayload | undefined) => void;\n}\n\nconst GridSelectionContext = createContext<IGridSelectionContextValue>({ publish: () => undefined });\n\nexport function GridSelectionProvider(props: { children: ReactNode }): JSX.Element {\n  const [payload, setPayload] = useState<IGridSelectionPayload | undefined>(undefined);\n  const publish = useCallback((next: IGridSelectionPayload | undefined) => setPayload(next), []);\n  const value = useMemo(() => ({ payload, publish }), [payload, publish]);\n  return <GridSelectionContext.Provider value={value}>{props.children}</GridSelectionContext.Provider>;\n}\n\nexport function useGridSelectionPublish(): (payload: IGridSelectionPayload | undefined) => void {\n  return useContext(GridSelectionContext).publish;\n}\n\nexport function useGridSelection(): IGridSelectionPayload | undefined {\n  return useContext(GridSelectionContext).payload;\n}\n","import { StringUtils_pluralize } from \"../../../utils/string\";\nimport { ProgramGrid_orderSuffix } from \"../../../pages/planner/models/programGrid\";\nimport type { IGridSelectionPayload } from \"./gridSelectionContext\";\n\nexport interface IGridSelectionAction {\n  label: string;\n  isDestructive?: boolean;\n  onPress: () => void;\n}\n\nexport interface IGridSelectionSummary {\n  label: string;\n  detailsKey?: string;\n  badges: string[];\n  description?: string;\n  detail?: string;\n  edit?: { label: string; disabled: boolean; onPress: () => void };\n  actions: IGridSelectionAction[];\n}\n\nexport function GridSelectionSummary_build(\n  payload: IGridSelectionPayload,\n  options: { includeStats: boolean } = { includeStats: true }\n): IGridSelectionSummary {\n  const target = payload.target;\n  const { includeStats } = options;\n\n  const single = target.kind === \"exercises\" && target.placements.length === 1 ? target.placements[0] : undefined;\n  const label =\n    target.kind === \"day\" || target.kind === \"week\"\n      ? target.name\n      : target.placements.map((p) => `${p.fullName}${ProgramGrid_orderSuffix(p)}`).join(\", \");\n  const description =\n    target.kind === \"week\" || target.kind === \"day\" ? target.description : (single?.description ?? undefined);\n  const detailsKey =\n    target.kind === \"week\"\n      ? `week-${target.weekIndex}`\n      : target.kind === \"day\"\n        ? `day-${target.rowIndexes.join(\"-\")}`\n        : single?.id;\n  const badges: string[] = [];\n  if (single != null) {\n    if (single.notused) {\n      badges.push(single.isTemplate ? \"tmpl\" : \"unused\");\n    }\n    if (single.tags.length > 0) {\n      badges.push(`id ${single.tags.join(\", \")}`);\n    }\n  }\n\n  // An action that doesn't apply is left out rather than shown greyed: a menu is read as a list of\n  // what you can do, and a disabled row in one is a worse answer than a shorter list.\n  const actions: IGridSelectionAction[] = [];\n  let edit: IGridSelectionSummary[\"edit\"];\n  if (target.kind === \"week\") {\n    edit = { label: \"Edit week\", disabled: false, onPress: () => payload.onEditWeek(target.weekIndex) };\n    if (includeStats) {\n      actions.push({ label: \"Week stats\", onPress: () => payload.onShowWeekStats(target.weekIndex) });\n    }\n    actions.push({ label: \"Duplicate week\", onPress: () => payload.onDuplicateWeek(target.weekIndex) });\n    actions.push({ label: \"Delete week\", isDestructive: true, onPress: () => payload.onDeleteWeek(target.weekIndex) });\n  } else if (target.kind === \"day\") {\n    const rowIndexes = target.rowIndexes;\n    const singleRow = rowIndexes.length === 1 ? rowIndexes[0] : undefined;\n    edit = {\n      label: \"Edit day\",\n      disabled: singleRow == null,\n      onPress: () => {\n        if (singleRow != null) {\n          payload.onEditDay(singleRow);\n        }\n      },\n    };\n    if (singleRow != null && includeStats) {\n      actions.push({ label: \"Day stats\", onPress: () => payload.onShowDayStats(singleRow) });\n    }\n    actions.push({\n      label: `Duplicate ${StringUtils_pluralize(\"day\", rowIndexes.length)}`,\n      onPress: () => payload.onDuplicateDays(rowIndexes),\n    });\n    actions.push({\n      label: `Delete ${StringUtils_pluralize(\"day\", rowIndexes.length)}`,\n      isDestructive: true,\n      onPress: () => payload.onDeleteDays(rowIndexes),\n    });\n  } else {\n    const placements = target.placements;\n    const onEdit = payload.onEdit;\n    edit =\n      onEdit != null\n        ? {\n            label: \"Edit\",\n            disabled: single == null,\n            onPress: () => {\n              if (single != null) {\n                onEdit(single);\n              }\n            },\n          }\n        : undefined;\n    if (single != null) {\n      if (includeStats) {\n        actions.push({ label: \"Exercise stats\", onPress: () => payload.onShowExerciseStats(single) });\n      }\n      actions.push({ label: \"Swap exercise\", onPress: () => payload.onSwap(single) });\n      actions.push({ label: \"Duplicate exercise\", onPress: () => payload.onDuplicate(single) });\n    }\n    actions.push({\n      label: `Delete ${StringUtils_pluralize(\"exercise\", placements.length)}`,\n      isDestructive: true,\n      onPress: () => payload.onDelete(placements),\n    });\n  }\n\n  return { label, detailsKey, badges, description, detail: single?.progression, edit, actions };\n}\n","import { JSX, ReactNode, useEffect, useRef } from \"react\";\n\nexport const GridStickyHeader_isCss = true;\n\n// On the web the page scrolls on the compositor thread, so a header moved from a scroll listener is\n// always a frame behind. CSS sticky is pinned by the compositor itself. It has to live outside the\n// grid's horizontal scroller, whose overflow would otherwise become the sticky ancestor.\nexport function GridStickyHeader(props: {\n  top: number;\n  width: number;\n  subscribeHorizontalOffset: (listener: (x: number) => void) => () => void;\n  onHeightChange: (height: number) => void;\n  below?: ReactNode;\n  children: ReactNode;\n}): JSX.Element {\n  const rowRef = useRef<HTMLDivElement | null>(null);\n  const frameRef = useRef<HTMLDivElement | null>(null);\n  const { subscribeHorizontalOffset, onHeightChange } = props;\n\n  useEffect(() => {\n    return subscribeHorizontalOffset((x) => {\n      if (rowRef.current != null) {\n        rowRef.current.style.transform = `translateX(${-x}px)`;\n      }\n    });\n  }, [subscribeHorizontalOffset]);\n\n  useEffect(() => {\n    const frame = frameRef.current;\n    if (frame == null) {\n      return undefined;\n    }\n    onHeightChange(frame.getBoundingClientRect().height);\n    const observer = new ResizeObserver(() => onHeightChange(frame.getBoundingClientRect().height));\n    observer.observe(frame);\n    return () => observer.disconnect();\n  }, [onHeightChange]);\n\n  return (\n    <div style={{ position: \"sticky\", top: props.top, zIndex: 2 }}>\n      <div ref={frameRef} className=\"overflow-hidden bg-background-default\">\n        <div ref={rowRef} style={{ width: props.width }}>\n          {props.children}\n        </div>\n      </div>\n      {props.below != null && <div style={{ position: \"absolute\", top: \"100%\", left: 0, right: 0 }}>{props.below}</div>}\n    </div>\n  );\n}\n","import { JSX, memo, useCallback } from \"react\";\nimport { View } from \"react-native\";\nimport Animated, { useAnimatedStyle } from \"react-native-reanimated\";\nimport { Text } from \"../../primitives/text\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { IProgramGrid, IProgramGridColumn } from \"../../../pages/planner/models/programGrid\";\nimport { GridDragHandle } from \"./gridDragHandle\";\nimport { IGridDrags } from \"./useGridDrags\";\nimport { useGridWeekDrag } from \"./useGridWeekDrag\";\n\nexport interface IWeekHeaderRowProps {\n  grid: IProgramGrid;\n  columnWidth: number;\n  selectedWeek?: number;\n  onSelectWeek: (weekIndex: number) => void;\n  onMoveWeek: (from: number, to: number) => void;\n  drags: IGridDrags;\n}\n\nexport const WeekHeaderRow = memo(function WeekHeaderRow(props: IWeekHeaderRowProps): JSX.Element {\n  const { grid, columnWidth } = props;\n  return (\n    <View className=\"flex-row border-b border-border-neutral\">\n      {grid.columns.map((column) => (\n        <WeekHeaderCell\n          key={column.weekIndex}\n          column={column}\n          weekCount={grid.columns.length}\n          columnWidth={columnWidth}\n          isSelected={props.selectedWeek === column.weekIndex}\n          isDimmed={props.selectedWeek != null && props.selectedWeek !== column.weekIndex}\n          isLast={column.weekIndex === grid.columns.length - 1}\n          onSelectWeek={props.onSelectWeek}\n          onMoveWeek={props.onMoveWeek}\n          drags={props.drags}\n        />\n      ))}\n    </View>\n  );\n});\n\ninterface IWeekHeaderCellProps {\n  column: IProgramGridColumn;\n  weekCount: number;\n  columnWidth: number;\n  isSelected: boolean;\n  isDimmed: boolean;\n  isLast: boolean;\n  onSelectWeek: (weekIndex: number) => void;\n  onMoveWeek: (from: number, to: number) => void;\n  drags: IGridDrags;\n}\n\nconst WeekHeaderCell = memo(function WeekHeaderCell(props: IWeekHeaderCellProps): JSX.Element {\n  const { column, onSelectWeek, onMoveWeek, columnWidth, weekCount } = props;\n  const { draggedWeek, dropWeekGap } = props.drags;\n  const weekIndex = column.weekIndex;\n  const onTap = useCallback(() => onSelectWeek(weekIndex), [onSelectWeek, weekIndex]);\n\n  const drag = useGridWeekDrag({\n    weekIndex,\n    weekCount,\n    columnWidth,\n    drags: props.drags,\n    onMoveWeek,\n  });\n\n  const liftStyle = useAnimatedStyle(() => ({ opacity: draggedWeek.value === weekIndex ? 0.25 : 0 }));\n  // Each column owns the gap on its left; the last one owns the gap past its right edge too.\n  const dropLeftStyle = useAnimatedStyle(() => ({ opacity: dropWeekGap.value === weekIndex ? 1 : 0 }));\n  const dropRightStyle = useAnimatedStyle(() => ({\n    opacity: props.isLast && dropWeekGap.value === weekIndex + 1 ? 1 : 0,\n  }));\n  // Orange, where everything else about a drag is purple: the line says where the drop *lands*, and\n  // it has to be told apart at a glance from the purple that says what is selected and what is on\n  // the move.\n  const line = {\n    position: \"absolute\" as const,\n    top: 0,\n    bottom: 0,\n    width: 3,\n    borderRadius: 2,\n    backgroundColor: Tailwind_semantic().graph.orange,\n  };\n\n  return (\n    <View style={{ width: props.columnWidth, opacity: props.isDimmed ? 0.35 : 1 }}>\n      <GridDragHandle\n        axis=\"x\"\n        onTap={onTap}\n        onDragStart={drag.onDragStart}\n        onDragMove={drag.onDragMove}\n        onDragEnd={drag.onDragEnd}\n      >\n        <View\n          className=\"px-2 py-2 rounded nm-grid-select-week\"\n          testID={`grid-select-week-${weekIndex}`}\n          style={{\n            borderWidth: props.isSelected ? 2 : 0,\n            borderColor: Tailwind_semantic().icon.purple,\n          }}\n        >\n          <Text className=\"text-sm font-bold text-text-primary\" numberOfLines={1}>\n            {column.name}\n          </Text>\n        </View>\n      </GridDragHandle>\n      <Animated.View\n        pointerEvents=\"none\"\n        style={[\n          liftStyle,\n          {\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            backgroundColor: Tailwind_semantic().icon.purple,\n          },\n        ]}\n      />\n      <Animated.View pointerEvents=\"none\" style={[dropLeftStyle, { ...line, left: -2 }]} />\n      <Animated.View pointerEvents=\"none\" style={[dropRightStyle, { ...line, right: -2 }]} />\n    </View>\n  );\n});\n","import { useMemo, useRef } from \"react\";\nimport { useModal } from \"../../../navigation/ModalStateContext\";\nimport { IDispatch } from \"../../../ducks/types\";\nimport { GridAppNavigation_create } from \"./gridAppNavigation\";\nimport { IGridEditDetailsResult, IGridHost } from \"./gridHost\";\n\nexport function useAppGridHost(programId: string, dispatch: IDispatch): IGridHost {\n  const pendingRef = useRef<((details?: IGridEditDetailsResult) => void) | undefined>(undefined);\n  const openEditDetailsModal = useModal(\"editDetailsModal\", (details) => {\n    const onResult = pendingRef.current;\n    pendingRef.current = undefined;\n    onResult?.(details);\n  });\n\n  return useMemo(\n    () => ({\n      createNavigation: (context) => GridAppNavigation_create(context, programId, dispatch),\n      openEditDetails: (request, onResult) => {\n        pendingRef.current = onResult;\n        openEditDetailsModal({ ...request, nameLabel: \"Name\", submitLabel: \"Save\" });\n      },\n    }),\n    [programId, dispatch, openEditDetailsModal]\n  );\n}\n","import { useCallback, useRef } from \"react\";\nimport { lb } from \"lens-shmens\";\nimport { IEvaluatedProgram } from \"../../../models/program\";\nimport { IPlannerProgram, ISettings } from \"../../../types\";\nimport { IPlannerState } from \"../../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { Dialog_alert } from \"../../../utils/dialog\";\nimport { IProgramGrid, IProgramGridPlacement, ProgramGrid_dayDataAt } from \"../../../pages/planner/models/programGrid\";\nimport {\n  IPlannerStructureResult,\n  IPlannerStructureExerciseMove,\n  PlannerStructure_deleteDayRow,\n  PlannerStructure_deleteWeek,\n  PlannerStructure_duplicateDayRow,\n  PlannerStructure_duplicateWeek,\n  PlannerStructure_moveDayRows,\n  PlannerStructure_moveExercisesToDay,\n  PlannerStructure_moveWeek,\n  PlannerStructure_reorderExercisesInDay,\n  PlannerStructure_setRepeatRange,\n  PlannerStructure_addDay,\n  PlannerStructure_addWeek,\n  PlannerStructure_deleteExercises,\n  PlannerStructure_setWeekDetails,\n  PlannerStructure_setDayDetails,\n  IPlannerWeekDetails,\n  IPlannerDayDetails,\n} from \"../../../pages/planner/models/plannerStructure\";\n\n// Every edit the grid can make, and *only* edits — navigation lives in the grid host. They all\n// share one shape: ask a pure transform first so a refusal can be shown, then dispatch it through\n// the lens. Checking inside the modifier alone would leave the refusal nowhere to go and the edit\n// would read as a silent no-op.\n//\n// The rule this hook exists to keep true: the grid never edits the program itself. Every entry\n// below goes through applyTransform, so there is no path that writes program text without a\n// transform having agreed to it first.\nexport interface IGridActions {\n  onDeletePlacements: (placements: IProgramGridPlacement[]) => void;\n  onAddDay: (weekIndex: number) => void;\n  onAddWeek: () => void;\n  onSetRepeatRange: (placement: IProgramGridPlacement, toWeekIndex: number) => void;\n  onMoveDayRows: (rows: number[], insertAt: number) => void;\n  onDuplicateDays: (rowIndexes: number[]) => void;\n  onDeleteDays: (rowIndexes: number[]) => void;\n  onMoveWeek: (from: number, to: number) => void;\n  onDuplicateWeek: (weekIndex: number) => void;\n  onDeleteWeek: (weekIndex: number) => void;\n  onSetWeekDetails: (weekIndex: number, details: IPlannerWeekDetails) => void;\n  onSetDayDetails: (rowIndex: number, details: IPlannerDayDetails) => void;\n  onReorderExercisesInDay: (rowIndex: number, order: string[]) => void;\n  onMoveExercisesToDay: (moves: IPlannerStructureExerciseMove[], toRow: number, before: string | undefined) => void;\n}\n\n// Several rows through a transform that only knows how to do one. Bottom up, because deleting a row\n// shifts the ones after it; and the first refusal stops the chain, since half of a structural edit\n// is worse than none of it.\nfunction eachRow(\n  start: IPlannerProgram,\n  rowIndexes: number[],\n  transform: (planner: IPlannerProgram, rowIndex: number) => IPlannerStructureResult\n): IPlannerStructureResult {\n  return rowIndexes\n    .slice()\n    .sort((a, b) => b - a)\n    .reduce<IPlannerStructureResult>((acc, rowIndex) => (acc.success ? transform(acc.data, rowIndex) : acc), {\n      success: true,\n      data: start,\n    });\n}\n\nexport function useGridActions(args: {\n  grid: IProgramGrid;\n  evaluatedProgram: IEvaluatedProgram;\n  settings: ISettings;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  // Called after an edit that restructures rows or columns, so a selection pointing at the old\n  // shape doesn't linger.\n  onStructuralChange: () => void;\n}): IGridActions {\n  const { grid, evaluatedProgram, settings, plannerDispatch, onStructuralChange } = args;\n  // Read by the pre-flight, which has to answer \"can this be done\" before dispatching.\n  const plannerRef = useRef(evaluatedProgram.planner);\n  plannerRef.current = evaluatedProgram.planner;\n\n  // Whether the edit changes which rows and columns exist. A selection points at a row index or a\n  // week index, so anything that reshuffles those leaves it pointing at something else — and that\n  // is a property of the *command*, not something each callback should remember to clean up after\n  // itself. An edit added later inherits the rule by declaring its kind.\n  type IEditKind = \"content\" | \"structural\";\n\n  const applyTransform = useCallback(\n    (\n      transform: (planner: IPlannerProgram) => IPlannerStructureResult,\n      description: string,\n      // Required, not defaulted: a default is a classification the next command can forget to make,\n      // and forgetting leaves a selection pointing at a row or week that now holds something else.\n      kind: IEditKind\n    ) => {\n      const check = transform(plannerRef.current);\n      if (!check.success) {\n        Dialog_alert(check.error);\n        return;\n      }\n      plannerDispatch(\n        lb<IPlannerState>()\n          .p(\"current\")\n          .p(\"program\")\n          .pi(\"planner\")\n          .recordModify((planner) => {\n            // The pre-flight already computed the answer for exactly this planner, and every\n            // transform is a pure function of it, so re-running would parse and evaluate the whole\n            // program a second time to arrive at the same value. This is only a saving — nothing\n            // here depends on taking it, which is the point: a transform whose two runs could\n            // disagree would be a transform this hook can't check before dispatching.\n            if (planner === plannerRef.current) {\n              return check.data;\n            }\n            const result = transform(planner);\n            return result.success ? result.data : planner;\n          }),\n        description\n      );\n      if (kind === \"structural\") {\n        onStructuralChange();\n      }\n      // After the dispatch, not before: a warning is about what the edit *did*, so the user should\n      // be looking at the result when they read it.\n      if (check.warnings != null && check.warnings.length > 0) {\n        Dialog_alert(check.warnings.join(\"\\n\\n\"));\n      }\n    },\n    [plannerDispatch, onStructuralChange]\n  );\n\n  const onMoveDayRows = useCallback(\n    (rows: number[], insertAt: number) => {\n      applyTransform(\n        (planner) => PlannerStructure_moveDayRows(planner, rows, insertAt, settings),\n        `Move ${rows.length} day(s) to position ${insertAt + 1}`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onDeletePlacements = useCallback(\n    (placements: IProgramGridPlacement[]) => {\n      // One target per line behind the strip: a strip drawn from two identically written weeks has\n      // two, and deleting only the one it starts in leaves the other behind.\n      const targets = placements.flatMap((placement) =>\n        placement.sourceWeeks.map((week) => ({\n          ...ProgramGrid_dayDataAt(grid, placement.rowIndex, week),\n          fullName: placement.fullName,\n        }))\n      );\n      applyTransform(\n        (planner) => PlannerStructure_deleteExercises(planner, targets, settings),\n        `Delete ${placements.length} exercise(s) from grid`,\n        \"structural\"\n      );\n    },\n    [applyTransform, grid, settings]\n  );\n\n  const onAddDay = useCallback(\n    (weekIndex: number) => {\n      applyTransform(\n        (planner) => PlannerStructure_addDay(planner, weekIndex, settings),\n        `Add a day to week ${weekIndex + 1}`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onSetRepeatRange = useCallback(\n    (placement: IProgramGridPlacement, toWeekIndex: number) => {\n      applyTransform(\n        (planner) =>\n          PlannerStructure_setRepeatRange(\n            planner,\n            // Where the line's claimed range starts — not where this strip is drawn, and not where\n            // the line is written. A repeat interrupted by an override draws several strips, and\n            // dragging the edge of any of them means \"make this line cover through here\"; a\n            // back-filled repeat is drawn before the week it is written in. `repeatSpan` is the\n            // claim itself, so it is the only one of the three that answers the question.\n            ProgramGrid_dayDataAt(grid, placement.rowIndex, placement.repeatSpan?.[0] ?? placement.colStart),\n            (placement.repeatSpan?.[1] ?? placement.colEnd) + 1,\n            placement.fullName,\n            toWeekIndex + 1,\n            settings\n          ),\n        `Repeat ${placement.fullName} through week ${toWeekIndex + 1}`,\n        \"content\"\n      );\n    },\n    [applyTransform, grid, settings]\n  );\n\n  const onAddWeek = useCallback(() => {\n    applyTransform((planner) => PlannerStructure_addWeek(planner, settings), \"Add new week\", \"structural\");\n  }, [applyTransform, settings]);\n\n  const onDuplicateDays = useCallback(\n    (rowIndexes: number[]) => {\n      applyTransform(\n        (planner) =>\n          eachRow(planner, rowIndexes, (p, rowIndex) => PlannerStructure_duplicateDayRow(p, rowIndex, settings)),\n        `Duplicate ${rowIndexes.length} day(s) in every week`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onDeleteDays = useCallback(\n    (rowIndexes: number[]) => {\n      applyTransform(\n        (planner) =>\n          eachRow(planner, rowIndexes, (p, rowIndex) => PlannerStructure_deleteDayRow(p, rowIndex, settings)),\n        `Delete ${rowIndexes.length} day(s) from every week`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onDuplicateWeek = useCallback(\n    (weekIndex: number) => {\n      applyTransform(\n        (planner) => PlannerStructure_duplicateWeek(planner, weekIndex, settings),\n        `Duplicate week ${weekIndex + 1}`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onDeleteWeek = useCallback(\n    (weekIndex: number) => {\n      applyTransform(\n        (planner) => PlannerStructure_deleteWeek(planner, weekIndex, settings),\n        `Delete week ${weekIndex + 1}`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onSetDayDetails = useCallback(\n    (rowIndex: number, details: IPlannerDayDetails) => {\n      applyTransform(\n        (planner) => PlannerStructure_setDayDetails(planner, rowIndex, details),\n        `Edit day ${rowIndex + 1} in every week`,\n        \"content\"\n      );\n    },\n    [applyTransform]\n  );\n\n  const onSetWeekDetails = useCallback(\n    (weekIndex: number, details: IPlannerWeekDetails) => {\n      applyTransform(\n        (planner) => PlannerStructure_setWeekDetails(planner, weekIndex, details),\n        `Edit week ${weekIndex + 1}`,\n        \"content\"\n      );\n    },\n    [applyTransform]\n  );\n\n  const onMoveWeek = useCallback(\n    (from: number, to: number) => {\n      applyTransform(\n        (planner) => PlannerStructure_moveWeek(planner, from, to, settings),\n        `Move week ${from + 1} to position ${to + 1}`,\n        \"structural\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onReorderExercisesInDay = useCallback(\n    (rowIndex: number, order: string[]) => {\n      applyTransform(\n        (planner) => PlannerStructure_reorderExercisesInDay(planner, rowIndex, order, settings),\n        `Reorder exercises in day ${rowIndex + 1}`,\n        \"content\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  const onMoveExercisesToDay = useCallback(\n    (moves: IPlannerStructureExerciseMove[], toRow: number, before: string | undefined) => {\n      applyTransform(\n        (planner) => PlannerStructure_moveExercisesToDay(planner, moves, toRow, before, settings),\n        `Move ${moves.map((m) => m.fullName).join(\", \")} to day ${toRow + 1}`,\n        \"content\"\n      );\n    },\n    [applyTransform, settings]\n  );\n\n  return {\n    onDeletePlacements,\n    onAddDay,\n    onAddWeek,\n    onSetRepeatRange,\n    onMoveDayRows,\n    onDuplicateDays,\n    onDeleteDays,\n    onMoveWeek,\n    onDuplicateWeek,\n    onDeleteWeek,\n    onSetWeekDetails,\n    onSetDayDetails,\n    onReorderExercisesInDay,\n    onMoveExercisesToDay,\n  };\n}\n","import { useRef } from \"react\";\nimport {\n  ProgramGridGeometry_dayBlockDropAt,\n  ProgramGridGeometry_insertAtForGap,\n  ProgramGridGeometry_isBlockDropNoop,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { IGridDrags } from \"./useGridDrags\";\nimport { IGridDragSession, useGridDragSession } from \"./useGridDragSession\";\n\n// Dragging a whole day row. Unlike the exercise drag this one only ever lands among the rows it can\n// already see, so it is instantiated per row — but it is still a hook, so that \"drag controllers\n// live in hooks, components render them\" holds for all three without exceptions.\nexport function useGridDayDrag(args: {\n  rowIndex: number;\n  drags: IGridDrags;\n  onMoveDayRows: (rows: number[], insertAt: number) => void;\n}): IGridDragSession {\n  const { rowIndex, drags } = args;\n  const { getGeometry, getSelectedDayRows, draggedRows, dropBoundary, ghostY, setActiveGhost } = drags;\n  const onMoveRef = useRef(args.onMoveDayRows);\n  onMoveRef.current = args.onMoveDayRows;\n\n  // Which rows this drag carries, decided when it starts and fixed for its whole life: grabbing a\n  // row that is part of the selection takes the whole selection, grabbing anything else takes just\n  // that row — so a drag never moves something the finger is nowhere near, and never changes its\n  // mind about what it is moving halfway through.\n  const movedRef = useRef<number[]>([]);\n\n  return useGridDragSession<number>({\n    axis: \"y\",\n    autoScroll: drags.autoScroll,\n    resolve: (translationY) => ProgramGridGeometry_dayBlockDropAt(getGeometry(), movedRef.current, translationY),\n    show: (gap, translationY) => {\n      draggedRows.value = gap == null ? [] : movedRef.current;\n      dropBoundary.value =\n        gap == null || ProgramGridGeometry_isBlockDropNoop(getGeometry().length, movedRef.current, gap) ? -1 : gap;\n      // Zero when there is no target — see useGridWeekDrag: a ghost left translated still takes up\n      // room in the scroller after the drag that moved it is over.\n      ghostY.value = gap == null ? 0 : translationY;\n    },\n    commit: (gap) => {\n      const moved = movedRef.current;\n      if (!ProgramGridGeometry_isBlockDropNoop(getGeometry().length, moved, gap)) {\n        onMoveRef.current(moved, ProgramGridGeometry_insertAtForGap(moved, gap));\n      }\n    },\n    onActive: (active) => {\n      if (active) {\n        const selected = getSelectedDayRows();\n        movedRef.current = selected.indexOf(rowIndex) !== -1 ? selected.slice().sort((a, b) => a - b) : [rowIndex];\n      }\n      setActiveGhost(active ? { kind: \"day\", rows: movedRef.current } : undefined);\n    },\n  });\n}\n","import { useCallback, useMemo, useRef } from \"react\";\nimport { IGridDragAutoScroll } from \"./gridDragAutoScroll\";\n\n// One drag, in the shape all three of the grid's drags share: a pointer position resolves to a drop\n// target, the target is shown, and on release it is committed. Days, exercises and weeks differ only\n// in `resolve` (pure, in programGridGeometry) and `commit` (a transform) — everything that made the\n// drags fragile is here, once:\n//\n//   - The target lives in a ref, written synchronously as the finger moves. Nothing calls setState,\n//     because a render under the finger is what gesture-handler cancels the pan for.\n//   - `show` may only write Reanimated shared values, for the same reason.\n//   - The handlers keep their identity for the whole drag — a rebuilt gesture drops the drag — so\n//     the callbacks come through refs rather than through the dependency array.\n//   - `onDragEnd` is idempotent, because onEnd *and* onFinalize both fire on a normal release, and\n//     onFinalize alone fires on a cancel.\n//   - Edge-scrolling re-runs `resolve` on its own timer: while the page moves under a still finger\n//     no gesture events arrive, but where the finger points keeps changing.\nexport interface IGridDragSession {\n  onDragStart: (absolute: number) => void;\n  onDragMove: (translation: number, absolute: number) => void;\n  onDragEnd: (commit: boolean) => void;\n}\n\nexport interface IGridDragSessionOptions<TTarget> {\n  axis: \"x\" | \"y\";\n  autoScroll: IGridDragAutoScroll;\n  // Where the drag would land, given how far the finger has travelled from where it started. Pure:\n  // the same translation always resolves to the same target, and nothing else happens.\n  resolve: (translation: number) => TTarget | undefined;\n  // Draw it. Called with the target on every move, and with undefined when the drag is over.\n  //\n  // The raw translation comes too, because where a drag *lands* and where it should be *drawn* are\n  // different questions: the target snaps to a row or a column, while the floating copy follows the\n  // finger. Without it, the two drags that need both smuggled the translation past the contract —\n  // one by writing a ref from inside `resolve`, the other by hanging a preview coordinate on its\n  // semantic target.\n  show: (target: TTarget | undefined, translation: number) => void;\n  commit: (target: TTarget) => void;\n  // Fires once when the drag starts and once when it ends — the only two moments in a drag where a\n  // render is allowed. Everything in between goes through shared values. The ghosts use it to build\n  // their contents on demand instead of keeping a copy of the grid mounted at all times.\n  onActive?: (active: boolean) => void;\n}\n\nexport function useGridDragSession<TTarget>(options: IGridDragSessionOptions<TTarget>): IGridDragSession {\n  const { autoScroll, axis } = options;\n  const targetRef = useRef<TTarget | undefined>(undefined);\n  // Refreshed every render, read only from handlers — which run long after it, so they always see\n  // the current geometry without being rebuilt when it changes.\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const apply = useCallback((translation: number) => {\n    const target = optionsRef.current.resolve(translation);\n    targetRef.current = target;\n    optionsRef.current.show(target, translation);\n  }, []);\n\n  const onDragStart = useCallback(\n    (absolute: number) => {\n      optionsRef.current.onActive?.(true);\n      apply(0);\n      autoScroll.begin(axis, absolute, apply);\n    },\n    [apply, autoScroll, axis]\n  );\n\n  const onDragMove = useCallback(\n    (translation: number, absolute: number) => {\n      autoScroll.move(translation, absolute);\n    },\n    [autoScroll]\n  );\n\n  const onDragEnd = useCallback(\n    (commit: boolean) => {\n      autoScroll.end();\n      const target = targetRef.current;\n      targetRef.current = undefined;\n      optionsRef.current.show(undefined, 0);\n      optionsRef.current.onActive?.(false);\n      if (commit && target !== undefined) {\n        optionsRef.current.commit(target);\n      }\n    },\n    [autoScroll]\n  );\n\n  // Memoized because the whole chain above it is: useGridLaneDrag's callbacks depend on this\n  // object, useGridDrags spreads that into the bus, and every row reads the bus — so a fresh object\n  // here re-renders every row on every parent render, including under a live finger.\n  return useMemo(() => ({ onDragStart, onDragMove, onDragEnd }), [onDragStart, onDragMove, onDragEnd]);\n}\n","import { useCallback, useMemo, useRef } from \"react\";\nimport { SharedValue, useSharedValue } from \"react-native-reanimated\";\nimport { IProgramGrid } from \"../../../pages/planner/models/programGrid\";\nimport { IPlannerStructureExerciseMove } from \"../../../pages/planner/models/plannerStructure\";\nimport { IGridGeometryRow } from \"../../../pages/planner/models/programGridGeometry\";\nimport { IGridDragAutoScroll } from \"./gridDragAutoScroll\";\nimport { IGridLaneDrag, useGridLaneDrag } from \"./useGridLaneDrag\";\n\n// Everything the three drags share, in one place instead of scattered across the render tree.\n//\n// Drags can't talk through state — a render under the finger cancels the pan — so they talk through\n// Reanimated shared values, and every row and column reads them to know whether it is the one being\n// dragged. That makes the values a small bus rather than one component's state, and it used to live\n// in EditProgramGrid simply because that was the common ancestor. Here it has a name.\n//\n// The refs are the other half: handlers are built once per drag and must not be rebuilt while a pan\n// is live, so they read the current model and layout through refs rather than closing over them.\n\n// One exercise strip, by the row and lane it sits in — the identity a drag moves, as opposed to the\n// placement, which is one *run* of it across weeks.\nexport interface IGridLaneRef {\n  row: number;\n  lane: number;\n}\n\n// What the ghosts have to draw, if anything. Deliberately *not* on the bus itself: the bus is read\n// by every row, so a value that changed when a drag started would re-render every row at exactly\n// the moment the pan must not be disturbed. Only the stable setter lives here; the value lives in\n// the grid, and reaches the ghosts alone.\n//\n// It carries the whole set rather than one index, because dragging a selection drags all of it.\nexport type IGridActiveGhost =\n  | { kind: \"day\"; rows: number[] }\n  | { kind: \"lane\"; lanes: IGridLaneRef[] }\n  | { kind: \"week\"; weeks: number[] };\n\nexport interface IGridDrags {\n  // Which rows/lanes/columns are lifted, and where their drop would land. Empty, or -1, means \"no\n  // drag\" — the sets are what a multi-selection drag needs, since every one of its members has to\n  // dim itself and none of them is the one true source.\n  draggedRows: SharedValue<number[]>;\n  dropBoundary: SharedValue<number>;\n  draggedWeek: SharedValue<number>;\n  dropWeekGap: SharedValue<number>;\n  draggedLanes: SharedValue<IGridLaneRef[]>;\n  dropLaneRow: SharedValue<number>;\n  dropLaneGap: SharedValue<number>;\n  // How far the drag has travelled; one per axis, since only one drag can be live. A translation\n  // rather than a position, because several ghosts move on it at once and each one starts somewhere\n  // different.\n  ghostX: SharedValue<number>;\n  ghostY: SharedValue<number>;\n  // Current layout, model and selection, for handlers that outlive the render that made them.\n  //\n  // Getters, not refs, and that is load-bearing: a gesture's worklet closure reaches everything on\n  // this object, and Reanimated freezes any plain object it serializes — a captured ref stops\n  // accepting writes *silently*, so every drag then computes against the layout as it was when the\n  // first gesture was built. A function is passed by reference and never frozen.\n  getGeometry: () => IGridGeometryRow[];\n  getGrid: () => IProgramGrid;\n  // Which rows a day drag should carry: the selection when the grabbed row is part of it, and the\n  // grabbed row alone otherwise.\n  getSelectedDayRows: () => number[];\n  autoScroll: IGridDragAutoScroll;\n  setActiveGhost: (ghost: IGridActiveGhost | undefined) => void;\n  // The exercise drag is owned here rather than by a row, because it can end in a different row.\n  lane: IGridLaneDrag;\n}\n\nexport function useGridDrags(args: {\n  grid: IProgramGrid;\n  geometry: IGridGeometryRow[];\n  // The current selection, as the two drags see it: which rows and which strips would come along.\n  selectedDayRows: number[];\n  selectedLanes: IGridLaneRef[];\n  // Edge-scrolling drives the grid's own scroller, which the component renders — so the refs to it\n  // come in rather than being owned here. They are render plumbing; a bus that handed them out\n  // would be handing out mutable refs again, which is the thing this hook exists not to do.\n  autoScroll: IGridDragAutoScroll;\n  onGhostActive: (ghost: IGridActiveGhost | undefined) => void;\n  onReorderExercisesInDay: (rowIndex: number, order: string[]) => void;\n  onMoveExercisesToDay: (moves: IPlannerStructureExerciseMove[], toRow: number, before: string | undefined) => void;\n}): IGridDrags {\n  const draggedRows = useSharedValue<number[]>([]);\n  const dropBoundary = useSharedValue(-1);\n  const draggedWeek = useSharedValue(-1);\n  const dropWeekGap = useSharedValue(-1);\n  const ghostX = useSharedValue(0);\n  const ghostY = useSharedValue(0);\n\n  const geometryRef = useRef<IGridGeometryRow[]>(args.geometry);\n  geometryRef.current = args.geometry;\n  const gridRef = useRef(args.grid);\n  gridRef.current = args.grid;\n  const selectedDayRowsRef = useRef(args.selectedDayRows);\n  selectedDayRowsRef.current = args.selectedDayRows;\n  const selectedLanesRef = useRef(args.selectedLanes);\n  selectedLanesRef.current = args.selectedLanes;\n\n  const getGeometry = useCallback(() => geometryRef.current, []);\n  const getGrid = useCallback(() => gridRef.current, []);\n  const getSelectedDayRows = useCallback(() => selectedDayRowsRef.current, []);\n  const getSelectedLanes = useCallback(() => selectedLanesRef.current, []);\n  // Straight through, not via a ref: it is a useState setter, so it is already stable for the life\n  // of the grid, and wrapping it only adds a thing that can be stale.\n  const setActiveGhost = args.onGhostActive;\n\n  const autoScroll = args.autoScroll;\n\n  const lane = useGridLaneDrag({\n    getGrid,\n    getGeometry,\n    getSelectedLanes,\n    ghostY,\n    autoScroll,\n    setActiveGhost,\n    onReorderExercisesInDay: args.onReorderExercisesInDay,\n    onMoveExercisesToDay: args.onMoveExercisesToDay,\n  });\n\n  return useMemo(\n    () => ({\n      draggedRows,\n      dropBoundary,\n      draggedWeek,\n      dropWeekGap,\n      draggedLanes: lane.draggedLanes,\n      dropLaneRow: lane.dropLaneRow,\n      dropLaneGap: lane.dropLaneGap,\n      ghostX,\n      ghostY,\n      getGeometry,\n      getGrid,\n      getSelectedDayRows,\n      autoScroll,\n      setActiveGhost,\n      lane,\n    }),\n    [\n      draggedRows,\n      dropBoundary,\n      draggedWeek,\n      dropWeekGap,\n      ghostX,\n      ghostY,\n      getGeometry,\n      getGrid,\n      getSelectedDayRows,\n      autoScroll,\n      setActiveGhost,\n      lane,\n    ]\n  );\n}\n","import { useCallback } from \"react\";\nimport { IProgramGrid } from \"../../../pages/planner/models/programGrid\";\nimport { IPlannerDayDetails, IPlannerWeekDetails } from \"../../../pages/planner/models/plannerStructure\";\nimport { IGridHost } from \"./gridHost\";\n\nexport interface IGridEditDetails {\n  onEditWeek: (weekIndex: number) => void;\n  onEditDay: (rowIndex: number) => void;\n}\n\n// Editing a name and a description is the one grid command that is both halves of the split: it\n// opens a modal like the host's navigation and it edits like useGridActions'. So it lives here\n// instead, and hands the answer to the edit — which stays behind the same transform as every\n// other one.\nexport function useGridEditDetails(args: {\n  grid: IProgramGrid;\n  openEditDetails: IGridHost[\"openEditDetails\"];\n  onSetWeekDetails: (weekIndex: number, details: IPlannerWeekDetails) => void;\n  onSetDayDetails: (rowIndex: number, details: IPlannerDayDetails) => void;\n}): IGridEditDetails {\n  const { grid, openEditDetails, onSetWeekDetails, onSetDayDetails } = args;\n\n  const onEditWeek = useCallback(\n    (weekIndex: number) => {\n      const column = grid.columns[weekIndex];\n      if (column == null) {\n        return;\n      }\n      openEditDetails(\n        {\n          title: \"Edit week\",\n          namePlaceholder: column.name,\n          descriptionPlaceholder: \"Week description in Markdown...\",\n          dataCyPrefix: \"edit-week\",\n          name: column.name,\n          description: column.description,\n        },\n        (details) => {\n          if (details != null) {\n            onSetWeekDetails(weekIndex, details);\n          }\n        }\n      );\n    },\n    [grid, openEditDetails, onSetWeekDetails]\n  );\n\n  const onEditDay = useCallback(\n    (rowIndex: number) => {\n      const row = grid.rows[rowIndex];\n      if (row == null) {\n        return;\n      }\n      // What the grid shows for the row: the first week that has this day. Weeks that name or\n      // describe it differently keep what they say unless the user edits that field.\n      const name = row.namePerWeek.find((n) => n != null) ?? `Day ${rowIndex + 1}`;\n      const description = row.descriptionPerWeek.find((d) => d != null);\n      openEditDetails(\n        {\n          title: \"Edit day\",\n          namePlaceholder: name,\n          descriptionPlaceholder: \"Day description in Markdown...\",\n          dataCyPrefix: \"edit-day\",\n          name,\n          description,\n        },\n        (details) => {\n          if (details == null) {\n            return;\n          }\n          onSetDayDetails(rowIndex, {\n            name: details.name !== name ? details.name : undefined,\n            description: details.description !== description ? (details.description ?? \"\") : undefined,\n          });\n        }\n      );\n    },\n    [grid, openEditDetails, onSetDayDetails]\n  );\n\n  return { onEditWeek, onEditDay };\n}\n","import { useCallback, useMemo, useRef } from \"react\";\nimport { SharedValue, useSharedValue } from \"react-native-reanimated\";\nimport {\n  IGridGeometryRow,\n  IGridLaneDrop,\n  ProgramGridGeometry_isBlockDropNoop,\n  ProgramGridGeometry_laneDropAt,\n  ProgramGridGeometry_moveBlock,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { IProgramGrid, ProgramGrid_laneNames } from \"../../../pages/planner/models/programGrid\";\nimport { IPlannerStructureExerciseMove } from \"../../../pages/planner/models/plannerStructure\";\nimport { IGridDragAutoScroll } from \"./gridDragAutoScroll\";\nimport { IGridActiveGhost, IGridLaneRef } from \"./useGridDrags\";\nimport { useGridDragSession } from \"./useGridDragSession\";\n\nexport interface IGridLaneDrag {\n  onLaneDragStart: (rowIndex: number, laneIndex: number, absolute: number) => void;\n  onLaneDragMove: (rowIndex: number, laneIndex: number, translation: number, absolute: number) => void;\n  onLaneDragEnd: (commit: boolean) => void;\n  draggedLanes: SharedValue<IGridLaneRef[]>;\n  dropLaneRow: SharedValue<number>;\n  dropLaneGap: SharedValue<number>;\n}\n\n// Unlike the day and week drags, this one is owned by the grid rather than by the row it starts in:\n// an exercise can be dropped into a *different* day, and only the grid knows where the other rows\n// are. The shared values are read by every row, so the drop line can be drawn in one row while\n// another row's gesture is tracking the finger.\nexport function useGridLaneDrag(args: {\n  // The model, for identity — which exercise is being dragged. Geometry answers *where* things are;\n  // it must not be the thing that says *what* they are.\n  getGrid: () => IProgramGrid;\n  getGeometry: () => IGridGeometryRow[];\n  getSelectedLanes: () => IGridLaneRef[];\n  ghostY: SharedValue<number>;\n  autoScroll: IGridDragAutoScroll;\n  setActiveGhost: (ghost: IGridActiveGhost | undefined) => void;\n  onReorderExercisesInDay: (rowIndex: number, order: string[]) => void;\n  onMoveExercisesToDay: (moves: IPlannerStructureExerciseMove[], toRow: number, before: string | undefined) => void;\n}): IGridLaneDrag {\n  const { getGrid, getGeometry, getSelectedLanes, ghostY, autoScroll } = args;\n  const draggedLanes = useSharedValue<IGridLaneRef[]>([]);\n  const dropLaneRow = useSharedValue(-1);\n  // The gap, in the target row's lanes: gap N sits above lane N, and gap `lanes` below the last one.\n  const dropLaneGap = useSharedValue(-1);\n  // Which strip the finger grabbed. Set on start, read by resolve/commit, cleared on release.\n  const originRef = useRef<IGridLaneRef | undefined>(undefined);\n  const argsRef = useRef(args);\n  argsRef.current = args;\n\n  // Which strips this drag carries, decided when it starts and fixed for its whole life: grabbing a\n  // selected strip drags the whole selection, grabbing anything else drags that strip alone. Sorted,\n  // so the block keeps the order it is drawn in whichever of its strips the drag started from.\n  const movedRef = useRef<IGridLaneRef[]>([]);\n\n  // Whether the drop would leave the program as it is: within one row that is a reorder that\n  // reorders nothing, and across rows it never is.\n  const isNoop = useCallback(\n    (drop: IGridLaneDrop, moved: IGridLaneRef[]): boolean => {\n      if (moved.some((lane) => lane.row !== drop.toRow)) {\n        return false;\n      }\n      const lanes = getGeometry()[drop.toRow]?.laneNames.length ?? 0;\n      return ProgramGridGeometry_isBlockDropNoop(\n        lanes,\n        moved.map((lane) => lane.lane),\n        drop.gap\n      );\n    },\n    [getGeometry]\n  );\n\n  const drag = useGridDragSession<IGridLaneDrop>({\n    axis: \"y\",\n    autoScroll,\n    resolve: (translationY) => {\n      const origin = originRef.current;\n      if (origin == null) {\n        return undefined;\n      }\n      // From the block's leading strip — its last one going down, its first going up — for the same\n      // reason the day drag is: a block that measured from whichever strip the finger grabbed would\n      // have to travel its own height before it displaced anything.\n      const leading = movedRef.current.reduce(\n        (acc, lane) =>\n          lane.row !== origin.row ? acc : translationY > 0 ? Math.max(acc, lane.lane) : Math.min(acc, lane.lane),\n        origin.lane\n      );\n      return ProgramGridGeometry_laneDropAt(getGeometry(), origin.row, leading, translationY);\n    },\n    show: (drop, translationY) => {\n      const moved = movedRef.current;\n      draggedLanes.value = drop == null ? [] : moved;\n      const noop = drop == null || isNoop(drop, moved);\n      dropLaneRow.value = noop ? -1 : drop!.toRow;\n      dropLaneGap.value = noop ? -1 : drop!.gap;\n      // Drawn from the translation rather than carried on the drop: where the strips *land* snaps\n      // to a lane, where they are *drawn* follows the finger, and a target that carries both is a\n      // target doing two jobs. Zero when there is no target — see useGridWeekDrag: a ghost left\n      // translated still takes up room in the scroller after the drag is over.\n      ghostY.value = drop == null ? 0 : translationY;\n    },\n    commit: (drop) => {\n      const grid = getGrid();\n      const moved = movedRef.current;\n      // Both the strips being moved and the one they land above are identities, so both come from\n      // the model's lanes rather than from the geometry rows the drag was drawn against.\n      const targetNames = ProgramGrid_laneNames(grid, drop.toRow);\n      if (moved.length === 0 || isNoop(drop, moved)) {\n        return;\n      }\n      if (moved.every((lane) => lane.row === drop.toRow)) {\n        const order = ProgramGridGeometry_moveBlock(\n          targetNames,\n          moved.map((lane) => lane.lane),\n          drop.gap\n        );\n        argsRef.current.onReorderExercisesInDay(\n          drop.toRow,\n          order.filter((name) => name !== \"\")\n        );\n        return;\n      }\n      const moves = moved.reduce<IPlannerStructureExerciseMove[]>((acc, lane) => {\n        const fullName = ProgramGrid_laneNames(grid, lane.row)[lane.lane];\n        return fullName == null || fullName === \"\" ? acc : [...acc, { fromRowIndex: lane.row, fullName }];\n      }, []);\n      if (moves.length === 0) {\n        return;\n      }\n      // Anchored by the name it was dropped above rather than by index: the target day can hold a\n      // different number of exercises in each week. A strip that is itself on the move can't anchor\n      // anything, so the anchor is the first one below the gap that is staying put.\n      const before = targetNames.find(\n        (name, laneIndex) =>\n          laneIndex >= drop.gap &&\n          name !== \"\" &&\n          !moved.some((lane) => lane.row === drop.toRow && lane.lane === laneIndex)\n      );\n      argsRef.current.onMoveExercisesToDay(moves, drop.toRow, before);\n    },\n    onActive: (active) => {\n      if (active) {\n        const origin = originRef.current;\n        const selected = getSelectedLanes();\n        const isSelected = origin != null && selected.some((l) => l.row === origin.row && l.lane === origin.lane);\n        movedRef.current = isSelected\n          ? selected.slice().sort((a, b) => (a.row === b.row ? a.lane - b.lane : a.row - b.row))\n          : origin == null\n            ? []\n            : [origin];\n      }\n      const moved = movedRef.current;\n      argsRef.current.setActiveGhost(active && moved.length > 0 ? { kind: \"lane\", lanes: moved } : undefined);\n    },\n  });\n\n  const onLaneDragStart = useCallback(\n    (rowIndex: number, laneIndex: number, absolute: number) => {\n      originRef.current = { row: rowIndex, lane: laneIndex };\n      drag.onDragStart(absolute);\n    },\n    [drag]\n  );\n\n  const onLaneDragMove = useCallback(\n    (_rowIndex: number, _laneIndex: number, translation: number, absolute: number) => {\n      drag.onDragMove(translation, absolute);\n    },\n    [drag]\n  );\n\n  const onLaneDragEnd = useCallback(\n    (commit: boolean) => {\n      drag.onDragEnd(commit);\n      originRef.current = undefined;\n    },\n    [drag]\n  );\n\n  // Memoized because useGridDrags spreads this into the bus every row reads: a fresh object here\n  // makes `drags` fresh, which re-renders every GridRow — including while a pan is live, which is\n  // the one thing that reliably kills a drag.\n  return useMemo(\n    () => ({ onLaneDragStart, onLaneDragMove, onLaneDragEnd, draggedLanes, dropLaneRow, dropLaneGap }),\n    [onLaneDragStart, onLaneDragMove, onLaneDragEnd, draggedLanes, dropLaneRow, dropLaneGap]\n  );\n}\n","import { useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { NavScreenScrollContext } from \"../../../navigation/NavScreenScrollContext\";\nimport { IProgramGrid, IProgramGridPlacement, IProgramGridSelection } from \"../../../pages/planner/models/programGrid\";\nimport { IGridGeometryRow, ProgramGridGeometry_laneHeight } from \"../../../pages/planner/models/programGridGeometry\";\n\n// \"...main\" tells you an exercise reuses another one; it doesn't tell you *where* that one is. The\n// grid already lights the source up when its reuser is selected, which answers the question only\n// when both happen to be on screen — and on any real program they usually aren't. So when the\n// source has scrolled out of view, say which way it went.\n//\n// Only one direction is ever reported, because only one is ever useful: the question is \"which way\n// do I scroll\", and a source that is already visible needs no answer at all.\nexport type IGridReuseDirection = \"up\" | \"down\";\n\nexport interface IGridReuseLocator {\n  name: string;\n  direction: IGridReuseDirection;\n  onGoTo: () => void;\n}\n\n// How much of the row to leave showing above the fold before it counts as off screen. A source\n// whose last pixel is peeking over the edge is not something anyone can read.\nconst VISIBLE_MARGIN = 24;\n// Where a jump puts the row: a little below the top edge, so it reads as the thing that was asked\n// for rather than as content that happens to start there.\nconst GO_TO_MARGIN = 12;\n\nexport function useGridReuseLocator(args: {\n  grid: IProgramGrid;\n  geometry: IGridGeometryRow[];\n  selection?: IProgramGridSelection;\n  // Where the grid's rows begin in scroll-content coordinates, and how tall the week header that\n  // pins itself over them is — both from useGridStickyHeader.\n  rowsTop: number;\n  headerHeight: number;\n}): IGridReuseLocator | undefined {\n  const { grid, geometry, selection, rowsTop, headerHeight } = args;\n  const scrollCtx = useContext(NavScreenScrollContext);\n\n  // What covers the top of the visible area: the screen's own sticky header, and then the grid's\n  // week names pinned beneath it. Counting only the first leaves a band the height of the week row\n  // that reads as visible and isn't — a strip sitting there is behind the names, and a jump aimed\n  // at it lands with it still behind them.\n  const occludedTop = (scrollCtx?.stickyHeaderHeight ?? 0) + headerHeight;\n\n  // What the selection reuses, if it agrees on one thing. Several strips reusing several different\n  // sources have no single answer, and pointing at one of them arbitrarily would be worse than\n  // saying nothing.\n  const target = useMemo((): IProgramGridPlacement | undefined => {\n    const names = new Set((selection?.placements ?? []).map((p) => p.reuseOf).filter((n): n is string => n != null));\n    if (names.size !== 1) {\n      return undefined;\n    }\n    const name = [...names][0];\n    // The topmost run of it. A source that repeats draws several strips, and the one to send\n    // somebody to is the first — that is where its text is written.\n    return grid.placements\n      .filter((p) => p.fullName === name)\n      .sort((a, b) => a.rowIndex - b.rowIndex || a.colStart - b.colStart)[0];\n  }, [grid, selection]);\n\n  const row = target != null ? geometry[target.rowIndex] : undefined;\n  // The strip, not the row it lives in. A reuse and its source are very often in the same day —\n  // `main` at the top of it and everything below reusing it — and a row is tall enough that it is\n  // still partly on screen long after the strip at its top has scrolled away. Asking about the row\n  // answers \"no direction\" for exactly the case the pill exists to serve.\n  //\n  // A collapsed row hides its strips, so the row itself is the target there.\n  const laneTop =\n    row == null || target == null ? 0 : row.isCollapsed ? row.top : row.contentTop + row.laneTops[target.laneIndex];\n  const rowTop = row == null ? 0 : rowsTop + laneTop;\n  const rowBottom =\n    row == null || target == null\n      ? 0\n      : rowTop + (row.isCollapsed ? row.height : ProgramGridGeometry_laneHeight(row, target.laneIndex));\n\n  const [direction, setDirection] = useState<IGridReuseDirection | undefined>(undefined);\n  // Read by the scroll listener, which outlives the render that installed it.\n  const boundsRef = useRef({ rowTop, rowBottom });\n  boundsRef.current = { rowTop, rowBottom };\n  // The scroll context carries what the viewport is occluded *by*, but not how tall it is. Scroll\n  // events do, and it is measured directly for the case where none has arrived yet — a grid opened\n  // and a strip tapped without scrolling once.\n  const viewportHeightRef = useRef(0);\n\n  const verdict = useCallback((): IGridReuseDirection | undefined => {\n    const viewport = viewportHeightRef.current;\n    if (viewport <= 0) {\n      return undefined;\n    }\n    const scrollY = scrollCtx?.scrollYRef.current ?? 0;\n    const top = scrollY + occludedTop;\n    const bottom = scrollY + viewport - (scrollCtx?.footerHeight ?? 0);\n    const bounds = boundsRef.current;\n    if (bounds.rowBottom - VISIBLE_MARGIN < top) {\n      return \"up\";\n    }\n    if (bounds.rowTop + VISIBLE_MARGIN > bottom) {\n      return \"down\";\n    }\n    return undefined;\n  }, [scrollCtx, occludedTop]);\n\n  // Recomputed on every scroll event but written only when the answer changes — an arrow that\n  // flips at most twice in a flick, rather than a setState per frame under the finger.\n  useEffect(() => {\n    if (row == null) {\n      setDirection(undefined);\n      return;\n    }\n    scrollCtx?.viewportRef.current?.measureInWindow((_x, _y, _w, height) => {\n      viewportHeightRef.current = height;\n      setDirection(verdict());\n    });\n    setDirection(verdict());\n    return scrollCtx?.addScrollListener((e) => {\n      viewportHeightRef.current = e.nativeEvent.layoutMeasurement.height;\n      setDirection((prev) => {\n        const next = verdict();\n        return prev === next ? prev : next;\n      });\n    });\n  }, [row, rowTop, rowBottom, scrollCtx, verdict]);\n\n  const onGoTo = useCallback(() => {\n    const node = scrollCtx?.scrollRef.current;\n    if (node == null) {\n      return;\n    }\n    node.scrollTo({ y: Math.max(0, boundsRef.current.rowTop - occludedTop - GO_TO_MARGIN) });\n  }, [scrollCtx, occludedTop]);\n\n  return useMemo(\n    () => (target == null || direction == null ? undefined : { name: target.fullName, direction, onGoTo }),\n    [target, direction, onGoTo]\n  );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { IProgramGrid, IProgramGridSelection, ProgramGrid_select } from \"../../../pages/planner/models/programGrid\";\nimport { IGridLaneRef } from \"./useGridDrags\";\n\n// Three selections, and only ever one of them: an exercise, a day row, or a week column. Each setter\n// clears the other two, because the dock shows one target with one set of verbs — a day is a day,\n// not the bag of exercises inside it.\n//\n// The plural shapes are the multi-select plumbing, kept because taking it out is a \"for now\"\n// decision: everything downstream still handles a set, it just never receives more than one.\nexport interface IGridSelectionState {\n  selectedIds: string[];\n  selectedDayRows: number[];\n  selectedWeek?: number;\n  selection?: IProgramGridSelection;\n  // Which strips the selection covers, as the exercise drag sees them: a placement is one *run* of\n  // an exercise across weeks, but what a drag moves is the lane it sits in.\n  selectedLanes: IGridLaneRef[];\n  // A tap replaces whatever was selected rather than adding to it, and tapping what is already\n  // selected leaves it selected — the dock's ✕ is how a selection is let go of. The tap that\n  // selects doubling as the one that unselects is what made every second tap a mistake.\n  onSelect: (placementId: string) => void;\n  onSelectDay: (rowIndex: number) => void;\n  onSelectWeek: (weekIndex: number) => void;\n  onClear: () => void;\n}\n\nexport function useGridSelectionState(grid: IProgramGrid): IGridSelectionState {\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [selectedDayRows, setSelectedDayRows] = useState<number[]>([]);\n  const [selectedWeek, setSelectedWeek] = useState<number | undefined>(undefined);\n  const selection = useMemo(() => ProgramGrid_select(grid, selectedIds), [grid, selectedIds]);\n  // Deduplicated: an undulating exercise is several placements in one lane, and dragging it twice\n  // would move it out of the day and then look for it there again.\n  const selectedLanes = useMemo(() => {\n    return (selection?.placements ?? []).reduce<IGridLaneRef[]>((acc, placement) => {\n      const seen = acc.some((lane) => lane.row === placement.rowIndex && lane.lane === placement.laneIndex);\n      return seen ? acc : [...acc, { row: placement.rowIndex, lane: placement.laneIndex }];\n    }, []);\n  }, [selection]);\n\n  const onSelect = useCallback((placementId: string) => {\n    setSelectedDayRows([]);\n    setSelectedWeek(undefined);\n    setSelectedIds([placementId]);\n  }, []);\n\n  const onSelectDay = useCallback((rowIndex: number) => {\n    setSelectedIds([]);\n    setSelectedWeek(undefined);\n    setSelectedDayRows([rowIndex]);\n  }, []);\n\n  const onSelectWeek = useCallback((weekIndex: number) => {\n    setSelectedIds([]);\n    setSelectedDayRows([]);\n    setSelectedWeek(weekIndex);\n  }, []);\n\n  const onClear = useCallback(() => {\n    setSelectedIds([]);\n    setSelectedDayRows([]);\n    setSelectedWeek(undefined);\n  }, []);\n\n  return {\n    selectedIds,\n    selectedDayRows,\n    selectedWeek,\n    selection,\n    selectedLanes,\n    onSelect,\n    onSelectDay,\n    onSelectWeek,\n    onClear,\n  };\n}\n","import { RefObject, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, LayoutChangeEvent, View } from \"react-native\";\nimport { NavScreenScrollContext } from \"../../../navigation/NavScreenScrollContext\";\n\n// The week names are the only thing saying which column is which, and a program several screens\n// tall spends most of its scroll with them out of sight. RN has no position:sticky, and the\n// screen's ScrollView pins only its own direct children — this row is nested inside the grid's\n// horizontal scroller, which is what keeps it lined up with the columns — so it follows the\n// vertical offset by hand, the same way StickyError does in dayLiftoEditorInline.tsx.\nexport function useGridStickyHeader(options: { isHeaderInContainer: boolean }): {\n  containerRef: RefObject<View | null>;\n  onContainerLayout: () => void;\n  onHeaderLayout: (e: LayoutChangeEvent) => void;\n  onHeaderHeight: (height: number) => void;\n  pinTop: number;\n  translateY: Animated.AnimatedInterpolation<number> | number;\n  // Where the grid's first row starts in scroll-content coordinates — the header's own anchor,\n  // pushed past the header. Anything asking \"where on screen has that row got to\" needs the same\n  // measurement this hook already keeps fresh, and measuring it a second time somewhere else is how\n  // the two answers drift apart.\n  rowsTop: number;\n  // The header's own height, for anything that wants to ride just below it on the same translate.\n  headerHeight: number;\n} {\n  const scrollCtx = useContext(NavScreenScrollContext);\n  const containerRef = useRef<View | null>(null);\n  const headerHeightRef = useRef(0);\n  const stickyHeaderHeight = scrollCtx?.stickyHeaderHeight ?? 0;\n  // Where the grid starts in scroll-content coordinates, and how far the header may travel before\n  // it would outrun the last row.\n  const [anchor, setAnchor] = useState({ top: 0, range: 0, headerHeight: 0 });\n\n  // Both boxes in window coordinates, turned into a content offset with the scroll position that\n  // was live at the same moment — on Android edge-to-edge the window and measureInWindow don't\n  // share an origin, so nothing here may come from window height or insets.\n  const remeasure = useCallback(() => {\n    const viewport = scrollCtx?.viewportRef.current;\n    const container = containerRef.current;\n    if (viewport == null || container == null) {\n      return;\n    }\n    viewport.measureInWindow((_vx, vy) => {\n      container.measureInWindow((_x, y, _w, height) => {\n        const top = y - vy + (scrollCtx?.scrollYRef.current ?? 0);\n        const headerHeight = headerHeightRef.current;\n        const range = Math.max(0, height - headerHeight);\n        setAnchor((prev) =>\n          prev.top === top && prev.range === range && prev.headerHeight === headerHeight\n            ? prev\n            : { top, range, headerHeight }\n        );\n      });\n    });\n  }, [scrollCtx]);\n\n  // The grid's own onLayout covers its rows growing and shrinking, but not an ancestor resizing\n  // above it — collapsing the program header leaves the grid where it was relative to its parent.\n  // A changed content height is the one signal that catches both.\n  const contentHeightRef = useRef(0);\n  useEffect(() => {\n    return scrollCtx?.addScrollListener((e) => {\n      const contentHeight = e.nativeEvent.contentSize.height;\n      if (contentHeight !== contentHeightRef.current) {\n        contentHeightRef.current = contentHeight;\n        remeasure();\n      }\n    });\n  }, [scrollCtx, remeasure]);\n\n  const onHeaderHeight = useCallback(\n    (height: number) => {\n      headerHeightRef.current = height;\n      remeasure();\n    },\n    [remeasure]\n  );\n  const onHeaderLayout = useCallback(\n    (e: LayoutChangeEvent) => onHeaderHeight(e.nativeEvent.layout.height),\n    [onHeaderHeight]\n  );\n\n  // Interpolated rather than followed in JS: the scroll listeners run a frame or two behind the\n  // scroll itself, which the eye reads as the row drifting away from the top edge on every flick.\n  const scrollAnimatedY = scrollCtx?.scrollAnimatedY;\n  const translateY = useMemo(() => {\n    const pinnedAt = anchor.top - stickyHeaderHeight;\n    if (scrollAnimatedY == null || anchor.range <= 0) {\n      return 0;\n    }\n    return scrollAnimatedY.interpolate({\n      inputRange: [pinnedAt, pinnedAt + anchor.range],\n      outputRange: [0, anchor.range],\n      extrapolate: \"clamp\",\n    });\n  }, [scrollAnimatedY, anchor, stickyHeaderHeight]);\n\n  return {\n    containerRef,\n    onContainerLayout: remeasure,\n    onHeaderLayout,\n    onHeaderHeight,\n    pinTop: stickyHeaderHeight,\n    translateY,\n    rowsTop: options.isHeaderInContainer ? anchor.top + anchor.headerHeight : anchor.top,\n    headerHeight: anchor.headerHeight,\n  };\n}\n","import { useRef } from \"react\";\nimport {\n  ProgramGridGeometry_gapForMove,\n  ProgramGridGeometry_weekDropAt,\n} from \"../../../pages/planner/models/programGridGeometry\";\nimport { IGridDrags } from \"./useGridDrags\";\nimport { IGridDragSession, useGridDragSession } from \"./useGridDragSession\";\n\n// Dragging a week column — the one drag on the horizontal axis.\nexport function useGridWeekDrag(args: {\n  weekIndex: number;\n  weekCount: number;\n  columnWidth: number;\n  drags: IGridDrags;\n  onMoveWeek: (from: number, to: number) => void;\n}): IGridDragSession {\n  const { weekIndex, weekCount, columnWidth, drags } = args;\n  const { draggedWeek, dropWeekGap, ghostX, setActiveGhost } = drags;\n  const onMoveRef = useRef(args.onMoveWeek);\n  onMoveRef.current = args.onMoveWeek;\n\n  return useGridDragSession<number>({\n    axis: \"x\",\n    autoScroll: drags.autoScroll,\n    resolve: (translationX) => ProgramGridGeometry_weekDropAt(weekCount, weekIndex, translationX, columnWidth),\n    show: (to, translationX) => {\n      draggedWeek.value = to == null ? -1 : weekIndex;\n      dropWeekGap.value = to == null ? -1 : ProgramGridGeometry_gapForMove(weekIndex, to);\n      // The column snaps to `to`; the copy under the finger does not. A translation only — the\n      // ghost knows which column it is and where that column starts.\n      //\n      // Back to nothing when there is no target, which is how a drag ends. A ghost left translated\n      // is invisible but still laid out where it was dropped, and the grid's scroller keeps room\n      // for it — a sideways scroll into blank space that outlives the drag that made it.\n      ghostX.value = to == null ? 0 : translationX;\n    },\n    commit: (to) => {\n      if (to !== weekIndex) {\n        onMoveRef.current(weekIndex, to);\n      }\n    },\n    onActive: (active) => setActiveGhost(active ? { kind: \"week\", weeks: [weekIndex] } : undefined),\n  });\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function SetNumber(props: { setIndex: number; size?: \"md\" | \"sm\" }): JSX.Element {\n  const isSmall = props.size === \"sm\";\n  return (\n    <View\n      className={`items-center justify-center ${isSmall ? \"w-scaled-5 h-scaled-5\" : \"w-scaled-6 h-scaled-6\"} border rounded-full border-border-prominent`}\n    >\n      <Text className={`font-bold text-text-secondary ${isSmall ? \"text-xs\" : \"\"}`}>{props.setIndex + 1}</Text>\n    </View>\n  );\n}\n","import { PP_iterate2 } from \"../../../models/pp\";\nimport {\n  IProgramRewriteResult,\n  ProgramRewrite_instances,\n  ProgramRewrite_repeatWeeks,\n  ProgramRewrite_validate,\n} from \"../../../models/programRewrite\";\nimport { Dialog_alert } from \"../../../utils/dialog\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerState,\n  IPlannerUi,\n} from \"../../../pages/planner/models/types\";\nimport { PlannerKey_fromFullName } from \"../../../pages/planner/plannerKey\";\nimport { PlannerStructure_normalizeOrdersInDay } from \"../../../pages/planner/models/plannerStructure\";\nimport {\n  IPlannerProgram,\n  ISettings,\n  IDayData,\n  IExerciseType,\n  IDaySetData,\n  IPlannerProgramDay,\n  IShortDayData,\n} from \"../../../types\";\nimport { ObjectUtils_clone } from \"../../../utils/object\";\nimport { IExercise, Exercise_fullName, Exercise_get } from \"../../../models/exercise\";\nimport {\n  IEvaluatedProgram,\n  Program_evaluateCachedPlanner,\n  Program_create,\n  Program_getFirstProgramExercise,\n} from \"../../../models/program\";\nimport { ProgramToPlanner } from \"../../../models/programToPlanner\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { UidFactory_generateUid } from \"../../../utils/generator\";\n\nfunction plannerOrAlert(result: IProgramRewriteResult, oldPlanner: IPlannerProgram): IPlannerProgram {\n  if (\"error\" in result) {\n    Dialog_alert(result.error.message);\n    return oldPlanner;\n  }\n  return result.planner;\n}\n\nexport function EditProgramUiHelpers_validate(\n  shouldValidate: boolean,\n  oldPlanner: IPlannerProgram,\n  newPlanner: IPlannerProgram,\n  settings: ISettings\n): IPlannerProgram {\n  if (!shouldValidate) {\n    return newPlanner;\n  }\n  const error = ProgramRewrite_validate(newPlanner, settings);\n  return plannerOrAlert(error != null ? { error } : { planner: newPlanner }, oldPlanner);\n}\n\nexport function EditProgramUiHelpers_onDaysChange(\n  plannerDispatch: ILensDispatch<IPlannerState>,\n  ui: IPlannerUi,\n  weekIndex: number,\n  days: IPlannerProgramDay[],\n  cb: (order: boolean[]) => void\n): void {\n  const lbUi = lb<IPlannerState>().p(\"ui\");\n  const collapsedOrder = days.map((d, i) => {\n    return ui.dayUi.collapsed.has(`${weekIndex}-${i}`);\n  });\n  cb(collapsedOrder);\n  plannerDispatch(\n    [\n      lbUi\n        .p(\"dayUi\")\n        .p(\"collapsed\")\n        .recordModify((collapsed) => {\n          const newCollapsed = new Set<string>(collapsed);\n          for (let i = 0; i < collapsedOrder.length; i++) {\n            if (collapsedOrder[i]) {\n              newCollapsed.add(`${weekIndex}-${i}`);\n            } else {\n              newCollapsed.delete(`${weekIndex}-${i}`);\n            }\n          }\n          return newCollapsed;\n        }),\n    ],\n    \"Toggle week collapse state\"\n  );\n}\n\nexport function EditProgramUiHelpers_changeSets(\n  planner: IPlannerProgram,\n  key: string,\n  daySets: IDaySetData[],\n  settings: ISettings,\n  cb: (set: IPlannerProgramExerciseEvaluatedSet) => void\n): IPlannerProgram {\n  const result = ProgramRewrite_instances(planner, settings, (evaluated) => {\n    PP_iterate2(evaluated.weeks, (e, weekIndex, dayInWeekIndex) => {\n      if (e.key !== key) {\n        return;\n      }\n      for (const daySet of daySets) {\n        if (daySet.week === weekIndex + 1 && daySet.dayInWeek === dayInWeekIndex + 1) {\n          for (let setVariationIndex = 0; setVariationIndex < e.evaluatedSetVariations.length; setVariationIndex++) {\n            if (daySet.setVariation === setVariationIndex + 1) {\n              const sets = e.evaluatedSetVariations[setVariationIndex].sets;\n              for (let setIndex = 0; setIndex < sets.length; setIndex++) {\n                if (daySet.set === setIndex + 1) {\n                  cb(sets[setIndex]);\n                }\n              }\n            }\n          }\n        }\n      }\n    });\n  });\n  return plannerOrAlert(result, planner);\n}\n\nexport function EditProgramUiHelpers_changeCurrentInstance3(\n  planner: IPlannerProgram,\n  fullName: string,\n  dayData: IShortDayData,\n  isRepeat: boolean,\n  settings: ISettings,\n  shouldValidate: boolean,\n  cb: (exercise: IPlannerProgramExercise) => void\n): IPlannerProgram {\n  const result = ProgramRewrite_instances(\n    planner,\n    settings,\n    (evaluated) => {\n      const weeks = EditProgramUiHelpers_getWeeks2(evaluated, dayData, fullName, isRepeat);\n      for (const week of weeks) {\n        PP_iterate2(evaluated.weeks, (e, weekIndex, dayInWeekIndex) => {\n          const current = week === weekIndex + 1 && dayData.dayInWeek === dayInWeekIndex + 1 && e.fullName === fullName;\n          if (current) {\n            cb(e);\n          }\n        });\n      }\n    },\n    { validate: shouldValidate }\n  );\n  return plannerOrAlert(result, planner);\n}\n\nexport function EditProgramUiHelpers_getWeeks2(\n  evaluatedProgram: IEvaluatedProgram,\n  dayData: IShortDayData,\n  fullName: string,\n  ignoreRepeats: boolean = false\n): number[] {\n  return ProgramRewrite_repeatWeeks(evaluatedProgram, dayData, fullName, ignoreRepeats);\n}\n\n// A label the copy can carry without landing on top of something already in the day. The caller's is\n// kept when it already distinguishes them — which is what a typed label is for — and otherwise three\n// random letters, the same way a rename picks a fresh suffix when the name it wanted is taken.\nfunction uniqueDuplicateLabel(\n  evaluatedProgram: IEvaluatedProgram,\n  dayData: Required<IDayData>,\n  newExerciseType: IExerciseType | string,\n  label: string | undefined,\n  settings: ISettings\n): string | undefined {\n  const day = evaluatedProgram.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1];\n  const takenKeys = new Set((day?.exercises ?? []).map((e) => e.key));\n  const keyFor = (candidate: string | undefined): string => {\n    const candidateFullName =\n      typeof newExerciseType === \"string\"\n        ? `${candidate ? `${candidate}: ` : \"\"}${newExerciseType}`\n        : Exercise_fullName(Exercise_get(newExerciseType, settings.exercises), settings, candidate);\n    return PlannerKey_fromFullName(candidateFullName, settings.exercises);\n  };\n  if (!takenKeys.has(keyFor(label))) {\n    return label;\n  }\n  for (let attempt = 0; attempt < 20; attempt += 1) {\n    const candidate = UidFactory_generateUid(3);\n    if (!takenKeys.has(keyFor(candidate))) {\n      return candidate;\n    }\n  }\n  return UidFactory_generateUid(3);\n}\n\nexport function EditProgramUiHelpers_duplicateCurrentInstance(\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  fullName: string,\n  label: string | undefined,\n  newExerciseType: IExerciseType | string,\n  settings: ISettings\n): IPlannerProgram {\n  const evaluatedProgram = ObjectUtils_clone(\n    Program_evaluateCachedPlanner({ ...Program_create(\"Temp\"), planner }, settings)\n  );\n  const weeks = EditProgramUiHelpers_getWeeks2(evaluatedProgram, dayData, fullName);\n  // A copy that keeps its source's label isn't a copy: the label is part of the key, so both lines\n  // would resolve to one exercise and the duplicate would silently merge into the original. When the\n  // caller hasn't supplied a label that distinguishes them, one gets minted — three random letters,\n  // the same way a rename picks a fresh suffix (plannerProgram.ts :143).\n  //\n  // Resolved once rather than per week, because the copy has to be the *same* exercise in every week\n  // this repeats into; a label per week would scatter it into one exercise per week.\n  const resolvedLabel = uniqueDuplicateLabel(evaluatedProgram, dayData, newExerciseType, label, settings);\n\n  const add = [];\n  for (const week of weeks) {\n    const targetDay = evaluatedProgram.weeks[week - 1]?.days[dayData.dayInWeek - 1];\n\n    let newFullName: string | undefined;\n    const index = targetDay.exercises.findIndex((e) => e.fullName === fullName);\n    const previousExercise = targetDay.exercises[index];\n    if (index !== -1 && previousExercise) {\n      let exercise: IExercise | undefined;\n      if (typeof newExerciseType === \"string\") {\n        newFullName = `${resolvedLabel ? `${resolvedLabel}: ` : \"\"}${newExerciseType}`;\n      } else {\n        exercise = Exercise_get(newExerciseType, settings.exercises);\n        newFullName = Exercise_fullName(exercise, settings, resolvedLabel);\n      }\n      const newExercise: IPlannerProgramExercise = {\n        ...ObjectUtils_clone(previousExercise),\n        label: resolvedLabel ?? previousExercise.label,\n        fullName: newFullName,\n        shortName: newFullName,\n        notused: typeof newExerciseType === \"string\" ? true : previousExercise.notused,\n        key: PlannerKey_fromFullName(newFullName, settings.exercises),\n        exerciseType: typeof newExerciseType === \"string\" ? undefined : newExerciseType,\n        name: exercise ? exercise.name : typeof newExerciseType === \"string\" ? newExerciseType : \"\",\n      };\n      targetDay.exercises.splice(index + 1, 0, newExercise);\n    }\n    if (newFullName != null && index !== -1) {\n      add.push({ dayData: { ...dayData, week }, fullName: newFullName, index: index + 1 });\n    }\n  }\n  if (add.length > 0) {\n    return new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ add });\n  } else {\n    return planner;\n  }\n}\n\nexport function EditProgramUiHelpers_deleteCurrentInstance(\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  fullName: string,\n  settings: ISettings,\n  shouldValidate: boolean,\n  allowDeleteEverywhere: boolean\n): IPlannerProgram {\n  const evaluatedProgram = ObjectUtils_clone(\n    Program_evaluateCachedPlanner({ ...Program_create(\"Temp\"), planner }, settings)\n  );\n  const weeks = EditProgramUiHelpers_getWeeks2(evaluatedProgram, dayData, fullName);\n\n  for (const week of weeks) {\n    const targetDay = evaluatedProgram.weeks[week - 1]?.days[dayData.dayInWeek - 1];\n\n    if (targetDay) {\n      const index = targetDay.exercises.findIndex((e) => e.fullName === fullName);\n      if (index !== -1) {\n        targetDay.exercises.splice(index, 1);\n      }\n    }\n  }\n\n  const newPlanner = EditProgramUiHelpers_validate(\n    shouldValidate,\n    planner,\n    new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner(),\n    settings\n  );\n  if (!allowDeleteEverywhere) {\n    const newEvaluatedProgram = Program_evaluateCachedPlanner(\n      { ...Program_create(\"Temp\"), planner: newPlanner },\n      settings\n    );\n    const firstExercise = Program_getFirstProgramExercise(newEvaluatedProgram, fullName);\n    if (!firstExercise) {\n      Dialog_alert(\"You cannot delete this exercise from all days on the screen. Do it from the Program screen.\");\n      return planner;\n    }\n  }\n  return newPlanner;\n}\n\nexport function EditProgramUiHelpers_changeCurrentInstancePosition(\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  fullName: string,\n  fromIndex: number,\n  toIndex: number,\n  settings: ISettings\n): IPlannerProgram {\n  const evaluatedProgram = ObjectUtils_clone(\n    Program_evaluateCachedPlanner({ ...Program_create(\"Temp\"), planner }, settings)\n  );\n  const weeks = EditProgramUiHelpers_getWeeks2(evaluatedProgram, dayData, fullName);\n  const reorder = weeks.map((week) => ({ dayData: { ...dayData, week }, fromIndex, toIndex }));\n  // The reorder moves lines; a forced order outranks where a line sits, so without this the day\n  // would be rewritten and then drawn in exactly the order it was in before.\n  return PlannerStructure_normalizeOrdersInDay(\n    new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ reorder }),\n    dayData.dayInWeek - 1,\n    settings\n  );\n}\n\n// Matches by key (the exercise's identity), not fullName. They diverge only for exercise variations:\n// the key ignores the `!` current marker, so two instances of the same ladder can share a key while their\n// fullNames differ. Matching all same-key instances is what \"change all instances\" means — a fullName match\n// would silently skip the divergent ones (splitting a ladder on add/remove/reorder). For single-name\n// exercises the two are equivalent, since the name can't diverge across instances.\nexport function EditProgramUiHelpers_changeAllInstances(\n  planner: IPlannerProgram,\n  key: string,\n  settings: ISettings,\n  shouldValidate: boolean,\n  cb: (exercise: IPlannerProgramExercise) => void\n): IPlannerProgram {\n  const result = ProgramRewrite_instances(\n    planner,\n    settings,\n    (evaluated) => {\n      PP_iterate2(evaluated.weeks, (e) => {\n        if (e.key === key) {\n          cb(e);\n        }\n      });\n    },\n    { validate: shouldValidate }\n  );\n  return plannerOrAlert(result, planner);\n}\n","import { JSX, memo } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IPlannerState, IPlannerUi } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb, LensBuilder } from \"lens-shmens\";\nimport { IDayData, IPlannerProgramDay, IPlannerProgramWeek, ISettings } from \"../../types\";\nimport { IconMusclesD } from \"../icons/iconMusclesD\";\nimport { IconArrowRight } from \"../icons/iconArrowRight\";\nimport { IconArrowDown2 } from \"../icons/iconArrowDown2\";\nimport { MarkdownEditorBorderless } from \"../markdownEditorBorderless\";\nimport { StringUtils_pluralize } from \"../../utils/string\";\nimport { IconTimerSmall } from \"../icons/iconTimerSmall\";\nimport { TimeUtils_formatHOrMin } from \"../../utils/time\";\nimport { PlannerStatsUtils_dayApproxTimeMs } from \"../../pages/planner/models/plannerStatsUtils\";\nimport { EditProgramUiExerciseView } from \"./editProgramUiExercise\";\nimport { pickerStateFromPlannerExercise } from \"./editProgramUtils\";\nimport { LinkButton } from \"../linkButton\";\nimport { EditProgramV2TextExercises } from \"./editProgramV2TextExercises\";\nimport { IPlannerEvalResult } from \"../../pages/planner/plannerExerciseEvaluator\";\nimport { Button } from \"../button\";\nimport { IconPlus2 } from \"../icons/iconPlus2\";\nimport { ContentGrowingTextarea } from \"../contentGrowingTextarea\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport { useProgressiveItems } from \"../../utils/useProgressiveItems\";\nimport { navigateToModal } from \"../../navigation/navigationService\";\n\ninterface IEditProgramDayViewProps {\n  state: IPlannerState;\n  day: IPlannerProgramDay;\n  dayData: Required<IDayData>;\n  isValidProgram: boolean;\n  evaluatedProgram: IEvaluatedProgram;\n  evaluatedDay: IPlannerEvalResult;\n  lbPlannerWeek: LensBuilder<IPlannerState, IPlannerProgramWeek, {}, undefined>;\n  weekIndex: number;\n  dayInWeekIndex: number;\n  settings: ISettings;\n  exerciseFullNames: string[];\n  programId: string;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\nexport const EditProgramUiDayView = memo(function EditProgramUiDayView(props: IEditProgramDayViewProps): JSX.Element {\n  const lbPlannerDay = props.lbPlannerWeek.p(\"days\").i(props.dayInWeekIndex);\n  const ui = props.state.ui;\n  const isCollapsed = ui.dayUi.collapsed.has(`${props.weekIndex}-${props.dayInWeekIndex}`);\n\n  return (\n    <View\n      key={props.day.id}\n      className=\"p-1 my-1 border bg-background-default rounded-2xl border-border-neutral\"\n      data-testid={`edit-day-${props.weekIndex + 1}-${props.dayInWeekIndex + 1}`}\n      testID={`edit-day-${props.weekIndex + 1}-${props.dayInWeekIndex + 1}`}\n    >\n      <View className=\"flex-row items-center\">\n        <View className=\"flex-1 pl-2\">\n          <ContentGrowingTextarea\n            className=\"text-base font-bold\"\n            value={props.day.name}\n            onInput={(newValue) => {\n              if (newValue) {\n                props.plannerDispatch(lbPlannerDay.p(\"name\").record(newValue), \"Update day name\");\n              }\n            }}\n          />\n        </View>\n        <View className=\"flex-row items-center\">\n          <View>\n            <Pressable\n              data-testid=\"edit-day-muscles-d\"\n              testID=\"edit-day-muscles-d\"\n              className=\"px-2 nm-day-muscles-d\"\n              onPress={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>().p(\"ui\").p(\"showDayStats\").record(props.dayInWeekIndex),\n                  \"Show day stats\"\n                );\n                navigateToModal(\"dayStatsModal\", { programId: props.programId });\n              }}\n            >\n              <IconMusclesD size={20} />\n            </Pressable>\n          </View>\n          <View>\n            <Pressable\n              className=\"w-scaled-8 pl-1 pr-2 items-center nm-edit-day-expand-collapse-day\"\n              onPress={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>()\n                    .p(\"ui\")\n                    .p(\"dayUi\")\n                    .p(\"collapsed\")\n                    .recordModify((collapsed) => {\n                      const newCollapsed = new Set(Array.from(collapsed));\n                      const key = `${props.weekIndex}-${props.dayInWeekIndex}`;\n                      if (newCollapsed.has(key)) {\n                        newCollapsed.delete(key);\n                      } else {\n                        newCollapsed.add(key);\n                      }\n                      return newCollapsed;\n                    }),\n                  \"Toggle day collapse\"\n                );\n              }}\n            >\n              {isCollapsed ? <IconArrowRight /> : <IconArrowDown2 />}\n            </Pressable>\n          </View>\n        </View>\n      </View>\n      {!isCollapsed && (\n        <EditProgramUiDayContentView\n          evaluatedProgram={props.evaluatedProgram}\n          isValidProgram={props.isValidProgram}\n          day={props.day}\n          dispatch={props.dispatch}\n          programId={props.programId}\n          settings={props.settings}\n          ui={ui}\n          dayData={props.dayData}\n          exerciseFullNames={props.exerciseFullNames}\n          plannerDispatch={props.plannerDispatch}\n          lbPlannerDay={lbPlannerDay}\n          evaluatedDay={props.evaluatedDay}\n          weekIndex={props.weekIndex}\n          dayIndex={props.dayInWeekIndex}\n        />\n      )}\n    </View>\n  );\n});\n\ninterface IEditProgramDayContentViewProps {\n  day: IPlannerProgramDay;\n  dispatch: IDispatch;\n  programId: string;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  evaluatedProgram: IEvaluatedProgram;\n  lbPlannerDay: LensBuilder<IPlannerState, IPlannerProgramDay, {}, undefined>;\n  ui: IPlannerUi;\n  isValidProgram: boolean;\n  dayData: Required<IDayData>;\n  weekIndex: number;\n  exerciseFullNames: string[];\n  dayIndex: number;\n  settings: ISettings;\n  evaluatedDay: IPlannerEvalResult;\n}\n\nconst EditProgramUiDayContentView = memo(function EditProgramUiDayContentView(\n  props: IEditProgramDayContentViewProps\n): JSX.Element {\n  const { evaluatedDay } = props;\n  const duration = TimeUtils_formatHOrMin(\n    PlannerStatsUtils_dayApproxTimeMs(\n      evaluatedDay.success ? evaluatedDay.data : [],\n      props.settings.timers.workout || 0,\n      props.settings\n    )\n  );\n  const { weekIndex, dayIndex } = props;\n  const lbPlanner = lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\");\n  const allExercisesCollapsed = evaluatedDay.success\n    ? evaluatedDay.data.every((e) => {\n        return props.ui.exerciseUi.collapsed.has(`${e.key}-${props.weekIndex}-${props.dayIndex}`);\n      })\n    : false;\n  const usedExercises = evaluatedDay.success ? evaluatedDay.data.filter((d) => !d.notused) : [];\n  const notUsedExercises = evaluatedDay.success ? evaluatedDay.data.filter((d) => d.notused) : [];\n  const visibleUsedExercises = useProgressiveItems(usedExercises, {\n    initialBatch: 3,\n    batchSize: 10,\n    debugLabel: `Edit/day-${props.weekIndex}-${props.dayIndex}-exercises`,\n    resetKey: `${weekIndex}-${dayIndex}`,\n  });\n  return (\n    <View className=\"px-1\">\n      <View className=\"px-1\">\n        <MarkdownEditorBorderless\n          value={props.day.description}\n          placeholder={`Day description in Markdown...`}\n          debounceMs={500}\n          onChange={(v) => {\n            props.plannerDispatch(props.lbPlannerDay.p(\"description\").record(v), \"Update day description\");\n          }}\n        />\n      </View>\n      <View className=\"flex-row items-center gap-2 pt-1 pl-2\">\n        {evaluatedDay.success && (\n          <View>\n            <Text className=\"text-xs\">\n              {evaluatedDay.data.length} {StringUtils_pluralize(\"exercise\", evaluatedDay.data.length)}\n            </Text>\n          </View>\n        )}\n        <View className=\"flex-row items-center py-1\">\n          <View>\n            <IconTimerSmall />\n          </View>\n          <View>\n            <Text className=\"text-xs\">\n              {duration.value} {duration.unit}\n            </Text>\n          </View>\n        </View>\n        {props.ui.mode === \"ui\" && evaluatedDay.success && (\n          <View className=\"ml-auto mr-2\">\n            <LinkButton\n              name=\"collapse-all-exercises\"\n              className=\"text-xs font-normal\"\n              onClick={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>()\n                    .p(\"ui\")\n                    .p(\"exerciseUi\")\n                    .p(\"collapsed\")\n                    .recordModify((collapsed) => {\n                      const newCollapsed = new Set<string>(collapsed);\n                      const exercises = evaluatedDay.data;\n                      for (const exercise of exercises) {\n                        const key = `${exercise.key}-${props.weekIndex}-${props.dayIndex}`;\n                        if (allExercisesCollapsed) {\n                          newCollapsed.delete(key);\n                        } else {\n                          newCollapsed.add(key);\n                        }\n                      }\n                      return newCollapsed;\n                    }),\n                  \"Toggle all exercises\"\n                );\n              }}\n            >\n              {allExercisesCollapsed ? \"Expand\" : \"Collapse\"} all exercises\n            </LinkButton>\n          </View>\n        )}\n      </View>\n      <View className=\"pt-2\">\n        {props.ui.mode === \"ui\" && props.isValidProgram && evaluatedDay.success ? (\n          <View>\n            {visibleUsedExercises.map((exercise, exerciseIndex) => {\n              const exCollapseKey = `${exercise.key}-${exercise.dayData.week - 1}-${exercise.dayData.dayInWeek - 1}`;\n              return (\n                <EditProgramUiExerciseView\n                  key={exercise.fullName || exerciseIndex}\n                  isCollapsed={props.ui.exerciseUi.collapsed.has(exCollapseKey)}\n                  plannerExercise={exercise}\n                  evaluatedProgram={props.evaluatedProgram}\n                  dispatch={props.dispatch}\n                  programId={props.programId}\n                  plannerDispatch={props.plannerDispatch}\n                  weekIndex={props.weekIndex}\n                  dayIndex={props.dayIndex}\n                  exerciseIndex={exerciseIndex}\n                  settings={props.settings}\n                  showNumber={true}\n                />\n              );\n            })}\n            {notUsedExercises.map((exercise, exerciseIndex) => {\n              const exCollapseKey = `${exercise.key}-${exercise.dayData.week - 1}-${exercise.dayData.dayInWeek - 1}`;\n              return (\n                <EditProgramUiExerciseView\n                  key={exercise.key || exerciseIndex}\n                  isCollapsed={props.ui.exerciseUi.collapsed.has(exCollapseKey)}\n                  plannerExercise={exercise}\n                  evaluatedProgram={props.evaluatedProgram}\n                  dispatch={props.dispatch}\n                  programId={props.programId}\n                  plannerDispatch={props.plannerDispatch}\n                  weekIndex={props.weekIndex}\n                  dayIndex={props.dayIndex}\n                  exerciseIndex={exerciseIndex}\n                  settings={props.settings}\n                />\n              );\n            })}\n            <View className=\"py-1\">\n              <Button\n                kind=\"lightgrayv3\"\n                buttonSize=\"md\"\n                data-testid=\"add-exercise\"\n                testID=\"add-exercise\"\n                name=\"add-exercise\"\n                className=\"flex-row items-center justify-center w-full\"\n                onClick={() => {\n                  props.plannerDispatch(\n                    lb<IPlannerState>()\n                      .p(\"ui\")\n                      .p(\"exercisePicker\")\n                      .record({\n                        dayData: {\n                          week: weekIndex + 1,\n                          dayInWeek: dayIndex + 1,\n                        },\n                        change: \"all\",\n                        state: pickerStateFromPlannerExercise(props.settings),\n                      }),\n                    \"Open add exercise picker\"\n                  );\n                }}\n              >\n                <IconPlus2 size={12} />\n                <Text className=\"ml-2 text-sm text-text-link font-semibold\">Add Exercise</Text>\n              </Button>\n            </View>\n          </View>\n        ) : (\n          <View className=\"flex-row\">\n            <EditProgramV2TextExercises\n              weekIndex={weekIndex}\n              dayIndex={dayIndex}\n              plannerDay={props.day}\n              exerciseFullNames={props.exerciseFullNames}\n              plannerDispatch={props.plannerDispatch}\n              lbProgram={lbPlanner}\n              evaluatedDay={evaluatedDay}\n              settings={props.settings}\n              ui={props.ui}\n              evaluatedProgram={props.evaluatedProgram}\n              dayData={props.dayData}\n            />\n          </View>\n        )}\n      </View>\n    </View>\n  );\n});\n","import { JSX, memo } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { PerfTracker_recordEvent, PerfTracker_getSessionId } from \"../../utils/perfTracker\";\nimport { PerfEnabled_tier2 } from \"../../utils/perfEnabled\";\nimport { PerfProfiler } from \"../../utils/perfProfiler\";\nimport { Text } from \"../primitives/text\";\nimport { FastText } from \"../primitives/fastText\";\nimport { StyledText, StyledText_cls } from \"../../utils/styledText\";\nimport { useRem } from \"../../utils/useRem\";\nimport { IPlannerProgramExercise, IPlannerState } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { ISettings } from \"../../types\";\nimport { SetNumber } from \"./editProgramSets\";\nimport { IconArrowRight } from \"../icons/iconArrowRight\";\nimport { IconArrowDown2 } from \"../icons/iconArrowDown2\";\nimport { ExerciseImage } from \"../exerciseImage\";\nimport { equipmentName, IExercise, Exercise_findByName, Exercise_get, Exercise_fullName } from \"../../models/exercise\";\nimport { IconEdit2 } from \"../icons/iconEdit2\";\nimport { lb } from \"lens-shmens\";\nimport {\n  PlannerProgramExercise_repeatToRangeStr,\n  PlannerProgramExercise_warmups,\n  PlannerProgramExercise_defaultWarmups,\n  PlannerProgramExercise_warmupSetsToDisplaySets,\n  PlannerProgramExercise_currentExerciseVariationIndex,\n} from \"../../pages/planner/models/plannerProgramExercise\";\nimport { HistoryRecordSet } from \"../historyRecordSets\";\nimport { IconDuplicate2 } from \"../icons/iconDuplicate2\";\nimport { IconTrash } from \"../icons/iconTrash\";\nimport { EditProgramUiHelpers_deleteCurrentInstance } from \"./editProgramUi/editProgramUiHelpers\";\nimport { IconGraphsE } from \"../icons/iconGraphsE\";\nimport { IconSwap } from \"../icons/iconSwap\";\nimport { Thunk_pushToEditProgramExercise } from \"../../ducks/thunks\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { EditProgramUiProgress } from \"./editProgramUiProgress\";\nimport {\n  IEvaluatedProgram,\n  Program_getNumberOfExerciseInstances,\n  Program_getSupersetExercises,\n} from \"../../models/program\";\nimport { EditProgramUiUpdate } from \"./editProgramUiUpdate\";\nimport { EditProgramUiExerciseSetVariations } from \"./editProgramUiExerciseSetVariations\";\nimport { EditProgramUiExerciseDescriptions } from \"./editProgramUiExerciseDescriptions\";\nimport { pickerStateFromPlannerExercise } from \"./editProgramUtils\";\nimport { navigateToModal } from \"../../navigation/navigationService\";\n\nfunction onExerciseProfile(\n  id: string,\n  phase: \"mount\" | \"update\" | \"nested-update\",\n  actualDuration: number,\n  baseDuration: number\n): void {\n  if (!PerfEnabled_tier2()) {\n    return;\n  }\n  if (actualDuration < 1) {\n    return;\n  }\n  PerfTracker_recordEvent({\n    type: \"profile\",\n    session: PerfTracker_getSessionId(),\n    id,\n    phase,\n    actual_ms: actualDuration,\n    base_ms: baseDuration,\n    ts: Date.now(),\n  });\n}\n\ninterface IEditProgramUiExerciseViewProps {\n  evaluatedProgram: IEvaluatedProgram;\n  plannerExercise: IPlannerProgramExercise;\n  isCollapsed: boolean;\n  exerciseIndex: number;\n  weekIndex: number;\n  dayIndex: number;\n  settings: ISettings;\n  programId: string;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  showNumber?: boolean;\n}\n\nexport const EditProgramUiExerciseView = memo(function EditProgramUiExerciseView(\n  props: IEditProgramUiExerciseViewProps\n): JSX.Element {\n  const { weekIndex, dayIndex, exerciseIndex, isCollapsed } = props;\n  const exercise = Exercise_findByName(props.plannerExercise.name, props.settings.exercises);\n\n  const repeatStr = PlannerProgramExercise_repeatToRangeStr(props.plannerExercise);\n  const order = props.plannerExercise.order !== 0 ? props.plannerExercise.order : undefined;\n  const orderAndRepeat = [order, repeatStr].filter((s) => s).join(\", \");\n\n  return (\n    <PerfProfiler id=\"ExerciseView\" onRender={onExerciseProfile}>\n      <View\n        data-testid={`exercise-${props.plannerExercise.key}`}\n        testID={`exercise-${props.plannerExercise.key}`}\n        className=\"my-1 overflow-hidden border bg-background-cardpurple rounded-xl border-border-cardpurple\"\n      >\n        <View className=\"flex-row items-center\">\n          {props.showNumber ? (\n            <View className=\"mx-2\">\n              <SetNumber size=\"sm\" setIndex={props.exerciseIndex} />\n            </View>\n          ) : (\n            <View className=\"w-scaled-9\" />\n          )}\n          <View\n            className=\"flex-row items-center flex-1\"\n            data-testid=\"planner-ui-exercise-name\"\n            testID=\"planner-ui-exercise-name\"\n          >\n            <View className=\"flex-1 leading-tight\">\n              <ExerciseNameLine\n                label={props.plannerExercise.label}\n                name={props.plannerExercise.name}\n                equipment={\n                  props.plannerExercise.equipment != null &&\n                  props.plannerExercise.equipment !== exercise?.defaultEquipment\n                    ? equipmentName(props.plannerExercise.equipment)\n                    : undefined\n                }\n                orderAndRepeat={orderAndRepeat || undefined}\n              />\n              <ExerciseVariationsLine plannerExercise={props.plannerExercise} settings={props.settings} />\n            </View>\n            {props.plannerExercise.notused && (\n              <View className=\"px-1 ml-3 rounded bg-background-darkgray\">\n                <Text className=\"text-xs font-bold text-text-alwayswhite\">UNUSED</Text>\n              </View>\n            )}\n            <Pressable\n              className=\"p-2\"\n              data-testid=\"edit-exercise-swap\"\n              testID=\"edit-exercise-swap\"\n              onPress={() => {\n                const numberOfExerciseInstances = Program_getNumberOfExerciseInstances(\n                  props.evaluatedProgram,\n                  props.plannerExercise.key\n                );\n                if (numberOfExerciseInstances > 1) {\n                  props.plannerDispatch(\n                    lb<IPlannerState>().p(\"ui\").p(\"editExerciseModal\").record({\n                      plannerExercise: props.plannerExercise,\n                    }),\n                    \"Open edit exercise modal\"\n                  );\n                  navigateToModal(\"editExerciseChangeModal\", { programId: props.programId });\n                } else {\n                  props.plannerDispatch(\n                    lb<IPlannerState>()\n                      .p(\"ui\")\n                      .p(\"exercisePicker\")\n                      .record({\n                        dayData: {\n                          week: props.plannerExercise.dayData.week,\n                          dayInWeek: props.plannerExercise.dayData.dayInWeek,\n                        },\n                        state: pickerStateFromPlannerExercise(props.settings, props.plannerExercise),\n                        exerciseKey: props.plannerExercise.key,\n                        change: \"one\",\n                      }),\n                    \"Open exercise picker modal\"\n                  );\n                }\n              }}\n            >\n              <IconSwap size={12} />\n            </Pressable>\n          </View>\n          <View>\n            <Pressable\n              className=\"p-2\"\n              data-testid=\"show-exercise-stats\"\n              testID=\"show-exercise-stats\"\n              onPress={() => {\n                props.plannerDispatch(\n                  [\n                    lb<IPlannerState>().p(\"ui\").p(\"focusedExercise\").record({\n                      weekIndex,\n                      dayIndex,\n                      exerciseLine: props.plannerExercise.line,\n                    }),\n                    lb<IPlannerState>().p(\"ui\").p(\"showExerciseStats\").record(true),\n                  ],\n                  \"Show exercise stats\"\n                );\n                navigateToModal(\"exerciseStatsModal\", { programId: props.programId });\n              }}\n            >\n              <IconGraphsE width={16} height={19} />\n            </Pressable>\n          </View>\n          <View className=\"py-4 border-l bg-background-default border-border-cardpurple\">\n            <Pressable\n              className=\"items-center w-scaled-10 px-2 nm-edit-exercise-expand-collapse\"\n              onPress={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>()\n                    .p(\"ui\")\n                    .p(\"exerciseUi\")\n                    .p(\"collapsed\")\n                    .recordModify((collapsed) => {\n                      const newCollapsed = new Set(Array.from(collapsed));\n                      const exKey = `${props.plannerExercise.key}-${props.plannerExercise.dayData.week - 1}-${props.plannerExercise.dayData.dayInWeek - 1}`;\n                      if (newCollapsed.has(exKey)) {\n                        newCollapsed.delete(exKey);\n                      } else {\n                        newCollapsed.add(exKey);\n                      }\n                      return newCollapsed;\n                    }),\n                  \"Toggle exercise collapse\"\n                );\n              }}\n            >\n              {isCollapsed ? <IconArrowRight /> : <IconArrowDown2 />}\n            </Pressable>\n          </View>\n        </View>\n        {!isCollapsed && (\n          <PerfProfiler id=\"ExerciseView.content\" onRender={onExerciseProfile}>\n            <EditProgramUiExerciseContentView\n              weekIndex={weekIndex}\n              dayIndex={dayIndex}\n              evaluatedProgram={props.evaluatedProgram}\n              exerciseIndex={exerciseIndex}\n              exercise={exercise}\n              plannerExercise={props.plannerExercise}\n              settings={props.settings}\n              dispatch={props.dispatch}\n              plannerDispatch={props.plannerDispatch}\n            />\n          </PerfProfiler>\n        )}\n      </View>\n    </PerfProfiler>\n  );\n});\n\ninterface IEditProgramUiExerciseContentViewProps {\n  exercise?: IExercise;\n  evaluatedProgram: IEvaluatedProgram;\n  exerciseIndex: number;\n  weekIndex: number;\n  dayIndex: number;\n  plannerExercise: IPlannerProgramExercise;\n  settings: ISettings;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\nexport const EditProgramUiExerciseContentView = memo(function EditProgramUiExerciseContentView(\n  props: IEditProgramUiExerciseContentViewProps\n): JSX.Element {\n  const plannerExercise = props.plannerExercise;\n  const exercise = props.exercise;\n  const exerciseType = exercise != null ? { id: exercise.id, equipment: props.plannerExercise.equipment } : undefined;\n  const warmupSets =\n    PlannerProgramExercise_warmups(plannerExercise) ||\n    (exercise != null ? PlannerProgramExercise_defaultWarmups(exercise, props.settings) : []);\n  const displayWarmupSets = PlannerProgramExercise_warmupSetsToDisplaySets(warmupSets);\n  const reusingSets = plannerExercise.reuse?.fullName;\n  const lbProgram = lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\");\n  const supersetGroup = props.plannerExercise.superset?.name;\n  const supersetExercises = Program_getSupersetExercises(props.evaluatedProgram, props.plannerExercise);\n\n  return (\n    <View>\n      <View className=\"flex-row border-t border-border-cardpurple\">\n        <View className=\"flex-1\">\n          {plannerExercise.descriptions.values.length > 0 && (\n            <View className=\"flex-row border-b border-border-cardpurple\">\n              <View className=\"flex-1 px-3 py-1\">\n                <EditProgramUiExerciseDescriptions plannerExercise={plannerExercise} settings={props.settings} />\n              </View>\n            </View>\n          )}\n          <View className=\"flex-row\">\n            {exerciseType ? (\n              <View className=\"p-1\">\n                <View className=\"p-1 m-1 rounded-lg bg-background-image\">\n                  <ExerciseImage\n                    settings={props.settings}\n                    className=\"w-scaled-10\"\n                    exerciseType={exerciseType}\n                    size=\"small\"\n                  />\n                </View>\n              </View>\n            ) : (\n              <View className=\"w-2\" />\n            )}\n            <View className=\"flex-1\">\n              <View>\n                <View className=\"flex-row items-start my-2\">\n                  {displayWarmupSets.flat().length > 0 && (\n                    <>\n                      <View data-testid=\"ui-warmups-sets\" testID=\"ui-warmups-sets\">\n                        <Text className=\"pb-1 text-xs text-left text-text-secondary\">Warmups</Text>\n                        <View>\n                          <View>\n                            {displayWarmupSets.map((g, gi) => (\n                              <HistoryRecordSet key={gi} sets={g} isNext={true} units={props.settings.units} />\n                            ))}\n                          </View>\n                        </View>\n                      </View>\n                      <View className=\"self-stretch ml-4 mr-4 bg-border-neutral\" style={{ width: 1 }} />\n                    </>\n                  )}\n                  <View data-testid=\"ui-workout-sets\" testID=\"ui-workout-sets\">\n                    <Text className=\"pb-1 text-xs text-left text-text-secondary\">Workout</Text>\n                    {reusingSets && <Text className=\"pb-1 text-xs text-text-secondary\">Reusing {reusingSets}</Text>}\n                    <PerfProfiler id=\"ExerciseView.setVariations\" onRender={onExerciseProfile}>\n                      <EditProgramUiExerciseSetVariations plannerExercise={plannerExercise} settings={props.settings} />\n                    </PerfProfiler>\n                  </View>\n                </View>\n              </View>\n            </View>\n          </View>\n          {supersetGroup && (\n            <View className=\"px-3 pb-2\">\n              <SupersetLine group={supersetGroup} exerciseNames={supersetExercises.map((ex) => ex.name)} />\n            </View>\n          )}\n          <View className=\"px-3 pb-2\">\n            <PerfProfiler id=\"ExerciseView.progress\" onRender={onExerciseProfile}>\n              <EditProgramUiProgress evaluatedProgram={props.evaluatedProgram} exercise={props.plannerExercise} />\n            </PerfProfiler>\n          </View>\n          {props.plannerExercise.update && (\n            <View className=\"px-3 pb-2\">\n              <PerfProfiler id=\"ExerciseView.update\" onRender={onExerciseProfile}>\n                <EditProgramUiUpdate evaluatedProgram={props.evaluatedProgram} exercise={props.plannerExercise} />\n              </PerfProfiler>\n            </View>\n          )}\n        </View>\n        <View className=\"border-l bg-background-default border-border-cardpurple\">\n          <View className=\"items-center\">\n            <Pressable\n              className=\"p-2\"\n              data-testid=\"edit-exercise\"\n              testID=\"edit-exercise\"\n              onPress={() => {\n                props.dispatch(\n                  Thunk_pushToEditProgramExercise(props.plannerExercise.key, props.plannerExercise.dayData)\n                );\n              }}\n            >\n              <IconEdit2 />\n            </Pressable>\n          </View>\n          <View className=\"items-center\">\n            <Pressable\n              className=\"p-2\"\n              onPress={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>()\n                    .p(\"ui\")\n                    .p(\"exercisePicker\")\n                    .record({\n                      state: pickerStateFromPlannerExercise(props.settings, props.plannerExercise),\n                      dayData: props.plannerExercise.dayData,\n                      exerciseKey: props.plannerExercise.key,\n                      change: \"duplicate\",\n                    }),\n                  \"Open duplicate exercise modal\"\n                );\n              }}\n            >\n              <IconDuplicate2 />\n            </Pressable>\n          </View>\n          <View className=\"items-center\">\n            <Pressable\n              className=\"p-2\"\n              onPress={() => {\n                props.plannerDispatch(\n                  lbProgram.recordModify((program) => {\n                    return EditProgramUiHelpers_deleteCurrentInstance(\n                      program,\n                      plannerExercise.dayData,\n                      plannerExercise.fullName,\n                      props.settings,\n                      false,\n                      true\n                    );\n                  }),\n                  \"Delete exercise instance\"\n                );\n              }}\n            >\n              <IconTrash />\n            </Pressable>\n          </View>\n        </View>\n      </View>\n    </View>\n  );\n});\n\nfunction ExerciseNameLine(props: {\n  label?: string;\n  name: string;\n  equipment?: string;\n  orderAndRepeat?: string;\n}): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const builder = new StyledText();\n  if (props.label) {\n    builder.add(`${props.label}: `);\n  }\n  builder.add(props.name);\n  if (props.equipment) {\n    builder.add(`, ${props.equipment}`);\n  }\n  if (props.orderAndRepeat) {\n    builder.add(` [${props.orderAndRepeat}]`, cls(\"text-sm font-normal\"));\n  }\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-base font-bold text-text-primary\")} />;\n}\n\nfunction ExerciseVariationsLine(props: {\n  plannerExercise: IPlannerProgramExercise;\n  settings: ISettings;\n}): JSX.Element | null {\n  const variations = props.plannerExercise.exerciseVariations ?? [];\n  const cls = StyledText_cls(useRem());\n  if (variations.length <= 1) {\n    return null;\n  }\n  const currentIndex = PlannerProgramExercise_currentExerciseVariationIndex(props.plannerExercise);\n  const otherNames = variations\n    .filter((_, i) => i !== currentIndex)\n    .map((v) =>\n      v.exerciseType\n        ? Exercise_fullName(Exercise_get(v.exerciseType, props.settings.exercises), props.settings)\n        : v.name\n    );\n  const builder = new StyledText();\n  builder.add(\"Variations: \");\n  otherNames.forEach((name, i) => {\n    builder.add(i > 0 ? \", \" : \"\");\n    builder.add(name, cls(\"font-semibold\"));\n  });\n  const built = builder.build();\n  return (\n    <FastText\n      data-testid=\"exercise-variations-summary\"\n      testID=\"exercise-variations-summary\"\n      text={built.text}\n      fragments={built.fragments}\n      {...cls(\"text-xs text-text-secondary\")}\n    />\n  );\n}\n\nfunction SupersetLine(props: { group: string; exerciseNames: string[] }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const secondary = cls(\"text-text-secondary\");\n  const builder = new StyledText();\n  builder.add(\"Superset Group: \");\n  builder.add(props.group, cls(\"font-bold\"));\n  if (props.exerciseNames.length > 0) {\n    builder.add(\" (\", secondary);\n    props.exerciseNames.forEach((name, i) => {\n      builder.add(i > 0 ? \", \" : \"\", secondary);\n      builder.add(name, cls(\"font-bold text-text-secondary\"));\n    });\n    builder.add(\")\", secondary);\n  }\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-primary\")} />;\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { PlannerProgramExercise_currentDescriptionIndex } from \"../../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { IconArrowDown3 } from \"../icons/iconArrowDown3\";\nimport { ISettings } from \"../../types\";\nimport { Markdown } from \"../markdown\";\n\ninterface IEditProgramUiExerciseDescriptionsProps {\n  plannerExercise: IPlannerProgramExercise;\n  settings: ISettings;\n}\n\nexport function EditProgramUiExerciseDescriptions(props: IEditProgramUiExerciseDescriptionsProps): JSX.Element {\n  const { plannerExercise } = props;\n  const descriptions = plannerExercise.descriptions.values;\n  const currentIndex = PlannerProgramExercise_currentDescriptionIndex(plannerExercise);\n\n  if (descriptions.length === 0) {\n    return <></>;\n  }\n\n  return (\n    <>\n      {descriptions.map((_, i) => {\n        return (\n          <View key={i} className={`${i > 0 ? \"mt-2 pt-2\" : \"\"}`}>\n            <View>\n              {descriptions.length > 1 && (\n                <GroupHeader\n                  highlighted={true}\n                  name={`Description ${i + 1}`}\n                  nameAddOn={\n                    currentIndex === i ? (\n                      <View className=\"ml-2\" style={{ transform: [{ rotate: \"90deg\" }] }}>\n                        <IconArrowDown3 size={14} />\n                      </View>\n                    ) : undefined\n                  }\n                />\n              )}\n            </View>\n            <Markdown className=\"text-xs markdown\" truncate={2} value={plannerExercise.descriptions.values[i].value} />\n          </View>\n        );\n      })}\n    </>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport {\n  PlannerProgramExercise_setVariations,\n  PlannerProgramExercise_sets,\n  PlannerProgramExercise_setsToDisplaySets,\n} from \"../../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { HistoryRecordSet } from \"../historyRecordSets\";\nimport { IconArrowDown3 } from \"../icons/iconArrowDown3\";\nimport { ISettings } from \"../../types\";\n\ninterface IEditProgramUiExerciseSetVariationsProps {\n  isCurrentIndicatorNearby?: boolean;\n  plannerExercise: IPlannerProgramExercise;\n  settings: ISettings;\n}\n\nexport function EditProgramUiExerciseSetVariations(props: IEditProgramUiExerciseSetVariationsProps): JSX.Element {\n  const { plannerExercise } = props;\n  const setVariations = PlannerProgramExercise_setVariations(plannerExercise);\n  return (\n    <>\n      {setVariations.map((_, i) => {\n        const sets = PlannerProgramExercise_sets(plannerExercise, i);\n        const hasCurrentSets = !!plannerExercise.setVariations[i]?.sets;\n        const globals = plannerExercise.globals;\n        const displayGroups = PlannerProgramExercise_setsToDisplaySets(sets, hasCurrentSets, globals, props.settings);\n        let currentIndex = setVariations.findIndex((v) => v.isCurrent);\n        currentIndex = currentIndex === -1 ? 0 : currentIndex;\n        return (\n          <View key={i} className={`${i > 0 ? \"mt-2 pt-2 border-t border-border-neutral\" : \"\"}`}>\n            <View>\n              {setVariations.length > 1 && (\n                <GroupHeader\n                  highlighted={true}\n                  name={`Set Variation ${i + 1}`}\n                  nameAddOn={\n                    props.isCurrentIndicatorNearby && currentIndex === i ? (\n                      <View className=\"ml-2\" style={{ transform: [{ rotate: \"90deg\" }] }}>\n                        <IconArrowDown3 size={14} />\n                      </View>\n                    ) : undefined\n                  }\n                  rightAddOn={\n                    !props.isCurrentIndicatorNearby && currentIndex === i ? (\n                      <View className=\"ml-2\" style={{ transform: [{ rotate: \"90deg\" }] }}>\n                        <IconArrowDown3 size={14} />\n                      </View>\n                    ) : undefined\n                  }\n                />\n              )}\n            </View>\n            <View className=\"items-end\">\n              <View className=\"flex-row\">\n                <View>\n                  {displayGroups.map((g, gi) => (\n                    <HistoryRecordSet key={gi} sets={g} isNext={true} units={props.settings.units} />\n                  ))}\n                </View>\n              </View>\n            </View>\n          </View>\n        );\n      })}\n    </>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { FastText } from \"../primitives/fastText\";\nimport { StyledText, StyledText_cls } from \"../../utils/styledText\";\nimport { useRem } from \"../../utils/useRem\";\nimport { Weight_print } from \"../../models/weight\";\nimport {\n  PlannerProgramExercise_progressionType,\n  PlannerProgramExercise_getState,\n} from \"../../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { IEvaluatedProgram, Program_getReusingProgressExercises } from \"../../models/program\";\n\ninterface IEditProgramUiProgressProps {\n  evaluatedProgram: IEvaluatedProgram;\n  exercise: IPlannerProgramExercise;\n}\n\nexport function EditProgramUiProgress(props: IEditProgramUiProgressProps): JSX.Element | null {\n  let reusingLine: JSX.Element | null = null;\n  let reusedByLine: JSX.Element | null = null;\n  let progressExercise: IPlannerProgramExercise | undefined = undefined;\n  const { evaluatedProgram, exercise } = props;\n  if (exercise.progress?.reuse) {\n    progressExercise = exercise.progress.reuse.exercise ?? exercise.reuse?.exercise;\n    reusingLine = <ReusingLine fullName={exercise.progress.reuse?.fullName} />;\n  } else if (exercise.progress) {\n    progressExercise = exercise;\n    const reusingProgressExercises = Program_getReusingProgressExercises(evaluatedProgram, exercise);\n    if (reusingProgressExercises.length > 0) {\n      reusedByLine = <ReusedByLine names={reusingProgressExercises.map((e) => e.fullName)} />;\n    }\n  }\n\n  if (progressExercise == null) {\n    return null;\n  }\n  return (\n    <View>\n      <View>{reusingLine}</View>\n      <Progression progressExercise={progressExercise} originalExercise={props.exercise} />\n      <View>{reusedByLine}</View>\n    </View>\n  );\n}\n\nfunction ReusingLine(props: { fullName?: string }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const builder = new StyledText();\n  builder.add(\"Reusing progress of '\", cls(\"text-xs\"));\n  builder.add(props.fullName, cls(\"text-xs font-bold\"));\n  builder.add(\"'\", cls(\"text-xs\"));\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-primary\")} />;\n}\n\nfunction ReusedByLine(props: { names: string[] }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const bold = cls(\"font-bold\");\n  const builder = new StyledText();\n  builder.add(\"This progress reused by: \");\n  props.names.forEach((name, i) => {\n    builder.add(i !== 0 ? \", \" : \"\");\n    builder.add(name, bold);\n  });\n  builder.add(\".\");\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-primary\")} />;\n}\n\ninterface IProgressionProps {\n  progressExercise: IPlannerProgramExercise;\n  originalExercise: IPlannerProgramExercise;\n}\n\nfunction Progression(props: IProgressionProps): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const base = cls(\"text-xs text-text-primary\");\n  const bold = cls(\"font-bold\");\n  const success = cls(\"font-bold text-text-success\");\n  const error = cls(\"font-bold text-text-error\");\n  const type = props.progressExercise ? PlannerProgramExercise_progressionType(props.progressExercise) : undefined;\n  if (type == null) {\n    return <View />;\n  }\n  switch (type.type) {\n    case \"linear\": {\n      const builder = new StyledText();\n      builder.add(\"Linear Progression:\", bold);\n      builder.add(\" \");\n      builder.add(`+${Weight_print(type.increase)}`, success);\n      if (type.successesRequired || 0 > 1) {\n        builder.add(\" after \");\n        builder.add(`${type.successesRequired}`, success);\n        builder.add(\" successes\");\n      }\n      if (type.decrease != null && type.decrease.value > 0) {\n        builder.add(\", \");\n        builder.add(Weight_print(type.decrease), error);\n        builder.add(\" after \");\n        builder.add(`${type.failuresRequired}`, error);\n        builder.add(\" failures\");\n      }\n      builder.add(\".\");\n      const built = builder.build();\n      return (\n        <View>\n          <FastText text={built.text} fragments={built.fragments} {...base} />\n        </View>\n      );\n    }\n    case \"double\": {\n      const builder = new StyledText();\n      builder.add(\"Double Progression\", bold);\n      builder.add(\": \");\n      builder.add(`+${Weight_print(type.increase)}`, success);\n      builder.add(\" within \");\n      builder.add(`${type.minReps}`, bold);\n      builder.add(\"-\");\n      builder.add(`${type.maxReps}`, bold);\n      builder.add(\" rep range.\");\n      const built = builder.build();\n      return (\n        <View>\n          <FastText text={built.text} fragments={built.fragments} {...base} />\n        </View>\n      );\n    }\n    case \"sumreps\": {\n      const builder = new StyledText();\n      builder.add(\"Sum Reps Progression\", bold);\n      builder.add(\": \");\n      builder.add(`+${Weight_print(type.increase)}`, success);\n      builder.add(\" if sum of all reps is at least \");\n      builder.add(`${type.reps}`, bold);\n      builder.add(\".\");\n      const built = builder.build();\n      return (\n        <View>\n          <FastText text={built.text} fragments={built.fragments} {...base} />\n        </View>\n      );\n    }\n    case \"custom\": {\n      const state = PlannerProgramExercise_getState(props.originalExercise);\n      const entries = Object.entries(state);\n      const secondary = cls(\"text-text-secondary\");\n      const builder = new StyledText();\n      entries.forEach(([name, value], i) => {\n        builder.add(i !== 0 ? \"\\n\" : \"\");\n        builder.add(\"•  \");\n        builder.add(name, secondary);\n        builder.add(\": \");\n        builder.add(Weight_print(value), bold);\n      });\n      const built = builder.build();\n      return (\n        <View>\n          <FastText text=\"Custom Progression\" {...cls(\"text-xs text-text-primary font-bold\")} />\n          {entries.length > 0 && (\n            <View>\n              <FastText text=\"State variables:\" {...cls(\"text-xs text-text-secondary\")} />\n              <View className=\"ml-4\">\n                <FastText text={built.text} fragments={built.fragments} {...base} />\n              </View>\n            </View>\n          )}\n        </View>\n      );\n    }\n  }\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { FastText } from \"../primitives/fastText\";\nimport { StyledText, StyledText_cls } from \"../../utils/styledText\";\nimport { useRem } from \"../../utils/useRem\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { IEvaluatedProgram, Program_getReusingUpdateExercises } from \"../../models/program\";\nimport { CollectionUtils_uniqBy } from \"../../utils/collection\";\n\ninterface IEditProgramUiUpdateProps {\n  evaluatedProgram: IEvaluatedProgram;\n  exercise: IPlannerProgramExercise;\n}\n\nexport function EditProgramUiUpdate(props: IEditProgramUiUpdateProps): JSX.Element | null {\n  let reusingLine: JSX.Element | null = null;\n  let reusedByLine: JSX.Element | null = null;\n  let progressExercise: IPlannerProgramExercise | undefined = undefined;\n  const { evaluatedProgram, exercise } = props;\n  if (exercise.update?.reuse) {\n    progressExercise = exercise.update.reuse.exercise;\n    reusingLine = <ReusingLine fullName={exercise.update.reuse?.fullName} />;\n  } else if (exercise.update) {\n    progressExercise = exercise;\n    const reusingUpdateExercises = CollectionUtils_uniqBy(\n      Program_getReusingUpdateExercises(evaluatedProgram, exercise),\n      \"fullName\"\n    );\n    if (reusingUpdateExercises.length > 0) {\n      reusedByLine = <ReusedByLine names={reusingUpdateExercises.map((e) => e.fullName)} />;\n    }\n  }\n\n  if (progressExercise == null) {\n    return null;\n  }\n  return (\n    <View>\n      <View>{reusingLine}</View>\n      <View>\n        <CustomUpdateLabel />\n      </View>\n      <View>{reusedByLine}</View>\n    </View>\n  );\n}\n\nfunction CustomUpdateLabel(): JSX.Element {\n  return <FastText text=\"Custom Update\" {...StyledText_cls(useRem())(\"text-xs text-text-primary font-bold\")} />;\n}\n\nfunction ReusingLine(props: { fullName?: string }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const builder = new StyledText();\n  builder.add(\"Reusing update of '\", cls(\"text-xs\"));\n  builder.add(props.fullName, cls(\"text-xs font-bold\"));\n  builder.add(\"'\", cls(\"text-xs\"));\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-primary\")} />;\n}\n\nfunction ReusedByLine(props: { names: string[] }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const bold = cls(\"font-bold\");\n  const builder = new StyledText();\n  builder.add(\"This update reused by: \");\n  props.names.forEach((name, i) => {\n    builder.add(i !== 0 ? \", \" : \"\");\n    builder.add(name, bold);\n  });\n  builder.add(\".\");\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-primary\")} />;\n}\n","import { JSX, memo } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { MarkdownEditorBorderless } from \"../markdownEditorBorderless\";\nimport { StringUtils_pluralize } from \"../../utils/string\";\nimport { IconMusclesW } from \"../icons/iconMusclesW\";\nimport { EditProgramUiDayView } from \"./editProgramUiDay\";\nimport { ISettings } from \"../../types\";\nimport { LinkButton } from \"../linkButton\";\nimport { IPlannerEvalResult } from \"../../pages/planner/plannerExerciseEvaluator\";\nimport { ContentGrowingTextarea } from \"../contentGrowingTextarea\";\nimport { IEvaluatedProgram, Program_getDayNumber } from \"../../models/program\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { navigateToModal } from \"../../navigation/navigationService\";\nimport { useProgressiveItems } from \"../../utils/useProgressiveItems\";\n\ninterface IEditProgramViewProps {\n  state: IPlannerState;\n  settings: ISettings;\n  evaluatedWeeks: IPlannerEvalResult[][];\n  evaluatedProgram: IEvaluatedProgram;\n  exerciseFullNames: string[];\n  programId: string;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\nexport const EditProgramUiWeekView = memo(function EditProgramUiWeekView(props: IEditProgramViewProps): JSX.Element {\n  const ui = props.state.ui;\n  const program = props.state.current.program;\n  const planner = program.planner!;\n\n  // Deleting a week doesn't move `ui.weekIndex`, so it can point past the end until something else\n  // moves it.\n  const currentWeekIndex = Math.min(ui.weekIndex, Math.max(0, planner.weeks.length - 1));\n  const currentWeek = planner.weeks[currentWeekIndex];\n  const visibleDays = useProgressiveItems(currentWeek?.days ?? [], {\n    initialBatch: 1,\n    batchSize: 1,\n    debugLabel: `Edit/week-${currentWeekIndex}-days`,\n    resetKey: currentWeekIndex,\n  });\n  if (!currentWeek) {\n    return <View />;\n  }\n\n  const lbPlanner = lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\");\n  const lbPlannerWeek = lbPlanner.p(\"weeks\").i(currentWeekIndex);\n\n  const isValidProgram = props.evaluatedWeeks.every((week) => week.every((day) => day.success));\n  const evaluatedCurrentWeek = props.evaluatedWeeks[currentWeekIndex];\n  const dayIndexOffset = Program_getDayNumber(planner, currentWeekIndex + 1, 1);\n  const allDaysCollapsed = Array.from(currentWeek.days).every((d, i) => {\n    return ui.dayUi.collapsed.has(`${currentWeekIndex}-${i}`);\n  });\n\n  return (\n    <View>\n      <View className=\"flex-row items-center px-4 pt-2\">\n        <View className=\"mr-auto\">\n          <ContentGrowingTextarea\n            className=\"text-base font-bold\"\n            value={currentWeek.name}\n            onInput={(newValue) => {\n              if (newValue) {\n                props.plannerDispatch(lbPlannerWeek.p(\"name\").record(newValue), \"Update week name\");\n              }\n            }}\n          />\n        </View>\n        <View className=\"flex-row items-center\">\n          <View>\n            <Pressable\n              data-testid=\"editor-v2-week-muscles\"\n              testID=\"editor-v2-week-muscles\"\n              className=\"px-2\"\n              onPress={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>().pi(\"ui\").p(\"showWeekStats\").record(currentWeekIndex),\n                  \"Show week stats\"\n                );\n                navigateToModal(\"weekStatsModal\", { programId: props.programId });\n              }}\n            >\n              <IconMusclesW size={20} />\n            </Pressable>\n          </View>\n        </View>\n      </View>\n      <View className=\"px-3 py-1\">\n        <MarkdownEditorBorderless\n          value={currentWeek.description}\n          debounceMs={500}\n          placeholder={`Week description in Markdown...`}\n          onChange={(v) => {\n            props.plannerDispatch(\n              lbPlanner.p(\"weeks\").i(currentWeekIndex).p(\"description\").record(v),\n              \"Update week description\"\n            );\n          }}\n        />\n      </View>\n      <View className=\"flex-row items-center px-4\">\n        <View className=\"mr-auto\">\n          <Text className=\"text-xs\">\n            {currentWeek.days.length} {StringUtils_pluralize(\"day\", currentWeek.days.length)}\n          </Text>\n        </View>\n        <View>\n          <LinkButton\n            name=\"collapse-all-days\"\n            className=\"text-xs font-normal\"\n            onClick={() => {\n              props.plannerDispatch(\n                lb<IPlannerState>()\n                  .p(\"ui\")\n                  .p(\"dayUi\")\n                  .p(\"collapsed\")\n                  .recordModify((collapsed) => {\n                    const newCollapsed = new Set<string>(collapsed);\n                    for (\n                      let dayInWeekIndex = 0;\n                      dayInWeekIndex < planner.weeks[currentWeekIndex].days.length;\n                      dayInWeekIndex += 1\n                    ) {\n                      const key = `${currentWeekIndex}-${dayInWeekIndex}`;\n                      if (allDaysCollapsed) {\n                        newCollapsed.delete(key);\n                      } else {\n                        newCollapsed.add(key);\n                      }\n                    }\n                    return newCollapsed;\n                  }),\n                \"Toggle all days collapse\"\n              );\n            }}\n          >\n            {allDaysCollapsed ? \"Expand\" : \"Collapse\"} all days\n          </LinkButton>\n        </View>\n      </View>\n      {visibleDays.map((plannerDay, dayInWeekIndex) => {\n        const evaluatedDay = evaluatedCurrentWeek[dayInWeekIndex];\n        const dayData = {\n          week: currentWeekIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n          day: dayInWeekIndex + dayIndexOffset,\n        };\n        return (\n          <EditProgramUiDayView\n            key={plannerDay.id ?? dayInWeekIndex}\n            settings={props.settings}\n            dispatch={props.dispatch}\n            programId={props.programId}\n            evaluatedProgram={props.evaluatedProgram}\n            isValidProgram={isValidProgram}\n            evaluatedDay={evaluatedDay}\n            exerciseFullNames={props.exerciseFullNames}\n            dayData={dayData}\n            lbPlannerWeek={lbPlannerWeek}\n            day={plannerDay}\n            weekIndex={currentWeekIndex}\n            dayInWeekIndex={dayInWeekIndex}\n            plannerDispatch={props.plannerDispatch}\n            state={props.state}\n          />\n        );\n      })}\n    </View>\n  );\n});\n","import { lb } from \"lens-shmens\";\nimport { IPlannerProgramExercise, IPlannerState } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IExercisePickerState, ISettings } from \"../../types\";\nimport { UndoingFlag_set } from \"../../utils/undoingFlag\";\n\nexport function applyChangesInEditor(plannerDispatch: ILensDispatch<IPlannerState>, cb: () => void): void {\n  UndoingFlag_set(true);\n  cb();\n  plannerDispatch(\n    [\n      lb<IPlannerState>()\n        .p(\"ui\")\n        .recordModify((a) => a),\n    ],\n    \"stop-is-undoing\"\n  );\n}\n\nexport function pickerStateFromPlannerExercise(\n  settings: ISettings,\n  plannerExercise?: IPlannerProgramExercise\n): IExercisePickerState {\n  const templateName =\n    plannerExercise != null && plannerExercise.exerciseType == null ? plannerExercise.name : undefined;\n\n  return {\n    mode: \"program\",\n    screenStack: [\"exercisePicker\"],\n    sort: plannerExercise?.exerciseType ? (settings.workoutSettings.pickerSort ?? \"name_asc\") : \"name_asc\",\n    filters: {},\n    label: plannerExercise?.label,\n    templateName,\n    exerciseType: plannerExercise?.exerciseType,\n    selectedTab: templateName != null ? 1 : 0,\n    selectedExercises:\n      plannerExercise && plannerExercise.exerciseType != null\n        ? [\n            {\n              type: \"adhoc\",\n              exerciseType: plannerExercise.exerciseType,\n              label: plannerExercise.label,\n            },\n          ]\n        : [],\n  };\n}\n","import { JSX, useEffect, useMemo, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { IPlannerProgram, ISettings } from \"../../types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IPlannerState, IPlannerUi } from \"../../pages/planner/models/types\";\nimport { lb, LensBuilder } from \"lens-shmens\";\nimport {\n  PlannerProgram_generateFullText,\n  PlannerProgram_evaluateFull,\n} from \"../../pages/planner/models/plannerProgram\";\nimport { PlannerEditorView } from \"../../pages/planner/components/plannerEditorView\";\nimport { EditProgramCustomErrorCta } from \"./editProgramCustomErrorCta\";\nimport { PlannerMode_commitFullText } from \"../../pages/planner/models/plannerMode\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport { AppliedTheme_get } from \"../../utils/appliedTheme\";\n\nexport interface IEditProgramV2FullProps {\n  plannerProgram: IPlannerProgram;\n  settings: ISettings;\n  ui: IPlannerUi;\n  lbUi: LensBuilder<IPlannerState, IPlannerUi, {}, undefined>;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  // Only the native structured editor uses this — it drives its exercise picker and reuse\n  // pickers, which the web CodeMirror body doesn't have.\n  evaluatedProgram: IEvaluatedProgram;\n}\n\nexport function EditProgramV2Full(props: IEditProgramV2FullProps): JSX.Element {\n  const [fulltext, setFulltext] = useState(() => PlannerProgram_generateFullText(props.plannerProgram.weeks));\n  const expectedRegenRef = useRef(fulltext);\n  const lbProgram = lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\");\n  const lbUi = lb<IPlannerState>().p(\"ui\");\n  const { evaluatedWeeks, exerciseFullNames } = useMemo(() => {\n    return PlannerProgram_evaluateFull(fulltext, props.settings);\n  }, [fulltext, props.settings]);\n  const settingsRef = useRef(props.settings);\n\n  useEffect(() => {\n    const regen = PlannerProgram_generateFullText(props.plannerProgram.weeks);\n    if (regen === expectedRegenRef.current) {\n      return;\n    }\n    expectedRegenRef.current = regen;\n    setFulltext(regen);\n    const regenEvaluation = PlannerProgram_evaluateFull(regen, props.settings).evaluatedWeeks;\n    const regenError = regenEvaluation.success ? undefined : regenEvaluation.error;\n    if (props.ui.fullTextError?.message !== regenError?.message) {\n      props.plannerDispatch(lbUi.p(\"fullTextError\").record(regenError), \"Update full text error\");\n    }\n  }, [props.plannerProgram.weeks]);\n\n  useEffect(() => {\n    settingsRef.current = props.settings;\n    const { evaluatedWeeks: evaluatedWeeks2 } = PlannerProgram_evaluateFull(fulltext, settingsRef.current);\n    const newError = evaluatedWeeks2.success ? undefined : evaluatedWeeks2.error;\n    if (\n      props.ui.fullTextError?.message !== newError?.message ||\n      props.ui.fullTextError?.line !== newError?.line ||\n      props.ui.fullTextError?.offset !== newError?.offset\n    ) {\n      props.plannerDispatch(lbUi.p(\"fullTextError\").record(newError), \"Update full text error\");\n    }\n  }, [props.settings]);\n\n  return (\n    <View className=\"relative\">\n      <View className=\"px-4 pt-4\">\n        <PlannerEditorView\n          name=\"Program\"\n          theme={AppliedTheme_get(props.settings)}\n          autoHeight={true}\n          minHeight={200}\n          customExercises={props.settings.exercises}\n          exerciseFullNames={exerciseFullNames}\n          error={\n            props.ui.fullTextError ? props.ui.fullTextError : evaluatedWeeks.success ? undefined : evaluatedWeeks.error\n          }\n          value={fulltext}\n          onCustomErrorCta={(err) => (\n            <EditProgramCustomErrorCta\n              dayData={{ week: 1, dayInWeek: 1 }}\n              dispatch={props.plannerDispatch}\n              err={err}\n              isInvertedColors={true}\n            />\n          )}\n          onChange={(text) => {\n            setFulltext(text);\n            const { weeks, error } = PlannerMode_commitFullText(text, settingsRef.current);\n            if (weeks != null) {\n              expectedRegenRef.current = PlannerProgram_generateFullText(weeks);\n            }\n            props.plannerDispatch(\n              [lbUi.p(\"fullTextError\").record(error), ...(weeks != null ? [lbProgram.p(\"weeks\").record(weeks)] : [])],\n              \"Update full program text\"\n            );\n          }}\n          lineNumbers={true}\n          onBlur={(_e, _text) => {}}\n          onLineChange={(_line) => {}}\n        />\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, ScrollView } from \"react-native\";\nimport { LensBuilder, lb } from \"lens-shmens\";\nimport { Text } from \"../primitives/text\";\nimport { PlannerCodeBlock } from \"../../pages/planner/components/plannerCodeBlock\";\nimport { PlannerEditorView } from \"../../pages/planner/components/plannerEditorView\";\nimport { PlannerStatsUtils_dayApproxTimeMs } from \"../../pages/planner/models/plannerStatsUtils\";\nimport { IPlannerUi, IPlannerState, IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { IPlannerEvalResult } from \"../../pages/planner/plannerExerciseEvaluator\";\nimport { IDayData, IPlannerProgram, IPlannerProgramDay, ISettings } from \"../../types\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport { AppliedTheme_get } from \"../../utils/appliedTheme\";\nimport { CollectionUtils_findIndexReverse } from \"../../utils/collection\";\nimport { TimeUtils_formatHHMM } from \"../../utils/time\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IconWatch } from \"../icons/iconWatch\";\nimport { EditProgramCustomErrorCta } from \"./editProgramCustomErrorCta\";\n\ninterface IEditProgramV2TextExercisesProps {\n  exerciseFullNames: string[];\n  settings: ISettings;\n  evaluatedDay: IPlannerEvalResult;\n  plannerDay: IPlannerProgramDay;\n  dayIndex: number;\n  ui: IPlannerUi;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  weekIndex: number;\n  lbProgram: LensBuilder<IPlannerState, IPlannerProgram, {}, undefined>;\n  // Only the native structured editor uses these — they drive its exercise picker and\n  // reuse pickers, which the web CodeMirror body doesn't have.\n  evaluatedProgram: IEvaluatedProgram;\n  dayData: Required<IDayData>;\n}\n\nexport function EditProgramV2TextExercises(props: IEditProgramV2TextExercisesProps): JSX.Element {\n  const { exercises: customExercises } = props.settings;\n  const { plannerDay, plannerDispatch, dayIndex, evaluatedDay, lbProgram, weekIndex } = props;\n  const focusedExercise = props.ui.focusedExercise;\n  const repeats: IPlannerProgramExercise[] = evaluatedDay.success ? evaluatedDay.data.filter((e) => e.isRepeat) : [];\n  let approxDayTime: string | undefined;\n  if (evaluatedDay.success) {\n    approxDayTime = TimeUtils_formatHHMM(\n      PlannerStatsUtils_dayApproxTimeMs(evaluatedDay.data, props.settings.timers.workout || 0, props.settings)\n    );\n  }\n  return (\n    <View className=\"flex-1 w-0 min-w-0\">\n      <PlannerEditorView\n        name=\"Exercises\"\n        theme={AppliedTheme_get(props.settings)}\n        autoHeight={true}\n        minHeight={200}\n        exerciseFullNames={props.exerciseFullNames}\n        customExercises={customExercises}\n        lineNumbers={true}\n        error={evaluatedDay.success ? undefined : evaluatedDay.error}\n        value={plannerDay.exerciseText}\n        onCustomErrorCta={(err) => (\n          <EditProgramCustomErrorCta\n            dayData={{ week: weekIndex + 1, dayInWeek: dayIndex + 1 }}\n            dispatch={props.plannerDispatch}\n            err={err}\n            isInvertedColors={true}\n          />\n        )}\n        onChange={(e) => {\n          plannerDispatch(\n            lbProgram.p(\"weeks\").i(weekIndex).p(\"days\").i(dayIndex).p(\"exerciseText\").record(e),\n            \"Update exercise text\"\n          );\n        }}\n        onBlur={(_e, _text) => {}}\n        onLineChange={(line) => {\n          const exerciseIndex =\n            dayIndex !== -1 && evaluatedDay.success\n              ? CollectionUtils_findIndexReverse(evaluatedDay.data, (d) => d.line <= line)\n              : -1;\n          const exercise = exerciseIndex !== -1 && evaluatedDay.success ? evaluatedDay.data[exerciseIndex] : undefined;\n\n          if (\n            !focusedExercise ||\n            focusedExercise.weekIndex !== weekIndex ||\n            focusedExercise.dayIndex !== dayIndex ||\n            focusedExercise.exerciseLine !== exercise?.line\n          ) {\n            plannerDispatch(\n              lb<IPlannerState>()\n                .p(\"ui\")\n                .p(\"focusedExercise\")\n                .record({ weekIndex, dayIndex, exerciseLine: exercise?.line ?? 0 }),\n              \"Focus on exercise\"\n            );\n          }\n        }}\n      />\n      {repeats.length > 0 && (\n        <ScrollView horizontal showsHorizontalScrollIndicator={false} className=\"pl-1 ml-8\">\n          <View>\n            {repeats.map((e, i) => (\n              <View key={i} className=\"flex-row\">\n                <Text className=\"mr-1\">{\"\\u2022\"}</Text>\n                <PlannerCodeBlock script={e.text} />\n              </View>\n            ))}\n          </View>\n        </ScrollView>\n      )}\n      {approxDayTime && (\n        <View className=\"flex-row justify-end items-center\">\n          <IconWatch className=\"mb-1\" />\n          <Text className=\"pl-1 text-xs text-text-secondary\">{approxDayTime}</Text>\n        </View>\n      )}\n    </View>\n  );\n}\n","import { JSX, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { View, ScrollView, Platform } from \"react-native\";\nimport { Pressable } from \"../primitives/pressable\";\nimport { Text } from \"../primitives/text\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { INavCommon, IState, updateState } from \"../../models/state\";\nimport { IProgram, ISettings } from \"../../types\";\nimport { useNavOptions } from \"../../navigation/useNavOptions\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { ILensRecordingPayload, lb } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { undoRedoMiddleware, useUndoRedo } from \"../../pages/builder/utils/undoredo\";\nimport {\n  IEvaluatedProgram,\n  Program_evaluate,\n  Program_dayAverageTimeMs,\n  Program_daysRange,\n  Program_exerciseRange,\n  Program_getDayName,\n} from \"../../models/program\";\nimport { StringUtils_dashcase, StringUtils_pluralize } from \"../../utils/string\";\nimport { IconCalendarSmall } from \"../icons/iconCalendarSmall\";\nimport { TimeUtils_formatHOrMin } from \"../../utils/time\";\nimport { IconTimerSmall } from \"../icons/iconTimerSmall\";\nimport { EditProgram_setName, EditProgram_tabLabels, EditProgram_mode } from \"../../models/editProgram\";\nimport { EditProgramNavbar, EditProgramView } from \"./editProgram\";\nimport { ProgramPreviewPlayground } from \"../preview/programPreviewPlayground\";\nimport { Thunk_pushScreen, Thunk_log } from \"../../ducks/thunks\";\nimport { PlannerDispatch_logEditAction } from \"../../utils/plannerDispatch\";\nimport { IconSwap } from \"../icons/iconSwap\";\nimport { ContentGrowingTextarea } from \"../contentGrowingTextarea\";\nimport { LinkButton } from \"../linkButton\";\nimport { PlannerProgram_evaluate } from \"../../pages/planner/models/plannerProgram\";\nimport { IconKebab } from \"../icons/iconKebab\";\nimport { UidFactory_generateUid } from \"../../utils/generator\";\nimport { useIsFocused } from \"@react-navigation/native\";\nimport { navigateToModal, getCurrentRouteName } from \"../../navigation/navigationService\";\nimport { ProgramPreviewWeekContent } from \"../preview/programPreviewTab\";\nimport { ProgramPreviewWeeks_build } from \"../preview/programPreviewWeeks\";\nimport { Nux } from \"../nux\";\nimport { programTourConfig } from \"../tour/programTourConfig\";\nimport { NavScreenContent } from \"../../navigation/NavScreenContent\";\nimport { LiftoEditorFocusProvider } from \"../liftoEditorFocus\";\nimport { LiftoEditorDock } from \"../liftoEditorDock\";\nimport { GridSelectionProvider } from \"./editProgramGrid/gridSelectionContext\";\nimport { GridActionDock } from \"./editProgramGrid/gridActionDock\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { useTimedMemo } from \"../../utils/useTimedMemo\";\nimport { usePerfRenderCount } from \"../../utils/usePerfRenderCount\";\nimport { usePerfRenderTrace } from \"../../utils/usePerfRenderTrace\";\nimport { PerfTracker_recordEvent, PerfTracker_getSessionId } from \"../../utils/perfTracker\";\nimport { PerfEnabled_tier2 } from \"../../utils/perfEnabled\";\nimport { PerfProfiler } from \"../../utils/perfProfiler\";\nimport { HermesProfile_captureOnce } from \"../../utils/hermesProfile\";\n\nfunction onProfile(\n  id: string,\n  phase: \"mount\" | \"update\" | \"nested-update\",\n  actualDuration: number,\n  baseDuration: number\n): void {\n  if (!PerfEnabled_tier2()) {\n    return;\n  }\n  if (actualDuration < 1) {\n    return;\n  }\n  PerfTracker_recordEvent({\n    type: \"profile\",\n    session: PerfTracker_getSessionId(),\n    id,\n    phase,\n    actual_ms: actualDuration,\n    base_ms: baseDuration,\n    ts: Date.now(),\n  });\n}\n\nconst TAB_LABELS = EditProgram_tabLabels;\nconst EDIT_TAB_INDEX = TAB_LABELS.indexOf(\"Edit\");\nconst EMPTY_EVAL: ReturnType<typeof PlannerProgram_evaluate> = { evaluatedWeeks: [], exerciseFullNames: [] };\nconst TAB_LABELS_RO: readonly string[] = TAB_LABELS;\nconst PLAYGROUND_TABS_PROPS = {\n  topPadding: \"0.25rem\",\n  className: \"gap-2 px-4\",\n  type: \"squares\",\n} as const;\n\ninterface IProps {\n  originalProgram: IProgram;\n  plannerState: IPlannerState;\n  helps: string[];\n  client: Window[\"fetch\"];\n  dispatch: IDispatch;\n  settings: ISettings;\n  isLoggedIn: boolean;\n  revisions: string[];\n  navCommon: INavCommon;\n}\n\nexport const ScreenProgram = memo(function ScreenProgram(props: IProps): JSX.Element {\n  usePerfRenderCount(\"ScreenProgram\");\n  usePerfRenderTrace(\"ScreenProgram\");\n  const plannerState = props.plannerState;\n  const dispatch = props.dispatch;\n  const programId = props.originalProgram.id;\n\n  const plannerStateRef = useRef(plannerState);\n  plannerStateRef.current = plannerState;\n  const loggedOnceRef = useRef<Set<string>>(new Set());\n\n  const lbBuilder = useMemo(() => lb<IState>().p(\"editProgramStates\").p(programId), [programId]);\n\n  const plannerDispatch = useMemo<ILensDispatch<IPlannerState>>(() => {\n    const fn: ILensDispatch<IPlannerState> = (lensRecording, desc) => {\n      const recordings = Array.isArray(lensRecording)\n        ? (lensRecording as ILensRecordingPayload<IPlannerState>[])\n        : [lensRecording as ILensRecordingPayload<IPlannerState>];\n      updateState(\n        dispatch,\n        recordings.map((r) => r.prepend(lbBuilder)),\n        desc || \"Update state\"\n      );\n      PlannerDispatch_logEditAction(dispatch, desc, loggedOnceRef.current);\n      const changesCurrent = recordings.some((r) => r.lens.from.some((f) => f === \"current\"));\n      const current = plannerStateRef.current;\n      if (desc !== \"undo\" && changesCurrent && current != null) {\n        undoRedoMiddleware(fn, current);\n      }\n    };\n    return fn;\n  }, [dispatch, lbBuilder]);\n\n  useUndoRedo(plannerState, plannerDispatch);\n\n  useEffect(() => {\n    dispatch(Thunk_log(\"ls-program-open\"));\n  }, [dispatch]);\n\n  const program: IProgram = plannerState.current.program;\n  const planner = program.planner!;\n  const evaluatedProgram = useTimedMemo(\n    \"editProgram.evaluatedProgram\",\n    () => Program_evaluate(program, props.settings),\n    [program, props.settings]\n  );\n  const ui = plannerState.ui;\n  const mode = EditProgram_mode(ui);\n\n  useLayoutEffect(() => {\n    for (const week of planner.weeks) {\n      week.id = week.id ?? UidFactory_generateUid(8);\n      for (const day of week.days) {\n        day.id = day.id ?? UidFactory_generateUid(8);\n      }\n    }\n  }, [planner]);\n\n  const exercisePickerUi = props.plannerState.ui.exercisePicker;\n  // Open the picker modal whenever a request is set but the picker isn't actually\n  // open. The route check makes this a no-op while the picker is up (so `.state`\n  // mutations don't re-push), but lets us re-open if a navigation was dropped.\n  const openPickerIfNeeded = useCallback(() => {\n    const picker = plannerStateRef.current.ui.exercisePicker;\n    if (!picker || getCurrentRouteName() === \"editProgramExercisePickerModal\") {\n      return;\n    }\n    navigateToModal(\"editProgramExercisePickerModal\", {\n      programId,\n      dayData: picker.dayData,\n      change: picker.change,\n      exerciseKey: picker.exerciseKey,\n    });\n  }, [programId]);\n  const navigatedPickerRef = useRef(exercisePickerUi);\n  useEffect(() => {\n    if (exercisePickerUi && navigatedPickerRef.current !== exercisePickerUi) {\n      dispatch(Thunk_log(\"ls-program-exercise-picker\"));\n      openPickerIfNeeded();\n    }\n    navigatedPickerRef.current = exercisePickerUi;\n  }, [dispatch, exercisePickerUi, openPickerIfNeeded]);\n  // Recover a dropped navigation: when this screen regains focus (e.g. a competing\n  // modal that stole the navigation closed) and a picker request is still pending,\n  // re-assert it instead of waiting for the user to tap again.\n  const isFocused = useIsFocused();\n  useEffect(() => {\n    if (isFocused) {\n      openPickerIfNeeded();\n    }\n  }, [isFocused, openPickerIfNeeded]);\n\n  const navRightButtons = useMemo(\n    () => [\n      <Pressable\n        key=\"kebab\"\n        data-testid=\"navbar-3-dot\"\n        testID=\"navbar-3-dot\"\n        className=\"p-2 nm-edit-program-v2-navbar-kebab\"\n        onPress={() => navigateToModal(\"editProgramMenuModal\", { programId })}\n      >\n        <IconKebab />\n      </Pressable>,\n    ],\n    [programId]\n  );\n\n  const navOptions = useMemo(\n    () => ({\n      navTitle: \"Program\",\n      navHelpTourId: programTourConfig.id,\n      navRightButtons,\n    }),\n    [navRightButtons]\n  );\n  useNavOptions(navOptions);\n\n  // Preview and Playground both render the evaluated program, so a program that failed to\n  // evaluate shows up there as a week of empty days with no hint of why. Pin the screen to\n  // Edit, the only tab that surfaces the syntax errors.\n  const hasEvalErrors = evaluatedProgram.errors.length > 0;\n  const tabIndex = hasEvalErrors ? EDIT_TAB_INDEX : (plannerState.ui.tabIndex ?? 0);\n  const activeTabLabel = TAB_LABELS[tabIndex] ?? \"Preview\";\n\n  // Also write the redirect through, so fixing the program leaves the user in the editor\n  // instead of yanking them back to Preview - the text they're typing passes through valid\n  // states on the way to the one they mean.\n  useEffect(() => {\n    if (!hasEvalErrors) {\n      return;\n    }\n    const recordings = [];\n    if ((ui.tabIndex ?? 0) !== EDIT_TAB_INDEX) {\n      recordings.push(lb<IPlannerState>().p(\"ui\").p(\"tabIndex\").record(EDIT_TAB_INDEX));\n    }\n    // The grid has nowhere to render an error, and the navbar already refuses to enter it while\n    // the program is broken.\n    if (mode === \"grid\") {\n      recordings.push(lb<IPlannerState>().p(\"ui\").p(\"mode\").record(\"ui\"));\n    }\n    if (recordings.length > 0) {\n      plannerDispatch(recordings, \"Fall through to editing an invalid program\");\n    }\n  }, [hasEvalErrors, ui.tabIndex, mode, plannerDispatch]);\n\n  const plannerEval = useTimedMemo(\n    \"editProgram.plannerEval\",\n    () => (activeTabLabel === \"Edit\" ? PlannerProgram_evaluate(planner, props.settings) : EMPTY_EVAL),\n    [activeTabLabel, planner, props.settings]\n  );\n  const { evaluatedWeeks, exerciseFullNames } = plannerEval;\n\n  const onChangeTab = useCallback(\n    (newTabIndex: number): void => {\n      const tabLabel = TAB_LABELS[newTabIndex];\n      if (tabLabel) {\n        dispatch(Thunk_log(`ls-program-tab-${tabLabel.toLowerCase()}`));\n        HermesProfile_captureOnce(`program-tab-${tabLabel.toLowerCase()}`, 3000);\n      }\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"tabIndex\").record(newTabIndex), \"Change tab\");\n    },\n    [dispatch, plannerDispatch]\n  );\n\n  const [previewWeekIndex, setPreviewWeekIndex] = useState(0);\n  const [playgroundWeekIndex, setPlaygroundWeekIndex] = useState(0);\n  const editWeekIndex = Math.min(ui.weekIndex ?? 0, Math.max(0, planner.weeks.length - 1));\n  const setEditWeekIndex = useCallback(\n    (newIndex: number): void => {\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"weekIndex\").record(newIndex), `Change week index to ${newIndex}`);\n    },\n    [plannerDispatch]\n  );\n\n  const previewWeekLabels = useMemo(\n    () => (activeTabLabel === \"Preview\" ? evaluatedProgram.weeks.map((w) => w.name) : []),\n    [activeTabLabel, evaluatedProgram]\n  );\n  const safePreviewWeekIndex = Math.min(previewWeekIndex, Math.max(0, previewWeekLabels.length - 1));\n  const previewWeek = useTimedMemo(\n    \"editProgram.previewWeek\",\n    () =>\n      activeTabLabel === \"Preview\"\n        ? ProgramPreviewWeeks_build(program, props.settings, props.navCommon.stats, safePreviewWeekIndex)\n        : undefined,\n    [activeTabLabel, program, props.settings, props.navCommon.stats, safePreviewWeekIndex]\n  );\n  const playgroundWeekNames = useMemo(\n    () => (activeTabLabel === \"Playground\" ? evaluatedProgram.weeks.map((w) => w.name) : []),\n    [activeTabLabel, evaluatedProgram]\n  );\n  const safePlaygroundWeekIndex = Math.min(playgroundWeekIndex, Math.max(0, playgroundWeekNames.length - 1));\n  const showEditWeekTabBar =\n    activeTabLabel === \"Edit\" && (mode === \"ui\" || mode === \"perday\") && planner.weeks.length > 1;\n\n  const onChangeProgram = useCallback(() => {\n    dispatch(Thunk_pushScreen(\"programs\"));\n  }, [dispatch]);\n  const onChangeDay = useCallback(() => {\n    navigateToModal(\"programNextDayModal\", { programId });\n  }, [programId]);\n  const onChangeName = useCallback(\n    (newValue: string) => {\n      EditProgram_setName(dispatch, props.originalProgram, newValue);\n      plannerDispatch(\n        [\n          lb<IPlannerState>().p(\"current\").p(\"program\").p(\"name\").record(newValue),\n          lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\").p(\"name\").record(newValue),\n        ],\n        \"Update program name\"\n      );\n    },\n    [dispatch, plannerDispatch, props.originalProgram]\n  );\n\n  let tabContent: JSX.Element;\n  if (activeTabLabel === \"Preview\") {\n    tabContent = previewWeek ? (\n      <PerfProfiler id=\"tab.Preview\" onRender={onProfile}>\n        <ProgramPreviewWeekContent\n          key=\"preview\"\n          week={previewWeek}\n          weekIndex={safePreviewWeekIndex}\n          program={program}\n          programId={programId}\n          settings={props.settings}\n          ui={ui}\n          stats={props.navCommon.stats}\n          dispatch={dispatch}\n          plannerDispatch={plannerDispatch}\n          totalWeeks={previewWeekLabels.length}\n        />\n      </PerfProfiler>\n    ) : (\n      <View />\n    );\n  } else if (activeTabLabel === \"Edit\") {\n    tabContent = (\n      <PerfProfiler id=\"tab.Edit\" onRender={onProfile}>\n        <EditProgramView\n          hideNavbar\n          hideWeekTabBar={showEditWeekTabBar}\n          evaluatedWeeks={evaluatedWeeks}\n          evaluatedProgram={evaluatedProgram}\n          exerciseFullNames={exerciseFullNames}\n          dispatch={dispatch}\n          originalProgram={props.originalProgram}\n          programId={programId}\n          settings={props.settings}\n          plannerDispatch={plannerDispatch}\n          state={plannerState}\n        />\n      </PerfProfiler>\n    );\n  } else {\n    tabContent = (\n      <PerfProfiler id=\"tab.Playground\" onRender={onProfile}>\n        <View className=\"pb-4\">\n          <Nux className=\"mx-4 my-2\" id=\"Playground\" helps={props.helps} dispatch={dispatch}>\n            <Text className=\"text-xs\">\n              Playground lets you test the program logic. You can finish workouts here and see how reps, weights, sets\n              change. Everything you do here is ephemeral, and doesn't change any settings, workouts or programs.\n            </Text>\n          </Nux>\n          <ProgramPreviewPlayground\n            key=\"playground\"\n            scrollableTabsProps={PLAYGROUND_TABS_PROPS}\n            isPlayground={true}\n            program={program}\n            settings={props.settings}\n            stats={props.navCommon.stats}\n            useNavModals={true}\n            hideWeekTabBar={true}\n            externalWeekIndex={safePlaygroundWeekIndex}\n          />\n        </View>\n      </PerfProfiler>\n    );\n  }\n\n  const editWeekLabels = useMemo(() => planner.weeks.map((w) => w.name), [planner.weeks]);\n  const editWeekInvalidIndices = useMemo(\n    () => planner.weeks.map((_, i) => evaluatedWeeks[i]?.some((day) => !day.success) ?? false),\n    [planner.weeks, evaluatedWeeks]\n  );\n\n  let perTabStickyHeader: JSX.Element;\n  if (activeTabLabel === \"Edit\") {\n    perTabStickyHeader = (\n      <View className=\"bg-background-default\">\n        <EditProgramNavbar\n          dispatch={dispatch}\n          originalProgram={props.originalProgram}\n          settings={props.settings}\n          state={plannerState}\n          evaluatedWeeks={evaluatedWeeks}\n          plannerDispatch={plannerDispatch}\n        />\n        {showEditWeekTabBar && (\n          <WeekTabBar\n            labels={editWeekLabels}\n            invalidIndices={editWeekInvalidIndices}\n            activeIndex={editWeekIndex}\n            onChange={setEditWeekIndex}\n          />\n        )}\n      </View>\n    );\n  } else if (activeTabLabel === \"Preview\" && previewWeekLabels.length > 1) {\n    perTabStickyHeader = (\n      <View className=\"bg-background-default\">\n        <WeekTabBar labels={previewWeekLabels} activeIndex={safePreviewWeekIndex} onChange={setPreviewWeekIndex} />\n      </View>\n    );\n  } else if (activeTabLabel === \"Playground\" && playgroundWeekNames.length > 1) {\n    perTabStickyHeader = (\n      <View className=\"bg-background-default\">\n        <WeekTabBar\n          labels={playgroundWeekNames}\n          activeIndex={safePlaygroundWeekIndex}\n          onChange={setPlaygroundWeekIndex}\n        />\n      </View>\n    );\n  } else {\n    perTabStickyHeader = <View className=\"bg-background-default\" />;\n  }\n\n  const showEditorDock = activeTabLabel === \"Edit\" && (mode === \"perday\" || mode === \"full\");\n  const showGridDock = activeTabLabel === \"Edit\" && mode === \"grid\";\n\n  return (\n    <PerfProfiler id=\"ScreenProgram.shell\" onRender={onProfile}>\n      <LiftoEditorFocusProvider>\n        <GridSelectionProvider>\n          <NavScreenContent\n            stickyHeaderIndices={STICKY_INDICES}\n            footer={showEditorDock ? <LiftoEditorDock /> : showGridDock ? <GridActionDock /> : undefined}\n            // Freeform editing hides the dock, so dragging is how the keyboard goes away on\n            // iOS; Android also has the back button.\n            keyboardDismissMode={showEditorDock ? (Platform.OS === \"ios\" ? \"interactive\" : \"on-drag\") : undefined}\n            // Freeform raises the system keyboard over a day editor that can sit at the very\n            // bottom of the list, and the reveal can only scroll as far as the content allows.\n            avoidSystemKeyboard={showEditorDock}\n          >\n            <PerfProfiler id=\"ScreenProgram.header\" onRender={onProfile}>\n              <EditProgramHeader\n                evaluatedProgram={evaluatedProgram}\n                settings={props.settings}\n                onChangeProgram={onChangeProgram}\n                onChangeDay={onChangeDay}\n                onChangeName={onChangeName}\n              />\n            </PerfProfiler>\n            <OuterTabBar\n              labels={TAB_LABELS_RO}\n              activeIndex={tabIndex}\n              pinnedIndex={hasEvalErrors ? EDIT_TAB_INDEX : undefined}\n              onChange={onChangeTab}\n            />\n            <PerfProfiler id=\"ScreenProgram.stickyHeader\" onRender={onProfile}>\n              {perTabStickyHeader}\n            </PerfProfiler>\n            {tabContent}\n          </NavScreenContent>\n        </GridSelectionProvider>\n      </LiftoEditorFocusProvider>\n    </PerfProfiler>\n  );\n});\n\nconst STICKY_INDICES = [1, 2];\n\ninterface IWeekTabBarProps {\n  labels: string[];\n  activeIndex: number;\n  invalidIndices?: boolean[];\n  onChange: (index: number) => void;\n}\n\nconst WeekTabBar = memo(function WeekTabBar(props: IWeekTabBarProps): JSX.Element {\n  return (\n    <ScrollView horizontal showsHorizontalScrollIndicator={false} className=\"bg-background-default\">\n      <View className=\"flex-row gap-2 px-gutter py-2\">\n        {props.labels.map((label, index) => {\n          const isSelected = props.activeIndex === index;\n          const isInvalid = props.invalidIndices?.[index] ?? false;\n          return (\n            <Pressable\n              key={`${label}-${index}`}\n              testID={`tab-${StringUtils_dashcase(label.toLowerCase())}`}\n              data-testid={`tab-${StringUtils_dashcase(label.toLowerCase())}`}\n              className={`px-3 py-2 rounded mr-2 ${\n                isSelected\n                  ? \"bg-background-default border border-button-primarybackground\"\n                  : \"bg-background-subtle border border-background-default\"\n              }`}\n              onPress={() => props.onChange(index)}\n            >\n              <Text className={`text-sm ${isSelected ? \"text-text-purple\" : \"text-text-secondary\"}`}>\n                {isInvalid ? \"⚠️ \" : \"\"}\n                {label}\n              </Text>\n            </Pressable>\n          );\n        })}\n      </View>\n    </ScrollView>\n  );\n});\n\ninterface IOuterTabBarProps {\n  labels: readonly string[];\n  activeIndex: number;\n  // Set while the program can't be evaluated: this tab is flagged as the one holding the\n  // errors, and the rest - which would render an empty program - are dimmed and inert.\n  pinnedIndex?: number;\n  onChange: (index: number) => void;\n}\n\nconst OuterTabBar = memo(function OuterTabBar(props: IOuterTabBarProps): JSX.Element {\n  const activeColor = Tailwind_semantic().button.secondarystroke;\n  return (\n    <View className=\"flex-row justify-between pt-4 px-4 bg-background-default border-b border-border-neutral\">\n      {props.labels.map((label, index) => {\n        const isSelected = props.activeIndex === index;\n        const isPinned = props.pinnedIndex === index;\n        const isDisabled = props.pinnedIndex != null && !isPinned;\n        const nameClass = `tab-${StringUtils_dashcase(label.toLowerCase())}`;\n        return (\n          <Pressable\n            key={label}\n            className=\"px-2 pb-1\"\n            data-testid={nameClass}\n            testID={nameClass}\n            style={{\n              opacity: isDisabled ? 0.4 : 1,\n              ...(isSelected ? { borderBottomWidth: 2, borderBottomColor: activeColor } : {}),\n            }}\n            onPress={() => {\n              if (!isDisabled) {\n                props.onChange(index);\n              }\n            }}\n          >\n            <Text className={`text-base ${isSelected ? \"text-text-purple\" : \"\"}`}>\n              {isPinned ? \"⚠️ \" : \"\"}\n              {label}\n            </Text>\n          </Pressable>\n        );\n      })}\n    </View>\n  );\n});\n\ninterface IEditProgramHeaderProps {\n  evaluatedProgram: IEvaluatedProgram;\n  onChangeProgram: () => void;\n  onChangeDay: () => void;\n  onChangeName: (newValue: string) => void;\n  settings: ISettings;\n}\n\nconst EditProgramHeader = memo(function EditProgramHeader(props: IEditProgramHeaderProps): JSX.Element {\n  const evaluatedProgram = props.evaluatedProgram;\n  const time = Program_dayAverageTimeMs(evaluatedProgram, props.settings);\n  const duration = TimeUtils_formatHOrMin(time);\n  return (\n    <View className=\"px-gutter\">\n      <View className=\"flex-row items-center gap-2\">\n        <View className=\"flex-1\">\n          <ContentGrowingTextarea\n            className=\"text-base font-bold\"\n            value={evaluatedProgram.name}\n            onInput={(newValue) => {\n              if (newValue) {\n                props.onChangeName(newValue);\n              }\n            }}\n          />\n        </View>\n        <View className=\"flex-row items-center\">\n          <Pressable\n            className=\"px-2\"\n            onPress={() => {\n              props.onChangeProgram();\n            }}\n          >\n            <IconSwap size={16} />\n          </Pressable>\n        </View>\n      </View>\n      <View>\n        <View className=\"flex-row items-center my-1\">\n          <IconCalendarSmall className=\"mr-1\" />\n          <Text className=\"text-xs text-text-secondary\">\n            {evaluatedProgram.weeks.length > 1 &&\n              `${evaluatedProgram.weeks.length} ${StringUtils_pluralize(\"week\", evaluatedProgram.weeks.length)}, `}\n            {Program_daysRange(evaluatedProgram)}, {Program_exerciseRange(evaluatedProgram)}\n          </Text>\n        </View>\n        <View className=\"flex-row items-center\">\n          <View>\n            <IconTimerSmall />\n          </View>\n          <Text className=\"pl-1 text-xs text-text-secondary\">\n            {duration.value} {duration.unit}\n          </Text>\n        </View>\n      </View>\n      <View className=\"flex-row items-center mt-1\">\n        <Text className=\"text-xs font-bold text-text-secondary\">Next Day: </Text>\n        <LinkButton\n          data-testid=\"change-program-day\"\n          testID=\"change-program-day\"\n          name=\"change-program-day\"\n          className=\"text-xs font-bold\"\n          onClick={() => props.onChangeDay()}\n        >\n          {Program_getDayName(evaluatedProgram, evaluatedProgram.nextDay)}\n        </LinkButton>\n      </View>\n    </View>\n  );\n});\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseEvaluatedSet } from \"../../pages/planner/models/types\";\nimport { IDaySetData, IExerciseType, IPlannerProgram, ISettings } from \"../../types\";\nimport { IEvaluatedProgramWeek, Program_getProgramExerciseFromDay } from \"../../models/program\";\nimport { ScrollableTabs } from \"../scrollableTabs\";\nimport { PP_iterate2 } from \"../../models/pp\";\nimport { InputNumber2 } from \"../inputNumber2\";\nimport { EditProgramUiHelpers_changeSets } from \"../editProgram/editProgramUi/editProgramUiHelpers\";\nimport { CollectionUtils_compact } from \"../../utils/collection\";\nimport { ObjectUtils_values, ObjectUtils_entries } from \"../../utils/object\";\nimport { SetUtils_areAllEqual, SetUtils_areEqual } from \"../../utils/setUtils\";\nimport { InputWeight2 } from \"../inputWeight2\";\nimport { Switch } from \"../primitives/switch\";\n\ninterface IInputNumberAddOnProps {\n  label: string;\n  value: boolean;\n  testID?: string;\n  onChange: (value: boolean) => void;\n}\n\nfunction InputNumberAddOn(props: IInputNumberAddOnProps): JSX.Element {\n  return (\n    <View className=\"flex-row items-center\">\n      <Text className=\"mr-2 text-sm font-semibold\">{props.label}</Text>\n      <Switch value={props.value} testID={props.testID} onValueChange={(v) => props.onChange(v)} />\n    </View>\n  );\n}\n\ninterface IEditProgramExerciseAcrossAllWeeksProps {\n  weeks: IEvaluatedProgramWeek[];\n  plannerExercise: IPlannerProgramExercise;\n  settings: ISettings;\n  tabIndex: number;\n  onChangeTabIndex: (index: number) => void;\n  // A modifier rather than a finished planner: a host holding the program in a lens applies it\n  // to whatever state holds at dispatch time, which is not necessarily the evaluation this\n  // component was rendered from.\n  onChange: (apply: (planner: IPlannerProgram) => IPlannerProgram) => void;\n}\n\nexport function EditProgramExerciseAcrossAllWeeks(props: IEditProgramExerciseAcrossAllWeeksProps): JSX.Element {\n  function change(setData: IDaySetData[], changeFn: (set: IPlannerProgramExerciseEvaluatedSet) => void): void {\n    props.onChange((planner) =>\n      EditProgramUiHelpers_changeSets(planner, props.plannerExercise.key, setData, props.settings, (set) => {\n        changeFn(set);\n      })\n    );\n  }\n\n  const tabs = [\n    {\n      label: \"Reps\",\n      children: () => (\n        <Tab\n          weeks={props.weeks}\n          plannerExercise={props.plannerExercise}\n          settings={props.settings}\n          getKey={(set) => `${set.minrep}-${set.maxrep}-${set.isAmrap}`}\n          getRightSide={(group, set) => (\n            <RepsValue\n              exerciseType={props.plannerExercise.exerciseType}\n              settings={props.settings}\n              group={group}\n              set={set}\n              change={change}\n            />\n          )}\n        />\n      ),\n    },\n  ];\n  tabs.push({\n    label: \"Weights\",\n    children: () => (\n      <Tab\n        weeks={props.weeks}\n        plannerExercise={props.plannerExercise}\n        settings={props.settings}\n        getKey={(set) => `${set.weight?.unit}-${set.weight?.value}-${set.askWeight}`}\n        getRightSide={(group, set) => (\n          <WeightsValue\n            exerciseType={props.plannerExercise.exerciseType}\n            settings={props.settings}\n            group={group}\n            set={set}\n            change={change}\n          />\n        )}\n      />\n    ),\n  });\n  tabs.push({\n    label: \"RPE\",\n    children: () => (\n      <Tab\n        weeks={props.weeks}\n        plannerExercise={props.plannerExercise}\n        settings={props.settings}\n        getKey={(set) => `${set.rpe}-${set.logRpe}`}\n        getRightSide={(group, set) => (\n          <RpeValue\n            exerciseType={props.plannerExercise.exerciseType}\n            settings={props.settings}\n            group={group}\n            set={set}\n            change={change}\n          />\n        )}\n      />\n    ),\n  });\n  tabs.push({\n    label: \"Timers\",\n    children: () => (\n      <Tab\n        weeks={props.weeks}\n        plannerExercise={props.plannerExercise}\n        settings={props.settings}\n        getKey={(set) => `${set.timer}`}\n        getRightSide={(group, set) => (\n          <TimerValue\n            exerciseType={props.plannerExercise.exerciseType}\n            settings={props.settings}\n            group={group}\n            set={set}\n            change={change}\n          />\n        )}\n      />\n    ),\n  });\n\n  return (\n    <View>\n      <ScrollableTabs\n        topPadding=\"1rem\"\n        defaultIndex={props.tabIndex}\n        onChange={props.onChangeTabIndex}\n        shouldNotExpand={true}\n        nonSticky={true}\n        color=\"purple\"\n        tabs={tabs}\n      />\n    </View>\n  );\n}\n\ninterface ITabProps {\n  weeks: IEvaluatedProgramWeek[];\n  plannerExercise: IPlannerProgramExercise;\n  getKey: (set: IPlannerProgramExerciseEvaluatedSet) => string;\n  getRightSide: (group: IDaySetData[], set: IPlannerProgramExerciseEvaluatedSet) => JSX.Element;\n  settings: ISettings;\n}\n\nfunction Tab(props: ITabProps): JSX.Element {\n  const groups: Record<string, IDaySetData[]> = {};\n  PP_iterate2(props.weeks, (exercise, weekIndex, dayInWeekIndex) => {\n    if (exercise.key !== props.plannerExercise.key) {\n      return;\n    }\n    for (let setVariationIndex = 0; setVariationIndex < exercise.evaluatedSetVariations.length; setVariationIndex++) {\n      for (let setIndex = 0; setIndex < exercise.evaluatedSetVariations[setVariationIndex].sets.length; setIndex++) {\n        const set = exercise.evaluatedSetVariations[setVariationIndex].sets[setIndex];\n        const key = props.getKey(set);\n        groups[key] = groups[key] || [];\n        groups[key].push({\n          week: weekIndex + 1,\n          dayInWeek: dayInWeekIndex + 1,\n          setVariation: setVariationIndex + 1,\n          set: setIndex + 1,\n        });\n      }\n    }\n  });\n\n  const groupsValues = ObjectUtils_values(groups);\n\n  const allWeeks = groupsValues.map((group) => new Set(group.map((setData) => setData.week)));\n  const allDays = groupsValues.map((group) => new Set(group.map((setData) => setData.dayInWeek)));\n  const setVariationsPerWeekDay: Record<string, Set<number>> = {};\n  for (const group of groupsValues) {\n    for (const setData of group) {\n      const key = `${setData.week}-${setData.dayInWeek}`;\n      setVariationsPerWeekDay[key] = setVariationsPerWeekDay[key] || new Set();\n      setVariationsPerWeekDay[key].add(setData.setVariation);\n    }\n  }\n  const setsPerWeekDaySetVariation: Record<string, Set<number>> = {};\n  for (const group of groupsValues) {\n    for (const setData of group) {\n      const key = `${setData.week}-${setData.dayInWeek}-${setData.setVariation}`;\n      setsPerWeekDaySetVariation[key] = setsPerWeekDaySetVariation[key] || new Set();\n      setsPerWeekDaySetVariation[key].add(setData.set);\n    }\n  }\n  const allWeeksEqual = SetUtils_areAllEqual(allWeeks);\n  const allDaysEqual = SetUtils_areAllEqual(allDays);\n\n  return (\n    <View className=\"px-4\">\n      {Object.entries(groups).map(([key, group]) => {\n        const first = group[0];\n        const day = props.weeks[first.week - 1].days[first.dayInWeek - 1];\n        const exercise = Program_getProgramExerciseFromDay(day, props.plannerExercise.key);\n        if (!exercise) {\n          return (\n            <View key={key}>\n              <Text>Exercise not found for key: {props.plannerExercise.key}</Text>\n            </View>\n          );\n        }\n        const set = exercise.evaluatedSetVariations[first.setVariation - 1].sets[first.set - 1];\n        return (\n          <View\n            key={key}\n            className=\"flex-row items-center gap-4 p-2 mb-4 border rounded-lg bg-background-cardpurple border-border-cardpurple\"\n          >\n            <View className=\"flex-1\">\n              <GroupLabel\n                group={group}\n                allWeeksEqual={allWeeksEqual}\n                allDaysEqual={allDaysEqual}\n                setVariationsPerWeekDay={setVariationsPerWeekDay}\n                setsPerWeekDaySetVariation={setsPerWeekDaySetVariation}\n              />\n            </View>\n            <View className=\"flex-row items-center gap-2\">{props.getRightSide(group, set)}</View>\n          </View>\n        );\n      })}\n    </View>\n  );\n}\n\ninterface IGroupLabelProps {\n  group: IDaySetData[];\n  allWeeksEqual: boolean;\n  allDaysEqual: boolean;\n  setVariationsPerWeekDay: Record<string, Set<number>>;\n  setsPerWeekDaySetVariation: Record<string, Set<number>>;\n}\n\nfunction GroupLabel(props: IGroupLabelProps): JSX.Element {\n  const groupSetVariationsPerWeekDay: Record<string, Set<number>> = {};\n  for (const setData of props.group) {\n    const key = `${setData.week}-${setData.dayInWeek}`;\n    groupSetVariationsPerWeekDay[key] = groupSetVariationsPerWeekDay[key] || new Set();\n    groupSetVariationsPerWeekDay[key].add(setData.setVariation);\n  }\n\n  const groupSetsPerWeekDaySetVariation: Record<string, Set<number>> = {};\n  for (const setData of props.group) {\n    const key = `${setData.week}-${setData.dayInWeek}-${setData.setVariation}`;\n    groupSetsPerWeekDaySetVariation[key] = groupSetsPerWeekDaySetVariation[key] || new Set();\n    groupSetsPerWeekDaySetVariation[key].add(setData.set);\n  }\n\n  const allSetVariationsEqual = ObjectUtils_entries(groupSetVariationsPerWeekDay).every(([key, setVariations]) => {\n    const allSetVariationsForWeekDay = props.setVariationsPerWeekDay[key];\n    if (\n      setVariations.size !== allSetVariationsForWeekDay.size ||\n      !SetUtils_areEqual(allSetVariationsForWeekDay, setVariations)\n    ) {\n      return false;\n    }\n    for (const setVariation of setVariations) {\n      const setKey = `${key}-${setVariation}`;\n      const groupSets = groupSetsPerWeekDaySetVariation[setKey];\n      const allSets = props.setsPerWeekDaySetVariation[setKey];\n      if (!groupSets || groupSets.size !== allSets.size || !SetUtils_areEqual(allSets, groupSets)) {\n        return false;\n      }\n    }\n    return true;\n  });\n\n  const allSetsEqual = ObjectUtils_entries(groupSetsPerWeekDaySetVariation).every(([key, sets]) => {\n    const allSetsForWeekDaySetVariation = props.setsPerWeekDaySetVariation[key];\n    return sets.size === allSetsForWeekDaySetVariation.size && SetUtils_areEqual(allSetsForWeekDaySetVariation, sets);\n  });\n\n  if (props.allWeeksEqual && props.allDaysEqual && allSetVariationsEqual && allSetsEqual) {\n    return <Text className=\"text-sm\">All Sets</Text>;\n  }\n\n  const parts = props.group.map<[string, number][]>((setData) => {\n    const setKey = `${setData.week}-${setData.dayInWeek}-${setData.setVariation}`;\n    const areSetsEqual = SetUtils_areEqual(\n      groupSetsPerWeekDaySetVariation[setKey],\n      props.setsPerWeekDaySetVariation[setKey]\n    );\n    return CollectionUtils_compact([\n      props.allWeeksEqual ? undefined : [\"Week\", setData.week],\n      props.allDaysEqual ? undefined : [\"Day\", setData.dayInWeek],\n      allSetVariationsEqual ? undefined : [\"Set Variation\", setData.setVariation],\n      areSetsEqual ? undefined : [\"Set\", setData.set],\n    ]);\n  });\n  const collapsedParts = collapseLastElementRange(parts);\n  const uniqueParts = Array.from(\n    new Set(collapsedParts.map((part) => part.map(([key, value]) => `${key} ${value}`).join(\", \")))\n  );\n\n  return (\n    <View>\n      {uniqueParts.map((part, index) => {\n        return (\n          <Text key={index} className=\"text-sm\">\n            {part}\n          </Text>\n        );\n      })}\n    </View>\n  );\n}\n\ninterface IValueProps {\n  group: IDaySetData[];\n  set: IPlannerProgramExerciseEvaluatedSet;\n  settings: ISettings;\n  exerciseType?: IExerciseType;\n  change: (group: IDaySetData[], changeFn: (set: IPlannerProgramExerciseEvaluatedSet) => void) => void;\n}\n\nfunction RepsValue(props: IValueProps): JSX.Element {\n  const { group, set, change } = props;\n  return (\n    <View className=\"flex-row items-center gap-1\">\n      {set.minrep != null && (\n        <>\n          <View className=\"items-center\">\n            <Text className=\"text-xs text-text-secondary\">Min Reps</Text>\n            <View>\n              <InputNumber2\n                width={3.5}\n                data-testid=\"min-reps-value\"\n                testID=\"min-reps-value\"\n                name=\"set-min-reps\"\n                onBlur={(value) => {\n                  change(group, (s) => {\n                    s.minrep = value;\n                  });\n                }}\n                value={set.minrep}\n                min={0}\n                max={999}\n                step={1}\n              />\n            </View>\n          </View>\n          <View>\n            <Text className=\"text-xs text-text-secondary\">&nbsp;</Text>\n            <Text>-</Text>\n          </View>\n        </>\n      )}\n      <View className=\"items-center\">\n        <Text className=\"text-xs text-text-secondary\">{set.minrep != null ? \"Max Reps\" : \"Reps\"}</Text>\n        <View>\n          <InputNumber2\n            width={3.5}\n            data-testid=\"reps-value\"\n            testID=\"reps-value\"\n            name=\"set-reps\"\n            onBlur={(value) => change(group, (s) => (s.maxrep = value))}\n            after={() => (set.isAmrap ? <Text className=\"text-xs text-text-secondary\">+</Text> : undefined)}\n            keyboardAddon={\n              <View className=\"py-2\">\n                <InputNumberAddOn\n                  label=\"Is AMRAP?\"\n                  value={set.isAmrap}\n                  onChange={(value) => {\n                    change(group, (s) => (s.isAmrap = value));\n                  }}\n                />\n              </View>\n            }\n            value={set.maxrep}\n            min={0}\n            max={999}\n            step={1}\n          />\n        </View>\n      </View>\n    </View>\n  );\n}\n\nfunction WeightsValue(props: IValueProps): JSX.Element {\n  const { group, set, change } = props;\n  return (\n    <View className=\"items-center\">\n      <Text className=\"text-xs text-text-secondary\">Weight</Text>\n      <View>\n        <InputWeight2\n          name=\"set-weight\"\n          width={4}\n          exerciseType={props.exerciseType}\n          data-testid=\"weight-value\"\n          testID=\"weight-value\"\n          units={[\"lb\", \"kg\", \"%\"] as const}\n          inputCommitMode=\"blur\"\n          onBlur={(value) => change(group, (s) => (s.weight = value))}\n          showUnitInside={true}\n          subscription={undefined}\n          value={set.weight}\n          after={() => (set.askWeight ? <Text className=\"text-xs text-text-secondary\">+</Text> : undefined)}\n          max={9999}\n          min={-9999}\n          settings={props.settings}\n          addOn={() => (\n            <InputNumberAddOn\n              label=\"Ask Weight?\"\n              value={set.askWeight}\n              onChange={(value) => {\n                change(group, (s) => (s.askWeight = value));\n              }}\n            />\n          )}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction RpeValue(props: IValueProps): JSX.Element {\n  const { group, set, change } = props;\n  return (\n    <View className=\"items-center\">\n      <Text className=\"text-xs text-text-secondary\">RPE</Text>\n      <View>\n        <InputNumber2\n          width={3}\n          data-testid=\"rpe-value\"\n          testID=\"rpe-value\"\n          allowDot={true}\n          name=\"set-rpe\"\n          after={() => (set.logRpe ? <Text className=\"text-xs text-text-secondary\">+</Text> : undefined)}\n          keyboardAddon={\n            <View className=\"py-2\">\n              <InputNumberAddOn\n                label=\"Log RPE?\"\n                value={set.isAmrap}\n                onChange={(value) => {\n                  change(group, (s) => (s.logRpe = value));\n                }}\n              />\n            </View>\n          }\n          onBlur={(value) => change(group, (s) => (s.rpe = value))}\n          value={set.rpe}\n          min={0}\n          max={10}\n          step={0.5}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction TimerValue(props: IValueProps): JSX.Element {\n  const { group, set, change } = props;\n  return (\n    <View className=\"items-center\">\n      <Text className=\"text-xs text-text-secondary\">Timer</Text>\n      <View>\n        <InputNumber2\n          width={3.5}\n          data-testid=\"set-timer\"\n          testID=\"set-timer\"\n          name=\"timer-value\"\n          onBlur={(value) => change(group, (s) => (s.timer = value))}\n          value={set.timer}\n          min={0}\n          max={9999}\n          step={15}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction collapseLastElementRange(data: [string, number][][]): [string, string][][] {\n  if (data.length === 0) {\n    return [];\n  }\n\n  const result: [string, string][][] = [];\n\n  let currentGroup: [string, number][][] = [data[0]];\n\n  for (let i = 1; i < data.length; i++) {\n    const prev = currentGroup[currentGroup.length - 1];\n    const curr = data[i];\n\n    const prevLast = prev[prev.length - 1];\n    const currLast = curr[curr.length - 1];\n\n    const sameDepth = prev.length === curr.length;\n    const sameLastKey = prevLast[0] === currLast[0];\n    const samePrefix = isSamePrefix(prev, curr);\n    const isConsecutive = currLast[1] === prevLast[1] || currLast[1] === prevLast[1] + 1;\n\n    const canGroup = sameDepth && sameLastKey && isConsecutive && (curr.length === 1 || samePrefix);\n\n    if (canGroup) {\n      currentGroup.push(curr);\n    } else {\n      result.push(buildCollapsedGroup(currentGroup));\n      currentGroup = [curr];\n    }\n  }\n\n  result.push(buildCollapsedGroup(currentGroup));\n\n  return result;\n}\n\nfunction isSamePrefix(a: [string, number][], b: [string, number][]): boolean {\n  for (let i = 0; i < a.length - 1; i++) {\n    if (a[i][0] !== b[i][0] || a[i][1] !== b[i][1]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction buildCollapsedGroup(group: [string, number][][]): [string, string][] {\n  const firstEntry = group[0];\n  const lastEntry = group[group.length - 1];\n\n  if (firstEntry.length === 1) {\n    const key = firstEntry[0][0];\n    const start = firstEntry[0][1];\n    const end = lastEntry[0][1];\n    const range = start === end ? `${start}` : `${start}-${end}`;\n    return [[key, range]];\n  }\n\n  const prefix = firstEntry.slice(0, -1).map(([k, v]) => [k, v.toString()]) as [string, string][];\n  const lastKey = firstEntry[firstEntry.length - 1][0];\n  const firstVal = firstEntry[firstEntry.length - 1][1];\n  const lastVal = lastEntry[lastEntry.length - 1][1];\n  const range = firstVal === lastVal ? `${firstVal}` : `${firstVal}-${lastVal}`;\n  return [...prefix, [lastKey, range]];\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../primitives/text\";\nimport { Modal } from \"../../modal\";\nimport { IPercentageUnit, IUnit } from \"../../../types\";\nimport { Button } from \"../../button\";\nimport { InputSelect } from \"../../inputSelect\";\nimport { Input } from \"../../input\";\nimport { MenuItemEditable } from \"../../menuItemEditable\";\nimport { LiftoEditorStateVars_nameError } from \"../../primitives/liftoEditorStateVars\";\n\ninterface IModalCreateStateVariableProps {\n  // The names already declared, so a duplicate is caught before it silently shadows one.\n  existingNames?: string[];\n  onClose: () => void;\n  onCreate: (name: string, type: IStateVariableType, isUserPrompted: boolean) => void;\n}\n\nexport type IStateVariableType = \"number\" | IUnit | IPercentageUnit;\n\nexport function ModalCreateStateVariableContent(props: IModalCreateStateVariableProps): JSX.Element {\n  const [name, setName] = useState<string>(\"\");\n  const [type, setType] = useState<IStateVariableType | undefined>(undefined);\n  const [showTypeError, setShowTypeError] = useState<boolean>(false);\n  const [showNameError, setShowNameError] = useState<boolean>(false);\n  const typeValues: [IStateVariableType, string][] = [\n    [\"number\", \"Number\"],\n    [\"kg\", \"Weight (kg)\"],\n    [\"lb\", \"Weight (lb)\"],\n    [\"%\", \"Percentage\"],\n  ];\n  const [isUserPrompted, setIsUserPrompted] = useState<boolean>(false);\n  const nameError = LiftoEditorStateVars_nameError(name, props.existingNames);\n\n  return (\n    <View className=\"items-center pb-4 bg-background-default\">\n      <Text className=\"mb-2 text-xs text-text-secondary\">\n        You can use state variables to store values between workouts, or parameterize your progress scripts. Use them\n        via <Text className=\"text-xs font-bold\">state.yourVariable</Text> in the script.\n      </Text>\n      <View className=\"w-full\">\n        <Input\n          label=\"Variable name\"\n          identifier=\"create-state-variable-name\"\n          // Scripts reference the name verbatim ('state.increment'), so an autocapitalized\n          // first letter is a typo the user can't see. On input, not on blur: Create can be\n          // tapped without ever blurring the field.\n          autoCapitalize=\"none\"\n          autoCorrect={false}\n          changeType=\"oninput\"\n          changeHandler={(r) => {\n            if (r.success) {\n              setName(r.data.trim());\n            }\n          }}\n        />\n        {showNameError && nameError != null && <Text className=\"text-xs text-text-error\">{nameError}</Text>}\n      </View>\n      <View className=\"w-full pt-2\">\n        <InputSelect\n          name=\"create-state-variable-type\"\n          label=\"Type\"\n          expandValue={true}\n          placeholder=\"Select a type\"\n          values={typeValues}\n          value={type}\n          onChange={(v) => {\n            if (v) {\n              setType(v);\n              setShowTypeError(false);\n            } else {\n              setType(undefined);\n              setShowTypeError(true);\n            }\n          }}\n        />\n        {showTypeError && <Text className=\"text-xs text-text-error\">Please select a type for the variable.</Text>}\n      </View>\n      <MenuItemEditable\n        name=\"User Prompted?\"\n        type=\"boolean\"\n        nextLine={\n          <View className=\"pb-2\" style={{ marginTop: -8 }}>\n            <Text className=\"text-xs text-text-secondary\">Will be asked for value at the end of workout</Text>\n          </View>\n        }\n        value={isUserPrompted ? \"true\" : \"false\"}\n        onChange={(v) => {\n          setIsUserPrompted(v === \"true\");\n        }}\n      />\n      <View className=\"items-center mt-4\">\n        <Button\n          kind=\"purple\"\n          name=\"modal-create-state-variable-submit\"\n          onClick={() => {\n            if (nameError != null) {\n              setShowNameError(true);\n            }\n            if (!type) {\n              setShowTypeError(true);\n            }\n            if (nameError != null || !type) {\n              return;\n            }\n            props.onCreate(name, type, isUserPrompted);\n            props.onClose();\n          }}\n        >\n          Create\n        </Button>\n      </View>\n    </View>\n  );\n}\n\nexport function ModalCreateStateVariable(props: IModalCreateStateVariableProps): JSX.Element {\n  return (\n    <Modal name=\"new-state-variable-modal\" onClose={props.onClose} shouldShowClose={true}>\n      <ModalCreateStateVariableContent {...props} />\n    </Modal>\n  );\n}\n","import { JSX, Fragment, Ref, useState } from \"react\";\nimport { View, Platform, LayoutAnimation, UIManager } from \"react-native\";\nimport { Pressable } from \"./primitives/pressable\";\nimport { Text } from \"./primitives/text\";\nimport { ILensRecordingPayload, lb, Lens } from \"lens-shmens\";\nimport { Weight_build, Weight_eqeq, Weight_compare, Weight_display, Weight_print } from \"../models/weight\";\nimport { ISettings, IEquipmentData, IEquipment, IAllEquipment, IUnit, IStats } from \"../types\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { MenuItem } from \"./menuItem\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { ILensDispatch } from \"../utils/useLensReducer\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { equipmentName } from \"../models/exercise\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState } from \"../models/state\";\nimport { IconArrowUp } from \"./icons/iconArrowUp\";\nimport { IconArrowDown2 } from \"./icons/iconArrowDown2\";\nimport { IconEyeClosed } from \"./icons/iconEyeClosed\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { Stats_getCurrentMovingAverageBodyweight } from \"../models/stats\";\nimport { MarkdownEditorBorderless } from \"./markdownEditorBorderless\";\nimport { IconEquipmentBarbell } from \"./icons/iconEquipmentBarbell\";\nimport { IconEquipmentCable } from \"./icons/iconEquipmentCable\";\nimport { IconEquipmentDumbbell } from \"./icons/iconEquipmentDumbbell\";\nimport { IconEquipmentEzBar } from \"./icons/iconEquipmentEzBar\";\nimport { IconEquipmentKettlebell } from \"./icons/iconEquipmentKettlebell\";\nimport { IconEquipmentLeverageMachine } from \"./icons/iconEquipmentLeverageMachine\";\nimport { IconEquipmentSmith } from \"./icons/iconEquipmentSmith\";\nimport { IconEquipmentTrapbar } from \"./icons/iconEquipmentTrapbar\";\nimport { Dialog_confirm } from \"../utils/dialog\";\n\nconst maxPlateNum = 1000;\n\ninterface IProps<T> {\n  dispatch: IDispatch;\n  lensPrefix: Lens<IState, IAllEquipment>;\n  expandedEquipment?: IEquipment;\n  expandedItemRef?: Ref<View>;\n  allEquipment: IAllEquipment;\n  settings: ISettings;\n  stats: IStats;\n}\n\nexport const equipmentToIcon: Record<string, () => JSX.Element> = {\n  barbell: () => <IconEquipmentBarbell />,\n  trapbar: () => <IconEquipmentTrapbar />,\n  leverageMachine: () => <IconEquipmentLeverageMachine />,\n  smith: () => <IconEquipmentSmith />,\n  dumbbell: () => <IconEquipmentDumbbell />,\n  ezbar: () => <IconEquipmentEzBar />,\n  cable: () => <IconEquipmentCable />,\n  kettlebell: () => <IconEquipmentKettlebell />,\n};\n\nfunction buildLensDispatch(originalDispatch: IDispatch): ILensDispatch<IState> {\n  return (lensRecording: ILensRecordingPayload<IState>[] | ILensRecordingPayload<IState>, desc: string) => {\n    originalDispatch({\n      type: \"UpdateState\",\n      lensRecording: Array.isArray(lensRecording) ? lensRecording : [lensRecording],\n      desc,\n    });\n  };\n}\n\nexport function EquipmentSettings<T>(props: IProps<T>): JSX.Element {\n  const lensDispatch = buildLensDispatch(props.dispatch);\n  const hiddenEquipment = ObjectUtils_keys(props.allEquipment).filter((e) => {\n    const eq = props.allEquipment[e];\n    return !eq?.name && eq?.isDeleted;\n  });\n  return (\n    <View>\n      {ObjectUtils_keys(props.allEquipment)\n        .filter((e) => !props.allEquipment[e]?.isDeleted)\n        .map((bar, i) => {\n          const equipmentData = props.allEquipment[bar];\n          if (equipmentData) {\n            return (\n              <View\n                key={bar}\n                ref={props.expandedEquipment === bar ? props.expandedItemRef : undefined}\n                className={`${i !== 0 ? \"mt-6\" : \"\"}`}\n              >\n                <EquipmentSettingsContent\n                  lensPrefix={props.lensPrefix}\n                  stats={props.stats}\n                  allEquipment={props.allEquipment}\n                  dispatch={props.dispatch}\n                  lensDispatch={lensDispatch}\n                  isExpanded={props.expandedEquipment === bar}\n                  equipment={bar}\n                  equipmentData={equipmentData}\n                  settings={props.settings}\n                />\n              </View>\n            );\n          } else {\n            return undefined;\n          }\n        })}\n      {hiddenEquipment.length > 0 && (\n        <View className=\"flex-row flex-wrap mx-4 my-2\">\n          <Text className=\"text-xs\">Hidden Equipment: </Text>\n          {hiddenEquipment.map((e, i) => (\n            <Fragment key={e}>\n              {i !== 0 && <Text className=\"text-xs\">, </Text>}\n              <LinkButton\n                className=\"text-xs\"\n                name={`show-equipment-${e}`}\n                onClick={() => {\n                  const lensRecording = props.lensPrefix\n                    .then(lb<IAllEquipment>().pi(e).p(\"isDeleted\").get())\n                    .record(false);\n                  lensDispatch(lensRecording, `Show equipment ${e}`);\n                }}\n              >\n                {equipmentName(e, props.allEquipment)}\n              </LinkButton>\n            </Fragment>\n          ))}\n        </View>\n      )}\n      <View className=\"m-4\">\n        <LinkButton className=\"text-sm\" name=\"add-new-equipment\" onClick={() => navigateToModal(\"newEquipmentModal\")}>\n          Add New Equipment Type\n        </LinkButton>\n      </View>\n    </View>\n  );\n}\n\ninterface IEquipmentSettingsContentProps<T> {\n  dispatch: IDispatch;\n  lensDispatch: ILensDispatch<T>;\n  lensPrefix: Lens<T, IAllEquipment>;\n  equipment: IEquipment;\n  stats: IStats;\n  allEquipment: IAllEquipment;\n  isExpanded?: boolean;\n  equipmentData: IEquipmentData;\n  settings: ISettings;\n}\n\ninterface IEquipmentRowHeaderProps<T> {\n  lensPrefix: Lens<T, IAllEquipment>;\n  lensDispatch: ILensDispatch<T>;\n  equipment: IEquipment;\n  equipmentData: IEquipmentData;\n  allEquipment: IAllEquipment;\n  settings: ISettings;\n  isExpanded: boolean;\n  onToggle: () => void;\n  headerRef?: Ref<View>;\n}\n\nexport function EquipmentRowHeader<T>(props: IEquipmentRowHeaderProps<T>): JSX.Element {\n  const name = equipmentName(props.equipment, props.allEquipment);\n  const icon = equipmentToIcon[props.equipment] ? equipmentToIcon[props.equipment]() : undefined;\n\n  return (\n    <View\n      ref={props.headerRef}\n      className={`px-2 border bg-background-default border-border-neutral ${\n        props.isExpanded ? \"rounded-t-xl\" : \"rounded-xl\"\n      }`}\n    >\n      <View\n        className={`flex-row items-center py-2 bg-background-default ${\n          props.isExpanded ? \"border-b border-background-subtle\" : \"\"\n        }`}\n        style={{ gap: 4 }}\n      >\n        <View className=\"flex-row items-center\">\n          <Pressable\n            className=\"px-2\"\n            testID={`group-header-${StringUtils_dashcase(name)}`}\n            data-testid={`group-header-${StringUtils_dashcase(name)}`}\n            onPress={props.onToggle}\n          >\n            {props.isExpanded ? <IconArrowUp /> : <IconArrowDown2 />}\n          </Pressable>\n        </View>\n        {icon && <View className=\"mr-1\">{icon}</View>}\n        <Pressable className=\"flex-1\" onPress={props.onToggle}>\n          <Text className=\"font-semibold\">{name}</Text>\n          {!props.isExpanded && <EquipmentSummary equipmentData={props.equipmentData} settings={props.settings} />}\n        </Pressable>\n        <View className=\"flex-row items-center\">\n          <Pressable\n            className=\"p-2\"\n            testID={`delete-equipment-${StringUtils_dashcase(name)}`}\n            data-testid={`delete-equipment-${StringUtils_dashcase(name)}`}\n            onPress={() => {\n              const doDelete = (): void => {\n                LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);\n                const lensRecording = props.lensPrefix\n                  .then(lb<IAllEquipment>().pi(props.equipment).p(\"isDeleted\").get())\n                  .record(true);\n                props.lensDispatch(lensRecording, \"Delete equipment\");\n              };\n              if (!props.equipmentData.name) {\n                doDelete();\n              } else {\n                confirmDelete(doDelete);\n              }\n            }}\n          >\n            {props.equipmentData.name ? <IconTrash /> : <IconEyeClosed />}\n          </Pressable>\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IEquipmentRowBodyProps<T> {\n  dispatch: IDispatch;\n  lensDispatch: ILensDispatch<T>;\n  lensPrefix: Lens<T, IAllEquipment>;\n  equipment: IEquipment;\n  equipmentData: IEquipmentData;\n  allEquipment: IAllEquipment;\n  settings: ISettings;\n  stats: IStats;\n}\n\nexport function EquipmentRowBody<T>(props: IEquipmentRowBodyProps<T>): JSX.Element {\n  return (\n    <View className=\"px-2 border border-t-0 bg-background-default rounded-b-xl border-border-neutral\">\n      <View className=\"px-2\">\n        {props.equipmentData.name && (\n          <MenuItemEditable\n            name=\"Name\"\n            type=\"text\"\n            value={props.equipmentData.name}\n            onChange={(newValue?: string) => {\n              if (newValue) {\n                const lensRecording = props.lensPrefix\n                  .then(lb<IAllEquipment>().pi(props.equipment).p(\"name\").get())\n                  .record(newValue || undefined);\n                props.lensDispatch(lensRecording, \"Change equipment name\");\n              }\n            }}\n          />\n        )}\n        <EquipmentSettingsValues\n          lensPrefix={props.lensPrefix}\n          equipment={props.equipment}\n          allEquipment={props.allEquipment}\n          stats={props.stats}\n          settings={props.settings}\n          dispatch={props.dispatch}\n          lensDispatch={props.lensDispatch}\n          equipmentData={props.equipmentData}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction EquipmentSummary(props: { equipmentData: IEquipmentData; settings: ISettings }): JSX.Element {\n  const { equipmentData, settings } = props;\n  const unit = equipmentData.unit ?? settings.units;\n\n  if (equipmentData.isFixed) {\n    const fixedWeights = CollectionUtils_sort(\n      equipmentData.fixed.filter((w) => w.unit === unit),\n      (a, b) => Weight_compare(a, b)\n    );\n    if (fixedWeights.length === 0) {\n      return <Text className=\"text-xs text-text-secondary\">Fixed weights</Text>;\n    }\n    const display = fixedWeights.slice(0, 10).map((w) => Weight_print(w));\n    return (\n      <Text className=\"text-xs text-text-secondary\">\n        {display.join(\", \")}\n        {fixedWeights.length > 10 ? `, and ${fixedWeights.length - 10} more` : \"\"}\n      </Text>\n    );\n  }\n\n  const barWeight = equipmentData.bar[unit];\n  const plates = CollectionUtils_sort(\n    equipmentData.plates.filter((p) => p.weight.unit === unit && p.num > 0),\n    (a, b) => Weight_compare(b.weight, a.weight)\n  );\n\n  const parts: string[] = [];\n  if (barWeight && barWeight.value > 0) {\n    parts.push(`Bar: ${Weight_print(barWeight)}`);\n  }\n  if (plates.length > 0) {\n    const plateStrs = plates.map((p) => `${Weight_print(p.weight)}×${p.num}`);\n    parts.push(plateStrs.join(\", \"));\n  }\n\n  if (parts.length === 0) {\n    return <Text className=\"text-xs text-text-secondary\">No plates configured</Text>;\n  }\n  return <Text className=\"text-xs text-text-secondary\">{parts.join(\" · \")}</Text>;\n}\n\nasync function confirmDelete(onConfirm: () => void): Promise<void> {\n  if (await Dialog_confirm(\"Are you sure?\")) {\n    onConfirm();\n  }\n}\n\nif (Platform.OS === \"android\" && UIManager.setLayoutAnimationEnabledExperimental) {\n  UIManager.setLayoutAnimationEnabledExperimental(true);\n}\n\nfunction toggleWithAnimation(setter: (fn: (prev: boolean) => boolean) => void): void {\n  LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);\n  setter((prev) => !prev);\n}\n\nexport function EquipmentSettingsContent<T>(props: IEquipmentSettingsContentProps<T>): JSX.Element {\n  const [isExpanded, setIsExpanded] = useState<boolean>(props.isExpanded ?? false);\n  return (\n    <View>\n      <EquipmentRowHeader\n        lensPrefix={props.lensPrefix}\n        lensDispatch={props.lensDispatch}\n        equipment={props.equipment}\n        equipmentData={props.equipmentData}\n        allEquipment={props.allEquipment}\n        settings={props.settings}\n        isExpanded={isExpanded}\n        onToggle={() => toggleWithAnimation(setIsExpanded)}\n      />\n      {isExpanded && (\n        <EquipmentRowBody\n          lensPrefix={props.lensPrefix}\n          lensDispatch={props.lensDispatch}\n          dispatch={props.dispatch}\n          equipment={props.equipment}\n          equipmentData={props.equipmentData}\n          allEquipment={props.allEquipment}\n          settings={props.settings}\n          stats={props.stats}\n        />\n      )}\n    </View>\n  );\n}\n\ninterface IEquipmentSettingsValuesProps<T> {\n  lensDispatch: ILensDispatch<T>;\n  dispatch: IDispatch;\n  lensPrefix: Lens<T, IAllEquipment>;\n  equipment: IEquipment;\n  stats: IStats;\n  allEquipment: IAllEquipment;\n  settings: ISettings;\n  equipmentData: IEquipmentData;\n}\n\nexport function EquipmentSettingsValues<T>(props: IEquipmentSettingsValuesProps<T>): JSX.Element {\n  return (\n    <>\n      <MenuItemEditable\n        name=\"Is Fixed Weight\"\n        type=\"boolean\"\n        value={props.equipmentData.isFixed ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          const lensRecording = props.lensPrefix\n            .then(lb<IAllEquipment>().pi(props.equipment).p(\"isFixed\").get())\n            .record(newValue === \"true\");\n          props.lensDispatch(lensRecording, \"Toggle fixed equipment\");\n        }}\n      />\n      <MenuItemEditable\n        name=\"Unit\"\n        type=\"select\"\n        value={props.equipmentData.unit ?? \"\"}\n        values={[\n          [\"\", \"Default\"],\n          [\"lb\", \"lb\"],\n          [\"kg\", \"kg\"],\n        ]}\n        onChange={(newValue?: string) => {\n          if (!newValue) {\n            newValue = undefined;\n          }\n          props.lensDispatch(\n            props.lensPrefix\n              .then(lb<IAllEquipment>().pi(props.equipment).p(\"unit\").get())\n              .record(newValue as IUnit | undefined),\n            \"Change equipment unit\"\n          );\n          props.dispatch({\n            type: \"ApplyProgramChangesToProgress\",\n          });\n        }}\n      />\n      {props.equipmentData.isFixed ? (\n        <EquipmentSettingsFixed\n          lensPrefix={props.lensPrefix}\n          equipmentData={props.equipmentData}\n          allEquipment={props.allEquipment}\n          name={props.equipment}\n          settings={props.settings}\n          dispatch={props.lensDispatch}\n        />\n      ) : (\n        <EquipmentSettingsPlates\n          lensPrefix={props.lensPrefix}\n          stats={props.stats}\n          equipmentData={props.equipmentData}\n          allEquipment={props.allEquipment}\n          name={props.equipment}\n          settings={props.settings}\n          dispatch={props.lensDispatch}\n        />\n      )}\n    </>\n  );\n}\n\ninterface IEquipmentSettingsFixedProps<T> {\n  dispatch: ILensDispatch<T>;\n  lensPrefix: Lens<T, IAllEquipment>;\n  allEquipment: IAllEquipment;\n  name: IEquipment;\n  settings: ISettings;\n  equipmentData: IEquipmentData;\n}\n\nfunction EquipmentSettingsFixed<T>(props: IEquipmentSettingsFixedProps<T>): JSX.Element {\n  const { equipmentData } = props;\n  const units = equipmentData.unit ?? props.settings.units;\n  const fixed = CollectionUtils_sort(\n    equipmentData.fixed.filter((p) => p.unit === units),\n    (a, b) => Weight_compare(b, a)\n  );\n  return (\n    <View className=\"mb-4\">\n      <GroupHeader\n        topPadding={true}\n        name={`Available fixed weight for ${equipmentName(props.name, props.allEquipment)}`}\n      />\n      {fixed.map((weight, i) => {\n        return (\n          <MenuItem\n            key={i}\n            name={Weight_display(weight)}\n            value={\n              <Pressable\n                testID=\"nm-remove-fixed-weight\"\n                data-testid=\"nm-remove-fixed-weight\"\n                onPress={() => {\n                  const newFixedWeights = equipmentData.fixed.filter((p) => !Weight_eqeq(p, weight));\n                  const lensRecording = props.lensPrefix\n                    .then(lb<IAllEquipment>().pi(props.name).p(\"fixed\").get())\n                    .record(newFixedWeights);\n                  props.dispatch(lensRecording, \"Update fixed weights\");\n                }}\n              >\n                <IconTrash />\n              </Pressable>\n            }\n          />\n        );\n      })}\n      <LinkButton\n        className=\"text-xs\"\n        name=\"add-new-fixed-weight\"\n        onClick={() => navigateToModal(\"newFixedWeightModal\", { equipment: props.name })}\n      >\n        Add New Fixed Weight\n      </LinkButton>\n    </View>\n  );\n}\n\ninterface IEquipmentSettingsPlatesProps<T> {\n  dispatch: ILensDispatch<T>;\n  lensPrefix: Lens<T, IAllEquipment>;\n  allEquipment: IAllEquipment;\n  settings: ISettings;\n  stats: IStats;\n  name: IEquipment;\n  equipmentData: IEquipmentData;\n}\n\nfunction EquipmentSettingsPlates<T>(props: IEquipmentSettingsPlatesProps<T>): JSX.Element {\n  const { equipmentData, settings } = props;\n  const units = equipmentData.unit ?? settings.units;\n  const barWeight = equipmentData.bar[units];\n  const plates = CollectionUtils_sort(\n    equipmentData.plates.filter((p) => p.weight.unit === units),\n    (a, b) => Weight_compare(b.weight, a.weight)\n  );\n  const currentBodyweight = equipmentData.useBodyweightForBar\n    ? Stats_getCurrentMovingAverageBodyweight(props.stats, props.settings)\n    : undefined;\n  return (\n    <View className=\"mb-4\">\n      {equipmentData.useBodyweightForBar ? (\n        <View className=\"opacity-50\">\n          <MenuItem name=\"Bar\" value={currentBodyweight != null ? Weight_print(currentBodyweight) : \"None\"} />\n        </View>\n      ) : (\n        <MenuItemEditable\n          name=\"Bar\"\n          type=\"number\"\n          value={barWeight.value.toString()}\n          valueUnits={barWeight.unit}\n          onChange={(newValue?: string) => {\n            const v = newValue != null && newValue !== \"\" ? parseFloat(newValue) : null;\n            if (v != null && !isNaN(v)) {\n              const lensRecording = props.lensPrefix\n                .then(lb<IAllEquipment>().pi(props.name).p(\"bar\").p(units).get())\n                .record(Weight_build(v, units));\n              props.dispatch(lensRecording, \"Change bar weight\");\n            }\n          }}\n        />\n      )}\n      <MenuItemEditable\n        name=\"Bodyweight for Bar\"\n        type=\"boolean\"\n        value={equipmentData.useBodyweightForBar ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          const lensRecording = props.lensPrefix\n            .then(lb<IAllEquipment>().pi(props.name).p(\"useBodyweightForBar\").get())\n            .record(newValue === \"true\");\n          props.dispatch(lensRecording, \"Toggle bodyweight for bar\");\n        }}\n      />\n      <MenuItemEditable\n        name=\"Is assisting?\"\n        underName={\n          <Text className=\"text-xs text-text-secondary\">\n            If it should reduce total weight, e.g. for assisted pullups\n          </Text>\n        }\n        type=\"boolean\"\n        value={equipmentData.isAssisting ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          const lensRecording = props.lensPrefix\n            .then(lb<IAllEquipment>().pi(props.name).p(\"isAssisting\").get())\n            .record(newValue === \"true\");\n          props.dispatch(lensRecording, \"Toggle is assisting equipment\");\n        }}\n      />\n      <MenuItemEditable\n        name=\"Sides\"\n        type=\"number\"\n        value={equipmentData.multiplier.toString()}\n        onChange={(newValue?: string) => {\n          const v = newValue != null && newValue !== \"\" ? parseInt(newValue, 10) : null;\n          if (v != null && !isNaN(v)) {\n            const value = Math.min(Math.max(1, v), 4);\n            const lensRecording = [\n              props.lensPrefix.then(lb<IAllEquipment>().pi(props.name).p(\"multiplier\").get()).record(value),\n              props.lensPrefix.then(lb<IAllEquipment>().pi(props.name).p(\"plates\").get()).recordModify((pl) => {\n                if (!pl) {\n                  return pl;\n                }\n                const newPlates = pl.map((plate) => {\n                  return {\n                    ...plate,\n                    num: Math.floor(plate.num / value) * value,\n                  };\n                });\n                return newPlates;\n              }),\n            ];\n            props.dispatch(lensRecording, \"Update multiplier\");\n          }\n        }}\n      />\n      <GroupHeader topPadding={true} name=\"Notes\" />\n      <View style={{ marginLeft: -4, marginRight: -4 }}>\n        <MarkdownEditorBorderless\n          debounceMs={500}\n          value={equipmentData.notes}\n          placeholder={`Hints or equipment specifics in Markdown...`}\n          onChange={(v) => {\n            const lensRecording = props.lensPrefix.then(lb<IAllEquipment>().pi(props.name).p(\"notes\").get()).record(v);\n            props.dispatch(lensRecording, \"Update plate\");\n          }}\n        />\n      </View>\n      <GroupHeader\n        topPadding={true}\n        name={`Number of ${equipmentName(props.name, props.allEquipment)} plates available`}\n      />\n      {plates.map((plate) => {\n        return (\n          <MenuItemEditable\n            key={`${plate.weight.value}-${plate.weight.unit}`}\n            name={`${plate.weight.value} ${plate.weight.unit}`}\n            type=\"number\"\n            value={plate.num.toString()}\n            hasClear={true}\n            onChange={(newValue?: string) => {\n              const v = newValue != null && newValue !== \"\" ? parseInt(newValue, 10) : null;\n              if (v != null && isNaN(v)) {\n                return;\n              }\n              const lensRecording = props.lensPrefix\n                .then(lb<IAllEquipment>().pi(props.name).p(\"plates\").get())\n                .recordModify((pl) => {\n                  if (!pl) {\n                    return pl;\n                  }\n                  let newPlates;\n                  if (v != null) {\n                    const clampedV = Math.min(Math.max(0, v), maxPlateNum);\n                    const num = Math.floor(clampedV / equipmentData.multiplier) * equipmentData.multiplier;\n                    newPlates = pl.map((p) => (Weight_eqeq(p.weight, plate.weight) ? { ...p, num } : p));\n                  } else {\n                    newPlates = pl.filter((p) => !Weight_eqeq(p.weight, plate.weight));\n                  }\n                  return newPlates;\n                });\n              props.dispatch(lensRecording, \"Update plate\");\n            }}\n          />\n        );\n      })}\n      <LinkButton\n        className=\"text-sm\"\n        name=\"add-new-plate-weight\"\n        onClick={() => navigateToModal(\"newPlateModal\", { equipment: props.name })}\n      >\n        Add New Plate Weight\n      </LinkButton>\n    </View>\n  );\n}\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IHistoryRecord, ISet, ISettings, IWeight } from \"../types\";\nimport { Weight_display, Weight_convertTo, Weight_build } from \"../models/weight\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { MenuItem } from \"./menuItem\";\nimport { Thunk_editHistoryRecord } from \"../ducks/thunks\";\nimport { useTrackClick } from \"../utils/clickTracking\";\n\ninterface IExerciseAllTimePRsProps {\n  settings: ISettings;\n  dispatch: IDispatch;\n  maxWeight?: { weight: IWeight; historyRecord?: IHistoryRecord };\n  max1RM?: { weight: IWeight; set?: ISet; historyRecord?: IHistoryRecord };\n}\n\nfunction ExerciseAllTimePRsInner(props: IExerciseAllTimePRsProps): JSX.Element {\n  const { maxWeight, max1RM } = props;\n  const trackClick = useTrackClick();\n\n  return (\n    <View\n      data-testid=\"exercise-stats-pr\"\n      testID=\"exercise-stats-pr\"\n      className=\"px-4 py-2 bg-background-cardpurple rounded-2xl\"\n    >\n      <GroupHeader topPadding={false} name=\"🏆 Personal Records\" />\n      {maxWeight && (\n        <MenuItem\n          name=\"Max Weight\"\n          expandName={true}\n          onClick={() => {\n            trackClick(\"exercise-pr-record\");\n            if (maxWeight.historyRecord) {\n              props.dispatch(Thunk_editHistoryRecord(maxWeight.historyRecord));\n            }\n          }}\n          value={\n            <View>\n              <Text className=\"text-text-primary text-right\" data-testid=\"max-weight-value\" testID=\"max-weight-value\">\n                {Weight_display(Weight_convertTo(maxWeight.weight, props.settings.units))}\n              </Text>\n              {maxWeight.historyRecord && (\n                <Text className=\"text-xs text-text-secondary text-right\">\n                  {DateUtils_format(maxWeight.historyRecord.startTime)}\n                </Text>\n              )}\n            </View>\n          }\n          shouldShowRightArrow={true}\n        />\n      )}\n      {max1RM && (\n        <MenuItem\n          isBorderless={true}\n          expandValue={true}\n          onClick={() => {\n            trackClick(\"exercise-pr-record\");\n            if (max1RM.historyRecord) {\n              props.dispatch(Thunk_editHistoryRecord(max1RM.historyRecord));\n            }\n          }}\n          name=\"Max 1RM\"\n          value={\n            <View>\n              <Text className=\"text-text-primary text-right\" data-testid=\"one-rm-value\" testID=\"one-rm-value\">\n                {Weight_display(Weight_convertTo(max1RM.weight, props.settings.units))}\n                {max1RM.set\n                  ? ` (${max1RM.set.completedReps} x ${Weight_display(max1RM.set.completedWeight ?? max1RM.set.weight ?? Weight_build(0, props.settings.units))})`\n                  : \"\"}\n              </Text>\n              {max1RM.historyRecord && (\n                <Text className=\"text-xs text-text-secondary text-right\">\n                  {DateUtils_format(max1RM.historyRecord.startTime)}\n                </Text>\n              )}\n            </View>\n          }\n          shouldShowRightArrow={true}\n        />\n      )}\n    </View>\n  );\n}\n\nexport const ExerciseAllTimePRs = memo(ExerciseAllTimePRsInner);\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  equipmentName,\n  IExercise,\n  Exercise_defaultRounding,\n  Exercise_getIsUnilateral,\n  Exercise_getVolumeMultiplier,\n  Exercise_toKey,\n} from \"../models/exercise\";\nimport { updateState, IState, updateSettings } from \"../models/state\";\nimport { Weight_build } from \"../models/weight\";\nimport { ISettings } from \"../types\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { ExerciseRM } from \"./exerciseRm\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { InputNumber } from \"./inputNumber\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport {\n  EditEquipment_setDefaultRoundingForExercise,\n  EditEquipment_setEquipmentForExercise,\n} from \"../models/editEquipment\";\nimport { Equipment_getEquipmentIdForExerciseType } from \"../models/equipment\";\n\ninterface IExerciseDataSettingsProps {\n  settings: ISettings;\n  dispatch: IDispatch;\n  programExerciseIds: string[];\n  fullExercise: IExercise;\n  show1RM: boolean;\n}\n\nfunction ExerciseDataSettingsInner(props: IExerciseDataSettingsProps): JSX.Element {\n  const fullExercise = props.fullExercise;\n\n  return (\n    <View className=\"my-2\">\n      <InputNumber\n        type=\"number\"\n        label=\"Default Rounding\"\n        min={0}\n        step={0.5}\n        max={100}\n        value={Exercise_defaultRounding(fullExercise, props.settings)}\n        onUpdate={(value) => {\n          EditEquipment_setDefaultRoundingForExercise(props.dispatch, fullExercise, value);\n        }}\n      />\n      <Text className=\"text-xs text-right text-text-secondary\">Used when Equipment is not set</Text>\n      {props.settings.gyms.length > 1 && (\n        <View className=\"mt-2\">\n          <GroupHeader name=\"Equipments for each Gym\" />\n        </View>\n      )}\n      {props.settings.gyms.map((gym, i) => {\n        const equipment = Equipment_getEquipmentIdForExerciseType(props.settings, props.fullExercise, gym.id);\n        const values: [string, string][] = [\n          [\"\", \"None\"],\n          ...ObjectUtils_keys(gym.equipment)\n            .filter((e) => !gym.equipment[e]?.isDeleted)\n            .map<[string, string]>((id) => [id, equipmentName(id, gym.equipment)]),\n        ];\n        return (\n          <MenuItemEditable\n            key={gym.id}\n            type=\"select\"\n            name={props.settings.gyms.length > 1 ? gym.name : \"Equipment\"}\n            underName={\n              props.settings.gyms.length > 1 && props.settings.currentGymId === gym.id ? (\n                <Text className=\"text-xs leading-none text-text-secondary\">current</Text>\n              ) : undefined\n            }\n            value={equipment ?? \"\"}\n            values={values}\n            onChange={(value) => {\n              EditEquipment_setEquipmentForExercise(\n                fullExercise,\n                value,\n                props.programExerciseIds,\n                props.dispatch,\n                props.settings,\n                gym.id\n              );\n            }}\n          />\n        );\n      })}\n      <MenuItemEditable\n        type=\"boolean\"\n        name=\"Is Unilateral\"\n        value={Exercise_getIsUnilateral(fullExercise, props.settings) ? \"true\" : \"false\"}\n        onChange={(value) => {\n          const isUnilateral = value === \"true\";\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>()\n              .p(\"exerciseData\")\n              .recordModify((exerciseData) => {\n                const k = Exercise_toKey(fullExercise);\n                return { ...exerciseData, [k]: { ...exerciseData[k], isUnilateral } };\n              }),\n            \"Set exercise unilateral setting\"\n          );\n        }}\n      />\n      <MenuItemEditable\n        type=\"boolean\"\n        name=\"Two weights (count both)\"\n        value={Exercise_getVolumeMultiplier(fullExercise, props.settings) === 2 ? \"true\" : \"false\"}\n        onChange={(value) => {\n          const volumeMultiplier = value === \"true\" ? 2 : 1;\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>()\n              .p(\"exerciseData\")\n              .recordModify((exerciseData) => {\n                const k = Exercise_toKey(fullExercise);\n                return { ...exerciseData, [k]: { ...exerciseData[k], volumeMultiplier } };\n              }),\n            \"Set exercise two-weights setting\"\n          );\n        }}\n      />\n\n      {props.show1RM && (\n        <ExerciseRM\n          name=\"1 Rep Max\"\n          rmKey=\"rm1\"\n          exercise={fullExercise}\n          settings={props.settings}\n          onEditVariable={(value) => {\n            updateState(\n              props.dispatch,\n              [\n                lb<IState>()\n                  .p(\"storage\")\n                  .p(\"settings\")\n                  .p(\"exerciseData\")\n                  .recordModify((data) => {\n                    const k = Exercise_toKey(fullExercise);\n                    return { ...data, [k]: { ...data[k], rm1: Weight_build(value, props.settings.units) } };\n                  }),\n              ],\n              \"Update 1RM for exercise\"\n            );\n          }}\n        />\n      )}\n    </View>\n  );\n}\n\nexport const ExerciseDataSettings = memo(ExerciseDataSettingsInner);\n","import { JSX, memo, useCallback, useMemo, useState } from \"react\";\nimport { usePerfWhyRender } from \"../utils/usePerfWhyRender\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Pressable } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IExerciseType, IHistoryRecord, ISettings, IUnit } from \"../types\";\nimport { Weight_print, Weight_is, Weight_isPct, Weight_display, Weight_multiply } from \"../models/weight\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { useProgressiveItems } from \"../utils/useProgressiveItems\";\nimport {\n  Exercise_get,\n  Exercise_fullName,\n  Exercise_eq,\n  Exercise_toKey,\n  Exercise_getVolumeMultiplier,\n  IExercise,\n} from \"../models/exercise\";\nimport { Reps_volume } from \"../models/set\";\nimport { History_getPersonalRecords, IPersonalRecords } from \"../models/history\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { HistoryRecordSetsView } from \"./historyRecordSets\";\nimport { FastText } from \"./primitives/fastText\";\nimport { StyledText, StyledText_remToPx } from \"../utils/styledText\";\nimport { useRem } from \"../utils/useRem\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { lb } from \"lens-shmens\";\nimport { updateSettings } from \"../models/state\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { IconFilter } from \"./icons/iconFilter\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { Thunk_editHistoryRecord } from \"../ducks/thunks\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IExerciseHistoryProps {\n  exerciseType: IExerciseType;\n  settings: ISettings;\n  dispatch: IDispatch;\n  history: IHistoryRecord[];\n  source: \"workout\" | \"stats\";\n  firstRecordProbe?: { ref: (node: View | null) => void; onLayout: () => void };\n}\n\nconst WORKOUT_HISTORY_LOADING = { initialBatch: 0, batchSize: 10, idleCap: 0, threshold: 50 };\nconst STATS_HISTORY_LOADING = { initialBatch: 5, batchSize: 15, idleCap: 10 };\n\nexport const ExerciseHistory = memo((props: IExerciseHistoryProps): JSX.Element => {\n  usePerfWhyRender(\"history\", props as unknown as Record<string, unknown>);\n  const fullExercise = useMemo(\n    () => Exercise_get(props.exerciseType, props.settings.exercises),\n    [props.exerciseType, props.settings.exercises]\n  );\n  const allPrs = useMemo(() => History_getPersonalRecords(props.history), [props.history]);\n  const [showFilters, setShowFilters] = useState(false);\n  const { hideWithoutExerciseNotes, hideWithoutWorkoutNotes, ascendingSort } = props.settings.exerciseStatsSettings;\n  const history = useMemo(() => {\n    if (!hideWithoutExerciseNotes && !hideWithoutWorkoutNotes) {\n      return props.history;\n    }\n    return props.history.filter((hr) => {\n      let result = true;\n      if (hideWithoutExerciseNotes) {\n        result = result && hr.entries.some((e) => e.notes);\n      }\n      if (hideWithoutWorkoutNotes) {\n        result = result && !!hr.notes;\n      }\n      return result;\n    });\n  }, [props.history, hideWithoutExerciseNotes, hideWithoutWorkoutNotes]);\n  const visibleHistory = useProgressiveItems(history, {\n    ...(props.source === \"workout\" ? WORKOUT_HISTORY_LOADING : STATS_HISTORY_LOADING),\n    debugLabel: \"ExerciseHistory\",\n    resetKey: `${Exercise_toKey(props.exerciseType)}|${hideWithoutExerciseNotes ? 1 : 0}|${\n      hideWithoutWorkoutNotes ? 1 : 0\n    }|${ascendingSort ? 1 : 0}`,\n  });\n  const dispatch = props.dispatch;\n  const onToggleFilters = useCallback(() => setShowFilters((s) => !s), []);\n  const onToggleAscending = useCallback(() => {\n    updateSettings(\n      dispatch,\n      lb<ISettings>().p(\"exerciseStatsSettings\").p(\"ascendingSort\").record(!ascendingSort),\n      \"Toggle sort order\"\n    );\n  }, [dispatch, ascendingSort]);\n  const onToggleHideExerciseNotes = useCallback(() => {\n    updateSettings(\n      dispatch,\n      lb<ISettings>().p(\"exerciseStatsSettings\").p(\"hideWithoutExerciseNotes\").record(!hideWithoutExerciseNotes),\n      \"Toggle exercise notes filter\"\n    );\n  }, [dispatch, hideWithoutExerciseNotes]);\n  const onToggleHideWorkoutNotes = useCallback(() => {\n    updateSettings(\n      dispatch,\n      lb<ISettings>().p(\"exerciseStatsSettings\").p(\"hideWithoutWorkoutNotes\").record(!hideWithoutWorkoutNotes),\n      \"Toggle workout notes filter\"\n    );\n  }, [dispatch, hideWithoutWorkoutNotes]);\n  const headerName = useMemo(\n    () => `${Exercise_fullName(fullExercise, props.settings)} History`,\n    [fullExercise, props.settings]\n  );\n\n  return (\n    <View data-testid=\"exercise-stats-history\">\n      <GroupHeader\n        topPadding={true}\n        name={headerName}\n        rightAddOn={\n          <Pressable\n            className=\"p-2\"\n            data-testid=\"exercise-stats-history-filter\"\n            testID=\"exercise-stats-history-filter\"\n            style={{ marginRight: -8, marginTop: -8 }}\n            onPress={onToggleFilters}\n          >\n            <IconFilter />\n          </Pressable>\n        }\n      />\n      {showFilters && (\n        <View>\n          <MenuItemEditable\n            type=\"boolean\"\n            name=\"Ascending sort by date\"\n            value={!!ascendingSort ? \"true\" : \"false\"}\n            onChange={onToggleAscending}\n          />\n          <MenuItemEditable\n            type=\"boolean\"\n            name=\"Hide entries without exercise notes\"\n            value={!!hideWithoutExerciseNotes ? \"true\" : \"false\"}\n            onChange={onToggleHideExerciseNotes}\n          />\n          <MenuItemEditable\n            type=\"boolean\"\n            name=\"Hide entries without workout notes\"\n            value={!!hideWithoutWorkoutNotes ? \"true\" : \"false\"}\n            onChange={onToggleHideWorkoutNotes}\n          />\n        </View>\n      )}\n      {visibleHistory.map((historyRecord, index) => {\n        const record = (\n          <ExerciseHistoryRecord\n            key={historyRecord.id}\n            historyRecord={historyRecord}\n            fullExercise={fullExercise}\n            units={props.settings.units}\n            settings={props.settings}\n            prs={allPrs[historyRecord.id]}\n            source={props.source}\n            dispatch={props.dispatch}\n          />\n        );\n        if (index !== 0 || props.firstRecordProbe == null) {\n          return record;\n        }\n        return (\n          <View key={historyRecord.id} ref={props.firstRecordProbe.ref} onLayout={props.firstRecordProbe.onLayout}>\n            {record}\n          </View>\n        );\n      })}\n    </View>\n  );\n});\n\ninterface IExerciseHistoryRecordProps {\n  historyRecord: IHistoryRecord;\n  fullExercise: IExercise;\n  units: IUnit;\n  settings: ISettings;\n  prs: IPersonalRecords[string];\n  source: \"workout\" | \"stats\";\n  dispatch: IDispatch;\n}\n\nconst ExerciseHistoryRecord = memo((props: IExerciseHistoryRecordProps): JSX.Element => {\n  const { historyRecord, fullExercise, units, settings, prs, source, dispatch } = props;\n  const rem = useRem();\n  const secondary = Tailwind_semantic().text.secondary;\n  const xs = StyledText_remToPx(\"xs\", rem);\n  const exerciseEntries = historyRecord.entries.filter((e) => Exercise_eq(e.exercise, fullExercise));\n  const exerciseNotes = exerciseEntries.map((e) => e.notes).filter((e) => e);\n  const trackClick = useTrackClick();\n  const onClick = useCallback(() => {\n    trackClick(\"exercise-history-record\", undefined, { source });\n    dispatch(Thunk_editHistoryRecord(historyRecord));\n  }, [dispatch, historyRecord, trackClick, source]);\n  return (\n    <MenuItemWrapper onClick={onClick} name={`${historyRecord.startTime}`}>\n      <View className=\"py-2\">\n        <View className=\"flex-row\">\n          <Text className=\"mr-2 text-xs font-bold text-text-secondary\">{DateUtils_format(historyRecord.date)}</Text>\n          <Text className=\"flex-1 text-xs text-right text-text-secondary\">\n            {historyRecord.programName}, {historyRecord.dayName}\n          </Text>\n        </View>\n        <View className=\"flex-row\">\n          <View className=\"flex-1\">\n            <View>\n              {exerciseEntries.map((entry, ei) => {\n                const entryPrs = prs?.[Exercise_toKey(entry.exercise)];\n                const state = { ...entry.state };\n                const vars = entry.vars || {};\n                for (const key of ObjectUtils_keys(vars)) {\n                  const name = { rm1: \"1 Rep Max\" }[key] || key;\n                  state[name] = vars[key];\n                }\n                const volume = Weight_multiply(\n                  Reps_volume(entry.sets, units),\n                  Exercise_getVolumeMultiplier(entry.exercise, settings)\n                );\n                return (\n                  <View key={ei} className=\"pt-1\">\n                    <View className=\"items-end\">\n                      <HistoryRecordSetsView\n                        showPrDetails={true}\n                        prs={entryPrs}\n                        sets={entry.sets}\n                        units={units}\n                        isNext={false}\n                      />\n                    </View>\n                    {volume.value > 0 &&\n                      (() => {\n                        const builder = new StyledText();\n                        builder.add(\"Volume: \");\n                        builder.add(Weight_print(volume), { fontWeight: \"700\" });\n                        const built = builder.build();\n                        return (\n                          <FastText\n                            text={built.text}\n                            fragments={built.fragments}\n                            color={secondary}\n                            fontSize={xs}\n                            style={{ marginBottom: rem / 4 }}\n                          />\n                        );\n                      })()}\n                    {Object.keys(state).length > 0 &&\n                      (() => {\n                        const builder = new StyledText();\n                        ObjectUtils_keys(state).forEach((stateKey, si) => {\n                          const value = state[stateKey];\n                          const displayValue = Weight_is(value) || Weight_isPct(value) ? Weight_display(value) : value;\n                          if (si !== 0) {\n                            builder.add(\", \");\n                          }\n                          builder.add(`${stateKey} - `);\n                          builder.add(`${displayValue}`, { fontWeight: \"700\" });\n                        });\n                        const built = builder.build();\n                        return (\n                          <FastText text={built.text} fragments={built.fragments} color={secondary} fontSize={xs} />\n                        );\n                      })()}\n                  </View>\n                );\n              })}\n            </View>\n            {exerciseNotes.length > 0 && (\n              <View>\n                {exerciseNotes.map((n, ni) => (\n                  <Text key={ni} className=\"text-sm text-text-secondary\">\n                    {n}\n                  </Text>\n                ))}\n              </View>\n            )}\n            {!!historyRecord.notes && (\n              <Text className=\"text-sm text-text-secondary\">\n                <Text className=\"text-sm font-bold\">Workout: </Text>\n                <Text className=\"text-sm\">{historyRecord.notes}</Text>\n              </Text>\n            )}\n          </View>\n          <View className=\"flex-row items-center py-2 pl-2\">\n            <IconArrowRight color={Tailwind_semantic().icon.neutral} />\n          </View>\n        </View>\n      </View>\n    </MenuItemWrapper>\n  );\n});\n","import { JSX, ReactNode, memo, useState } from \"react\";\nimport { View, Image } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { IExerciseType, ISettings } from \"../types\";\nimport { IconDefaultExercise } from \"./icons/iconDefaultExercise\";\nimport {\n  ExerciseImageUtils_url,\n  ExerciseImageUtils_exists,\n  ExerciseImageUtils_existsCustom,\n} from \"../models/exerciseImage\";\nimport { Exercise_get, Exercise_nameWithEquipment } from \"../models/exercise\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\nimport { ImageCache_initialUri, ImageCache_markMissing, ImageCache_download } from \"../utils/imageCache\";\nimport { useRemScale } from \"../utils/useRem\";\n\ninterface IProps {\n  exerciseType: IExerciseType;\n  size: \"large\" | \"small\";\n  useTextForCustomExercise?: boolean;\n  useBorderForCustomExercise?: boolean;\n  suppressCustom?: boolean;\n  settings?: ISettings;\n  className?: string;\n  customClassName?: string;\n  width?: number;\n}\n\nfunction areExerciseImagePropsEqual(prev: IProps, next: IProps): boolean {\n  return (\n    prev.size === next.size &&\n    prev.useTextForCustomExercise === next.useTextForCustomExercise &&\n    prev.useBorderForCustomExercise === next.useBorderForCustomExercise &&\n    prev.suppressCustom === next.suppressCustom &&\n    prev.className === next.className &&\n    prev.customClassName === next.customClassName &&\n    prev.width === next.width &&\n    prev.exerciseType.id === next.exerciseType.id &&\n    prev.exerciseType.equipment === next.exerciseType.equipment &&\n    prev.settings?.exercises === next.settings?.exercises\n  );\n}\n\nexport const ExerciseImage = memo(function ExerciseImage(props: IProps): JSX.Element | null {\n  const { size } = props;\n  const remScale = useRemScale();\n  const exercise = Exercise_get(props.exerciseType, props.settings?.exercises || {});\n  const exerciseType = {\n    id: props.exerciseType.id,\n    equipment: props.exerciseType.equipment || exercise.defaultEquipment,\n  };\n\n  const rawSrc = ExerciseImageUtils_url(exerciseType, size, props.settings);\n  const remoteSrc = rawSrc ? HostConfig_resolveUrl(rawSrc) : undefined;\n  const initialUri = remoteSrc ? ImageCache_initialUri(remoteSrc) : undefined;\n\n  const [prevRemote, setPrevRemote] = useState<string | undefined>(remoteSrc);\n  const [isLoading, setIsLoading] = useState<boolean>(true);\n  const [isError, setIsError] = useState<boolean>(false);\n  const [aspectRatio, setAspectRatio] = useState<number>(4 / 3);\n  const [src, setSrc] = useState<string | undefined>(initialUri);\n  const [usingRemote, setUsingRemote] = useState<boolean>(initialUri === remoteSrc);\n\n  if (prevRemote !== remoteSrc) {\n    setPrevRemote(remoteSrc);\n    setSrc(initialUri);\n    setUsingRemote(initialUri === remoteSrc);\n    setIsLoading(true);\n    setIsError(false);\n    setAspectRatio(4 / 3);\n  }\n\n  const doesExist =\n    ExerciseImageUtils_exists(exerciseType, size) ||\n    ExerciseImageUtils_existsCustom(exerciseType, size, !!props.suppressCustom, props.settings);\n\n  const onCachedError = (): void => {\n    if (!usingRemote && remoteSrc) {\n      ImageCache_markMissing(remoteSrc);\n      setUsingRemote(true);\n      setSrc(remoteSrc);\n    } else {\n      setIsError(true);\n    }\n  };\n\n  const onCachedLoad = (): void => {\n    setIsLoading(false);\n    if (usingRemote && remoteSrc) {\n      ImageCache_download(remoteSrc);\n    }\n  };\n\n  if (size === \"small\") {\n    const w = Math.round((props.width || 32) * remScale);\n    const imgStyle = { width: w, height: Math.round(w * 1.5) };\n    return (\n      <>\n        {!isError && doesExist && (\n          <Image\n            data-testid=\"exercise-image-small\"\n            testID=\"exercise-image-small\"\n            className={props.className}\n            source={{ uri: src }}\n            style={imgStyle}\n            onLoad={onCachedLoad}\n            onError={onCachedError}\n            accessibilityLabel={Exercise_nameWithEquipment(exercise, props.settings)}\n          />\n        )}\n        {(isError || !doesExist) &&\n          (props.useTextForCustomExercise ? (\n            <View\n              className={`items-start justify-center overflow-hidden bg-background-image ${props.className ?? \"\"} ${props.customClassName ?? \"\"}`}\n              style={imgStyle}\n            >\n              <Text\n                className=\"text-xs text-text-secondarysubtle\"\n                style={{ fontSize: 11 * remScale, lineHeight: 13 * remScale }}\n              >\n                {Exercise_nameWithEquipment(exercise, props.settings)}\n              </Text>\n            </View>\n          ) : (\n            <View className={`items-center justify-center ${props.className ?? \"\"}`} style={imgStyle}>\n              <IconDefaultExercise size={w} />\n            </View>\n          ))}\n      </>\n    );\n  } else {\n    return doesExist ? (\n      <>\n        <Image\n          data-testid=\"exercise-image-large\"\n          testID=\"exercise-image-large\"\n          className={props.className}\n          source={{ uri: src }}\n          resizeMode=\"contain\"\n          style={{ width: \"100%\", aspectRatio }}\n          onLoad={(e) => {\n            onCachedLoad();\n            const source = (e?.nativeEvent as { source?: { width?: number; height?: number } } | undefined)?.source;\n            if (source?.width && source?.height) {\n              setAspectRatio(source.width / source.height);\n            }\n          }}\n          onError={onCachedError}\n          accessibilityLabel={Exercise_nameWithEquipment(exercise, props.settings)}\n        />\n        <ExerciseImageAuxiliary size={props.size} isError={isError} isLoading={isLoading} />\n      </>\n    ) : (\n      <ExerciseNoImage size={props.size}>\n        <Text>No exercise image</Text>\n      </ExerciseNoImage>\n    );\n  }\n}, areExerciseImagePropsEqual);\n\nfunction ExerciseImageAuxiliary(props: {\n  size: \"large\" | \"small\";\n  isError: boolean;\n  isLoading: boolean;\n}): JSX.Element | null {\n  if (props.isError) {\n    return (\n      <ExerciseNoImage size={props.size}>\n        <Text className=\"text-xs leading-normal text-center text-red-700\">Error fetching the exercise image</Text>\n      </ExerciseNoImage>\n    );\n  } else if (props.isLoading) {\n    return (\n      <ExerciseNoImage size={props.size}>\n        <View className=\"items-center w-full\">\n          <IconSpinner width={20} height={20} />\n        </View>\n      </ExerciseNoImage>\n    );\n  } else {\n    return null;\n  }\n}\n\ninterface INoImageProps {\n  children: ReactNode;\n  size: \"large\" | \"small\";\n}\n\nfunction ExerciseNoImage(props: INoImageProps): JSX.Element | null {\n  return (\n    <View className=\"items-center justify-center px-4 py-10 my-4 border border-dotted rounded-lg border-border-neutral bg-background-neutral\">\n      {props.children}\n    </View>\n  );\n}\n","import { JSX, useState, useMemo, useCallback } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { TextInput } from \"../primitives/textInput\";\nimport { LegendList } from \"@legendapp/list\";\nimport { Text } from \"../primitives/text\";\nimport { ISettings } from \"../../types\";\nimport { IExercise, Exercise_allExpanded, Exercise_toKey } from \"../../models/exercise\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { IconMagnifyingGlass } from \"../icons/iconMagnifyingGlass\";\nimport { StringUtils_fuzzySearch } from \"../../utils/string\";\nimport { ExercisePickerExerciseItem } from \"./exercisePickerExerciseItem\";\nimport { BottomSheetOrModal } from \"../bottomSheetOrModal\";\nimport { SheetDragHandle } from \"../../navigation/TransparentModal\";\n\ninterface IProps {\n  isHidden: boolean;\n  showMuscles: boolean;\n  settings: ISettings;\n  onSelect: (exercise: IExercise) => void;\n  onClose: () => void;\n}\n\nexport type IExerciseCloneLibraryContentProps = Omit<IProps, \"isHidden\"> & { bare?: boolean };\n\nexport function ExerciseCloneLibraryContent(props: IExerciseCloneLibraryContentProps): JSX.Element {\n  const [search, setSearch] = useState<string>(\"\");\n  const trimmedSearch = search.trim().toLowerCase();\n  const exercises = useMemo(() => {\n    let result = !trimmedSearch\n      ? Exercise_allExpanded(props.settings.exercises)\n      : Exercise_allExpanded(props.settings.exercises).filter((e) => {\n          return StringUtils_fuzzySearch(trimmedSearch, e.name.toLowerCase());\n        });\n    result = result.sort((a, b) => a.name.localeCompare(b.name));\n    return result;\n  }, [trimmedSearch, props.settings.exercises]);\n\n  const keyExtractor = useCallback((e: IExercise) => Exercise_toKey(e), []);\n  const renderItem = useCallback(\n    ({ item: ex }: { item: IExercise }) => (\n      <Pressable onPress={() => props.onSelect(ex)}>\n        <ExercisePickerExerciseItem isEnabled={true} showMuscles={true} settings={props.settings} exercise={ex} />\n      </Pressable>\n    ),\n    [props.onSelect, props.settings]\n  );\n\n  const header = (\n    <SheetDragHandle>\n      <View collapsable={false} className=\"px-gutter pb-2\">\n        <Text className=\"pt-1 pb-3 text-base font-semibold text-center\">Pick Exercise To Clone From</Text>\n        <View className=\"flex-row items-center gap-2 p-2 rounded-lg bg-background-neutral\">\n          <IconMagnifyingGlass size={18} color={Tailwind_colors().lightgray[600]} />\n          <TextInput\n            placeholder=\"Search by name\"\n            placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n            className=\"flex-1 text-sm text-text-secondary\"\n            style={{ paddingVertical: 0, includeFontPadding: false }}\n            data-testid=\"exercise-filter-by-name\"\n            testID=\"exercise-filter-by-name\"\n            defaultValue={search}\n            onChangeText={setSearch}\n            returnKeyType=\"search\"\n          />\n        </View>\n      </View>\n    </SheetDragHandle>\n  );\n  const list = (\n    <LegendList\n      data={exercises}\n      keyExtractor={keyExtractor}\n      renderItem={renderItem}\n      contentContainerStyle={{ paddingHorizontal: 16 }}\n      keyboardShouldPersistTaps=\"handled\"\n    />\n  );\n  if (props.bare) {\n    return (\n      <>\n        {header}\n        {list}\n      </>\n    );\n  }\n  return (\n    <View className=\"flex-1\">\n      {header}\n      {list}\n    </View>\n  );\n}\n\nexport function BottomSheetExerciseCloneLibrary(props: IProps): JSX.Element {\n  return (\n    <BottomSheetOrModal isHidden={props.isHidden} onClose={props.onClose} shouldShowClose={true}>\n      <ExerciseCloneLibraryContent\n        showMuscles={props.showMuscles}\n        settings={props.settings}\n        onSelect={props.onSelect}\n        onClose={props.onClose}\n      />\n    </BottomSheetOrModal>\n  );\n}\n","import { JSX, useEffect, useMemo, useState, useCallback } from \"react\";\nimport { View, Image } from \"react-native\";\nimport { TextInput } from \"../primitives/textInput\";\nimport { LegendList } from \"@legendapp/list\";\nimport { Text } from \"../primitives/text\";\nimport { ISettings } from \"../../types\";\nimport {\n  IExercise,\n  Exercise_allExpanded,\n  Exercise_find,\n  Exercise_fullName,\n  Exercise_toKey,\n} from \"../../models/exercise\";\nimport { MenuItemWrapper } from \"../menuItem\";\nimport { ExerciseImage } from \"../exerciseImage\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { IconMagnifyingGlass } from \"../icons/iconMagnifyingGlass\";\nimport { StringUtils_fuzzySearch } from \"../../utils/string\";\nimport { Service } from \"../../api/service\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { IconSpinner } from \"../icons/iconSpinner\";\nimport { UidFactory_generateUid } from \"../../utils/generator\";\nimport { ExerciseImageUtils_url } from \"../../models/exerciseImage\";\nimport { BottomSheetOrModal } from \"../bottomSheetOrModal\";\nimport { SheetDragHandle } from \"../../navigation/TransparentModal\";\n\ninterface IProps {\n  isHidden: boolean;\n  settings: ISettings;\n  isLoggedIn: boolean;\n  service: Service;\n  onClose: () => void;\n  onSelect: (smallImageUrl?: string, largeImageUrl?: string) => void;\n}\n\nexport type IExerciseImageLibraryContentProps = Omit<IProps, \"isHidden\"> & { bare?: boolean };\n\nfunction getExerciseIdFromImageUrl(url: string): string | undefined {\n  return url.split(\"/\").pop()?.split(\"-\").slice(1).join(\"-\").split(\".\")[0];\n}\n\nexport function ExerciseImageLibraryContent(props: IExerciseImageLibraryContentProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState<boolean>(props.isLoggedIn);\n  const [uploadedImages, setUploadedImages] = useState<string[]>([]);\n  const [search, setSearch] = useState<string>(\"\");\n\n  useEffect(() => {\n    if (props.isLoggedIn) {\n      props.service.getUploadedImages().then((imgs) => {\n        setUploadedImages(imgs);\n        setIsLoading(false);\n      });\n    }\n  }, []);\n\n  const trimmedSearch = search.trim().toLowerCase();\n  const exercises = useMemo(\n    () =>\n      !trimmedSearch\n        ? Exercise_allExpanded({})\n        : Exercise_allExpanded({}).filter((e) => {\n            return StringUtils_fuzzySearch(trimmedSearch, e.name.toLowerCase());\n          }),\n    [trimmedSearch]\n  );\n\n  const filteredUploadedImages = !trimmedSearch\n    ? uploadedImages\n    : uploadedImages.filter((img) => {\n        const exerciseId = getExerciseIdFromImageUrl(img);\n        const customExercise = exerciseId ? Exercise_find({ id: exerciseId }, props.settings.exercises) : undefined;\n        if (customExercise) {\n          return StringUtils_fuzzySearch(trimmedSearch, customExercise.name.toLowerCase());\n        } else {\n          return false;\n        }\n      });\n\n  const keyExtractor = useCallback((exercise: IExercise) => Exercise_toKey(exercise), []);\n  const renderBuiltinItem = useCallback(\n    ({ item: exercise }: { item: IExercise }) => (\n      <MenuItemWrapper\n        name={exercise.name}\n        onClick={() => {\n          const smallImageUrl = ExerciseImageUtils_url(exercise, \"small\");\n          const largeImageUrl = ExerciseImageUtils_url(exercise, \"large\");\n          props.onSelect(smallImageUrl, largeImageUrl);\n        }}\n      >\n        <View className=\"flex-row items-center h-scaled-16 gap-4\">\n          <View className=\"w-scaled-10\">\n            <ExerciseImage settings={props.settings} exerciseType={exercise} size=\"small\" className=\"w-full\" />\n          </View>\n          <Text className=\"flex-1\">{Exercise_fullName(exercise, props.settings)}</Text>\n        </View>\n      </MenuItemWrapper>\n    ),\n    [props.onSelect, props.settings]\n  );\n\n  const ListHeader = (\n    <>\n      {(isLoading || filteredUploadedImages.length > 0) && (\n        <>\n          <GroupHeader name=\"Uploaded Images\" />\n          {isLoading ? (\n            <View className=\"items-center py-4\">\n              <IconSpinner width={18} height={18} />\n            </View>\n          ) : (\n            filteredUploadedImages.map((img) => {\n              const exerciseId = getExerciseIdFromImageUrl(img) ?? UidFactory_generateUid(8);\n              const customExercise = exerciseId\n                ? Exercise_find({ id: exerciseId }, props.settings.exercises)\n                : undefined;\n              return (\n                <MenuItemWrapper\n                  key={exerciseId}\n                  name={customExercise?.name ?? exerciseId}\n                  onClick={() => {\n                    props.onSelect(img);\n                  }}\n                >\n                  <View className=\"flex-row items-center h-scaled-16 gap-4\">\n                    <View className=\"w-scaled-10\">\n                      <Image source={{ uri: img }} className=\"w-scaled-10 h-scaled-10\" resizeMode=\"contain\" />\n                    </View>\n                    {customExercise && (\n                      <Text className=\"flex-1\">{Exercise_fullName(customExercise, props.settings)}</Text>\n                    )}\n                  </View>\n                </MenuItemWrapper>\n              );\n            })\n          )}\n          <GroupHeader name=\"Built-in Images\" topPadding={true} />\n        </>\n      )}\n    </>\n  );\n\n  const header = (\n    <SheetDragHandle>\n      <View collapsable={false} className=\"px-gutter pb-2\">\n        <Text className=\"pt-1 pb-3 text-base font-semibold text-center\">Pick Exercise Image</Text>\n        <View className=\"flex-row items-center gap-2 p-2 rounded-lg bg-background-neutral\">\n          <IconMagnifyingGlass size={18} color={Tailwind_colors().lightgray[600]} />\n          <TextInput\n            placeholder=\"Search by name\"\n            placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n            className=\"flex-1 text-sm text-text-secondary\"\n            style={{ paddingVertical: 0, includeFontPadding: false }}\n            data-testid=\"exercise-filter-by-name\"\n            testID=\"exercise-filter-by-name\"\n            defaultValue={search}\n            onChangeText={setSearch}\n            returnKeyType=\"search\"\n          />\n        </View>\n      </View>\n    </SheetDragHandle>\n  );\n  const list = (\n    <LegendList\n      data={exercises}\n      keyExtractor={keyExtractor}\n      renderItem={renderBuiltinItem}\n      ListHeaderComponent={ListHeader}\n      contentContainerStyle={{ paddingHorizontal: 16 }}\n      keyboardShouldPersistTaps=\"handled\"\n    />\n  );\n  if (props.bare) {\n    return (\n      <>\n        {header}\n        {list}\n      </>\n    );\n  }\n  return (\n    <View className=\"flex-1\">\n      {header}\n      {list}\n    </View>\n  );\n}\n\nexport function BottomSheetExerciseImageLibrary(props: IProps): JSX.Element {\n  return (\n    <BottomSheetOrModal isHidden={props.isHidden} onClose={props.onClose} shouldShowClose={true}>\n      <ExerciseImageLibraryContent\n        settings={props.settings}\n        isLoggedIn={props.isLoggedIn}\n        service={props.service}\n        onClose={props.onClose}\n        onSelect={props.onSelect}\n      />\n    </BottomSheetOrModal>\n  );\n}\n","import type { JSX } from \"react\";\nimport { BottomSheet } from \"../bottomSheet\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport {\n  ICustomExercise,\n  IExercisePickerSelectedExercise,\n  IExercisePickerState,\n  IExerciseType,\n  ISettings,\n} from \"../../types\";\nimport { ExercisePickerMain } from \"./exercisePickerMain\";\nimport { ExercisePickerFilter } from \"./exercisePickerFilter\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { ExercisePickerSettings, IExercisePickerSettings } from \"./exercisePickerSettings\";\nimport { ExercisePickerCustomExercise } from \"./exercisePickerCustomExercise\";\nimport { lb } from \"lens-shmens\";\nimport { buildCustomLensDispatch } from \"../../ducks/types\";\n\ninterface IExercisePickerContentProps {\n  isLoggedIn: boolean;\n  settings: ISettings;\n  exercisePicker: IExercisePickerState;\n  usedExerciseTypes: IExerciseType[];\n  onStar: (key: string) => void;\n  onChangeSettings: (settings: IExercisePickerSettings) => void;\n  onChangeCustomExercise: (action: \"upsert\" | \"delete\", exercise: ICustomExercise, notes?: string) => void;\n  onChoose: (selectedExercises: IExercisePickerSelectedExercise[]) => void;\n  dispatch: ILensDispatch<IExercisePickerState>;\n  evaluatedProgram?: IEvaluatedProgram;\n  onClose: () => void;\n}\n\nexport function ExercisePickerContent(props: IExercisePickerContentProps): JSX.Element {\n  const { evaluatedProgram } = props;\n  const state = props.exercisePicker;\n  const currentScreen = state.screenStack[state.screenStack.length - 1] ?? \"exercisePicker\";\n  if (currentScreen === \"exercisePicker\") {\n    return (\n      <ExercisePickerMain\n        dispatch={props.dispatch}\n        onStar={props.onStar}\n        isHidden={false}\n        usedExerciseTypes={props.usedExerciseTypes}\n        onChoose={props.onChoose}\n        state={state}\n        settings={props.settings}\n        evaluatedProgram={evaluatedProgram}\n        onClose={props.onClose}\n      />\n    );\n  } else if (currentScreen === \"settings\") {\n    return (\n      <ExercisePickerSettings onChange={props.onChangeSettings} settings={props.settings} dispatch={props.dispatch} />\n    );\n  } else if (currentScreen === \"filter\") {\n    return (\n      <ExercisePickerFilter\n        state={state}\n        settings={props.settings}\n        dispatch={props.dispatch}\n        onChangeSettings={props.onChangeSettings}\n      />\n    );\n  } else if (currentScreen === \"customExercise\" && state.editCustomExercise != null) {\n    const originalExercise = props.settings.exercises[state.editCustomExercise.id];\n    return (\n      <ExercisePickerCustomExercise\n        screenStack={state.screenStack}\n        settings={props.settings}\n        showMuscles={!!state.showMuscles}\n        isLoggedIn={props.isLoggedIn}\n        dispatch={buildCustomLensDispatch(props.dispatch, lb<IExercisePickerState>().pi(\"editCustomExercise\"))}\n        originalExercise={originalExercise}\n        exercise={state.editCustomExercise}\n        onClose={props.onClose}\n        onChange={(action, exercise, notes) => {\n          props.onChangeCustomExercise(action, exercise, notes);\n        }}\n        onGoBack={(desc) => {\n          if (state.screenStack.length > 1) {\n            props.dispatch(\n              [\n                lb<IExercisePickerState>()\n                  .p(\"screenStack\")\n                  .recordModify((stack) => stack.slice(0, -1)),\n                lb<IExercisePickerState>().p(\"editCustomExercise\").record(undefined),\n              ],\n              desc\n            );\n          } else {\n            props.onClose();\n          }\n        }}\n      />\n    );\n  }\n  return <></>;\n}\n\ninterface IBottomSheetExercisePickerProps extends IExercisePickerContentProps {\n  isHidden: boolean;\n}\n\nexport function BottomSheetExercisePicker(props: IBottomSheetExercisePickerProps): JSX.Element {\n  return (\n    <BottomSheet isHidden={props.isHidden} onClose={props.onClose}>\n      <ExercisePickerContent {...props} />\n    </BottomSheet>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { ISettings, IExerciseType, IExercisePickerState } from \"../../types\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { ExercisePickerExerciseItem } from \"./exercisePickerExerciseItem\";\nimport { Exercise_get } from \"../../models/exercise\";\n\ninterface IExercisePickerCurrentExerciseProps {\n  exerciseType: IExerciseType;\n  state: IExercisePickerState;\n  settings: ISettings;\n}\n\nexport function ExercisePickerCurrentExercise(props: IExercisePickerCurrentExerciseProps): JSX.Element {\n  const exercise = Exercise_get(props.exerciseType, props.settings.exercises);\n  return (\n    <View className=\"mx-4 mb-3\">\n      <GroupHeader name=\"Current Exercise\" />\n      <View className=\"px-2 border bg-background-cardpurple border-border-cardpurple rounded-2xl\">\n        <ExercisePickerExerciseItem\n          exercise={exercise}\n          settings={props.settings}\n          showMuscles={props.state.showMuscles}\n          isEnabled={true}\n        />\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View, Pressable, ScrollView, Platform } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { ISettings, ICustomExercise, IExercisePickerScreen } from \"../../types\";\nimport { Button } from \"../button\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IconBack } from \"../icons/iconBack\";\nimport { IconClose2 } from \"../icons/iconClose2\";\nimport { ObjectUtils_isEqual } from \"../../utils/object\";\nimport { ExercisePickerCustomExerciseContent } from \"./exercisePickerCustomExerciseContent\";\nimport { Exercise_getNotes, Exercise_nameError } from \"../../models/exercise\";\nimport { SheetDragHandle } from \"../../navigation/TransparentModal\";\nimport { SystemKeyboardSpacer } from \"../systemKeyboardSpacer\";\n\ninterface IExercisePickerCustomExercise2Props {\n  settings: ISettings;\n  screenStack: IExercisePickerScreen[];\n  useInlineModals?: boolean;\n  originalExercise?: ICustomExercise;\n  showMuscles: boolean;\n  exercise: ICustomExercise;\n  isLoggedIn: boolean;\n  dispatch: ILensDispatch<ICustomExercise>;\n  onGoBack: (string: string) => void;\n  onClose: () => void;\n  onChange: (action: \"upsert\" | \"delete\", exercise: ICustomExercise, notes?: string) => void;\n}\n\nexport function ExercisePickerCustomExercise(props: IExercisePickerCustomExercise2Props): JSX.Element {\n  const isEdited = !props.originalExercise || !ObjectUtils_isEqual(props.exercise, props.originalExercise);\n  const isValid = Exercise_nameError(props.exercise.name) == null;\n  const [notes, setNotes] = useState<string | undefined>(\n    props.exercise ? Exercise_getNotes(props.exercise, props.settings) : undefined\n  );\n  const scrollRef = useRef<ScrollView>(null);\n\n  return (\n    <View className=\"flex-1\" style={{ marginTop: -12 }}>\n      <SheetDragHandle>\n        <View className=\"flex-row items-center pt-0 pb-4 mt-2\">\n          <Pressable\n            className=\"px-4 py-2\"\n            hitSlop={12}\n            data-testid=\"navbar-back\"\n            testID=\"navbar-back\"\n            onPress={() => {\n              props.onGoBack(\"Pop screen in exercise picker screen stack\");\n            }}\n          >\n            {props.screenStack.length > 1 ? <IconBack /> : <IconClose2 size={22} />}\n          </Pressable>\n          <View className=\"flex-1\" />\n          <View className=\"px-4\">\n            <Button\n              kind=\"purple\"\n              buttonSize=\"md\"\n              disabled={!isEdited || !isValid}\n              name=\"navbar-save-custom-exercise\"\n              data-testid=\"custom-exercise-create\"\n              testID=\"custom-exercise-create\"\n              onPress={() => {\n                props.onChange(\"upsert\", props.exercise, notes);\n                props.onGoBack(\"Save custom exercise\");\n              }}\n            >\n              Save\n            </Button>\n          </View>\n          <View className=\"absolute top-0 left-0 right-0 items-center py-2\" pointerEvents=\"none\">\n            <Text className=\"font-semibold\">{props.exercise ? \"Edit\" : \"Create\"} Custom Exercise</Text>\n          </View>\n        </View>\n      </SheetDragHandle>\n      <ScrollView\n        ref={scrollRef}\n        className=\"flex-1 pb-4\"\n        keyboardShouldPersistTaps=\"handled\"\n        keyboardDismissMode=\"interactive\"\n        automaticallyAdjustKeyboardInsets\n        contentContainerStyle={{ paddingBottom: 24 }}\n      >\n        <View className=\"px-4\">\n          <ExercisePickerCustomExerciseContent\n            onGoBack={props.onGoBack}\n            settings={props.settings}\n            useInlineModals={props.useInlineModals}\n            hideNotes={false}\n            hideDeleteButton={false}\n            notes={notes}\n            setNotes={setNotes}\n            originalExercise={props.originalExercise}\n            showMuscles={props.showMuscles}\n            exercise={props.exercise}\n            isLoggedIn={props.isLoggedIn}\n            dispatch={props.dispatch}\n            onClose={props.onClose}\n            onDelete={() => {\n              props.onChange(\"delete\", props.exercise);\n            }}\n          />\n        </View>\n        {Platform.OS === \"android\" ? <SystemKeyboardSpacer scrollRef={scrollRef} /> : null}\n      </ScrollView>\n    </View>\n  );\n}\n","import { JSX, useContext, useState } from \"react\";\nimport { View, Pressable, Image, Platform } from \"react-native\";\nimport { TextInput } from \"../primitives/textInput\";\nimport { Dialog_alert, Dialog_confirm } from \"../../utils/dialog\";\nimport { Text } from \"../primitives/text\";\nimport { ISettings, ICustomExercise, IMuscle, exerciseKinds, IExerciseKind } from \"../../types\";\nimport { Button } from \"../button\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { IconAi } from \"../icons/iconAi\";\nimport { ExercisePickerOptionsMuscles } from \"./exercisePickerOptionsMuscles\";\nimport { IconArrowDown2 } from \"../icons/iconArrowDown2\";\nimport { ExercisePickerOptions, IFilterValue } from \"./exercisePickerOptions\";\nimport { StringUtils_capitalize } from \"../../utils/string\";\nimport { ObjectUtils_keys, ObjectUtils_clone, ObjectUtils_mapValues } from \"../../utils/object\";\nimport { Exercise_targetMuscles, Exercise_synergistMuscles, Exercise_nameError } from \"../../models/exercise\";\nimport { AppContext } from \"../appContext\";\nimport { Service } from \"../../api/service\";\nimport { IconSpinner } from \"../icons/iconSpinner\";\nimport { BottomSheetItem } from \"../bottomSheetItem\";\nimport { IconCamera } from \"../icons/iconCamera\";\nimport { ImageUploader } from \"../../utils/imageUploader\";\nimport { IconPicture } from \"../icons/iconPicture\";\nimport { BottomSheetExerciseImageLibrary } from \"./bottomSheetExerciseImageLibrary\";\nimport { LinkButton } from \"../linkButton\";\nimport { Importer } from \"../importer\";\nimport { MarkdownEditor } from \"../markdownEditor\";\nimport { BottomSheetExerciseCloneLibrary } from \"./bottomSheetExerciseCloneLibrary\";\nimport { ExerciseImageUtils_url } from \"../../models/exerciseImage\";\nimport { BottomSheetOrModal } from \"../bottomSheetOrModal\";\nimport { useModal } from \"../../navigation/ModalStateContext\";\nimport { ImagePicker_pick } from \"../../utils/imagePicker\";\n\ninterface IExercisePickerCustomExerciseContentProps {\n  settings: ISettings;\n  useInlineModals?: boolean;\n  originalExercise?: ICustomExercise;\n  showMuscles: boolean;\n  exercise: ICustomExercise;\n  isLoggedIn: boolean;\n  hideDeleteButton: boolean;\n  hideNotes: boolean;\n  notes: string | undefined;\n  setNotes: (notes: string) => void;\n  dispatch: ILensDispatch<ICustomExercise>;\n  onClose: () => void;\n  onGoBack: (reason: string) => void;\n  onDelete: () => void;\n}\n\nasync function uploadAndUpdateImage(\n  source: \"camera\" | \"photo-library\",\n  exerciseId: string,\n  service: Service,\n  dispatch: ILensDispatch<ICustomExercise>\n): Promise<void> {\n  const data = await ImagePicker_pick(source);\n  if (!data) {\n    return;\n  }\n  const imageUploader = new ImageUploader(service);\n  const url = await imageUploader.uploadBase64Image(data, exerciseId);\n  dispatch(\n    [lb<ICustomExercise>().p(\"smallImageUrl\").record(url), lb<ICustomExercise>().p(\"largeImageUrl\").record(undefined)],\n    \"Set custom exercise image URL\"\n  );\n}\n\nasync function confirmAsync(message: string): Promise<boolean> {\n  return Dialog_confirm(message);\n}\n\nexport function ExercisePickerCustomExerciseContent(props: IExercisePickerCustomExerciseContentProps): JSX.Element {\n  const appContext = useContext(AppContext);\n  const service =\n    appContext.service ?? (typeof window !== \"undefined\" ? new Service(fetch.bind(window)) : new Service(fetch));\n  const editCustomExercise = props.exercise;\n  const { notes, setNotes } = props;\n  const nameError = Exercise_nameError(editCustomExercise.name);\n  const isValid = nameError == null;\n  const [isAutofilling, setIsAutofilling] = useState<boolean>(false);\n  const [showCloneBottomSheet, setShowCloneBottomSheet] = useState<boolean>(false);\n  const [showImageBottomSheet, setShowImageBottomSheet] = useState<boolean>(false);\n  const [showPicturePickerBottomSheet, setShowPicturePickerBottomSheet] = useState<boolean>(false);\n  const [showImageLibrary, setShowImageLibrary] = useState<boolean>(false);\n  const [isUploading, setIsUploading] = useState<boolean>(false);\n\n  const openImageSource = useModal(\"exerciseImageSourceModal\", (result) => {\n    props.dispatch(\n      [\n        lb<ICustomExercise>().p(\"smallImageUrl\").record(result.smallImageUrl),\n        lb<ICustomExercise>().p(\"largeImageUrl\").record(result.largeImageUrl),\n      ],\n      \"Set custom exercise image URL\"\n    );\n  });\n\n  const openCloneLibraryModal = useModal(\"exerciseCloneLibraryModal\", (result) => {\n    props.dispatch(\n      [\n        lb<ICustomExercise>().p(\"smallImageUrl\").record(result.smallImageUrl),\n        lb<ICustomExercise>().p(\"largeImageUrl\").record(result.largeImageUrl),\n        lb<ICustomExercise>().p(\"meta\").p(\"targetMuscles\").record(result.targetMuscles),\n        lb<ICustomExercise>().p(\"meta\").p(\"synergistMuscles\").record(result.synergistMuscles),\n        lb<ICustomExercise>().p(\"types\").record(result.types),\n      ],\n      \"Clone built-in exercise into custom exercise\"\n    );\n  });\n\n  const typeValues = exerciseKinds.reduce<Record<IExerciseKind, IFilterValue>>(\n    (memo, type) => {\n      memo[type] = {\n        label: StringUtils_capitalize(type),\n        isSelected: !!editCustomExercise.types?.includes(type),\n      };\n      return memo;\n    },\n    {} as Record<IExerciseKind, IFilterValue>\n  );\n\n  const openCloneLibrary = (): void => {\n    if (props.useInlineModals) {\n      setShowCloneBottomSheet(true);\n    } else {\n      openCloneLibraryModal({});\n    }\n  };\n\n  const openImageSourceAction = (): void => {\n    if (props.useInlineModals) {\n      setShowImageBottomSheet(true);\n    } else {\n      openImageSource({ exerciseId: editCustomExercise.id });\n    }\n  };\n\n  return (\n    <View>\n      <View>\n        <View className=\"items-center pb-2\">\n          <LinkButton className=\"text-xs\" name=\"clone-builtin-exercise\" onPress={openCloneLibrary}>\n            Clone from another exercise\n          </LinkButton>\n        </View>\n        <View>\n          <Text className=\"pb-1 text-sm\">\n            Name<Text className=\"text-text-error\"> *</Text>\n          </Text>\n          <TextInput\n            data-testid=\"custom-exercise-name-input\"\n            testID=\"custom-exercise-name-input\"\n            defaultValue={editCustomExercise.name}\n            placeholder=\"Super Squat\"\n            placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n            style={{ minHeight: 40 }}\n            className=\"px-4 py-2 text-base border rounded-lg bg-background-default border-border-prominent text-text-primary\"\n            onChangeText={(text) => {\n              props.dispatch(lb<ICustomExercise>().p(\"name\").record(text), \"Update custom exercise name\");\n            }}\n          />\n          {nameError != null && <Text className=\"mt-1 text-xs text-text-error\">{nameError}</Text>}\n        </View>\n        <View className=\"mt-4\">\n          {editCustomExercise.largeImageUrl || editCustomExercise.smallImageUrl ? (\n            <View className=\"items-center\">\n              <Pressable onPress={openImageSourceAction}>\n                <Image\n                  source={{ uri: editCustomExercise.largeImageUrl ?? editCustomExercise.smallImageUrl }}\n                  resizeMode=\"contain\"\n                  style={{ height: 192, width: 192 }}\n                />\n              </Pressable>\n              <LinkButton name=\"custom-exercise-change-image\" className=\"text-xs\" onPress={openImageSourceAction}>\n                Change Image\n              </LinkButton>\n            </View>\n          ) : (\n            <Button\n              name=\"custom-exercise-add-image\"\n              kind=\"purple\"\n              className=\"w-full\"\n              buttonSize=\"md\"\n              onPress={openImageSourceAction}\n            >\n              Add image\n            </Button>\n          )}\n        </View>\n        <View className=\"mt-4\">\n          <Button\n            buttonSize=\"sm\"\n            kind=\"lightgrayv3\"\n            name=\"autofill-muscles\"\n            className=\"w-full\"\n            onPress={async () => {\n              if (!isValid) {\n                Dialog_alert(\"Please enter a name\");\n                return;\n              }\n              setIsAutofilling(true);\n              const response = await service.getMuscles(editCustomExercise.name);\n              setIsAutofilling(false);\n              if (response != null) {\n                const { targetMuscles, synergistMuscles, types } = response;\n                props.dispatch(\n                  [\n                    lb<ICustomExercise>().p(\"meta\").p(\"targetMuscles\").record(targetMuscles),\n                    lb<ICustomExercise>().p(\"meta\").p(\"synergistMuscles\").record(synergistMuscles),\n                    lb<ICustomExercise>().p(\"types\").record(types),\n                  ],\n                  \"Autofill custom exercise muscles and types\"\n                );\n              } else {\n                Dialog_alert(\"Couldn't autofill the muscles for this exercise. Try a different name!\");\n              }\n            }}\n          >\n            <View className=\"flex-row items-center\">\n              {isAutofilling ? (\n                <View className=\"flex-row items-center\" style={{ minHeight: 24 }}>\n                  <IconSpinner width={18} height={18} />\n                </View>\n              ) : (\n                <>\n                  <IconAi color={Tailwind_semantic().icon.blue} />\n                  <Text className=\"ml-1 text-sm\">Autofill Muscles and Types</Text>\n                </>\n              )}\n            </View>\n          </Button>\n        </View>\n        <View className=\"pt-2\">\n          <ExercisePickerCustomExerciseMuscles\n            settings={props.settings}\n            useInlineModals={props.useInlineModals}\n            name=\"target-muscles\"\n            bottomSheetTitle=\"Target Muscles\"\n            muscleKey=\"targetMuscles\"\n            label=\"Target Muscles\"\n            selectedMuscles={editCustomExercise.meta.targetMuscles}\n            onSelect={(muscle) => {\n              const current = new Set(editCustomExercise.meta.targetMuscles);\n              if (current.has(muscle)) {\n                current.delete(muscle);\n              } else {\n                current.add(muscle);\n              }\n              props.dispatch(\n                lb<ICustomExercise>().p(\"meta\").p(\"targetMuscles\").record(Array.from(current).sort()),\n                \"Update custom exercise target muscles\"\n              );\n            }}\n            onMusclesSelected={(muscles) => {\n              props.dispatch(\n                lb<ICustomExercise>().p(\"meta\").p(\"targetMuscles\").record(muscles),\n                \"Update custom exercise targetMuscles\"\n              );\n            }}\n          />\n        </View>\n        <View className=\"pt-2\">\n          <ExercisePickerCustomExerciseMuscles\n            settings={props.settings}\n            useInlineModals={props.useInlineModals}\n            name=\"synergist-muscles\"\n            bottomSheetTitle=\"Synergist Muscles\"\n            muscleKey=\"synergistMuscles\"\n            label=\"Synergist Muscles\"\n            selectedMuscles={editCustomExercise.meta.synergistMuscles}\n            onSelect={(muscle) => {\n              const current = new Set(editCustomExercise.meta.synergistMuscles);\n              if (current.has(muscle)) {\n                current.delete(muscle);\n              } else {\n                current.add(muscle);\n              }\n              props.dispatch(\n                lb<ICustomExercise>().p(\"meta\").p(\"synergistMuscles\").record(Array.from(current).sort()),\n                \"Update custom exercise synergist muscles\"\n              );\n            }}\n            onMusclesSelected={(muscles) => {\n              props.dispatch(\n                lb<ICustomExercise>().p(\"meta\").p(\"synergistMuscles\").record(muscles),\n                \"Update custom exercise synergistMuscles\"\n              );\n            }}\n          />\n        </View>\n        <View className=\"pt-2\">\n          <ExercisePickerCustomExerciseTypes\n            useInlineModals={props.useInlineModals}\n            types={typeValues}\n            selectedTypes={editCustomExercise.types ?? []}\n            onNewTypes={(types) => {\n              const newTypes = ObjectUtils_keys(types).filter((k) => types[k].isSelected);\n              props.dispatch(lb<ICustomExercise>().p(\"types\").record(newTypes), \"Update custom exercise types\");\n            }}\n            onTypesSelected={(types) => {\n              props.dispatch(lb<ICustomExercise>().p(\"types\").record(types), \"Update custom exercise types\");\n            }}\n          />\n        </View>\n        {!props.hideNotes && (\n          <View className=\"pt-2 pb-4\">\n            <Text className=\"pb-1 text-sm text-text-primary\">\n              <Text className=\"text-sm\">Exercise Notes</Text>\n              <Text className=\"text-xs text-text-secondary\"> (optional)</Text>\n            </Text>\n            <MarkdownEditor\n              value={notes ?? \"\"}\n              onChange={(v) => {\n                setNotes(v);\n              }}\n            />\n          </View>\n        )}\n      </View>\n      {props.originalExercise && !props.hideDeleteButton && (\n        <View className=\"px-4 pb-4\">\n          <Button\n            name=\"delete-custom-exercise\"\n            kind=\"red\"\n            data-testid=\"custom-exercise-delete\"\n            testID=\"custom-exercise-delete\"\n            buttonSize=\"md\"\n            className=\"w-full mt-4\"\n            onPress={async () => {\n              const ok = await confirmAsync(\n                \"Are you sure you want to delete this exercise? This action cannot be undone.\"\n              );\n              if (ok) {\n                props.onDelete();\n              }\n              props.onGoBack(\"Delete custom exercise\");\n            }}\n          >\n            Delete Exercise\n          </Button>\n        </View>\n      )}\n      {props.useInlineModals && showImageBottomSheet && (\n        <BottomSheetOrModal\n          shouldShowClose={true}\n          onClose={() => setShowImageBottomSheet(false)}\n          isHidden={!showImageBottomSheet}\n        >\n          <View className=\"p-4\">\n            <Text className=\"text-xs text-center text-text-secondary\">Prefer 2:3 aspect ratio</Text>\n            <BottomSheetItem\n              name=\"from-image-library\"\n              title=\"From Image Library\"\n              onClick={() => {\n                setShowImageBottomSheet(false);\n                setShowImageLibrary(true);\n              }}\n            />\n            {Platform.OS !== \"web\" ? (\n              <BottomSheetItem\n                name=\"upload-image\"\n                title=\"Upload Image\"\n                onClick={() => {\n                  if (!props.isLoggedIn) {\n                    Dialog_alert(\"You need to be logged in to upload custom exercise images\");\n                    return;\n                  }\n                  setShowImageBottomSheet(false);\n                  setShowPicturePickerBottomSheet(true);\n                }}\n              />\n            ) : (\n              <Importer\n                onRawFile={async (file) => {\n                  const imageUploader = new ImageUploader(service);\n                  const url = await imageUploader.uploadImage(file as File, editCustomExercise.id);\n                  setIsUploading(true);\n                  props.dispatch(\n                    [\n                      lb<ICustomExercise>().p(\"smallImageUrl\").record(url),\n                      lb<ICustomExercise>().p(\"largeImageUrl\").record(undefined),\n                    ],\n                    \"Set custom exercise image URL\"\n                  );\n                  setIsUploading(false);\n                  setShowImageBottomSheet(false);\n                }}\n              >\n                {(onClick) => (\n                  <BottomSheetItem\n                    name=\"upload-image\"\n                    icon={isUploading ? <IconSpinner width={18} height={18} /> : undefined}\n                    title=\"Upload Image\"\n                    onClick={() => {\n                      if (!props.isLoggedIn) {\n                        Dialog_alert(\"You need to be logged in to upload custom exercise images\");\n                      } else {\n                        onClick();\n                      }\n                    }}\n                  />\n                )}\n              </Importer>\n            )}\n          </View>\n        </BottomSheetOrModal>\n      )}\n      {props.useInlineModals && showPicturePickerBottomSheet && (\n        <BottomSheetOrModal\n          shouldShowClose={true}\n          onClose={() => setShowPicturePickerBottomSheet(false)}\n          isHidden={!showPicturePickerBottomSheet}\n        >\n          <View className=\"p-4\">\n            <BottomSheetItem\n              title=\"From Camera\"\n              name=\"from-camera\"\n              icon={isUploading ? <IconSpinner width={18} height={18} /> : <IconCamera size={24} />}\n              isFirst={true}\n              description=\"Take a photo\"\n              onClick={async () => {\n                setIsUploading(true);\n                try {\n                  await uploadAndUpdateImage(\"camera\", editCustomExercise.id, service, props.dispatch);\n                } catch (e) {\n                  Dialog_alert(\"Failed to upload image. Please try again.\");\n                } finally {\n                  setIsUploading(false);\n                  setShowPicturePickerBottomSheet(false);\n                }\n              }}\n            />\n            <BottomSheetItem\n              title=\"From Photo Library\"\n              name=\"from-photo-library\"\n              icon={isUploading ? <IconSpinner width={18} height={18} /> : <IconPicture size={24} />}\n              description=\"Pick photo from your photo library\"\n              onClick={async () => {\n                setIsUploading(true);\n                try {\n                  await uploadAndUpdateImage(\"photo-library\", editCustomExercise.id, service, props.dispatch);\n                } catch (e) {\n                  Dialog_alert(\"Failed to upload image. Please try again.\");\n                } finally {\n                  setIsUploading(false);\n                  setShowPicturePickerBottomSheet(false);\n                }\n              }}\n            />\n          </View>\n        </BottomSheetOrModal>\n      )}\n      {props.useInlineModals && showImageLibrary && (\n        <BottomSheetExerciseImageLibrary\n          isHidden={!showImageLibrary}\n          isLoggedIn={props.isLoggedIn}\n          service={service}\n          settings={props.settings}\n          onClose={() => setShowImageLibrary(false)}\n          onSelect={(smallImageUrl, largeImageUrl) => {\n            props.dispatch(\n              [\n                lb<ICustomExercise>().p(\"smallImageUrl\").record(smallImageUrl),\n                lb<ICustomExercise>().p(\"largeImageUrl\").record(largeImageUrl),\n              ],\n              \"Set custom exercise image URL\"\n            );\n            setShowImageLibrary(false);\n          }}\n        />\n      )}\n      {props.useInlineModals && showCloneBottomSheet && (\n        <BottomSheetExerciseCloneLibrary\n          isHidden={!showCloneBottomSheet}\n          showMuscles={props.showMuscles}\n          settings={props.settings}\n          onClose={() => setShowCloneBottomSheet(false)}\n          onSelect={(exercise) => {\n            const customExercise = props.settings.exercises[exercise.id];\n            const smallImageUrl = customExercise\n              ? customExercise.smallImageUrl\n              : ExerciseImageUtils_url(exercise, \"small\");\n            const largeImageUrl = customExercise\n              ? customExercise.largeImageUrl\n              : ExerciseImageUtils_url(exercise, \"large\");\n            const targetMuscles = ObjectUtils_clone(Exercise_targetMuscles(exercise, props.settings));\n            const synergistMuscles = ObjectUtils_clone(Exercise_synergistMuscles(exercise, props.settings));\n            const types = ObjectUtils_clone(exercise.types);\n            props.dispatch(\n              [\n                lb<ICustomExercise>().p(\"smallImageUrl\").record(smallImageUrl),\n                lb<ICustomExercise>().p(\"largeImageUrl\").record(largeImageUrl),\n                lb<ICustomExercise>().p(\"meta\").p(\"targetMuscles\").record(targetMuscles),\n                lb<ICustomExercise>().p(\"meta\").p(\"synergistMuscles\").record(synergistMuscles),\n                lb<ICustomExercise>().p(\"types\").record(types),\n              ],\n              \"Clone built-in exercise into custom exercise\"\n            );\n            setShowCloneBottomSheet(false);\n          }}\n        />\n      )}\n    </View>\n  );\n}\n\ninterface IExercisePickerCustomExerciseTypesProps {\n  useInlineModals?: boolean;\n  types: Record<IExerciseKind, IFilterValue>;\n  selectedTypes: IExerciseKind[];\n  onNewTypes: (types: Record<IExerciseKind, IFilterValue>) => void;\n  onTypesSelected: (types: IExerciseKind[]) => void;\n}\n\nfunction ExercisePickerCustomExerciseTypes(props: IExercisePickerCustomExerciseTypesProps): JSX.Element {\n  const [isOpened, setIsOpened] = useState<boolean>(false);\n  const selectedValues = ObjectUtils_keys(props.types).filter((k) => props.types[k].isSelected);\n\n  const openTypesModal = useModal(\"exerciseTypesPickerModal\", (types) => {\n    props.onTypesSelected(types);\n  });\n\n  const openPicker = (): void => {\n    if (props.useInlineModals) {\n      setIsOpened(true);\n    } else {\n      openTypesModal({ selectedTypes: props.selectedTypes });\n    }\n  };\n\n  return (\n    <View className=\"w-full\">\n      <Text className=\"pb-1 text-sm text-text-primary\">\n        <Text className=\"text-sm\">Types</Text>\n        <Text className=\"text-xs text-text-secondary\"> (optional)</Text>\n      </Text>\n      <Pressable onPress={openPicker}>\n        <ExercisePickerCustomExercise2SelectInput selectedValues={selectedValues} />\n      </Pressable>\n      {props.useInlineModals && isOpened && (\n        <BottomSheetOrModal\n          shouldShowClose={true}\n          onClose={() => {\n            setIsOpened(false);\n          }}\n          isHidden={!isOpened}\n        >\n          <View className=\"flex-1 px-4\" style={{ marginTop: -12 }}>\n            <Text className=\"pt-6 pb-3 text-base font-semibold text-center\">Types</Text>\n            <View className=\"flex-1 pb-4\">\n              <ExercisePickerOptions\n                values={props.types}\n                onSelect={(key) => {\n                  const newTypes = ObjectUtils_mapValues(props.types, (type: IFilterValue, k: IExerciseKind) => {\n                    if (k === key) {\n                      return { ...type, isSelected: !type.isSelected };\n                    }\n                    return type;\n                  });\n                  props.onNewTypes(newTypes);\n                }}\n              />\n            </View>\n            <View className=\"py-2 bg-background-default\">\n              <Button\n                kind=\"purple\"\n                name=\"done-selecting-types\"\n                className=\"w-full\"\n                buttonSize=\"md\"\n                onPress={() => {\n                  setIsOpened(false);\n                }}\n              >\n                Done\n              </Button>\n            </View>\n          </View>\n        </BottomSheetOrModal>\n      )}\n    </View>\n  );\n}\n\ninterface IExercisePickerCustomExerciseMusclesProps {\n  label: string;\n  name: string;\n  bottomSheetTitle: string;\n  muscleKey: \"targetMuscles\" | \"synergistMuscles\";\n  useInlineModals?: boolean;\n  selectedMuscles: IMuscle[];\n  settings: ISettings;\n  onSelect: (muscle: IMuscle) => void;\n  onMusclesSelected: (muscles: IMuscle[]) => void;\n}\n\nfunction ExercisePickerCustomExerciseMuscles(props: IExercisePickerCustomExerciseMusclesProps): JSX.Element {\n  const [isOpened, setIsOpened] = useState<boolean>(false);\n\n  const openMusclesModal = useModal(\"exerciseMusclesPickerModal\", (muscles) => {\n    props.onMusclesSelected(muscles);\n  });\n\n  const openPicker = (): void => {\n    if (props.useInlineModals) {\n      setIsOpened(true);\n    } else {\n      openMusclesModal({\n        title: props.bottomSheetTitle,\n        name: props.name,\n        selectedMuscles: props.selectedMuscles,\n      });\n    }\n  };\n\n  return (\n    <View className=\"w-full\">\n      <Text className=\"pb-1 text-sm text-text-primary\">\n        <Text className=\"text-sm\">{props.label}</Text>\n        <Text className=\"text-xs text-text-secondary\"> (optional)</Text>\n      </Text>\n      <Pressable onPress={openPicker} data-testid={`select-${props.name}`} testID={`select-${props.name}`}>\n        <ExercisePickerCustomExercise2SelectInput selectedValues={props.selectedMuscles} />\n      </Pressable>\n      {props.useInlineModals && isOpened && (\n        <BottomSheetOrModal\n          shouldShowClose={true}\n          onClose={() => {\n            setIsOpened(false);\n          }}\n          isHidden={!isOpened}\n        >\n          <View className=\"flex-1 px-4\" style={{ marginTop: -12 }}>\n            <Text className=\"pt-6 pb-3 text-base font-semibold text-center\">{props.bottomSheetTitle}</Text>\n            <View className=\"flex-1 pb-4\">\n              <ExercisePickerOptionsMuscles\n                selectedValues={props.selectedMuscles}\n                onSelect={props.onSelect}\n                settings={props.settings}\n              />\n            </View>\n            <View className=\"py-2 bg-background-default\">\n              <Button\n                kind=\"purple\"\n                data-testid=\"done-selecting-muscles\"\n                testID=\"done-selecting-muscles\"\n                name=\"done-selecting-muscles\"\n                className=\"w-full\"\n                buttonSize=\"md\"\n                onPress={() => {\n                  setIsOpened(false);\n                }}\n              >\n                Done\n              </Button>\n            </View>\n          </View>\n        </BottomSheetOrModal>\n      )}\n    </View>\n  );\n}\n\ninterface IExercisePickerCustomExercise2SelectInputProps {\n  selectedValues: string[];\n}\n\nfunction ExercisePickerCustomExercise2SelectInput(props: IExercisePickerCustomExercise2SelectInputProps): JSX.Element {\n  return (\n    <View\n      className=\"flex-row items-center p-2 border rounded-md bg-background-default border-border-prominent\"\n      style={{ minHeight: 32 }}\n    >\n      <View className=\"flex-row flex-wrap flex-1\" style={{ gap: 4 }}>\n        {props.selectedValues.map((m) => (\n          <View key={m} className=\"px-2 py-1 rounded-full bg-background-subtle\">\n            <Text className=\"text-xs text-text-secondary\">{m}</Text>\n          </View>\n        ))}\n      </View>\n      <IconArrowDown2 />\n    </View>\n  );\n}\n","import { memo } from \"react\";\nimport type { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { FastText } from \"../primitives/fastText\";\nimport {\n  IExercise,\n  equipmentName,\n  Exercise_toKey,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroups,\n} from \"../../models/exercise\";\nimport { ISettings, IExerciseType } from \"../../types\";\nimport { StringUtils_dashcase, StringUtils_capitalize } from \"../../utils/string\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { ExerciseImage } from \"../exerciseImage\";\nimport { IconEdit2 } from \"../icons/iconEdit2\";\nimport { IconStar } from \"../icons/iconStar\";\nimport { IconCheckCircle } from \"../icons/iconCheckCircle\";\nimport { Muscle_getMusclesFromScreenMuscle, Muscle_getMuscleGroupName } from \"../../models/muscle\";\nimport { StyledText, StyledText_cls } from \"../../utils/styledText\";\nimport { useRem } from \"../../utils/useRem\";\n\ninterface IExerciseItemProps {\n  exercise: IExercise;\n  settings: ISettings;\n  onStar?: (key: string) => void;\n  onEdit?: () => void;\n  currentExerciseType?: { id: string; equipment?: string };\n  showMuscles?: boolean;\n  isEnabled: boolean;\n  isSelected?: boolean;\n  onChoose?: (key: string) => void;\n  isMultiselect?: boolean;\n}\n\nexport const ExercisePickerExerciseItem = memo(function ExercisePickerExerciseItem(\n  props: IExerciseItemProps\n): JSX.Element {\n  const { exercise: e } = props;\n  const exerciseType = { id: e.id, equipment: e.equipment || e.defaultEquipment };\n  const key = Exercise_toKey(e);\n  const isStarred = !!props.settings.starredExercises?.[key];\n  const onEdit = props.onEdit;\n  const onChoose = props.onChoose;\n  const isDisabled = !props.isEnabled && !props.isSelected;\n\n  return (\n    <View className={`flex-row gap-3 ${isDisabled ? \"opacity-40\" : \"\"}`}>\n      <View className=\"self-center w-scaled-12 min-h-scaled-10\">\n        <View className=\"p-1 rounded-lg bg-background-image\">\n          <ExerciseImage\n            useTextForCustomExercise={true}\n            customClassName=\"border border-border-neutral rounded-lg overflow-hidden\"\n            settings={props.settings}\n            className=\"w-full\"\n            exerciseType={exerciseType}\n            size=\"small\"\n          />\n        </View>\n      </View>\n      <View className=\"flex-1 py-2\">\n        <Pressable\n          className=\"flex-row items-center gap-2\"\n          onPress={() => {\n            if (props.onStar) {\n              props.onStar(key);\n            }\n          }}\n        >\n          {props.onStar && (\n            <View>\n              <IconStar\n                size={20}\n                isSelected={isStarred}\n                color={isStarred ? Tailwind_semantic().icon.purple : Tailwind_semantic().icon.neutral}\n              />\n            </View>\n          )}\n          <ExerciseNameLine name={e.name} equipment={exerciseType.equipment} />\n        </Pressable>\n        <Pressable\n          data-testid={`custom-exercise-${StringUtils_dashcase(e.name)}`}\n          testID={`custom-exercise-${StringUtils_dashcase(e.name)}`}\n          disabled={isDisabled || !props.onChoose}\n          onPress={() => {\n            if (!isDisabled && props.onChoose) {\n              props.onChoose(key);\n            }\n          }}\n        >\n          {props.showMuscles ? (\n            <MuscleView currentExerciseType={props.currentExerciseType} exercise={e} settings={props.settings} />\n          ) : (\n            <MuscleGroupsView currentExerciseType={props.currentExerciseType} exercise={e} settings={props.settings} />\n          )}\n        </Pressable>\n      </View>\n      <View className=\"flex-row items-center gap-1 ml-2\">\n        {onEdit && (\n          <Pressable\n            onPress={onEdit}\n            className=\"p-2\"\n            data-testid={`custom-exercise-edit-${StringUtils_dashcase(e.name)}`}\n            testID={`custom-exercise-edit-${StringUtils_dashcase(e.name)}`}\n          >\n            <IconEdit2 />\n          </Pressable>\n        )}\n        {onChoose &&\n          (props.isMultiselect ? (\n            <Pressable\n              className=\"p-2\"\n              disabled={isDisabled}\n              data-testid={`menu-item-${StringUtils_dashcase(e.name)}`}\n              testID={`menu-item-${StringUtils_dashcase(e.name)}`}\n              onPress={() => onChoose(Exercise_toKey(e))}\n            >\n              <IconCheckCircle isChecked={!!props.isSelected} />\n            </Pressable>\n          ) : (\n            <Pressable\n              className=\"p-2\"\n              disabled={isDisabled}\n              data-testid={`menu-item-${StringUtils_dashcase(e.name)}`}\n              testID={`menu-item-${StringUtils_dashcase(e.name)}`}\n              onPress={() => onChoose(Exercise_toKey(e))}\n            >\n              <RadioIndicator checked={!!props.isSelected} />\n            </Pressable>\n          ))}\n      </View>\n    </View>\n  );\n});\n\nfunction ExerciseNameLine(props: { name: string; equipment?: string }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const builder = new StyledText();\n  builder.add(props.name, cls(\"font-semibold\"));\n  if (props.equipment) {\n    builder.add(`, ${equipmentName(props.equipment)}`, cls(\"text-text-secondary\"));\n  }\n  const built = builder.build();\n  // Without flexShrink the name is measured at its natural width inside the row and runs under the\n  // edit/select icons instead of wrapping inside its own column.\n  return (\n    <FastText\n      text={built.text}\n      fragments={built.fragments}\n      {...cls(\"text-sm text-text-primary\")}\n      style={{ flexShrink: 1 }}\n    />\n  );\n}\n\n// One picker row renders up to three of these; collapsing each into a single FastText node\n// (instead of a nested <Text> per muscle) is the bulk of the picker's mount-time win.\nfunction LabeledItemsLine(props: { label: string; items: { text: string; isMatch?: boolean }[] }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const semantic = Tailwind_semantic();\n  const semibold = cls(\"font-semibold\");\n  const builder = new StyledText();\n  builder.add(`${props.label}: `, cls(\"text-text-secondary\"));\n  props.items.forEach((item, i) => {\n    const color = item.isMatch == null ? undefined : item.isMatch ? semantic.text.success : semantic.text.error;\n    builder.add(`${item.text}${i !== props.items.length - 1 ? \", \" : \"\"}`, { ...semibold, color });\n  });\n  const built = builder.build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-primary\")} />;\n}\n\nfunction RadioIndicator(props: { checked: boolean }): JSX.Element {\n  const color = Tailwind_semantic().icon.purple;\n  return (\n    <View\n      className=\"items-center justify-center border-2 rounded-full\"\n      style={{ width: 20, height: 20, borderColor: props.checked ? color : Tailwind_semantic().border.prominent }}\n    >\n      {props.checked && <View className=\"rounded-full\" style={{ width: 10, height: 10, backgroundColor: color }} />}\n    </View>\n  );\n}\n\nfunction MuscleView(props: {\n  currentExerciseType?: IExerciseType;\n  exercise: IExercise;\n  settings: ISettings;\n}): JSX.Element {\n  const { exercise, settings } = props;\n  const tms = props.currentExerciseType ? Exercise_targetMuscles(props.currentExerciseType, settings) : [];\n  const sms = props.currentExerciseType ? Exercise_synergistMuscles(props.currentExerciseType, settings) : [];\n  const targetMuscles = Exercise_targetMuscles(exercise, settings);\n  const synergistMuscles = Exercise_synergistMuscles(exercise, settings).filter((m) => targetMuscles.indexOf(m) === -1);\n\n  const types = exercise.types.map((t) => StringUtils_capitalize(t));\n\n  return (\n    <View>\n      {types.length > 0 && <LabeledItemsLine label=\"Type\" items={[{ text: types.join(\", \") }]} />}\n      {targetMuscles.length > 0 && (\n        <LabeledItemsLine\n          label=\"Target\"\n          items={targetMuscles.map((m) => ({\n            text: m,\n            isMatch: tms.length === 0 ? undefined : tms.indexOf(m) !== -1,\n          }))}\n        />\n      )}\n      {synergistMuscles.length > 0 && (\n        <LabeledItemsLine\n          label=\"Synergist\"\n          items={synergistMuscles.map((m) => ({\n            text: m,\n            isMatch: sms.length === 0 ? undefined : sms.indexOf(m) !== -1,\n          }))}\n        />\n      )}\n    </View>\n  );\n}\n\nexport function MuscleGroupsView(props: {\n  currentExerciseType?: IExerciseType;\n  exercise: IExercise;\n  settings: ISettings;\n}): JSX.Element {\n  const { exercise, settings } = props;\n  const tms: string[] = props.currentExerciseType ? Exercise_targetMuscles(props.currentExerciseType, settings) : [];\n  const sms: string[] = props.currentExerciseType ? Exercise_synergistMuscles(props.currentExerciseType, settings) : [];\n  const targetMuscleGroups = Exercise_targetMusclesGroups(exercise, settings);\n  const synergistMuscleGroups = Exercise_synergistMusclesGroups(exercise, settings).filter(\n    (m) => targetMuscleGroups.indexOf(m) === -1\n  );\n\n  const types = exercise.types.map((t) => StringUtils_capitalize(t));\n\n  return (\n    <View>\n      {types.length > 0 && <LabeledItemsLine label=\"Type\" items={[{ text: types.join(\", \") }]} />}\n      {targetMuscleGroups.length > 0 && (\n        <LabeledItemsLine\n          label=\"Target\"\n          items={targetMuscleGroups.map((m) => {\n            const muscles = Muscle_getMusclesFromScreenMuscle(m, props.settings);\n            return {\n              text: Muscle_getMuscleGroupName(m, props.settings),\n              isMatch: !props.currentExerciseType ? undefined : muscles.some((muscle) => tms.includes(muscle)),\n            };\n          })}\n        />\n      )}\n      {synergistMuscleGroups.length > 0 && (\n        <LabeledItemsLine\n          label=\"Synergist\"\n          items={synergistMuscleGroups.map((m) => {\n            const muscles = Muscle_getMusclesFromScreenMuscle(m, props.settings);\n            return {\n              text: Muscle_getMuscleGroupName(m, props.settings),\n              isMatch: !props.currentExerciseType ? undefined : muscles.some((muscle) => sms.includes(muscle)),\n            };\n          })}\n        />\n      )}\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, Pressable, ScrollView } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport {\n  equipments,\n  exerciseKinds,\n  IBuiltinEquipment,\n  IExerciseKind,\n  IExercisePickerSort,\n  IExercisePickerState,\n  IScreenMuscle,\n  ISettings,\n  screenMuscles,\n} from \"../../types\";\nimport { IconBack } from \"../icons/iconBack\";\nimport { ObjectUtils_values, ObjectUtils_entries } from \"../../utils/object\";\nimport { IconArrowUp } from \"../icons/iconArrowUp\";\nimport { IconArrowDown2 } from \"../icons/iconArrowDown2\";\nimport { lb } from \"lens-shmens\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { equipmentName } from \"../../models/exercise\";\nimport { CollectionUtils_remove } from \"../../utils/collection\";\nimport { StringUtils_capitalize } from \"../../utils/string\";\nimport { ScrollableTabs } from \"../scrollableTabs\";\nimport {\n  Muscle_getAvailableMuscleGroups,\n  Muscle_getMuscleGroupName,\n  Muscle_getMusclesFromScreenMuscle,\n} from \"../../models/muscle\";\nimport { ExercisePickerUtils_getSelectedMuscleGroupNames } from \"./exercisePickerUtils\";\nimport { ExercisePickerOptionsMuscles } from \"./exercisePickerOptionsMuscles\";\nimport { ExercisePickerOptions } from \"./exercisePickerOptions\";\nimport { MuscleGroupImage } from \"../muscleGroupImage\";\nimport { IExercisePickerSettings } from \"./exercisePickerSettings\";\nimport { MenuItemEditable } from \"../menuItemEditable\";\nimport { Equipment_getCurrentGym } from \"../../models/equipment\";\n\ninterface IProps {\n  settings: ISettings;\n  state: IExercisePickerState;\n  dispatch: ILensDispatch<IExercisePickerState>;\n  onChangeSettings: (settings: IExercisePickerSettings) => void;\n}\n\nexport const exercisePickerSortNames = {\n  name_asc: \"Name, A to Z\",\n  similar_muscles: \"Similar Muscles\",\n};\n\ntype IFilterValue = { label: string; isSelected: boolean; disabledReason?: string };\n\nexport function ExercisePickerFilter(props: IProps): JSX.Element {\n  const sortValues: Record<IExercisePickerSort, IFilterValue> = {\n    name_asc: { label: exercisePickerSortNames.name_asc, isSelected: props.state.sort === \"name_asc\" },\n    similar_muscles: {\n      label: exercisePickerSortNames.similar_muscles,\n      isSelected: props.state.sort === \"similar_muscles\",\n      disabledReason: props.state.exerciseType != null ? undefined : \"Enabled only for swap/edit\",\n    },\n  };\n  const gymEquipment = Equipment_getCurrentGym(props.settings).equipment;\n\n  const equipmentValues = equipments.reduce<Record<IBuiltinEquipment, IFilterValue>>(\n    (memo, equipment) => {\n      memo[equipment] = {\n        label: equipmentName(equipment, {}),\n        isSelected: props.state.filters.equipment?.includes(equipment) ?? false,\n        disabledReason:\n          !props.settings.workoutSettings.shouldShowInvisibleEquipment && gymEquipment[equipment]?.isDeleted\n            ? \"Hidden\"\n            : undefined,\n      };\n      return memo;\n    },\n    {} as Record<IBuiltinEquipment, IFilterValue>\n  );\n\n  const typeValues = exerciseKinds.reduce<Record<IExerciseKind, IFilterValue>>(\n    (memo, type) => {\n      memo[type] = {\n        label: StringUtils_capitalize(type),\n        isSelected: props.state.filters.type?.includes(type) ?? false,\n      };\n      return memo;\n    },\n    {} as Record<IExerciseKind, IFilterValue>\n  );\n\n  return (\n    <View className=\"flex-1 pb-4\" style={{ marginTop: -12 }}>\n      <View className=\"flex-row items-center py-4 mt-2\">\n        <Pressable\n          className=\"px-4 py-2\"\n          hitSlop={12}\n          data-testid=\"navbar-back\"\n          testID=\"navbar-back\"\n          onPress={() => {\n            props.dispatch(\n              lb<IExercisePickerState>()\n                .p(\"screenStack\")\n                .recordModify((stack) => stack.slice(0, -1)),\n              \"Pop screen in exercise picker screen stack\"\n            );\n          }}\n        >\n          <IconBack />\n        </Pressable>\n        <Text className=\"flex-1 pr-12 font-bold text-center\">Filter and sort</Text>\n      </View>\n      <ScrollView className=\"flex-1\">\n        <Filter\n          name=\"sort\"\n          title=\"Sort by\"\n          values={sortValues}\n          onChange={(value) => {\n            props.onChangeSettings({\n              pickerSort: value,\n            });\n            props.dispatch(\n              lb<IExercisePickerState>().p(\"sort\").record(value),\n              `Set sort in exercise picker to ${value}`\n            );\n          }}\n        />\n        <View className=\"px-4\">\n          <MenuItemEditable\n            type=\"boolean\"\n            name=\"Show only available equipment\"\n            value={props.settings.workoutSettings.shouldShowInvisibleEquipment ? \"false\" : \"true\"}\n            onChange={(v) => {\n              props.onChangeSettings({\n                shouldShowInvisibleEquipment: v !== \"true\",\n              });\n              props.dispatch(\n                lb<IExercisePickerState>()\n                  .p(\"filters\")\n                  .p(\"equipment\")\n                  .recordModify((equipment) => {\n                    if (v === \"false\") {\n                      return equipment;\n                    }\n                    return equipment?.filter((e) => !gymEquipment[e]?.isDeleted) || [];\n                  }),\n                \"Unselect hidden equipment in exercise picker\"\n              );\n            }}\n          />\n        </View>\n        <Filter\n          name=\"equipment\"\n          title=\"Equipment\"\n          values={equipmentValues}\n          onChange={(value) => {\n            props.dispatch(\n              lb<IExercisePickerState>()\n                .p(\"filters\")\n                .p(\"equipment\")\n                .recordModify((equipment) => {\n                  if (equipment?.includes(value)) {\n                    return CollectionUtils_remove(equipment, value);\n                  } else {\n                    return [...(equipment ?? []), value];\n                  }\n                }),\n              `Set equipment filter in exercise picker to ${value}`\n            );\n          }}\n        />\n        <Filter\n          name=\"type\"\n          title=\"Type\"\n          values={typeValues}\n          onChange={(value) => {\n            props.dispatch(\n              lb<IExercisePickerState>()\n                .p(\"filters\")\n                .p(\"type\")\n                .recordModify((types) => {\n                  if (types?.includes(value)) {\n                    return CollectionUtils_remove(types, value);\n                  } else {\n                    return [...(types ?? []), value];\n                  }\n                }),\n              `Set type filter in exercise picker to ${value}`\n            );\n          }}\n        />\n        <FilterMuscles dispatch={props.dispatch} state={props.state} settings={props.settings} />\n      </ScrollView>\n    </View>\n  );\n}\n\ninterface IFilterProps<T extends string> {\n  name: string;\n  title: string;\n  values: Record<T, IFilterValue>;\n  onChange: (value: T) => void;\n}\n\nfunction Filter<T extends string>(props: IFilterProps<T>): JSX.Element {\n  const selectedValues = ObjectUtils_values(props.values).filter((v) => v.isSelected);\n  const [isExpanded, setIsExpanded] = useState(selectedValues.length > 0);\n  return (\n    <View className=\"px-4 py-2 border-b border-background-subtle\">\n      <Pressable className=\"flex-row items-center pb-1\" onPress={() => setIsExpanded(!isExpanded)}>\n        <View className=\"flex-1\">\n          <Text>\n            <Text>{props.title}: </Text>\n            <Text className=\"font-semibold\">{selectedValues.map((v) => v.label).join(\", \") || \"All\"}</Text>\n          </Text>\n        </View>\n        <View className=\"px-2\">{isExpanded ? <IconArrowUp /> : <IconArrowDown2 />}</View>\n      </Pressable>\n      {isExpanded && <ExercisePickerOptions values={props.values} onSelect={props.onChange} />}\n    </View>\n  );\n}\n\ninterface IFilterMusclesProps {\n  dispatch: ILensDispatch<IExercisePickerState>;\n  settings: ISettings;\n  state: IExercisePickerState;\n}\n\nfunction FilterMuscles(props: IFilterMusclesProps): JSX.Element {\n  const selectedValues = props.state.filters?.muscles || [];\n  const [isExpanded, setIsExpanded] = useState(selectedValues.length > 0);\n  const selectedMuscleGroups = ExercisePickerUtils_getSelectedMuscleGroupNames(selectedValues, props.settings);\n\n  return (\n    <View className=\"px-4 py-2 border-b border-background-subtle\">\n      <Pressable className=\"flex-row items-center pb-1\" onPress={() => setIsExpanded(!isExpanded)}>\n        <View className=\"flex-1\">\n          <Text>\n            <Text>Muscles: </Text>\n            <Text className=\"font-semibold\">{selectedMuscleGroups.join(\", \") || \"All\"}</Text>\n          </Text>\n        </View>\n        <View className=\"px-2\">{isExpanded ? <IconArrowUp /> : <IconArrowDown2 />}</View>\n      </Pressable>\n      {isExpanded && (\n        <ScrollableTabs\n          topPadding=\"0.5rem\"\n          nonSticky={true}\n          color=\"purple\"\n          tabs={[\n            {\n              label: \"Muscle Groups\",\n              children: () => {\n                const muscleGroups = Muscle_getAvailableMuscleGroups(props.settings).reduce<\n                  Record<IScreenMuscle, IFilterValue>\n                >(\n                  (memo, muscleGroup) => {\n                    const muscles = Muscle_getMusclesFromScreenMuscle(muscleGroup, props.settings);\n                    if (muscles.length === 0) {\n                      return memo;\n                    }\n                    const isSelected = muscles.every((muscle) => selectedValues.includes(muscle));\n                    memo[muscleGroup] = { label: Muscle_getMuscleGroupName(muscleGroup, props.settings), isSelected };\n                    return memo;\n                  },\n                  {} as Record<IScreenMuscle, IFilterValue>\n                );\n                return (\n                  <View className=\"flex-row flex-wrap mt-2\" style={{ gap: 16 }}>\n                    {ObjectUtils_entries(muscleGroups).map(([key, value]) => {\n                      const customMuscleGroup = !(screenMuscles as readonly string[]).includes(key);\n                      return (\n                        <Pressable\n                          key={key}\n                          className={`flex-row items-center gap-2 h-scaled-12 overflow-hidden rounded-lg bg-background-subtle ${\n                            value.isSelected ? \"border-button-secondarystroke\" : \"border-border-neutral\"\n                          }`}\n                          style={{ width: \"47%\", borderWidth: value.isSelected ? 2 : 1 }}\n                          onPress={() => {\n                            props.dispatch(\n                              lb<IExercisePickerState>()\n                                .p(\"filters\")\n                                .p(\"muscles\")\n                                .recordModify((muscles) => {\n                                  const musclesOfMuscleGroup = Muscle_getMusclesFromScreenMuscle(key, props.settings);\n                                  const isIncluded = musclesOfMuscleGroup.some((m) => selectedValues.includes(m));\n                                  if (isIncluded) {\n                                    return muscles?.filter((muscle) => !musclesOfMuscleGroup.includes(muscle)) || [];\n                                  } else {\n                                    return [...(muscles || []), ...musclesOfMuscleGroup];\n                                  }\n                                }),\n                              `Set muscle group filter in exercise picker to ${key}`\n                            );\n                          }}\n                        >\n                          {customMuscleGroup ? (\n                            <View style={{ width: 61 }} />\n                          ) : (\n                            <MuscleGroupImage muscleGroup={key} size={61} />\n                          )}\n                          <Text className={`flex-1 ${value.isSelected ? \"text-text-purple\" : \"\"}`}>{value.label}</Text>\n                        </Pressable>\n                      );\n                    })}\n                  </View>\n                );\n              },\n            },\n            {\n              label: \"Muscles\",\n              children: () => {\n                return (\n                  <ExercisePickerOptionsMuscles\n                    selectedValues={selectedValues}\n                    settings={props.settings}\n                    onSelect={(key) => {\n                      props.dispatch(\n                        lb<IExercisePickerState>()\n                          .p(\"filters\")\n                          .p(\"muscles\")\n                          .recordModify((mscls) => {\n                            if (mscls?.includes(key)) {\n                              return CollectionUtils_remove(mscls, key);\n                            } else {\n                              return [...(mscls || []), key];\n                            }\n                          }),\n                        `Set muscle filter in exercise picker to ${key}`\n                      );\n                    }}\n                  />\n                );\n              },\n            },\n          ]}\n        />\n      )}\n    </View>\n  );\n}\n","import { JSX, Fragment, memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useRemScale } from \"../../utils/useRem\";\nimport { FitText_fontSize } from \"../../utils/fitText\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { TextInput } from \"../primitives/textInput\";\nimport Animated, {\n  useSharedValue,\n  useAnimatedScrollHandler,\n  useAnimatedStyle,\n  interpolate,\n  Extrapolation,\n} from \"react-native-reanimated\";\nimport { AnimatedLegendList } from \"@legendapp/list/reanimated\";\nimport { Text } from \"../primitives/text\";\nimport { IconMuscles2 } from \"../icons/iconMuscles2\";\nimport { IconStar } from \"../icons/iconStar\";\nimport { IconFilter } from \"../icons/iconFilter\";\nimport { IconFilter2 } from \"../icons/iconFilter2\";\nimport { IconMagnifyingGlass } from \"../icons/iconMagnifyingGlass\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { IEvaluatedProgram, IEvaluatedProgramWeek } from \"../../models/program\";\nimport {\n  ICustomExercise,\n  IExercisePickerSelectedExercise,\n  IExercisePickerState,\n  IExerciseType,\n  ISettings,\n} from \"../../types\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { Button } from \"../button\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport {\n  Exercise_get,\n  Exercise_fullName,\n  Exercise_toKey,\n  Exercise_createCustomExercise,\n  Exercise_allExpanded,\n  Exercise_filterAndRankByQuery,\n  Exercise_filterAndRankCustomByQuery,\n  Exercise_matchesQuery,\n  Exercise_fromKey,\n  Exercise_find,\n  IExercise,\n} from \"../../models/exercise\";\nimport {\n  ExercisePickerUtils_getProgramExercisefullName,\n  ExercisePickerUtils_getAllFilters,\n  ExercisePickerUtils_getAllFilterNames,\n  ExercisePickerUtils_filterCustomExercises,\n  ExercisePickerUtils_sortCustomExercises,\n  ExercisePickerUtils_getIsMultiselect,\n  ExercisePickerUtils_chooseAdhocExercise,\n  ExercisePickerUtils_chooseProgramExercise,\n  ExercisePickerUtils_filterExercises,\n  ExercisePickerUtils_sortExercises,\n} from \"./exercisePickerUtils\";\nimport { CollectionUtils_compact } from \"../../utils/collection\";\nimport { ObjectUtils_values, ObjectUtils_clone, ObjectUtils_keys } from \"../../utils/object\";\nimport { StringUtils_dashcase, StringUtils_pluralize } from \"../../utils/string\";\nimport { ExercisePickerCurrentExercise } from \"./exercisePickerCurrentExercise\";\nimport { ExercisePickerTemplate } from \"./exercisePickerTemplate\";\nimport { ExercisePickerExerciseItem } from \"./exercisePickerExerciseItem\";\nimport { Input, IValidationError } from \"../input\";\nimport { IEither } from \"../../utils/types\";\nimport { SheetDragHandle } from \"../../navigation/TransparentModal\";\nimport { getNavigationService } from \"../../navigation/navUtils\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { LinkButton } from \"../linkButton\";\nimport { ExerciseImage } from \"../exerciseImage\";\nimport { HistoryRecordSet } from \"../historyRecordSets\";\nimport {\n  PlannerProgramExercise_currentEvaluatedSetVariation,\n  PlannerProgramExercise_evaluatedSetsToDisplaySets,\n} from \"../../pages/planner/models/plannerProgramExercise\";\nimport { IconCheckCircle } from \"../icons/iconCheckCircle\";\nimport { exercisePickerSortNames } from \"./exercisePickerFilter\";\nimport { Scroller } from \"../scroller\";\n\ninterface IProps {\n  isHidden: boolean;\n  settings: ISettings;\n  dispatch: ILensDispatch<IExercisePickerState>;\n  onStar: (key: string) => void;\n  onChoose: (selectedExercises: IExercisePickerSelectedExercise[]) => void;\n  usedExerciseTypes: IExerciseType[];\n  state: IExercisePickerState;\n  evaluatedProgram?: IEvaluatedProgram;\n  onClose: () => void;\n}\n\ninterface IProgramGroup {\n  exerciseKey: string;\n  exerciseType: IExerciseType;\n  name: string;\n  exercises: IPlannerProgramExercise[];\n}\n\ntype IListItem =\n  | { kind: \"title\" }\n  | { kind: \"labelInput\" }\n  | { kind: \"currentExercise\"; exerciseType: IExerciseType }\n  | { kind: \"tabs\" }\n  | { kind: \"weekTabs\" }\n  | { kind: \"searchFilter\" }\n  | { kind: \"stickyChrome\"; showTabs: boolean; sub: \"search\" | \"program\" | null; showWeeks: boolean }\n  | { kind: \"recentHeader\" }\n  | { kind: \"customHeader\" }\n  | { kind: \"customExercise\"; raw: ICustomExercise; exercise: IExercise; key: string }\n  | { kind: \"builtinHeader\" }\n  | { kind: \"builtinExercise\"; exercise: IExercise; key: string }\n  | { kind: \"programGroup\"; group: IProgramGroup }\n  | { kind: \"programEmpty\"; message: string }\n  | { kind: \"templateForm\" };\n\ntype IRecentListItem = Extract<IListItem, { kind: \"customExercise\" | \"builtinExercise\" }>;\n\ninterface ITabDef {\n  label: string;\n  index: number;\n}\n\nexport function ExercisePickerMain(props: IProps): JSX.Element {\n  const remScale = useRemScale();\n  const { evaluatedProgram, state, dispatch, settings, onStar, onChoose, usedExerciseTypes } = props;\n  const {\n    mode,\n    search,\n    filters,\n    sort,\n    showMuscles,\n    exerciseType,\n    selectedExercises,\n    label,\n    templateName,\n    hideLabel,\n    hideTemplate,\n  } = state;\n  const isStarred = !!filters.isStarred;\n\n  const title =\n    mode === \"workout\"\n      ? exerciseType\n        ? \"Swap Exercise\"\n        : \"Add Exercises\"\n      : exerciseType || templateName\n        ? \"Edit Exercise\"\n        : \"Add Exercise\";\n\n  const tabs = useMemo<ITabDef[]>(() => {\n    if (mode === \"workout\") {\n      const result: ITabDef[] = [{ label: \"Ad-hoc Exercise\", index: 0 }];\n      if (evaluatedProgram) {\n        result.push({ label: \"From Program\", index: 1 });\n      }\n      return result;\n    }\n    const result: ITabDef[] = [{ label: \"Exercise\", index: 0 }];\n    if (!hideTemplate) {\n      result.push({ label: \"Template\", index: 1 });\n    }\n    return result;\n  }, [mode, evaluatedProgram, hideTemplate]);\n\n  const selectedTab = Math.min(state.selectedTab ?? 0, tabs.length - 1);\n\n  const weeks = evaluatedProgram?.weeks ?? [];\n  const [currentWeekIndex, setCurrentWeekIndex] = useState(0);\n  useEffect(() => {\n    if (currentWeekIndex >= weeks.length) {\n      setCurrentWeekIndex(0);\n    }\n  }, [weeks.length, currentWeekIndex]);\n\n  const [isRecentCollapsed, setIsRecentCollapsed] = useState(false);\n  const [isCustomCollapsed, setIsCustomCollapsed] = useState(false);\n  const [isBuiltinCollapsed, setIsBuiltinCollapsed] = useState(false);\n\n  const isMultiselect = useMemo(\n    () => ExercisePickerUtils_getIsMultiselect({ mode, exerciseType }),\n    [mode, exerciseType]\n  );\n\n  const useRankOrdering = !!search && !(sort === \"similar_muscles\" && exerciseType);\n\n  const builtinExercises = useMemo(() => {\n    let result = Exercise_allExpanded({});\n    result = ExercisePickerUtils_filterExercises(result, filters, settings);\n    if (filters.isStarred) {\n      result = result.filter((e) => settings.starredExercises?.[Exercise_toKey(e)]);\n    }\n    if (search) {\n      result = useRankOrdering\n        ? Exercise_filterAndRankByQuery(result, search)\n        : result.filter((e) => Exercise_matchesQuery(e, search));\n    }\n    if (!useRankOrdering) {\n      result = ExercisePickerUtils_sortExercises(result, settings, { filters, sort, exerciseType });\n    }\n    return result;\n  }, [search, useRankOrdering, filters, sort, settings, exerciseType]);\n\n  const customExercises = useMemo(() => {\n    const exercises = ExercisePickerUtils_filterCustomExercises(settings.exercises, filters);\n    let list: ICustomExercise[];\n    if (search) {\n      list = useRankOrdering\n        ? Exercise_filterAndRankCustomByQuery(exercises, search)\n        : CollectionUtils_compact(ObjectUtils_values(exercises))\n            .filter((e) => !e.isDeleted)\n            .filter((e) => Exercise_matchesQuery(e, search));\n    } else {\n      list = CollectionUtils_compact(ObjectUtils_values(exercises)).filter((e) => !e.isDeleted);\n    }\n    if (!useRankOrdering) {\n      list = ExercisePickerUtils_sortCustomExercises(list, settings, { filters, sort, exerciseType });\n    }\n    if (filters.isStarred) {\n      list = list.filter((e) => settings.starredExercises?.[Exercise_toKey(e)]);\n    }\n    return list.map((raw) => ({\n      raw,\n      key: Exercise_toKey(raw),\n      exercise: Exercise_get({ id: raw.id }, settings.exercises),\n    }));\n  }, [settings, search, useRankOrdering, filters, sort, exerciseType]);\n\n  // Only when swapping, and only unnarrowed: with a query the ranked results are the answer, and with a\n  // filter on, recents that ignore it would contradict the narrowing the user just asked for.\n  const recentExercises = useMemo(() => {\n    const isNarrowed = !!search || ExercisePickerUtils_getAllFilters(filters).length > 0 || !!filters.isStarred;\n    if (mode !== \"workout\" || exerciseType == null || isNarrowed) {\n      return [];\n    }\n    const keys = settings.recentExercises?.[Exercise_toKey(exerciseType)] ?? [];\n    // Emitted as the same list items the sections below use, so a recent custom exercise still renders\n    // through CustomExerciseRow and keeps its edit affordance.\n    return CollectionUtils_compact(\n      keys.map((key): IRecentListItem | undefined => {\n        const type = Exercise_fromKey(key);\n        const raw = settings.exercises[type.id];\n        if (raw?.isDeleted) {\n          return undefined;\n        }\n        const exercise = Exercise_find(type, settings.exercises);\n        if (exercise == null) {\n          return undefined;\n        }\n        return raw != null\n          ? { kind: \"customExercise\", raw, exercise, key }\n          : { kind: \"builtinExercise\", exercise, key };\n      })\n    );\n  }, [mode, exerciseType, search, filters, settings]);\n\n  const recentKeys = useMemo(() => new Set(recentExercises.map((r) => r.key)), [recentExercises]);\n\n  const currentWeek: IEvaluatedProgramWeek | undefined = weeks[currentWeekIndex] ?? weeks[0];\n  const programGroups = useMemo<IProgramGroup[]>(() => {\n    if (!currentWeek) {\n      return [];\n    }\n    const grouped: Record<string, IPlannerProgramExercise[]> = {};\n    for (const day of currentWeek.days) {\n      for (const ex of day.exercises) {\n        if (!grouped[ex.key]) {\n          grouped[ex.key] = [];\n        }\n        grouped[ex.key].push(ex);\n      }\n    }\n    return ObjectUtils_keys(grouped)\n      .map((key) => {\n        const exs = grouped[key];\n        const first = exs[0];\n        if (first.exerciseType == null) {\n          return undefined;\n        }\n        return {\n          exerciseKey: key,\n          exerciseType: first.exerciseType,\n          name: first.name,\n          exercises: exs,\n        };\n      })\n      .filter((g): g is IProgramGroup => g != null)\n      .filter((g) => !search || Exercise_matchesQuery({ name: g.name, equipment: g.exerciseType.equipment }, search));\n  }, [currentWeek, search]);\n\n  const usedKeys = useMemo(() => new Set(usedExerciseTypes.map((et) => Exercise_toKey(et))), [usedExerciseTypes]);\n\n  const selectedAdhocKeys = useMemo(\n    () => new Set(selectedExercises.filter((ex) => ex.type === \"adhoc\").map((ex) => Exercise_toKey(ex.exerciseType))),\n    [selectedExercises]\n  );\n\n  const selectedProgramKeys = useMemo(() => {\n    const keys = new Set<string>();\n    selectedExercises.forEach((ex) => {\n      if (ex.type === \"program\") {\n        keys.add(`${Exercise_toKey(ex.exerciseType)}_${ex.week}_${ex.dayInWeek}`);\n      }\n    });\n    return keys;\n  }, [selectedExercises]);\n\n  const selectedAnyKeys = useMemo(\n    () =>\n      new Set(\n        selectedExercises\n          .filter((ex) => \"exerciseType\" in ex)\n          .map((ex) => Exercise_toKey((ex as { exerciseType: IExerciseType }).exerciseType))\n      ),\n    [selectedExercises]\n  );\n\n  const chooseCtxRef = useRef({ mode, exerciseType, selectedExercises, label });\n  chooseCtxRef.current = { mode, exerciseType, selectedExercises, label };\n\n  const onChooseAdhoc = useCallback(\n    (key: string) => {\n      ExercisePickerUtils_chooseAdhocExercise(dispatch, key, chooseCtxRef.current);\n    },\n    [dispatch]\n  );\n\n  const onChooseProgram = useCallback(\n    (et: IExerciseType, week: number, dayInWeek: number) => {\n      ExercisePickerUtils_chooseProgramExercise(dispatch, et, week, dayInWeek, chooseCtxRef.current);\n    },\n    [dispatch]\n  );\n\n  const onSettingsPress = useCallback(async () => {\n    if (Platform.OS === \"web\") {\n      dispatch(\n        lb<IExercisePickerState>()\n          .p(\"screenStack\")\n          .recordModify((stack) => [...stack, \"settings\"]),\n        \"Navigate to settings picker screen\"\n      );\n    } else {\n      const { navigateToModal } = await getNavigationService();\n      navigateToModal(\"exercisePickerSettingsModal\");\n    }\n  }, [dispatch]);\n\n  const onToggleMuscles = useCallback(() => {\n    dispatch(\n      lb<IExercisePickerState>().p(\"showMuscles\").record(!showMuscles),\n      `Toggle show muscles to ${!showMuscles}`\n    );\n  }, [dispatch, showMuscles]);\n\n  const onToggleStarred = useCallback(() => {\n    dispatch(\n      lb<IExercisePickerState>().p(\"filters\").p(\"isStarred\").record(!isStarred),\n      `Toggle starred exercises to ${!isStarred}`\n    );\n  }, [dispatch, isStarred]);\n\n  const onLabelChange = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      if (e.success) {\n        dispatch(\n          [\n            lb<IExercisePickerState>().p(\"label\").record(e.data),\n            lb<IExercisePickerState>()\n              .p(\"selectedExercises\")\n              .recordModify((exercises) => {\n                return exercises.map((ex) => {\n                  if (ex.type === \"adhoc\" || ex.type === \"template\") {\n                    return { ...ex, label: e.data };\n                  } else {\n                    return ex;\n                  }\n                });\n              }),\n          ],\n          `Set label to ${e.data}`\n        );\n      }\n    },\n    [dispatch]\n  );\n\n  const onTabChange = useCallback(\n    (tab: number) => {\n      dispatch(\n        lb<IExercisePickerState>().p(\"selectedTab\").record(tab),\n        `Set selected tab in exercise picker to ${tab}`\n      );\n    },\n    [dispatch]\n  );\n\n  const onCreateCustom = useCallback(() => {\n    dispatch(\n      [\n        lb<IExercisePickerState>()\n          .p(\"editCustomExercise\")\n          .record(Exercise_createCustomExercise(\"\", [], [], [])),\n        lb<IExercisePickerState>()\n          .p(\"screenStack\")\n          .recordModify((stack) => [...stack, \"customExercise\"]),\n      ],\n      \"Navigate to create custom exercise screen\"\n    );\n  }, [dispatch]);\n\n  const onBottomClick = useCallback(() => {\n    const isTemplateSave = state.mode === \"program\" && state.selectedTab === 1;\n    if (isTemplateSave && state.templateName) {\n      onChoose([\n        {\n          type: \"template\",\n          name: state.templateName,\n          label: state.label,\n        },\n      ]);\n    } else {\n      onChoose(state.selectedExercises);\n    }\n  }, [state.mode, state.selectedTab, state.templateName, state.label, state.selectedExercises, onChoose]);\n\n  const items = useMemo<IListItem[]>(() => {\n    const result: IListItem[] = [{ kind: \"title\" }];\n    if (mode === \"program\" && !hideLabel) {\n      result.push({ kind: \"labelInput\" });\n    }\n    if (exerciseType) {\n      result.push({ kind: \"currentExercise\", exerciseType });\n    }\n\n    const isAdhocTab = selectedTab === 0;\n    const isFromProgramTab = mode === \"workout\" && selectedTab === 1 && evaluatedProgram != null;\n    const isTemplateTab = mode === \"program\" && selectedTab === 1;\n    const showTabs = tabs.length > 1;\n\n    if (mode === \"workout\") {\n      const sub: \"search\" | \"program\" | null = isAdhocTab ? \"search\" : isFromProgramTab ? \"program\" : null;\n      if (showTabs || sub != null) {\n        result.push({ kind: \"stickyChrome\", showTabs, sub, showWeeks: isFromProgramTab && weeks.length > 1 });\n      }\n    } else {\n      if (showTabs) {\n        result.push({ kind: \"tabs\" });\n      }\n      if (isAdhocTab) {\n        result.push({ kind: \"searchFilter\" });\n      }\n    }\n\n    if (isFromProgramTab) {\n      if (weeks.length === 0) {\n        result.push({ kind: \"programEmpty\", message: \"No weeks available in the program.\" });\n      } else if (programGroups.length === 0) {\n        result.push({ kind: \"programEmpty\", message: \"No exercises match your search.\" });\n      } else {\n        for (const g of programGroups) {\n          result.push({ kind: \"programGroup\", group: g });\n        }\n      }\n    } else if (isTemplateTab) {\n      result.push({ kind: \"templateForm\" });\n    } else if (isAdhocTab) {\n      if (recentExercises.length > 0) {\n        result.push({ kind: \"recentHeader\" });\n        if (!isRecentCollapsed) {\n          result.push(...recentExercises);\n        }\n      }\n      // Whatever Recent actually shows is dropped from the lists below, so every exercise stays exactly\n      // one row. Two rows would both light up when selected, and `getByTestId` is strict, so a duplicated\n      // `menu-item-*` would break the Playwright swap specs. Collapsed, Recent shows nothing and excludes\n      // nothing — otherwise folding the section away would remove those exercises from the picker\n      // entirely, since Recent is a second home for them rather than their only one.\n      const shownRecentKeys = isRecentCollapsed ? new Set<string>() : recentKeys;\n      result.push({ kind: \"customHeader\" });\n      if (!isCustomCollapsed) {\n        for (const c of customExercises) {\n          if (!shownRecentKeys.has(c.key)) {\n            result.push({ kind: \"customExercise\", raw: c.raw, exercise: c.exercise, key: c.key });\n          }\n        }\n      }\n      result.push({ kind: \"builtinHeader\" });\n      if (!isBuiltinCollapsed) {\n        for (const e of builtinExercises) {\n          const key = Exercise_toKey(e);\n          if (!shownRecentKeys.has(key)) {\n            result.push({ kind: \"builtinExercise\", exercise: e, key });\n          }\n        }\n      }\n    }\n    return result;\n  }, [\n    mode,\n    hideLabel,\n    exerciseType,\n    tabs.length,\n    selectedTab,\n    evaluatedProgram,\n    weeks.length,\n    programGroups,\n    customExercises,\n    builtinExercises,\n    recentExercises,\n    recentKeys,\n    isRecentCollapsed,\n    isCustomCollapsed,\n    isBuiltinCollapsed,\n  ]);\n\n  const stickyIndices = useMemo<number[] | undefined>(() => {\n    if (Platform.OS === \"web\") {\n      return undefined;\n    }\n    if (mode === \"workout\") {\n      const idx = items.findIndex((it) => it.kind === \"stickyChrome\");\n      return idx !== -1 ? [idx] : undefined;\n    }\n    if (mode === \"program\" && selectedTab === 0) {\n      const idx = items.findIndex((it) => it.kind === \"searchFilter\");\n      return idx !== -1 ? [idx] : undefined;\n    }\n    return undefined;\n  }, [items, mode, selectedTab]);\n\n  const keyExtractor = useCallback((item: IListItem) => {\n    switch (item.kind) {\n      case \"title\":\n        return \"title\";\n      case \"labelInput\":\n        return \"labelInput\";\n      case \"currentExercise\":\n        return \"currentExercise\";\n      case \"tabs\":\n        return \"tabs\";\n      case \"weekTabs\":\n        return \"weekTabs\";\n      case \"searchFilter\":\n        return \"searchFilter\";\n      case \"stickyChrome\":\n        return \"stickyChrome\";\n      case \"recentHeader\":\n        return \"recentHeader\";\n      case \"customHeader\":\n        return \"customHeader\";\n      case \"customExercise\":\n        return `custom-${item.raw.id}`;\n      case \"builtinHeader\":\n        return \"builtinHeader\";\n      case \"builtinExercise\":\n        return `builtin-${item.key}`;\n      case \"programGroup\":\n        return `programGroup-${item.group.exerciseKey}`;\n      case \"programEmpty\":\n        return \"programEmpty\";\n      case \"templateForm\":\n        return \"templateForm\";\n    }\n  }, []);\n\n  const getItemType = useCallback((item: IListItem) => item.kind, []);\n\n  // Every row here is sized by text that grows with the text size setting, so these estimates have\n  // to grow with it too - a virtualized list that under-estimates by 50% scrolls to blank regions.\n  const getEstimatedItemSize = useCallback(\n    (_index: number, item: IListItem) => {\n      switch (item.kind) {\n        case \"title\":\n          return 44 * remScale;\n        case \"labelInput\":\n          return 64 * remScale;\n        case \"currentExercise\":\n          return 100 * remScale;\n        case \"tabs\":\n          return 44 * remScale;\n        case \"weekTabs\":\n          return 48 * remScale;\n        case \"searchFilter\":\n          return 92 * remScale;\n        case \"stickyChrome\": {\n          const tabsHeight = item.showTabs ? 44 : 0;\n          const subHeight = item.sub === \"search\" ? 92 : item.sub === \"program\" ? 48 + (item.showWeeks ? 48 : 0) : 0;\n          return (tabsHeight + subHeight || 44) * remScale;\n        }\n        case \"recentHeader\":\n        case \"customHeader\":\n        case \"builtinHeader\":\n          return 44 * remScale;\n        case \"customExercise\":\n        case \"builtinExercise\":\n          return 72 * remScale;\n        case \"programGroup\":\n          return 140 * remScale;\n        case \"programEmpty\":\n          return 60 * remScale;\n        case \"templateForm\":\n          return 220 * remScale;\n      }\n    },\n    [remScale]\n  );\n\n  const scrollY = useSharedValue(0);\n  const titleHeight = useSharedValue(0);\n  const labelHeight = useSharedValue(0);\n  const currentExHeight = useSharedValue(0);\n  const tabsHeight = useSharedValue(0);\n  const onAnimatedScroll = useAnimatedScrollHandler({\n    onScroll: (e) => {\n      scrollY.value = e.contentOffset.y;\n    },\n  });\n  const captureHeight = useCallback(\n    (sv: typeof scrollY) => (e: { nativeEvent: { layout: { height: number } } }) => {\n      sv.value = e.nativeEvent.layout.height;\n    },\n    []\n  );\n  const onTitleLayout = useMemo(() => captureHeight(titleHeight), [captureHeight, titleHeight]);\n  const onLabelLayout = useMemo(() => captureHeight(labelHeight), [captureHeight, labelHeight]);\n  const onCurrentExLayout = useMemo(() => captureHeight(currentExHeight), [captureHeight, currentExHeight]);\n  const onTabsLayout = useMemo(() => captureHeight(tabsHeight), [captureHeight, tabsHeight]);\n  const stickyShadowStyle = useAnimatedStyle(() => {\n    const top = titleHeight.value + labelHeight.value + currentExHeight.value + tabsHeight.value;\n    const t = top > 0 ? interpolate(scrollY.value, [top - 4, top + 4], [0, 1], Extrapolation.CLAMP) : 0;\n    if (Platform.OS === \"ios\") {\n      return { shadowOpacity: t * 0.12 };\n    }\n    if (Platform.OS === \"android\") {\n      return { elevation: t * 4 };\n    }\n    return { opacity: 1 };\n  });\n  const stickyLabelStyle = useAnimatedStyle(() => {\n    if (currentExHeight.value === 0) {\n      return { opacity: 0, transform: [{ translateY: 0 }] };\n    }\n    const cardTop = titleHeight.value + labelHeight.value;\n    const cardBottom = cardTop + currentExHeight.value;\n    const t = interpolate(scrollY.value, [cardTop, cardBottom], [0, 1], Extrapolation.CLAMP);\n    return { opacity: t, transform: [{ translateY: (1 - t) * 6 }] };\n  });\n\n  const currentExerciseName = useMemo(() => {\n    if (!exerciseType) {\n      return \"\";\n    }\n    const ex = Exercise_get(exerciseType, settings.exercises);\n    return Exercise_fullName(ex, settings);\n  }, [exerciseType, settings]);\n\n  const renderItem = useCallback(\n    ({ item }: { item: IListItem }) => {\n      switch (item.kind) {\n        case \"title\":\n          return (\n            <SheetDragHandle>\n              <View className=\"flex-row items-center gap-2 px-2 py-1\" onLayout={onTitleLayout}>\n                <Pressable className=\"px-2\" onPress={onSettingsPress}>\n                  <IconFilter />\n                </Pressable>\n                <Text className=\"flex-1 py-2 font-bold text-center\">{title}</Text>\n                <View className=\"flex-row items-center gap-1\">\n                  <Pressable className=\"px-2\" onPress={onToggleMuscles}>\n                    <IconMuscles2 color={Tailwind_semantic().icon.purple} isSelected={showMuscles} />\n                  </Pressable>\n                  <Pressable className=\"px-2\" onPress={onToggleStarred}>\n                    <IconStar isSelected={isStarred} color={Tailwind_semantic().icon.purple} />\n                  </Pressable>\n                </View>\n              </View>\n            </SheetDragHandle>\n          );\n        case \"labelInput\":\n          return (\n            <View className=\"px-4 pb-1\" onLayout={onLabelLayout}>\n              <Input\n                label=\"Label\"\n                defaultValue={state.label}\n                isLabelOutside={true}\n                changeType={\"oninput\"}\n                inputSize=\"sm\"\n                pattern=\"^[^\\/\\{\\}\\(\\)\\t\\n\\r#\\[\\]]+$\"\n                patternMessage=\"Label cannot contain special characters: '/{}()#[]'\"\n                labelSize=\"xs\"\n                changeHandler={onLabelChange}\n              />\n            </View>\n          );\n        case \"currentExercise\":\n          return (\n            <SheetDragHandle>\n              <View className=\"pt-2\" onLayout={onCurrentExLayout}>\n                <ExercisePickerCurrentExercise state={state} exerciseType={item.exerciseType} settings={settings} />\n              </View>\n            </SheetDragHandle>\n          );\n        case \"tabs\":\n          return (\n            <View onLayout={onTabsLayout}>\n              <TabsRow tabs={tabs} selectedTab={selectedTab} onTabChange={onTabChange} />\n            </View>\n          );\n        case \"weekTabs\":\n          return <WeekTabsRow weeks={weeks} currentWeekIndex={currentWeekIndex} onChange={setCurrentWeekIndex} />;\n        case \"searchFilter\":\n          return (\n            <Animated.View\n              className=\"bg-background-default\"\n              style={[\n                Platform.select({\n                  ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: 2 }, shadowRadius: 4 },\n                  android: {},\n                  default: {},\n                }),\n                stickyShadowStyle,\n              ]}\n            >\n              {exerciseType != null && (\n                <Animated.View\n                  pointerEvents=\"none\"\n                  style={[{ height: 18, justifyContent: \"flex-end\" }, stickyLabelStyle]}\n                >\n                  <Text numberOfLines={1} className=\"px-4 text-xs text-center text-text-secondary\">\n                    <Text className=\"text-xs text-text-secondary\">Current Exercise: </Text>\n                    <Text className=\"text-xs font-bold\">{currentExerciseName}</Text>\n                  </Text>\n                </Animated.View>\n              )}\n              <SearchAndFilter dispatch={dispatch} search={search} sort={sort} filters={filters} settings={settings} />\n            </Animated.View>\n          );\n        case \"stickyChrome\":\n          return (\n            <Animated.View\n              className=\"bg-background-default\"\n              style={[\n                Platform.select({\n                  ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: 2 }, shadowRadius: 4 },\n                  android: {},\n                  default: {},\n                }),\n                stickyShadowStyle,\n              ]}\n            >\n              {exerciseType != null && (\n                <Animated.View\n                  pointerEvents=\"none\"\n                  style={[{ height: 18, justifyContent: \"flex-end\" }, stickyLabelStyle]}\n                >\n                  <Text numberOfLines={1} className=\"px-4 text-xs text-center text-text-secondary\">\n                    <Text className=\"text-xs text-text-secondary\">Current Exercise: </Text>\n                    <Text className=\"text-xs font-bold\">{currentExerciseName}</Text>\n                  </Text>\n                </Animated.View>\n              )}\n              {item.showTabs && <TabsRow tabs={tabs} selectedTab={selectedTab} onTabChange={onTabChange} />}\n              {item.sub === \"search\" && (\n                <SearchAndFilter\n                  dispatch={dispatch}\n                  search={search}\n                  sort={sort}\n                  filters={filters}\n                  settings={settings}\n                />\n              )}\n              {item.sub === \"program\" && (\n                <>\n                  <View className=\"flex-row items-center mx-4 my-1\">\n                    <SearchInput dispatch={dispatch} search={search} />\n                  </View>\n                  {item.showWeeks && (\n                    <WeekTabsRow weeks={weeks} currentWeekIndex={currentWeekIndex} onChange={setCurrentWeekIndex} />\n                  )}\n                </>\n              )}\n            </Animated.View>\n          );\n        case \"recentHeader\":\n          return (\n            <View className=\"py-2\">\n              <GroupHeader\n                isExpanded={!isRecentCollapsed}\n                onToggle={() => setIsRecentCollapsed((v) => !v)}\n                leftExpandIcon={true}\n                name=\"Recent\"\n                headerClassName=\"mx-4\"\n              />\n            </View>\n          );\n        case \"customHeader\":\n          return (\n            <View className=\"py-2\">\n              <GroupHeader\n                isExpanded={!isCustomCollapsed}\n                onToggle={() => setIsCustomCollapsed((v) => !v)}\n                leftExpandIcon={true}\n                name=\"Custom Exercises\"\n                headerClassName=\"mx-4\"\n                rightAddOn={\n                  <LinkButton\n                    className=\"text-xs\"\n                    data-testid=\"custom-exercise-create\"\n                    testID=\"custom-exercise-create\"\n                    name=\"create-custom-exercise\"\n                    onPress={onCreateCustom}\n                  >\n                    Create\n                  </LinkButton>\n                }\n              />\n            </View>\n          );\n        case \"customExercise\": {\n          const isSelectedAlready = selectedAnyKeys.has(item.key);\n          const isUsedForDay = usedKeys.has(item.key);\n          const isSelected = selectedAdhocKeys.has(item.key);\n          return (\n            <CustomExerciseRow\n              rawExercise={item.raw}\n              exercise={item.exercise}\n              isSelected={isSelected}\n              isEnabled={!isUsedForDay && (!isMultiselect || !isSelectedAlready)}\n              isMultiselect={isMultiselect}\n              showMuscles={showMuscles}\n              currentExerciseType={exerciseType}\n              settings={settings}\n              dispatch={dispatch}\n              onChoose={onChooseAdhoc}\n              onStar={onStar}\n            />\n          );\n        }\n        case \"builtinHeader\":\n          return (\n            <View className=\"py-2\">\n              <GroupHeader\n                isExpanded={!isBuiltinCollapsed}\n                onToggle={() => setIsBuiltinCollapsed((v) => !v)}\n                leftExpandIcon={true}\n                name=\"Built-in Exercises\"\n                headerClassName=\"mx-4\"\n              />\n            </View>\n          );\n        case \"builtinExercise\": {\n          const e = item.exercise;\n          const key = item.key;\n          const isUsedForDay = usedKeys.has(key);\n          const isSelectedAlready = selectedAnyKeys.has(key);\n          const isSelected = selectedAdhocKeys.has(key);\n          const testId = `menu-item-${StringUtils_dashcase(e.name)}${\n            e.equipment ? `-${StringUtils_dashcase(e.equipment)}` : \"\"\n          }`;\n          return (\n            <View\n              data-testid={testId}\n              testID={testId}\n              className={`w-full py-1 pl-4 pr-2 border-b border-border-neutral ${\n                isSelected ? \"bg-background-purpledark\" : \"\"\n              }`}\n            >\n              <ExercisePickerExerciseItem\n                onStar={onStar}\n                isMultiselect={isMultiselect}\n                isEnabled={!isUsedForDay && (!isMultiselect || !isSelectedAlready)}\n                isSelected={isSelected}\n                onChoose={onChooseAdhoc}\n                showMuscles={showMuscles}\n                settings={settings}\n                currentExerciseType={exerciseType}\n                exercise={e}\n              />\n            </View>\n          );\n        }\n        case \"programGroup\":\n          return (\n            <ProgramExerciseGroupCard\n              group={item.group}\n              isMultiselect={isMultiselect}\n              selectedProgramKeys={selectedProgramKeys}\n              selectedAnyKeys={selectedAnyKeys}\n              usedKeys={usedKeys}\n              settings={settings}\n              onChoose={onChooseProgram}\n            />\n          );\n        case \"programEmpty\":\n          return (\n            <View className=\"px-4 py-6\">\n              <Text className=\"text-sm text-center text-text-secondary\">{item.message}</Text>\n            </View>\n          );\n        case \"templateForm\":\n          return <ExercisePickerTemplate dispatch={dispatch} templateName={templateName} />;\n      }\n    },\n    [\n      title,\n      onSettingsPress,\n      onToggleMuscles,\n      onToggleStarred,\n      showMuscles,\n      isStarred,\n      state,\n      onLabelChange,\n      settings,\n      tabs,\n      selectedTab,\n      onTabChange,\n      weeks,\n      currentWeekIndex,\n      dispatch,\n      search,\n      sort,\n      filters,\n      onCreateCustom,\n      selectedAnyKeys,\n      usedKeys,\n      selectedAdhocKeys,\n      isMultiselect,\n      exerciseType,\n      onChooseAdhoc,\n      onStar,\n      selectedProgramKeys,\n      onChooseProgram,\n      templateName,\n      stickyShadowStyle,\n      stickyLabelStyle,\n      currentExerciseName,\n      onTitleLayout,\n      onLabelLayout,\n      onCurrentExLayout,\n      onTabsLayout,\n      isRecentCollapsed,\n      isCustomCollapsed,\n      isBuiltinCollapsed,\n    ]\n  );\n\n  const bottomShadowStyle = useMemo(\n    () =>\n      Platform.select({\n        ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: -2 }, shadowOpacity: 0.05, shadowRadius: 4 },\n        android: { elevation: 4 },\n        default: { boxShadow: \"0 -4px 4px 0 rgba(0, 0, 0, 0.05)\" },\n      }),\n    []\n  );\n\n  const listExtraData = useMemo(\n    () => ({\n      selectedAdhocKeys,\n      selectedProgramKeys,\n      selectedAnyKeys,\n      usedKeys,\n      isMultiselect,\n      showMuscles,\n      currentExerciseName,\n    }),\n    [selectedAdhocKeys, selectedProgramKeys, selectedAnyKeys, usedKeys, isMultiselect, showMuscles, currentExerciseName]\n  );\n\n  return (\n    <View className=\"flex-1\">\n      <View className=\"flex-1\">\n        <AnimatedLegendList\n          data={items}\n          renderItem={renderItem}\n          keyExtractor={keyExtractor}\n          getItemType={getItemType}\n          getEstimatedItemSize={getEstimatedItemSize}\n          stickyIndices={stickyIndices}\n          extraData={listExtraData}\n          keyboardShouldPersistTaps=\"handled\"\n          contentContainerStyle={{ paddingBottom: 16 }}\n          onScroll={onAnimatedScroll}\n          bounces={false}\n          overScrollMode=\"never\"\n        />\n      </View>\n      <View className=\"w-full px-4 pt-2 pb-2\" style={bottomShadowStyle}>\n        <BottomButton state={state} evaluatedProgram={evaluatedProgram} onClick={onBottomClick} settings={settings} />\n      </View>\n    </View>\n  );\n}\n\ninterface ITabsRowProps {\n  tabs: ITabDef[];\n  selectedTab: number;\n  onTabChange: (tab: number) => void;\n}\n\nconst TabsRow = memo(function TabsRow(props: ITabsRowProps): JSX.Element {\n  const { tabs, selectedTab, onTabChange } = props;\n  const activeColor = Tailwind_semantic().button.secondarystroke;\n  const remScale = useRemScale();\n  const [rowWidth, setRowWidth] = useState(0);\n  // Tabs split the row evenly, so the longest label decides one font size for all of them - labels\n  // at different sizes next to each other read as a mistake.\n  const fontSize = useMemo(() => {\n    const baseFontSize = 16 * remScale;\n    if (rowWidth <= 0 || tabs.length === 0) {\n      return baseFontSize;\n    }\n    const availableWidth = rowWidth / tabs.length - 16;\n    return tabs.reduce(\n      (min, tab) => Math.min(min, FitText_fontSize(tab.label, availableWidth, baseFontSize)),\n      baseFontSize\n    );\n  }, [rowWidth, tabs, remScale]);\n  return (\n    <View className=\"flex-row bg-background-default\" onLayout={(e) => setRowWidth(e.nativeEvent.layout.width)}>\n      {tabs.map((tab) => {\n        const isSelected = selectedTab === tab.index;\n        const nameClass = `tab-${StringUtils_dashcase(tab.label.toLowerCase())}`;\n        return (\n          <View\n            key={tab.label}\n            className=\"items-center border-b border-border-neutral\"\n            style={{ flexGrow: 1, flexShrink: 1, flexBasis: 0 }}\n          >\n            <Pressable\n              className=\"px-2 pt-2 pb-1\"\n              style={isSelected ? { borderBottomWidth: 2, borderBottomColor: activeColor } : undefined}\n              data-testid={nameClass}\n              testID={nameClass}\n              onPress={() => onTabChange(tab.index)}\n            >\n              <Text\n                numberOfLines={1}\n                className={`text-base ${isSelected ? \"text-text-purple\" : \"\"}`}\n                style={{ fontSize }}\n              >\n                {tab.label}\n              </Text>\n            </Pressable>\n          </View>\n        );\n      })}\n    </View>\n  );\n});\n\ninterface IWeekTabsRowProps {\n  weeks: IEvaluatedProgramWeek[];\n  currentWeekIndex: number;\n  onChange: (index: number) => void;\n}\n\nconst WeekTabsRow = memo(function WeekTabsRow(props: IWeekTabsRowProps): JSX.Element {\n  const { weeks, currentWeekIndex, onChange } = props;\n  return (\n    <View className=\"bg-background-default\">\n      <Scroller>\n        <View className=\"flex-row gap-2 px-4 py-2\">\n          {weeks.map((week, i) => {\n            const isSelected = currentWeekIndex === i;\n            const nameClass = `tab-${StringUtils_dashcase(week.name.toLowerCase())}`;\n            return (\n              <Pressable\n                key={`${i}-${week.name}`}\n                className={`px-3 py-2 rounded ${\n                  isSelected\n                    ? \"bg-background-default border border-button-primarybackground\"\n                    : \"bg-background-subtle border border-background-default\"\n                }`}\n                data-testid={nameClass}\n                testID={nameClass}\n                onPress={() => onChange(i)}\n              >\n                <Text className={`text-sm ${isSelected ? \"text-text-purple\" : \"text-text-secondary\"}`}>\n                  {week.name}\n                </Text>\n              </Pressable>\n            );\n          })}\n        </View>\n      </Scroller>\n    </View>\n  );\n});\n\ninterface ISearchAndFilterProps {\n  dispatch: ILensDispatch<IExercisePickerState>;\n  settings: ISettings;\n  search?: string;\n  sort: IExercisePickerState[\"sort\"];\n  filters: IExercisePickerState[\"filters\"];\n}\n\nconst SearchInput = memo(function SearchInput(props: {\n  dispatch: ILensDispatch<IExercisePickerState>;\n  search?: string;\n}): JSX.Element {\n  const { dispatch, search } = props;\n  const [localSearch, setLocalSearch] = useState<string>(search ?? \"\");\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, []);\n  useEffect(() => {\n    if (timeoutRef.current == null && (search ?? \"\") !== localSearch) {\n      setLocalSearch(search ?? \"\");\n    }\n  }, [search, localSearch]);\n\n  const onChangeText = useCallback(\n    (value: string) => {\n      setLocalSearch(value);\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n      timeoutRef.current = setTimeout(() => {\n        dispatch(lb<IExercisePickerState>().p(\"search\").record(value), \"Update search input\");\n        timeoutRef.current = null;\n      }, 200);\n    },\n    [dispatch]\n  );\n\n  return (\n    <View className=\"flex-row items-center flex-1 gap-2 p-2 rounded-lg bg-background-neutral\">\n      <IconMagnifyingGlass size={18} color={Tailwind_colors().lightgray[600]} />\n      <TextInput\n        placeholder=\"Search by name\"\n        placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n        className=\"flex-1 text-sm text-text-secondary\"\n        style={{ paddingVertical: 0, includeFontPadding: false }}\n        data-testid=\"exercise-filter-by-name\"\n        testID=\"exercise-filter-by-name\"\n        value={localSearch}\n        onChangeText={onChangeText}\n        returnKeyType=\"search\"\n      />\n    </View>\n  );\n});\n\nconst SearchAndFilter = memo(function SearchAndFilter(props: ISearchAndFilterProps): JSX.Element {\n  const { dispatch, search, sort, filters, settings } = props;\n  const filterNames = useMemo(() => ExercisePickerUtils_getAllFilterNames(filters, settings), [filters, settings]);\n  const isFiltered = filterNames.length > 0;\n\n  const onFilterPress = useCallback(() => {\n    dispatch(\n      lb<IExercisePickerState>()\n        .p(\"screenStack\")\n        .recordModify((stack) => [...stack, \"filter\"]),\n      \"Navigate to filter picker screen\"\n    );\n  }, [dispatch]);\n\n  const onClearFilters = useCallback(\n    () => dispatch(lb<IExercisePickerState>().p(\"filters\").record({}), \"Clear filters\"),\n    [dispatch]\n  );\n\n  return (\n    <View className=\"my-1\">\n      <View className=\"flex-row items-center gap-2 mx-4\">\n        <SearchInput dispatch={dispatch} search={search} />\n        <Pressable\n          className={`flex-row items-center gap-1 py-1 border rounded-lg ${\n            isFiltered ? \"border-button-secondarystroke px-2\" : \"px-4 border-border-neutral\"\n          }`}\n          onPress={onFilterPress}\n        >\n          {isFiltered && (\n            <View\n              className=\"items-center justify-center rounded-full bg-button-primarybackground\"\n              style={{ width: 20, height: 20 }}\n            >\n              <Text className=\"text-xs font-semibold text-text-alwayswhite\">{filterNames.length}</Text>\n            </View>\n          )}\n          <IconFilter2 color={isFiltered ? Tailwind_semantic().icon.purple : Tailwind_semantic().icon.neutral} />\n        </Pressable>\n      </View>\n      <View className=\"mx-4\">\n        <Text className=\"text-xs text-text-secondary\">\n          <Text className=\"text-xs text-text-secondary\">Sorted by: </Text>\n          <Text className=\"text-xs font-bold text-text-secondary\">{exercisePickerSortNames[sort]}</Text>\n          {filterNames.length > 0 && (\n            <Text className=\"text-xs text-text-secondary\">\n              {\", Filters: \"}\n              {filterNames.map((f, i) => (\n                <Fragment key={i}>\n                  {i > 0 ? \", \" : \"\"}\n                  <Text className=\"text-xs font-bold text-text-secondary\">{f}</Text>\n                </Fragment>\n              ))}\n            </Text>\n          )}\n        </Text>\n        {filterNames.length > 0 && (\n          <LinkButton name=\"clear-filters\" className=\"text-xs\" onPress={onClearFilters}>\n            Clear\n          </LinkButton>\n        )}\n      </View>\n    </View>\n  );\n});\n\ninterface ICustomExerciseRowProps {\n  rawExercise: ICustomExercise;\n  exercise: IExercise;\n  isSelected: boolean;\n  isEnabled: boolean;\n  isMultiselect: boolean;\n  showMuscles?: boolean;\n  currentExerciseType?: IExerciseType;\n  settings: ISettings;\n  dispatch: ILensDispatch<IExercisePickerState>;\n  onChoose: (key: string) => void;\n  onStar: (key: string) => void;\n}\n\nconst CustomExerciseRow = memo(function CustomExerciseRow(props: ICustomExerciseRowProps): JSX.Element {\n  const { rawExercise, dispatch } = props;\n  const onEdit = useCallback(() => {\n    dispatch(\n      [\n        lb<IExercisePickerState>()\n          .p(\"screenStack\")\n          .recordModify((stack) => [...stack, \"customExercise\"]),\n        lb<IExercisePickerState>().p(\"editCustomExercise\").record(ObjectUtils_clone(rawExercise)),\n      ],\n      `Navigate to edit custom exercise screen for ${rawExercise.name}`\n    );\n  }, [dispatch, rawExercise]);\n\n  return (\n    <View\n      data-testid={`menu-item-${rawExercise.id}`}\n      testID={`menu-item-${rawExercise.id}`}\n      className={`w-full py-1 pl-4 pr-2 border-b border-border-neutral ${\n        props.isSelected ? \"bg-background-purpledark\" : \"\"\n      }`}\n    >\n      <ExercisePickerExerciseItem\n        onStar={props.onStar}\n        isMultiselect={props.isMultiselect}\n        isEnabled={props.isEnabled}\n        showMuscles={props.showMuscles}\n        settings={props.settings}\n        currentExerciseType={props.currentExerciseType}\n        exercise={props.exercise}\n        isSelected={props.isSelected}\n        onChoose={props.onChoose}\n        onEdit={onEdit}\n      />\n    </View>\n  );\n});\n\ninterface IProgramGroupCardProps {\n  group: IProgramGroup;\n  isMultiselect: boolean;\n  selectedProgramKeys: Set<string>;\n  selectedAnyKeys: Set<string>;\n  usedKeys: Set<string>;\n  settings: ISettings;\n  onChoose: (et: IExerciseType, week: number, dayInWeek: number) => void;\n}\n\nconst ProgramExerciseGroupCard = memo(function ProgramExerciseGroupCard(props: IProgramGroupCardProps): JSX.Element {\n  const { group, isMultiselect, selectedProgramKeys, selectedAnyKeys, usedKeys, settings, onChoose } = props;\n  const isAllDisabled = group.exercises.every((exercise) => {\n    const et = exercise.exerciseType;\n    if (et == null) {\n      return true;\n    }\n    const key = Exercise_toKey(et);\n    const selKey = `${key}_${exercise.dayData.week}_${exercise.dayData.dayInWeek}`;\n    const isSelected = selectedProgramKeys.has(selKey);\n    const isDisabled = selectedAnyKeys.has(key);\n    const isUsedForDay = usedKeys.has(key);\n    return isMultiselect ? isUsedForDay || (isDisabled && !isSelected) : isUsedForDay;\n  });\n\n  return (\n    <View\n      className={`flex-row gap-2 px-2 pb-2 mb-4 border-b border-background-subtle ${isAllDisabled ? \"opacity-40\" : \"\"}`}\n    >\n      <View className=\"pl-1\">\n        <View className=\"p-1 rounded-lg bg-background-image\">\n          <ExerciseImage settings={settings} exerciseType={group.exerciseType} size=\"small\" className=\"w-scaled-10\" />\n        </View>\n      </View>\n      <View className=\"flex-1 pt-1\">\n        <Text className=\"text-base font-semibold\">{group.name}</Text>\n      </View>\n      <View>\n        {group.exercises.map((exercise) => {\n          const et = exercise.exerciseType;\n          if (et == null) {\n            return null;\n          }\n          const key = Exercise_toKey(et);\n          const selKey = `${key}_${exercise.dayData.week}_${exercise.dayData.dayInWeek}`;\n          const isSelected = selectedProgramKeys.has(selKey);\n          const isDisabled = selectedAnyKeys.has(key);\n          const isUsedForDay = usedKeys.has(key);\n          const isItemDisabled = isMultiselect ? isUsedForDay || (isDisabled && !isSelected) : isUsedForDay;\n          const rowKey = `${exercise.key}_${exercise.dayData.week}_${exercise.dayData.dayInWeek}`;\n          return (\n            <ProgramExerciseRow\n              key={rowKey}\n              exercise={exercise}\n              exerciseType={et}\n              isMultiselect={isMultiselect}\n              isSelected={isSelected}\n              isItemDisabled={isItemDisabled}\n              isAllDisabled={isAllDisabled}\n              settings={settings}\n              onChoose={onChoose}\n            />\n          );\n        })}\n      </View>\n    </View>\n  );\n});\n\ninterface IProgramExerciseRowProps {\n  exercise: IPlannerProgramExercise;\n  exerciseType: IExerciseType;\n  isMultiselect: boolean;\n  isSelected: boolean;\n  isItemDisabled: boolean;\n  isAllDisabled: boolean;\n  settings: ISettings;\n  onChoose: (et: IExerciseType, week: number, dayInWeek: number) => void;\n}\n\nconst ProgramExerciseRow = memo(function ProgramExerciseRow(props: IProgramExerciseRowProps): JSX.Element {\n  const { exercise, exerciseType, isMultiselect, isSelected, isItemDisabled, isAllDisabled, settings, onChoose } =\n    props;\n  const choose = useCallback(() => {\n    onChoose(exerciseType, exercise.dayData.week, exercise.dayData.dayInWeek);\n  }, [onChoose, exerciseType, exercise.dayData.week, exercise.dayData.dayInWeek]);\n\n  const displayGroups = useMemo(() => {\n    const currentSetVariation = PlannerProgramExercise_currentEvaluatedSetVariation(exercise);\n    return PlannerProgramExercise_evaluatedSetsToDisplaySets(currentSetVariation.sets, settings);\n  }, [exercise, settings]);\n\n  const testId = `exercise-picker-program-${StringUtils_dashcase(exercise.name)}-${exercise.dayData.week}-${exercise.dayData.dayInWeek}`;\n  const rowClassName = `justify-end flex-row pb-1 ${isItemDisabled && !isAllDisabled ? \"opacity-40\" : \"\"}`;\n\n  const dayContent = (\n    <View>\n      <Text className=\"px-1 pb-1 text-xs text-text-secondary\">Day {exercise.dayData.dayInWeek}</Text>\n      {displayGroups.map((g, gi) => (\n        <HistoryRecordSet key={gi} sets={g} isNext={true} units={settings.units} />\n      ))}\n    </View>\n  );\n\n  if (isMultiselect) {\n    return (\n      <View className={rowClassName} data-testid={testId} testID={testId}>\n        <Pressable className=\"flex-row\" disabled={isItemDisabled} onPress={choose}>\n          {dayContent}\n        </Pressable>\n        <Pressable className=\"items-center justify-center p-2\" disabled={isItemDisabled} onPress={choose}>\n          <IconCheckCircle isChecked={isSelected} />\n        </Pressable>\n      </View>\n    );\n  }\n  return (\n    <Pressable className={rowClassName} disabled={isItemDisabled} data-testid={testId} testID={testId} onPress={choose}>\n      {dayContent}\n      <View className=\"items-center justify-center p-2\">\n        <RadioIndicator checked={isSelected} />\n      </View>\n    </Pressable>\n  );\n});\n\nfunction RadioIndicator(props: { checked: boolean }): JSX.Element {\n  const color = Tailwind_semantic().icon.purple;\n  return (\n    <View\n      className=\"items-center justify-center border-2 rounded-full\"\n      style={{ width: 20, height: 20, borderColor: props.checked ? color : Tailwind_semantic().border.prominent }}\n    >\n      {props.checked && <View className=\"rounded-full\" style={{ width: 10, height: 10, backgroundColor: color }} />}\n    </View>\n  );\n}\n\ninterface IBottomButtonProps {\n  evaluatedProgram?: IEvaluatedProgram;\n  state: IExercisePickerState;\n  onClick: () => void;\n  settings: ISettings;\n}\n\nfunction BottomButton(props: IBottomButtonProps): JSX.Element {\n  const { state, settings, evaluatedProgram } = props;\n  const selectedExercises = useMemo(\n    () =>\n      CollectionUtils_compact(\n        state.selectedExercises.map((e) => {\n          if (e.type === \"adhoc\") {\n            const ex = Exercise_get(e.exerciseType, settings.exercises);\n            return Exercise_fullName(ex, settings);\n          } else if (e.type === \"program\") {\n            return evaluatedProgram\n              ? ExercisePickerUtils_getProgramExercisefullName(e, evaluatedProgram, settings)\n              : undefined;\n          } else {\n            return undefined;\n          }\n        })\n      ),\n    [state.selectedExercises, settings, evaluatedProgram]\n  );\n  return (\n    <View>\n      <Button\n        className=\"w-full\"\n        name=\"pick-exercises\"\n        kind=\"purple\"\n        buttonSize=\"lg\"\n        onPress={props.onClick}\n        data-testid=\"exercise-picker-confirm\"\n        testID=\"exercise-picker-confirm\"\n      >\n        {state.mode === \"workout\"\n          ? state.exerciseType\n            ? \"Swap Exercise\"\n            : selectedExercises.length > 0\n              ? `Add to this workout${selectedExercises.length > 0 ? ` (${selectedExercises.length})` : \"\"}`\n              : \"Close\"\n          : state.exerciseType || state.templateName\n            ? `Save ${state.selectedTab === 1 ? \"Template\" : \"Exercise\"}`\n            : selectedExercises.length > 0\n              ? state.selectedTab === 1\n                ? \"Add Template\"\n                : // Counted, because adding to a program is multi-select too now and the button is\n                  // the only place that says how many are about to land in the day.\n                  `Add ${StringUtils_pluralize(\"Exercise\", selectedExercises.length)}${\n                    selectedExercises.length > 1 ? ` (${selectedExercises.length})` : \"\"\n                  }`\n              : \"Close\"}\n      </Button>\n      {!(state.mode === \"program\" && state.selectedTab === 1) && selectedExercises.length > 0 && (\n        <Text className=\"text-xs text-text-secondary\">\n          {selectedExercises.map((e, i) => (\n            <Fragment key={i}>\n              {i > 0 ? \"; \" : \"\"}\n              <Text className=\"text-xs font-bold text-text-secondary\">{e}</Text>\n            </Fragment>\n          ))}\n        </Text>\n      )}\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { ObjectUtils_entries } from \"../../utils/object\";\n\ninterface IProps<T extends string> {\n  values: Record<T, IFilterValue>;\n  onSelect: (key: T) => void;\n}\n\nexport type IFilterValue = { label: string; isSelected: boolean; disabledReason?: string };\n\nexport function ExercisePickerOptions<T extends string>(props: IProps<T>): JSX.Element {\n  return (\n    <View className=\"flex-row flex-wrap mt-2\" style={{ gap: 16 }}>\n      {ObjectUtils_entries(props.values).map(([key, value]) => {\n        return (\n          <View key={key} style={{ width: \"47%\" }}>\n            <Pressable\n              className={`items-center justify-center min-h-scaled-12 px-2 py-2 rounded-lg bg-background-subtle ${\n                value.isSelected ? \"border-text-purple\" : \"border-border-neutral\"\n              }`}\n              style={{ borderWidth: value.isSelected ? 2 : 1 }}\n              disabled={!!value.disabledReason}\n              onPress={() => {\n                props.onSelect(key);\n              }}\n            >\n              <Text\n                className={`w-full text-center ${\n                  value.disabledReason\n                    ? \"text-border-neutral\"\n                    : value.isSelected\n                      ? \"text-text-purple\"\n                      : \"text-text-primary\"\n                }`}\n              >\n                {value.label}\n              </Text>\n            </Pressable>\n            {value.disabledReason && <Text className=\"text-xs text-text-secondary\">{value.disabledReason}</Text>}\n          </View>\n        );\n      })}\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, Pressable, LayoutChangeEvent } from \"react-native\";\nimport { useRemScale } from \"../../utils/useRem\";\nimport { FitText_fontSize } from \"../../utils/fitText\";\nimport { Text } from \"../primitives/text\";\nimport { availableMuscles, IMuscle, IScreenMuscle, ISettings } from \"../../types\";\nimport { Muscle_getScreenMusclesFromMuscle, Muscle_getMuscleGroupName } from \"../../models/muscle\";\nimport { ObjectUtils_keys } from \"../../utils/object\";\nimport { StringUtils_dashcase } from \"../../utils/string\";\nimport { IFilterValue } from \"./exercisePickerOptions\";\nimport { MuscleImage } from \"../muscleImage\";\n\ninterface IProps {\n  selectedValues: IMuscle[];\n  dontGroup?: boolean;\n  settings: ISettings;\n  onSelect: (muscle: IMuscle) => void;\n}\n\nconst MUSCLE_IMAGE_SIZE = 48;\n// p-1 on the cell, the border, and the label's own pr-2.\nconst MUSCLE_CELL_CHROME = 24;\n\nexport function ExercisePickerOptionsMuscles(props: IProps): JSX.Element {\n  const selectedValues = props.selectedValues;\n  const remScale = useRemScale();\n  const [rowWidth, setRowWidth] = useState(0);\n  const onRowLayout = (event: LayoutChangeEvent): void => setRowWidth(event.nativeEvent.layout.width);\n  const labelWidth = rowWidth > 0 ? rowWidth / 2 - MUSCLE_IMAGE_SIZE - MUSCLE_CELL_CHROME : 0;\n  const groupedMuscles = props.dontGroup\n    ? {\n        muscles: availableMuscles.reduce<Record<string, { label: string; isSelected: boolean }>>((memo, muscle) => {\n          memo[muscle] = { label: muscle, isSelected: selectedValues.includes(muscle) };\n          return memo;\n        }, {}),\n      }\n    : availableMuscles.reduce(\n        (memo, muscle) => {\n          const group = Muscle_getScreenMusclesFromMuscle(muscle, props.settings)?.[0];\n          if (group != null) {\n            memo[group] = memo[group] || {};\n            const isSelected = selectedValues.includes(muscle);\n            memo[group][muscle] = { label: muscle, isSelected };\n          }\n          return memo;\n        },\n        {} as Record<IScreenMuscle | string, Record<IMuscle, IFilterValue>>\n      );\n  const sortedGroupedMuscles = ObjectUtils_keys(groupedMuscles).sort(([a], [b]) => a.localeCompare(b));\n\n  return (\n    <>\n      {sortedGroupedMuscles.map((group) => {\n        const muscles = groupedMuscles[group];\n        const sortedMuscles = ObjectUtils_keys(muscles).sort(([a], [b]) => a.localeCompare(b));\n        return (\n          <View key={group} className=\"mb-4\">\n            {!props.dontGroup && (\n              <Text className=\"mb-2 font-semibold\">{Muscle_getMuscleGroupName(group, props.settings)}</Text>\n            )}\n            <View className=\"flex-row flex-wrap mt-2\" onLayout={onRowLayout}>\n              {sortedMuscles.map((key) => {\n                const value = muscles[key];\n                // A label wraps between words but never inside one, so the longest word is what has\n                // to fit - shrink to that and let wrapping handle the rest.\n                const longestWord = value.label\n                  .split(\" \")\n                  .reduce((memo, word) => (word.length > memo.length ? word : memo), \"\");\n                const fontSize = FitText_fontSize(longestWord, labelWidth, 16 * remScale);\n                return (\n                  <View key={key} style={{ width: \"50%\" }} className=\"p-1\">\n                    <Pressable\n                      testID={`select-muscle-${StringUtils_dashcase(value.label)}`}\n                      data-testid={`select-muscle-${StringUtils_dashcase(value.label)}`}\n                      className={`bg-background-subtle flex-row items-center min-h-scaled-14 rounded-lg border ${value.isSelected ? \"border-text-purple\" : \"border-border-neutral\"}`}\n                      style={{ borderWidth: value.isSelected ? 2 : 1 }}\n                      onPress={() => props.onSelect(key)}\n                    >\n                      <View>\n                        <MuscleImage muscle={key} size={MUSCLE_IMAGE_SIZE} />\n                      </View>\n                      <Text\n                        numberOfLines={2}\n                        style={{ fontSize }}\n                        className={`flex-1 pr-2 text-base ${value.isSelected ? \"text-text-purple\" : \"\"}`}\n                      >\n                        {value.label}\n                      </Text>\n                    </Pressable>\n                  </View>\n                );\n              })}\n            </View>\n          </View>\n        );\n      })}\n    </>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IExercisePickerState, ISettings } from \"../../types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { IconBack } from \"../icons/iconBack\";\nimport { MenuItemEditable } from \"../menuItemEditable\";\n\nexport type IExercisePickerSettings = Pick<\n  ISettings[\"workoutSettings\"],\n  \"shouldKeepProgramExerciseId\" | \"pickerSort\" | \"shouldShowInvisibleEquipment\"\n>;\n\ninterface IProps {\n  settings: ISettings;\n  dispatch: ILensDispatch<IExercisePickerState>;\n  onChange: (settings: IExercisePickerSettings) => void;\n}\n\nexport function ExercisePickerSettings(props: IProps): JSX.Element {\n  return (\n    <View className=\"flex-1 pb-4\">\n      <View className=\"flex-row items-center py-4 mt-2\">\n        <Pressable\n          className=\"px-4 py-2\"\n          hitSlop={12}\n          data-testid=\"navbar-back\"\n          testID=\"navbar-back\"\n          onPress={() => {\n            props.dispatch(\n              lb<IExercisePickerState>()\n                .p(\"screenStack\")\n                .recordModify((stack) => stack.slice(0, -1)),\n              \"Pop screen in exercise picker screen stack\"\n            );\n          }}\n        >\n          <IconBack />\n        </Pressable>\n        <Text className=\"flex-1 pr-12 font-bold text-center\">Settings</Text>\n      </View>\n      <View className=\"px-4\">\n        <MenuItemEditable\n          type=\"boolean\"\n          name=\"Keep existing program exercise logic when pick adhoc exercise\"\n          value={props.settings.workoutSettings.shouldKeepProgramExerciseId ? \"true\" : \"false\"}\n          onChange={(v) => {\n            props.onChange({\n              shouldKeepProgramExerciseId: v === \"true\",\n            });\n          }}\n        />\n      </View>\n    </View>\n  );\n}\n","import { JSX, memo, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { TextInput } from \"../primitives/textInput\";\nimport { Text } from \"../primitives/text\";\nimport { IExercisePickerState } from \"../../types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Exercise_nameError } from \"../../models/exercise\";\n\ninterface IProps {\n  templateName?: string;\n  dispatch: ILensDispatch<IExercisePickerState>;\n}\n\nexport const ExercisePickerTemplate = memo(function ExercisePickerTemplate(props: IProps): JSX.Element {\n  const [nameError, setNameError] = useState<string | undefined>(undefined);\n\n  return (\n    <View className=\"mx-4 mt-4 mb-4\">\n      <View className=\"mb-4\">\n        <Text className=\"text-sm font-bold\">\n          Template Name<Text className=\"text-text-error\"> *</Text>\n        </Text>\n        <TextInput\n          data-testid=\"exercise-template-name\"\n          testID=\"exercise-template-name\"\n          defaultValue={props.templateName ?? \"\"}\n          placeholder=\"My Awesome Template\"\n          placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n          className=\"px-4 py-2 mt-1 text-base border rounded-lg min-h-scaled-10 bg-background-default border-border-prominent text-text-primary\"\n          onChangeText={(rawValue) => {\n            const value = rawValue?.trim() || \"\";\n            const error = Exercise_nameError(value);\n            setNameError(error);\n            if (error == null) {\n              props.dispatch(\n                lb<IExercisePickerState>().p(\"templateName\").record(value),\n                `Set template name to ${value}`\n              );\n            }\n          }}\n        />\n        {nameError && <Text className=\"mt-1 text-xs text-text-error\">{nameError}</Text>}\n      </View>\n      <Text className=\"my-2 text-sm\">\n        <Text className=\"text-sm\">You can choose any name for the template, and it will be saved as </Text>\n        <Text className=\"text-sm font-bold\">\"non-used\"</Text>\n        <Text className=\"text-sm\"> (i.e. as a template). You can reuse </Text>\n        <Text className=\"text-sm font-bold\">sets</Text>\n        <Text className=\"text-sm\">, </Text>\n        <Text className=\"text-sm font-bold\">warmup</Text>\n        <Text className=\"text-sm\">, </Text>\n        <Text className=\"text-sm font-bold\">update</Text>\n        <Text className=\"text-sm\"> or </Text>\n        <Text className=\"text-sm font-bold\">progress</Text>\n        <Text className=\"text-sm\"> from this template in your real exercises.</Text>\n      </Text>\n    </View>\n  );\n});\n","import { lb } from \"lens-shmens\";\nimport {\n  equipmentName,\n  IExercise,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n  Exercise_get,\n  Exercise_similarRating,\n  Exercise_targetMusclesGroups,\n  Exercise_eq,\n  Exercise_toKey,\n  Exercise_fromKey,\n  Exercise_fullName,\n} from \"../../models/exercise\";\nimport {\n  Muscle_getAvailableMuscleGroups,\n  Muscle_getMusclesFromScreenMuscle,\n  Muscle_getScreenMusclesFromMuscle,\n  Muscle_getMuscleGroupName,\n} from \"../../models/muscle\";\nimport {\n  IAllCustomExercises,\n  ICustomExercise,\n  IExercisePickerFilters,\n  IExercisePickerProgramExercise,\n  IExercisePickerState,\n  IExerciseType,\n  IMuscle,\n  IScreenMuscle,\n  ISettings,\n} from \"../../types\";\nimport { ObjectUtils_filter } from \"../../utils/object\";\nimport { SetUtils_containsAnyValues } from \"../../utils/setUtils\";\nimport { StringUtils_capitalize } from \"../../utils/string\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport { PP_iterate2 } from \"../../models/pp\";\nimport { CollectionUtils_sort } from \"../../utils/collection\";\nimport { Equipment_getCurrentGym } from \"../../models/equipment\";\n\nexport function ExercisePickerUtils_getSelectedMuscleGroupNames(\n  selectedValues: IMuscle[],\n  settings: ISettings\n): string[] {\n  const currentGroups = Muscle_getAvailableMuscleGroups(settings).filter((muscleGroup) => {\n    const muscles = Muscle_getMusclesFromScreenMuscle(muscleGroup, settings);\n    return muscles.length > 0 && muscles.every((muscle) => selectedValues.includes(muscle));\n  });\n  const currentMuscles = selectedValues.filter((muscle) => {\n    const group = Muscle_getScreenMusclesFromMuscle(muscle, settings)?.[0];\n    return group && !currentGroups.includes(group);\n  });\n  return [...currentGroups.map((g) => Muscle_getMuscleGroupName(g, settings)), ...currentMuscles];\n}\n\nexport function ExercisePickerUtils_getAllFilterNames(filters: IExercisePickerFilters, settings: ISettings): string[] {\n  return [\n    ...(filters.equipment || []).map((f) => equipmentName(f)),\n    ...(filters.type || []).map((m) => StringUtils_capitalize(m)),\n    ...ExercisePickerUtils_getSelectedMuscleGroupNames(filters.muscles || [], settings),\n  ];\n}\n\nexport function ExercisePickerUtils_getAllFilters(filters: IExercisePickerFilters): string[] {\n  return [...(filters.equipment || []), ...(filters.type || []), ...(filters.muscles || [])];\n}\n\nexport function ExercisePickerUtils_getCustomFilters(filters: IExercisePickerFilters): string[] {\n  return [...(filters.type || []), ...(filters.muscles || [])];\n}\n\nexport function ExercisePickerUtils_filterExercises(\n  exercises: IExercise[],\n  filters: IExercisePickerFilters,\n  settings: ISettings\n): IExercise[] {\n  const allFilters = ExercisePickerUtils_getAllFilters(filters);\n  if (allFilters.length === 0 && settings.workoutSettings.shouldShowInvisibleEquipment) {\n    return exercises;\n  }\n  const gymEquipment = Equipment_getCurrentGym(settings).equipment;\n  return exercises.filter((exercise) => {\n    if (!exercise) {\n      return false;\n    }\n    if (\n      !settings.workoutSettings.shouldShowInvisibleEquipment &&\n      exercise.equipment &&\n      gymEquipment[exercise.equipment]?.isDeleted\n    ) {\n      return false;\n    }\n    const typeSet = new Set(filters.type || []);\n    const equipmentSet = new Set(filters.equipment || []);\n    const musclesSet = new Set(filters.muscles || []);\n    let result = true;\n    if (typeSet.size > 0) {\n      result = result && SetUtils_containsAnyValues(new Set(exercise.types), typeSet);\n    }\n    if (equipmentSet.size > 0) {\n      result = result && SetUtils_containsAnyValues(new Set([exercise.equipment]), equipmentSet);\n    }\n    if (musclesSet.size > 0) {\n      const muscles = new Set(\n        Exercise_targetMuscles(exercise, settings).concat(Exercise_synergistMuscles(exercise, settings))\n      );\n      result = result && SetUtils_containsAnyValues(muscles, musclesSet);\n    }\n    return result;\n  });\n}\n\nexport function ExercisePickerUtils_getSelectedMuscleGroups(\n  selectedValues: IMuscle[],\n  settings: ISettings\n): IScreenMuscle[] {\n  return Muscle_getAvailableMuscleGroups(settings).filter((muscleGroup) => {\n    const muscles = Muscle_getMusclesFromScreenMuscle(muscleGroup, settings);\n    return muscles.every((muscle) => selectedValues.includes(muscle));\n  });\n}\n\nexport type IExercisePickerSortCtx = Pick<IExercisePickerState, \"filters\" | \"sort\" | \"exerciseType\">;\n\nexport function ExercisePickerUtils_sortExercises(\n  exercises: IExercise[],\n  settings: ISettings,\n  ctx: IExercisePickerSortCtx\n): IExercise[] {\n  return CollectionUtils_sort(exercises, (a, b) => {\n    return ExercisePickerUtils_getSortRating(a, b, settings, ctx);\n  });\n}\n\nexport function ExercisePickerUtils_sortCustomExercises(\n  customExercises: ICustomExercise[],\n  settings: ISettings,\n  ctx: IExercisePickerSortCtx\n): ICustomExercise[] {\n  return CollectionUtils_sort(customExercises, (aE, bE) => {\n    const a = Exercise_get(aE, settings.exercises);\n    const b = Exercise_get(bE, settings.exercises);\n    return ExercisePickerUtils_getSortRating(a, b, settings, ctx);\n  });\n}\n\nexport function ExercisePickerUtils_getSortRating(\n  a: IExercise,\n  b: IExercise,\n  settings: ISettings,\n  ctx: IExercisePickerSortCtx\n): number {\n  const filters = ctx.filters;\n  const sort = ctx.sort;\n  const currentExerciseType = ctx.exerciseType;\n  const exerciseType = currentExerciseType;\n  if (sort === \"similar_muscles\" && exerciseType) {\n    const aRating = Exercise_similarRating(exerciseType, a, settings);\n    const bRating = Exercise_similarRating(exerciseType, b, settings);\n    return bRating - aRating;\n  } else if ((filters.muscles || []).length > 0) {\n    const filterMuscleGroups = ExercisePickerUtils_getSelectedMuscleGroups(filters.muscles || [], settings);\n    const aTargetMuscleGroups = Exercise_targetMusclesGroups(a, settings);\n    const bTargetMuscleGroups = Exercise_targetMusclesGroups(b, settings);\n    if (\n      aTargetMuscleGroups.some((m) => filterMuscleGroups.indexOf(m) !== -1) &&\n      bTargetMuscleGroups.every((m) => filterMuscleGroups.indexOf(m) === -1)\n    ) {\n      return -1;\n    } else if (\n      bTargetMuscleGroups.some((m) => filterMuscleGroups.indexOf(m) !== -1) &&\n      aTargetMuscleGroups.every((m) => filterMuscleGroups.indexOf(m) === -1)\n    ) {\n      return 1;\n    } else {\n      return a.name.localeCompare(b.name);\n    }\n  } else {\n    return a.name.localeCompare(b.name);\n  }\n}\n\nexport function ExercisePickerUtils_filterCustomExercises(\n  customExercises: IAllCustomExercises,\n  filters: IExercisePickerFilters\n): IAllCustomExercises {\n  const allFilters = ExercisePickerUtils_getCustomFilters(filters);\n  if (allFilters.length === 0) {\n    return customExercises;\n  }\n  return ObjectUtils_filter(customExercises, (_id, exercise) => {\n    if (!exercise) {\n      return false;\n    }\n    const typesSet = new Set(filters.type || []);\n    const musclesSet = new Set(filters.muscles || []);\n    let result = true;\n    if (typesSet.size > 0) {\n      result = result && SetUtils_containsAnyValues(new Set(exercise.types), typesSet);\n    }\n    if (musclesSet.size > 0) {\n      const muscles = new Set(exercise.meta.targetMuscles.concat(exercise.meta.synergistMuscles));\n      result = result && SetUtils_containsAnyValues(muscles, musclesSet);\n    }\n    return result;\n  });\n}\n\nexport function ExercisePickerUtils_chooseProgramExercise(\n  dispatch: ILensDispatch<IExercisePickerState>,\n  exerciseType: IExerciseType,\n  week: number,\n  dayInWeek: number,\n  ctx: IExercisePickerChooseCtx\n): void {\n  const isMultiselect = ExercisePickerUtils_getIsMultiselect(ctx);\n  const isInExercises = ctx.selectedExercises.some((e) => {\n    return (\n      \"exerciseType\" in e &&\n      Exercise_eq(e.exerciseType, exerciseType) &&\n      (e.type === \"adhoc\" || e.week !== week || e.dayInWeek !== dayInWeek)\n    );\n  });\n  if (isMultiselect && isInExercises) {\n    return;\n  }\n  dispatch(\n    lb<IExercisePickerState>()\n      .p(\"selectedExercises\")\n      .recordModify((exercises) => {\n        if (\n          exercises.some(\n            (e) =>\n              \"exerciseType\" in e &&\n              Exercise_eq(e.exerciseType, exerciseType) &&\n              e.type === \"program\" &&\n              e.week === week &&\n              e.dayInWeek === dayInWeek\n          )\n        ) {\n          return exercises.filter((e) => e.type !== \"program\" || !Exercise_eq(e.exerciseType, exerciseType));\n        } else {\n          if (isMultiselect) {\n            return [...exercises, { type: \"program\", exerciseType, week, dayInWeek }];\n          } else {\n            return [{ type: \"program\", exerciseType, week, dayInWeek }];\n          }\n        }\n      }),\n    `Toggle selection of program exercise ${Exercise_toKey(exerciseType)}[${week}:${dayInWeek}]`\n  );\n}\n\nexport type IExercisePickerMultiselectCtx = Pick<IExercisePickerState, \"mode\" | \"exerciseType\">;\nexport type IExercisePickerChooseCtx = Pick<\n  IExercisePickerState,\n  \"mode\" | \"exerciseType\" | \"selectedExercises\" | \"label\"\n>;\n\n// An `exerciseType` means the picker was opened *about* one exercise — replacing it, duplicating it,\n// swapping a variation — and all of those answer with exactly one exercise. Without one it was\n// opened to add, and adding several at once is the same gesture repeated. That holds in a program\n// as much as in a workout, which is why the mode no longer comes into it.\nexport function ExercisePickerUtils_getIsMultiselect(ctx: IExercisePickerMultiselectCtx): boolean {\n  return !ctx.exerciseType;\n}\n\nexport function ExercisePickerUtils_chooseAdhocExercise(\n  dispatch: ILensDispatch<IExercisePickerState>,\n  key: string,\n  ctx: IExercisePickerChooseCtx\n): void {\n  const selectedExercises = ctx.selectedExercises;\n  const isMultiselect = ExercisePickerUtils_getIsMultiselect(ctx);\n  const exerciseType = Exercise_fromKey(key);\n  const isInProgramExercises = selectedExercises.some(\n    (e) => e.type === \"program\" && Exercise_eq(e.exerciseType, exerciseType)\n  );\n  if (isMultiselect && isInProgramExercises) {\n    return;\n  }\n  dispatch(\n    lb<IExercisePickerState>()\n      .p(\"selectedExercises\")\n      .recordModify((exercises) => {\n        if (isMultiselect && exercises.some((e) => e.type === \"adhoc\" && Exercise_eq(e.exerciseType, exerciseType))) {\n          return exercises.filter((e) => e.type !== \"adhoc\" || !Exercise_eq(e.exerciseType, exerciseType));\n        } else {\n          if (isMultiselect) {\n            return [...exercises, { type: \"adhoc\", exerciseType, label: ctx.label }];\n          } else {\n            return [{ type: \"adhoc\", exerciseType, label: ctx.label }];\n          }\n        }\n      }),\n    `Toggle selection of ${key}`\n  );\n}\n\nexport function ExercisePickerUtils_getProgramExercisefullName(\n  exercise: IExercisePickerProgramExercise,\n  program: IEvaluatedProgram,\n  settings: ISettings\n): string {\n  const exerciseType = Exercise_get(exercise.exerciseType, settings.exercises);\n  if (!exerciseType) {\n    return \"\";\n  }\n  const name = Exercise_fullName(exerciseType, settings);\n  let count = 0;\n  PP_iterate2(program.weeks, (e) => {\n    if (e.exerciseType && Exercise_eq(e.exerciseType, exercise.exerciseType)) {\n      count += 1;\n    }\n    if (count > 1) {\n      return true;\n    }\n    return false;\n  });\n  const isMultipleInstances = count > 1;\n  const suffix = [];\n  if (isMultipleInstances) {\n    if (program.weeks.length > 1) {\n      suffix.push(exercise.week);\n    }\n    suffix.push(exercise.dayInWeek);\n  }\n  return `${name}${isMultipleInstances ? `[${suffix.join(\":\")}]` : \"\"}`;\n}\n","import { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { IExercise, Exercise_onerm } from \"../models/exercise\";\nimport { IExerciseDataValue, ISettings } from \"../types\";\nimport { IconCalculator } from \"./icons/iconCalculator\";\nimport { useModal } from \"../navigation/ModalStateContext\";\n\ninterface IExerciseRMProps {\n  name: string;\n  rmKey: keyof IExerciseDataValue;\n  exercise: IExercise;\n  settings: ISettings;\n  onEditVariable: (value: number) => void;\n  onInput?: (v: string) => void;\n  displayValue?: string;\n}\n\nexport function ExerciseRM(props: IExerciseRMProps): JSX.Element {\n  const rm = Exercise_onerm(props.exercise, props.settings);\n  const displayValue = props.displayValue ?? `${rm.value}`;\n\n  const openCalculator = useModal(\"repMaxCalculatorModal\", (weightValue) => {\n    if (weightValue != null) {\n      props.onEditVariable(weightValue);\n    }\n  });\n\n  return (\n    <View\n      data-testid=\"exercise-stats-1rm-set\"\n      testID=\"exercise-stats-1rm-set\"\n      className=\"px-4 py-1 mt-2 font-bold bg-background-cardpurple rounded-2xl\"\n    >\n      <MenuItemEditable\n        type=\"number\"\n        name={props.name}\n        isBorderless={true}\n        onChange={(v) => {\n          const value = v ? parseFloat(v) : undefined;\n          if (value && !isNaN(value)) {\n            props.onEditVariable(value);\n          }\n        }}\n        onInput={props.onInput}\n        value={displayValue}\n        after={\n          <>\n            <Text className=\"ml-1 mr-2 font-normal text-text-secondary\">{rm.unit}</Text>\n            <Pressable\n              className=\"px-2\"\n              data-testid=\"onerm-calculator\"\n              testID=\"onerm-calculator\"\n              style={{ marginRight: -4 }}\n              onPress={() => {\n                openCalculator({ unit: props.settings.units });\n              }}\n            >\n              <IconCalculator size={16} />\n            </Pressable>\n          </>\n        }\n      />\n      <View>\n        <Text className=\"text-xs italic font-normal text-right\">\n          Available in Liftoscript as <Text className=\"font-bold\">{props.rmKey}</Text> variable\n        </Text>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { IExerciseType, ISettings } from \"../types\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { Exercise_targetMusclesGroups, Exercise_synergistMusclesGroups } from \"../models/exercise\";\nimport { Muscle_getMuscleGroupName } from \"../models/muscle\";\n\nexport function ExerciseTooltip(props: {\n  exerciseType: IExerciseType;\n  settings: ISettings;\n  name: string;\n}): JSX.Element {\n  const [show, setShow] = useState(false);\n  const [pinned, setPinned] = useState(false);\n  const [nudge, setNudge] = useState(0);\n  const wrapperRef = useRef<HTMLSpanElement>(null);\n  const tooltipRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    function handleOutsideClick(e: Event): void {\n      if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n        setPinned(false);\n        setShow(false);\n      }\n    }\n    document.addEventListener(\"mousedown\", handleOutsideClick, true);\n    document.addEventListener(\"touchstart\", handleOutsideClick, true);\n    return () => {\n      document.removeEventListener(\"mousedown\", handleOutsideClick, true);\n      document.removeEventListener(\"touchstart\", handleOutsideClick, true);\n    };\n  }, []);\n\n  useEffect(() => {\n    if (!show || !tooltipRef.current) {\n      setNudge(0);\n      return;\n    }\n    const rect = tooltipRef.current.getBoundingClientRect();\n    const viewportWidth = document.documentElement.clientWidth;\n    const padding = 8;\n    if (rect.left < padding) {\n      setNudge(padding - rect.left);\n    } else if (rect.right > viewportWidth - padding) {\n      setNudge(viewportWidth - padding - rect.right);\n    } else {\n      setNudge(0);\n    }\n  }, [show]);\n\n  const targetMuscles = Exercise_targetMusclesGroups(props.exerciseType, props.settings);\n  const synergistMuscles = Exercise_synergistMusclesGroups(props.exerciseType, props.settings);\n\n  return (\n    <span\n      ref={wrapperRef}\n      className=\"relative\"\n      onMouseEnter={() => {\n        if (!pinned) {\n          setShow(true);\n        }\n      }}\n      onMouseLeave={() => {\n        if (!pinned) {\n          setShow(false);\n        }\n      }}\n      onClick={(e) => {\n        e.stopPropagation();\n        if (pinned) {\n          setPinned(false);\n          setShow(false);\n        } else {\n          setPinned(true);\n          setShow(true);\n        }\n      }}\n    >\n      <strong className=\"cursor-pointer md-exercise-name\" style={{ borderBottom: \"1px dashed #999\" }}>\n        {props.name}\n      </strong>\n      {show && (\n        <div\n          ref={tooltipRef}\n          className=\"absolute z-20 px-3 py-2 text-xs bg-white border rounded-lg shadow-lg md-exercise-tooltip border-grayv2-400\"\n          style={{\n            bottom: \"calc(100% + 6px)\",\n            left: \"50%\",\n            transform: `translateX(calc(-50% + ${nudge}px))`,\n            minWidth: \"14rem\",\n            maxWidth: \"22rem\",\n          }}\n        >\n          <div className=\"flex items-start gap-2 mb-1\">\n            <div className=\"w-scaled-12\">\n              <ExerciseImage\n                width={48}\n                settings={props.settings}\n                className=\"inline-block w-scaled-12\"\n                exerciseType={props.exerciseType}\n                size=\"small\"\n              />\n            </div>\n            <div className=\"flex-1\">\n              <div className=\"text-sm font-semibold\">{props.name}</div>\n              {targetMuscles.length > 0 && (\n                <div>\n                  <span className=\"font-semibold text-text-secondary\">Target: </span>\n                  <span className=\"font-normal\">\n                    {targetMuscles.map((m) => Muscle_getMuscleGroupName(m, props.settings)).join(\", \")}\n                  </span>\n                </div>\n              )}\n              {synergistMuscles.length > 0 && (\n                <div>\n                  <span className=\"font-semibold text-text-secondary\">Synergist: </span>\n                  <span className=\"font-normal\">\n                    {synergistMuscles.map((m) => Muscle_getMuscleGroupName(m, props.settings)).join(\", \")}\n                  </span>\n                </div>\n              )}\n            </div>\n          </div>\n          <div\n            style={{\n              position: \"absolute\",\n              bottom: \"-5px\",\n              left: `calc(50% - ${nudge}px)`,\n              transform: \"translateX(-50%) rotate(45deg)\",\n              width: \"10px\",\n              height: \"10px\",\n              background: \"white\",\n              borderRight: \"1px solid #d1d5db\",\n              borderBottom: \"1px solid #d1d5db\",\n            }}\n          />\n        </div>\n      )}\n    </span>\n  );\n}\n","import { JSX, memo, useMemo, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { Text } from \"./primitives/text\";\nimport { Thunk_pushExerciseStatsScreen } from \"../ducks/thunks\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Equipment_getEquipmentNameForExerciseType } from \"../models/equipment\";\nimport {\n  equipmentName,\n  Exercise_get,\n  Exercise_fullName,\n  Exercise_onerm,\n  Exercise_defaultRounding,\n  Exercise_toKey,\n  Exercise_isCustom,\n  Exercise_filterExercises,\n  Exercise_filterExercisesByType,\n} from \"../models/exercise\";\nimport { equipments, exerciseKinds, IExerciseType, IProgram, ISettings, IWeight } from \"../types\";\nimport { CollectionUtils_uniqByExpr, CollectionUtils_compact } from \"../utils/collection\";\nimport { StringUtils_capitalize } from \"../utils/string\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { Multiselect } from \"./multiselect\";\nimport { IHistoryRecord } from \"../types\";\nimport { Weight_eqeq, Weight_print } from \"../models/weight\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { LinkButton } from \"./linkButton\";\nimport { ObjectUtils_values } from \"../utils/object\";\nimport { Settings_activeCustomExercises } from \"../models/settings\";\nimport { Program_evaluate, Program_getAllUsedProgramExercises } from \"../models/program\";\nimport { Muscle_getAvailableMuscleGroups, Muscle_getMuscleGroupName } from \"../models/muscle\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { useProgressiveItems } from \"../utils/useProgressiveItems\";\n\ninterface IExercisesListProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  isLoggedIn: boolean;\n  program: IProgram;\n  history: IHistoryRecord[];\n}\n\ninterface IExercisesListExercise extends IExerciseType {\n  name: string;\n  rm1: IWeight;\n  equipmentName?: string;\n  defaultRounding?: number;\n}\n\nfunction buildExercises(exerciseTypes: IExerciseType[], settings: ISettings): IExercisesListExercise[] {\n  return exerciseTypes.map((e) => {\n    const exercise = Exercise_get(e, settings.exercises);\n    return {\n      ...e,\n      name: Exercise_fullName(exercise, settings),\n      rm1: Exercise_onerm(e, settings),\n      equipmentName: Equipment_getEquipmentNameForExerciseType(settings, e),\n      defaultRounding: Exercise_defaultRounding(e, settings),\n    };\n  });\n}\n\nexport function ExercisesList(props: IExercisesListProps): JSX.Element {\n  const { settings, program, history, dispatch } = props;\n  const [filter, setFilter] = useState<string>(\"\");\n  const [filterTypes, setFilterTypes] = useState<string[]>([]);\n\n  const evaluatedProgram = useMemo(() => Program_evaluate(program, settings), [program, settings]);\n\n  const allBuilt = useMemo(() => {\n    const programExs = buildExercises(\n      CollectionUtils_uniqByExpr(Program_getAllUsedProgramExercises(evaluatedProgram), (e) =>\n        Exercise_toKey(e.exerciseType)\n      ).map((e) => e.exerciseType),\n      settings\n    );\n    const programKeys = new Set(programExs.map((e) => Exercise_toKey(e)));\n    const historyExs = buildExercises(\n      CollectionUtils_uniqByExpr(\n        history\n          .flatMap((hr) => hr.entries.map((e) => e.exercise))\n          .filter((e) => !programKeys.has(Exercise_toKey(e)) && !Exercise_isCustom(e.id, settings.exercises)),\n        (e) => Exercise_toKey(e)\n      ),\n      settings\n    );\n    const customExs = buildExercises(\n      CollectionUtils_compact(ObjectUtils_values(Settings_activeCustomExercises(settings))),\n      settings\n    );\n    programExs.sort((a, b) => a.name.localeCompare(b.name));\n    historyExs.sort((a, b) => a.name.localeCompare(b.name));\n    customExs.sort((a, b) => a.name.localeCompare(b.name));\n    return { programExs, historyExs, customExs };\n  }, [\n    evaluatedProgram,\n    history,\n    settings.exercises,\n    settings.exerciseData,\n    settings.gyms,\n    settings.currentGymId,\n    settings.units,\n  ]);\n\n  const filterOptions = useMemo(\n    () => [\n      ...equipments.map((e) => equipmentName(e)),\n      ...exerciseKinds.map(StringUtils_capitalize),\n      ...Muscle_getAvailableMuscleGroups(settings).map((mg) => Muscle_getMuscleGroupName(mg, settings)),\n    ],\n    [settings]\n  );\n\n  const { programExercises, historyExercises, customExercises } = useMemo(() => {\n    let p = allBuilt.programExs;\n    let h = allBuilt.historyExs;\n    let c = allBuilt.customExs;\n    if (filter) {\n      p = Exercise_filterExercises(p, filter);\n      h = Exercise_filterExercises(h, filter);\n      c = Exercise_filterExercises(c, filter);\n    }\n    if (filterTypes && filterTypes.length > 0) {\n      p = Exercise_filterExercisesByType(p, filterTypes, settings);\n      h = Exercise_filterExercisesByType(h, filterTypes, settings);\n      c = Exercise_filterExercisesByType(c, filterTypes, settings);\n    }\n    return { programExercises: p, historyExercises: h, customExercises: c };\n  }, [allBuilt, filter, filterTypes, settings]);\n\n  type ISection = \"custom\" | \"program\" | \"history\";\n  const allExercises = useMemo<{ section: ISection; exercise: IExercisesListExercise }[]>(\n    () => [\n      ...customExercises.map((e) => ({ section: \"custom\" as const, exercise: e })),\n      ...programExercises.map((e) => ({ section: \"program\" as const, exercise: e })),\n      ...historyExercises.map((e) => ({ section: \"history\" as const, exercise: e })),\n    ],\n    [customExercises, programExercises, historyExercises]\n  );\n  const visibleExercises = useProgressiveItems(allExercises, {\n    initialBatch: 10,\n    batchSize: 20,\n    debugLabel: \"ExercisesList\",\n    resetKey: `${filter}|${filterTypes.join(\",\")}`,\n  });\n  const visibleCustom = useMemo(\n    () => visibleExercises.filter((x) => x.section === \"custom\").map((x) => x.exercise),\n    [visibleExercises]\n  );\n  const visibleProgram = useMemo(\n    () => visibleExercises.filter((x) => x.section === \"program\").map((x) => x.exercise),\n    [visibleExercises]\n  );\n  const visibleHistoryEx = useMemo(\n    () => visibleExercises.filter((x) => x.section === \"history\").map((x) => x.exercise),\n    [visibleExercises]\n  );\n\n  return (\n    <View className=\"pb-8\">\n      <View data-testid=\"exercises-list\">\n        <TextInput\n          data-testid=\"exercises-list-filter\"\n          testID=\"exercises-list-filter\"\n          className=\"px-4 py-2 mb-2 text-base border rounded-lg bg-background-default border-border-neutral text-text-primary\"\n          defaultValue={filter}\n          autoCapitalize=\"none\"\n          autoCorrect={false}\n          placeholder=\"Filter by name\"\n          placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n          onChangeText={(t) => setFilter(t)}\n          returnKeyType=\"search\"\n        />\n        <Multiselect\n          id=\"filtertypes\"\n          label=\"\"\n          placeholder=\"Filter by type\"\n          values={filterOptions}\n          initialSelectedValues={new Set()}\n          onChange={(ft) => setFilterTypes(Array.from(ft))}\n        />\n      </View>\n      <View className=\"items-end\">\n        <LinkButton name=\"create-custom-exercise\" onClick={() => navigateToModal(\"customExerciseModal\", {})}>\n          Create custom exercise\n        </LinkButton>\n      </View>\n\n      {visibleCustom.length > 0 && <GroupHeader name=\"Custom Exercises\" topPadding={true} />}\n      {visibleCustom.map((exercise) => (\n        <ExerciseItem key={Exercise_toKey(exercise)} dispatch={dispatch} settings={settings} exercise={exercise} />\n      ))}\n\n      {visibleProgram.length > 0 && <GroupHeader name=\"Current program exercises\" topPadding={true} />}\n      {visibleProgram.map((exercise) => (\n        <ExerciseItem key={Exercise_toKey(exercise)} dispatch={dispatch} settings={settings} exercise={exercise} />\n      ))}\n      {visibleHistoryEx.length > 0 && <GroupHeader name=\"Exercises from history\" topPadding={true} />}\n      {visibleHistoryEx.map((exercise) => (\n        <ExerciseItem key={Exercise_toKey(exercise)} dispatch={dispatch} settings={settings} exercise={exercise} />\n      ))}\n    </View>\n  );\n}\n\ninterface IExerciseItemProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  exercise: IExercisesListExercise;\n}\n\nfunction areExerciseItemPropsEqual(prev: IExerciseItemProps, next: IExerciseItemProps): boolean {\n  if (prev.dispatch !== next.dispatch) {\n    return false;\n  }\n  if (prev.settings.exercises !== next.settings.exercises) {\n    return false;\n  }\n  const a = prev.exercise;\n  const b = next.exercise;\n  return (\n    a.id === b.id &&\n    a.equipment === b.equipment &&\n    a.name === b.name &&\n    a.equipmentName === b.equipmentName &&\n    a.defaultRounding === b.defaultRounding &&\n    Weight_eqeq(a.rm1, b.rm1)\n  );\n}\n\nconst ExerciseItem = memo(function ExerciseItem(props: IExerciseItemProps): JSX.Element {\n  return (\n    <MenuItemWrapper\n      name={props.exercise.name}\n      onClick={() => {\n        props.dispatch(Thunk_pushExerciseStatsScreen(props.exercise));\n      }}\n    >\n      <View className=\"flex-row items-center gap-2\">\n        <View className=\"items-center justify-center\">\n          <View className=\"p-1 my-1 rounded-lg bg-background-image\">\n            <ExerciseImage\n              useTextForCustomExercise={true}\n              settings={props.settings}\n              className=\"w-scaled-8\"\n              exerciseType={props.exercise}\n              size=\"small\"\n            />\n          </View>\n        </View>\n        <View className=\"flex-1 py-2\">\n          <Text className=\"text-base text-text-primary\">{props.exercise.name}</Text>\n          <View className=\"flex-row text-xs text-text-secondary\">\n            <Text className=\"mr-2 text-xs text-text-secondary\">\n              <Text className=\"text-xs font-bold text-text-secondary\">1RM:</Text> {Weight_print(props.exercise.rm1)},\n            </Text>\n            {props.exercise.equipmentName ? (\n              <Text className=\"text-xs text-text-secondary\">\n                <Text className=\"text-xs font-bold text-text-secondary\">Equipment:</Text> {props.exercise.equipmentName}\n              </Text>\n            ) : (\n              <Text className=\"text-xs text-text-secondary\">\n                <Text className=\"text-xs font-bold text-text-secondary\">Default rounding:</Text>{\" \"}\n                {props.exercise.defaultRounding}\n              </Text>\n            )}\n          </View>\n        </View>\n        <View className=\"items-center py-2 pl-2\">\n          <IconArrowRight />\n        </View>\n      </View>\n    </MenuItemWrapper>\n  );\n}, areExerciseItemPropsEqual);\n","import { JSX, ReactNode, RefObject, useId } from \"react\";\nimport { ScrollView, View } from \"react-native\";\nimport { Svg, Defs, LinearGradient, Stop, Rect } from \"./primitives/svg\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IProps {\n  children: ReactNode;\n  className?: string;\n  contentClassName?: string;\n  // Must match the background the scroller sits on for the overlay to read as a fade.\n  color?: string;\n  fadeWidth?: number;\n  scrollRef?: RefObject<ScrollView | null>;\n}\n\n// Horizontal scroller whose right edge fades content out into the background. The gradient\n// is background-colored, so it stays invisible until content actually scrolls under it —\n// no scroll-position tracking needed.\nexport function FadeScrollView(props: IProps): JSX.Element {\n  // useId can contain colons, which break url(#...) references on web.\n  const gradientId = `fade-scroll-${useId().replace(/:/g, \"\")}`;\n  const color = props.color ?? Tailwind_semantic().background.default;\n  const fadeWidth = props.fadeWidth ?? 24;\n  return (\n    <View className={`relative ${props.className ?? \"\"}`}>\n      {/* The automatic inset under the native-stack modal gives the scroller vertical\n          scrollable range, which reads as a rubbery vertical drag on the chip rails. */}\n      <ScrollView\n        ref={props.scrollRef}\n        horizontal={true}\n        showsHorizontalScrollIndicator={false}\n        alwaysBounceVertical={false}\n        contentInsetAdjustmentBehavior=\"never\"\n      >\n        <View className={`flex-row items-center ${props.contentClassName ?? \"\"}`} style={{ paddingRight: fadeWidth }}>\n          {props.children}\n        </View>\n      </ScrollView>\n      <View pointerEvents=\"none\" style={{ position: \"absolute\", top: 0, bottom: 0, right: 0, width: fadeWidth }}>\n        <Svg width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" viewBox=\"0 0 100 100\">\n          <Defs>\n            <LinearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"100\" y2=\"0\" gradientUnits=\"userSpaceOnUse\">\n              <Stop offset=\"0%\" stopColor={color} stopOpacity={0} />\n              <Stop offset=\"100%\" stopColor={color} stopOpacity={1} />\n            </LinearGradient>\n          </Defs>\n          <Rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradientId})`} />\n        </Svg>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useLayoutEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { useIsFocused } from \"@react-navigation/native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\n\ntype INonNullableValues<T> = {\n  [K in keyof T]: NonNullable<T[K]>;\n};\n\ninterface IProps<T extends Record<string, unknown | undefined>> {\n  state: T;\n  dispatch: IDispatch;\n  children: (state: INonNullableValues<T>) => JSX.Element;\n}\n\nexport function FallbackScreen<T extends Record<string, unknown>>(props: IProps<T>): JSX.Element {\n  const hasAnyNulls = Object.values(props.state).some((value) => value == null);\n  const isFocused = useIsFocused();\n  useLayoutEffect(() => {\n    if (hasAnyNulls && isFocused) {\n      props.dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n    }\n  }, [hasAnyNulls, isFocused]);\n\n  if (hasAnyNulls) {\n    return <View />;\n  }\n\n  return props.children(props.state as INonNullableValues<T>);\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\ninterface IProps {\n  onDetected: (code: string) => void;\n}\n\nexport function BarcodeScanner(props: IProps): JSX.Element {\n  const videoRef = useRef<HTMLVideoElement | null>(null);\n  const onDetectedRef = useRef(props.onDetected);\n  onDetectedRef.current = props.onDetected;\n  const [error, setError] = useState<string | undefined>(undefined);\n\n  useEffect(() => {\n    let controls: { stop: () => void } | undefined;\n    let cancelled = false;\n    (async () => {\n      try {\n        const [{ BrowserMultiFormatReader }, { BarcodeFormat, DecodeHintType }] = await Promise.all([\n          import(/* webpackChunkName: \"zxing\" */ \"@zxing/browser\"),\n          import(/* webpackChunkName: \"zxing\" */ \"@zxing/library\"),\n        ]);\n        const hints = new Map([\n          [\n            DecodeHintType.POSSIBLE_FORMATS,\n            [BarcodeFormat.EAN_13, BarcodeFormat.EAN_8, BarcodeFormat.UPC_A, BarcodeFormat.UPC_E],\n          ],\n        ]);\n        const reader = new BrowserMultiFormatReader(hints);\n        if (cancelled || !videoRef.current) {\n          return;\n        }\n        controls = await reader.decodeFromConstraints(\n          { video: { facingMode: \"environment\" } },\n          videoRef.current,\n          (result, _err, ctrl) => {\n            if (result) {\n              ctrl.stop();\n              onDetectedRef.current(result.getText());\n            }\n          }\n        );\n        if (cancelled) {\n          controls.stop();\n        }\n      } catch (e) {\n        const name = (e as Error)?.name;\n        setError(\n          name === \"NotAllowedError\"\n            ? \"Camera access was denied. Allow it in Safari settings for this site, then try again.\"\n            : \"Couldn't start the camera on this device.\"\n        );\n      }\n    })();\n    return () => {\n      cancelled = true;\n      controls?.stop();\n    };\n  }, []);\n\n  if (error) {\n    return <Text className=\"py-6 text-center text-text-error\">{error}</Text>;\n  }\n  return (\n    <View className=\"overflow-hidden bg-black rounded-lg\">\n      <video\n        ref={videoRef}\n        playsInline\n        muted\n        style={{ width: \"100%\", height: 260, objectFit: \"cover\", display: \"block\" }}\n      />\n      <Text className=\"py-2 text-xs text-center text-text-alwayswhite\">Point the camera at a barcode</Text>\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { Platform, Pressable, View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { TextInput } from \"../primitives/textInput\";\nimport { foodMeals, IFoodMeal, INutrients } from \"../../types\";\nimport { Food_formatAmount, Food_mealNames } from \"../../models/food\";\n\nconst inputClass =\n  \"h-scaled-10 px-3 border rounded-lg bg-background-default border-border-prominent text-text-primary\";\nconst androidInputStyle = Platform.OS === \"android\" ? { paddingVertical: 0, includeFontPadding: false } : undefined;\n\nexport function FoodTextField(props: {\n  label?: string;\n  value: string;\n  onChange: (text: string) => void;\n  placeholder?: string;\n  numeric?: boolean;\n  autoFocus?: boolean;\n  testID: string;\n  className?: string;\n}): JSX.Element {\n  return (\n    <View className={props.className}>\n      {props.label && <Text className=\"pb-1 text-xs text-text-secondary\">{props.label}</Text>}\n      <TextInput\n        className={inputClass}\n        style={androidInputStyle}\n        value={props.value}\n        placeholder={props.placeholder}\n        keyboardType={props.numeric ? \"decimal-pad\" : \"default\"}\n        autoFocus={props.autoFocus}\n        autoCorrect={false}\n        selectTextOnFocus={props.numeric}\n        testID={props.testID}\n        data-testid={props.testID}\n        onChangeText={props.onChange}\n      />\n    </View>\n  );\n}\n\nexport function NutrientLine(props: { nutrients: INutrients; className?: string }): JSX.Element {\n  const n = props.nutrients;\n  return (\n    <Text className={`text-xs text-text-secondary ${props.className ?? \"\"}`}>\n      <Text className=\"text-xs font-semibold text-text-primary\">{Food_formatAmount(n.calories)} kcal</Text>\n      {`  P ${Food_formatAmount(n.protein)}  C ${Food_formatAmount(n.carbs)}  F ${Food_formatAmount(n.fat)}`}\n    </Text>\n  );\n}\n\nexport function Chip(props: { label: string; isSelected: boolean; onPress: () => void; testID: string }): JSX.Element {\n  return (\n    <Pressable\n      testID={props.testID}\n      data-testid={props.testID}\n      onPress={props.onPress}\n      className={`px-3 py-1.5 mr-2 mb-2 border rounded-full ${\n        props.isSelected ? \"bg-button-primarybackground border-button-primarybackground\" : \"border-border-prominent\"\n      }`}\n    >\n      <Text className={`text-sm ${props.isSelected ? \"text-text-alwayswhite\" : \"text-text-primary\"}`}>{props.label}</Text>\n    </Pressable>\n  );\n}\n\nexport function MealPicker(props: { meal: IFoodMeal; onChange: (meal: IFoodMeal) => void }): JSX.Element {\n  return (\n    <View className=\"flex-row flex-wrap\">\n      {foodMeals.map((meal) => (\n        <Chip\n          key={meal}\n          testID={`food-meal-${meal}`}\n          label={Food_mealNames[meal]}\n          isSelected={props.meal === meal}\n          onPress={() => props.onChange(meal)}\n        />\n      ))}\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { FoodTextField, NutrientLine } from \"./foodFields\";\nimport { FoodLabel_per100, IFoodLabelForm } from \"../../models/foodLabel\";\n\ninterface IProps {\n  form: IFoodLabelForm;\n  onChange: (form: IFoodLabelForm) => void;\n  testIDPrefix: string;\n}\n\nexport function FoodLabelFields(props: IProps): JSX.Element {\n  const { form } = props;\n  const per100 = FoodLabel_per100(form);\n  const field = (key: keyof IFoodLabelForm, label: string, numeric: boolean, className?: string): JSX.Element => (\n    <FoodTextField\n      className={className}\n      label={label}\n      numeric={numeric}\n      value={form[key]}\n      testID={`${props.testIDPrefix}-${key}`}\n      onChange={(text) => props.onChange({ ...form, [key]: text })}\n    />\n  );\n  return (\n    <View>\n      <View className=\"flex-row pt-2\">\n        {field(\"servingLabel\", \"Serving, e.g. 1 cup\", false, \"flex-1 mr-2\")}\n        {field(\"servingGrams\", \"Weight (g)\", true, \"w-24\")}\n      </View>\n      <Text className=\"pt-3 text-xs text-text-secondary\">Nutrition per serving, as on the label</Text>\n      <View className=\"flex-row pt-1\">\n        {field(\"calories\", \"Calories\", true, \"flex-1 mr-2\")}\n        {field(\"protein\", \"Protein (g)\", true, \"flex-1\")}\n      </View>\n      <View className=\"flex-row pt-2\">\n        {field(\"carbs\", \"Carbs (g)\", true, \"flex-1 mr-2\")}\n        {field(\"fat\", \"Fat (g)\", true, \"flex-1 mr-2\")}\n        {field(\"fiber\", \"Fiber (g)\", true, \"flex-1\")}\n      </View>\n      {per100 && (\n        <View className=\"pt-2\">\n          <Text className=\"text-xs text-text-secondary\">Per 100 g</Text>\n          <NutrientLine nutrients={per100} />\n        </View>\n      )}\n    </View>\n  );\n}\n","import { JSX, useEffect, useState } from \"react\";\nimport { Pressable, View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IconSpinner } from \"../icons/iconSpinner\";\nimport { Service } from \"../../api/service\";\nimport { IFoodEntryValue, IFoodItem } from \"../../types\";\nimport {\n  Food_formatAmount,\n  Food_searchLibrary,\n  Food_selectionForEntry,\n  Food_selectionFromItem,\n  Food_selectionFromSearch,\n  IFoodSelection,\n} from \"../../models/food\";\nimport {\n  FoodSearch_formatServing,\n  FoodSearch_gramLabel,\n  FoodSearch_sameBarcode,\n  IFoodSearchResult,\n} from \"../../models/foodSearch\";\nimport { Chip, FoodTextField } from \"./foodFields\";\nimport { BarcodeScanner } from \"./barcodeScanner\";\n\ntype IPickerTab = \"search\" | \"scan\" | \"saved\";\n\ninterface IProps {\n  service: Service;\n  library: IFoodItem[];\n  recent: IFoodEntryValue[];\n  onSelect: (selection: IFoodSelection) => void;\n  onBarcodeNotFound: (code: string) => void;\n}\n\nconst searchDebounceMs = 400;\n\nfunction servingSummary(selection: IFoodSelection): string {\n  const first = selection.servings[0];\n  const isGram = first.label === FoodSearch_gramLabel;\n  const kcal = isGram ? first.perServing.calories * 100 : first.perServing.calories;\n  return `${Food_formatAmount(kcal)} kcal / ${isGram ? \"100 g\" : FoodSearch_formatServing(first.label, 1)}`;\n}\n\nfunction Row(props: { selection: IFoodSelection; tag?: string; testID: string; onPress: () => void }): JSX.Element {\n  return (\n    <Pressable\n      testID={props.testID}\n      data-testid={props.testID}\n      onPress={props.onPress}\n      className=\"py-2 border-b border-border-neutral\"\n    >\n      <Text className=\"text-sm\" numberOfLines={2}>\n        {props.selection.name}\n        {props.tag && <Text className=\"text-xs text-text-purple\">{`  ${props.tag}`}</Text>}\n      </Text>\n      <Text className=\"text-xs text-text-secondary\" numberOfLines={1}>\n        {[props.selection.brand, servingSummary(props.selection)].filter(Boolean).join(\" · \")}\n      </Text>\n    </Pressable>\n  );\n}\n\nexport function FoodPicker(props: IProps): JSX.Element {\n  const [tab, setTab] = useState<IPickerTab>(\"search\");\n  const [query, setQuery] = useState(\"\");\n  const [results, setResults] = useState<IFoodSearchResult[]>([]);\n  const [status, setStatus] = useState<\"idle\" | \"loading\" | \"offline\">(\"idle\");\n\n  useEffect(() => {\n    const q = query.trim();\n    if (q.length < 2) {\n      setResults([]);\n      setStatus(\"idle\");\n      return;\n    }\n    const controller = new AbortController();\n    setStatus(\"loading\");\n    const timer = setTimeout(async () => {\n      const found = await props.service.searchFood(q, controller.signal);\n      if (!controller.signal.aborted) {\n        setResults(found || []);\n        setStatus(found ? \"idle\" : \"offline\");\n      }\n    }, searchDebounceMs);\n    return () => {\n      clearTimeout(timer);\n      controller.abort();\n    };\n  }, [query]);\n\n  const selectSearchResult = async (result: IFoodSearchResult): Promise<void> => {\n    if (result.source !== \"usda\") {\n      props.onSelect(Food_selectionFromSearch(result));\n      return;\n    }\n    setStatus(\"loading\");\n    const detail = await props.service.getUsdaFood(result.sourceId);\n    setStatus(\"idle\");\n    props.onSelect(Food_selectionFromSearch(detail || result));\n  };\n\n  const onBarcode = async (code: string): Promise<void> => {\n    const saved = props.library.find((item) => FoodSearch_sameBarcode(item.barcode, code));\n    if (saved) {\n      props.onSelect(Food_selectionFromItem(saved));\n      return;\n    }\n    setStatus(\"loading\");\n    const result = await props.service.getFoodByBarcode(code);\n    setStatus(\"idle\");\n    if (result === \"not_found\") {\n      props.onBarcodeNotFound(code);\n    } else if (result) {\n      props.onSelect(Food_selectionFromSearch(result));\n    } else {\n      setStatus(\"offline\");\n    }\n  };\n\n  const libraryMatches = query.trim() ? Food_searchLibrary(props.library, query).slice(0, 5) : [];\n\n  return (\n    <View>\n      <View className=\"flex-row pb-2\">\n        <Chip testID=\"food-tab-search\" label=\"Search\" isSelected={tab === \"search\"} onPress={() => setTab(\"search\")} />\n        <Chip testID=\"food-tab-scan\" label=\"Scan\" isSelected={tab === \"scan\"} onPress={() => setTab(\"scan\")} />\n        <Chip\n          testID=\"food-tab-saved\"\n          label=\"Saved & recent\"\n          isSelected={tab === \"saved\"}\n          onPress={() => setTab(\"saved\")}\n        />\n      </View>\n      {status === \"loading\" && (\n        <View className=\"items-center py-2\">\n          <IconSpinner width={24} height={24} />\n        </View>\n      )}\n      {status === \"offline\" && (\n        <Text className=\"py-2 text-sm text-text-error\">\n          Couldn't reach the food database. Saved and recent foods still work offline.\n        </Text>\n      )}\n      {tab === \"search\" && (\n        <View>\n          <FoodTextField\n            value={query}\n            placeholder=\"Search foods, e.g. chicken breast\"\n            autoFocus={true}\n            testID=\"food-search-input\"\n            onChange={setQuery}\n          />\n          {libraryMatches.map((item) => (\n            <Row\n              key={item.id}\n              testID={`food-library-result-${item.id}`}\n              tag=\"saved\"\n              selection={Food_selectionFromItem(item)}\n              onPress={() => props.onSelect(Food_selectionFromItem(item))}\n            />\n          ))}\n          {results.map((result, i) => (\n            <Row\n              key={`${result.source}-${result.sourceId}-${i}`}\n              testID={`food-search-result-${i}`}\n              tag={result.source === \"usda\" ? \"USDA\" : undefined}\n              selection={Food_selectionFromSearch(result)}\n              onPress={() => selectSearchResult(result)}\n            />\n          ))}\n        </View>\n      )}\n      {tab === \"scan\" && <BarcodeScanner onDetected={onBarcode} />}\n      {tab === \"saved\" && (\n        <View>\n          {props.library.length === 0 && props.recent.length === 0 && (\n            <Text className=\"py-4 text-sm text-center text-text-secondary\">\n              Foods you log or save show up here, so you can add them again with one tap.\n            </Text>\n          )}\n          {props.library.length > 0 && <Text className=\"pt-2 text-xs font-semibold text-text-secondary\">MY FOODS</Text>}\n          {[...props.library]\n            .sort((a, b) => a.name.localeCompare(b.name))\n            .map((item) => (\n              <Row\n                key={item.id}\n                testID={`food-saved-${item.id}`}\n                tag={item.ingredients ? \"recipe\" : undefined}\n                selection={Food_selectionFromItem(item)}\n                onPress={() => props.onSelect(Food_selectionFromItem(item))}\n              />\n            ))}\n          {props.recent.length > 0 && <Text className=\"pt-4 text-xs font-semibold text-text-secondary\">RECENT</Text>}\n          {props.recent.map((entry, i) => {\n            const selection = Food_selectionForEntry(entry, props.library, \"relog\");\n            return (\n              <Row\n                key={`recent-${i}`}\n                testID={`food-recent-${i}`}\n                selection={selection}\n                onPress={() => props.onSelect(selection)}\n              />\n            );\n          })}\n        </View>\n      )}\n    </View>\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { Chip, FoodTextField, NutrientLine } from \"./foodFields\";\nimport { Food_parseNumber, Food_scaleNutrients, IFoodSelection, IFoodServingChoice } from \"../../models/food\";\nimport { FoodSearch_gramLabel } from \"../../models/foodSearch\";\n\nexport type IServingChoice = IFoodServingChoice;\n\ninterface IProps {\n  selection: IFoodSelection;\n  choice: IServingChoice;\n  onChange: (choice: IServingChoice) => void;\n  children?: ReactNode;\n}\n\nexport function ServingPicker(props: IProps): JSX.Element {\n  const { selection, choice } = props;\n  const option = selection.servings[choice.optionIndex] ?? selection.servings[0];\n  const amount = Food_parseNumber(choice.amountText);\n  const isGram = option.label === FoodSearch_gramLabel;\n  return (\n    <View className=\"p-3 mb-3 border rounded-lg border-border-cardpurple bg-background-cardpurple\">\n      <Text className=\"text-base font-semibold\">{selection.name}</Text>\n      {selection.brand && <Text className=\"text-xs text-text-secondary\">{selection.brand}</Text>}\n      {selection.servings.length > 1 && (\n        <View className=\"flex-row flex-wrap pt-3\">\n          {selection.servings.map((s, i) => (\n            <Chip\n              key={`${s.label}-${i}`}\n              testID={`food-serving-${i}`}\n              label={s.label === FoodSearch_gramLabel ? \"grams\" : s.label}\n              isSelected={i === choice.optionIndex}\n              onPress={() =>\n                props.onChange({ optionIndex: i, amountText: s.label === FoodSearch_gramLabel ? \"100\" : \"1\" })\n              }\n            />\n          ))}\n        </View>\n      )}\n      <View className=\"flex-row items-end pt-2\">\n        <FoodTextField\n          className=\"w-28\"\n          label={isGram ? \"Grams\" : \"Servings\"}\n          numeric={true}\n          value={choice.amountText}\n          testID=\"food-amount\"\n          onChange={(amountText) => props.onChange({ ...choice, amountText })}\n        />\n        {!isGram && <Text className=\"flex-1 pb-2 pl-3 text-sm text-text-secondary\">× {option.label}</Text>}\n      </View>\n      <NutrientLine className=\"pt-3\" nutrients={Food_scaleNutrients(option.perServing, amount ?? 0)} />\n      {props.children}\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Thunk_pushScreen, Thunk_pushToEditProgram, Thunk_startProgramDay } from \"../ducks/thunks\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ITab } from \"../models/screen\";\nimport { FooterButton } from \"./footerButton\";\nimport { IconGraphs } from \"./icons/iconGraphs\";\nimport { IconHome } from \"./icons/iconHome\";\nimport { IconMe } from \"./icons/iconMe\";\nimport { Tailwind_semantic, Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { IconDoc2 } from \"./icons/iconDoc2\";\nimport { INavCommon } from \"../models/state\";\nimport { IconBarbell2 } from \"./icons/iconBarbell2\";\nimport { IconFood } from \"./icons/iconFood\";\nimport { ObjectUtils_values } from \"../utils/object\";\nimport { Program_evaluate } from \"../models/program\";\nimport { navigateToModal } from \"../navigation/navigationService\";\n\ninterface IFooterProps {\n  dispatch: IDispatch;\n  navCommon: INavCommon;\n  currentTab: ITab;\n}\n\nfunction getHasErrorsInProgram(navCommon: INavCommon): boolean {\n  const program = navCommon.currentProgram;\n  if (!program) {\n    return false;\n  }\n  const evaluatedProgram = Program_evaluate(program, navCommon.settings);\n  return evaluatedProgram.errors.length > 0;\n}\n\nfunction getNativeShadowStyle(semantic: ReturnType<typeof Tailwind_semantic>): Record<string, unknown> {\n  const colors = Tailwind_colors();\n  const isDark = semantic.background.default === colors.black;\n  const shadowColor = isDark ? \"rgba(255,255,255,0.18)\" : \"rgba(0,0,0,0.2)\";\n  return {\n    boxShadow: [{ offsetX: 0, offsetY: -2, blurRadius: 6, spreadDistance: 0, color: shadowColor }],\n  };\n}\n\nexport function Footer2View(props: IFooterProps): JSX.Element {\n  const semantic = Tailwind_semantic();\n  const activeColor = semantic.icon.purple;\n  const inactiveColor = semantic.icon.neutral;\n  const currentTab = props.currentTab;\n  const isUserLoading = ObjectUtils_values(props.navCommon.loading.items).some(\n    (i) => i?.type === \"fetchStorage\" && !i.endTime\n  );\n  const hasErrorsInProgram = getHasErrorsInProgram(props.navCommon);\n  const insets = useSafeAreaInsets();\n  const nativeShadow = getNativeShadowStyle(semantic);\n  return (\n    <View\n      className=\"items-center w-full bg-background-default footer-shadow\"\n      style={[nativeShadow, { paddingBottom: insets.bottom }]}\n    >\n      <View className={`flex-row w-full px-1 pt-3 ${Platform.OS !== \"web\" ? \"\" : \"pb-3\"}`}>\n        <FooterButton\n          name=\"home\"\n          currentTab={currentTab}\n          icon={(isActive) => <IconHome size={20} isSelected={isActive} />}\n          text=\"Home\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }))}\n        />\n        <FooterButton\n          name=\"program\"\n          currentTab={currentTab}\n          icon={(isActive) => <IconDoc2 isSelected={isActive} />}\n          hasDot={hasErrorsInProgram}\n          text=\"Program\"\n          onClick={() => props.dispatch(Thunk_pushToEditProgram())}\n        />\n        <View className=\"items-center flex-1\">\n          <Pressable\n            data-testid=\"footer-workout\"\n            testID=\"footer-workout\"\n            className=\"-mt-scaled-6\"\n            onPress={() => {\n              if (props.navCommon.isOngoingProgress) {\n                props.dispatch(Thunk_startProgramDay());\n              } else {\n                navigateToModal(\"nextWorkoutModal\");\n              }\n            }}\n          >\n            <CreateButton isActive={currentTab === \"workout\"} />\n          </Pressable>\n          <Text\n            numberOfLines={1}\n            className={`text-2xs pt-0.5 ${currentTab === \"workout\" ? \"text-text-purple\" : \"text-text-secondary\"}`}\n          >\n            Workout\n          </Text>\n        </View>\n        <FooterButton\n          name=\"graphs\"\n          currentTab={currentTab}\n          icon={(isActive) => <IconGraphs color={isActive ? activeColor : inactiveColor} />}\n          text=\"Graphs\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"graphsList\", undefined, { tab: \"graphs\" }))}\n        />\n        <FooterButton\n          name=\"food\"\n          currentTab={currentTab}\n          icon={(isActive) => <IconFood size={20} isSelected={isActive} />}\n          text=\"Food\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"food\", undefined, { tab: \"food\" }))}\n        />\n        <FooterButton\n          name=\"me\"\n          currentTab={currentTab}\n          icon={(isActive) => {\n            const color = isActive\n              ? undefined\n              : props.navCommon.userId\n                ? Tailwind_colors().green[600]\n                : isUserLoading\n                  ? Tailwind_colors().lightgray[600]\n                  : Tailwind_colors().red[600];\n            return <IconMe isSelected={isActive} color={color} />;\n          }}\n          text=\"Me\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"settings\", undefined, { tab: \"me\" }))}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction CreateButton(props: { isActive: boolean }): JSX.Element {\n  return (\n    <View\n      className=\"items-center justify-center rounded-full w-scaled-14 h-scaled-14 bg-button-primarybackground border-background-default footer-shadow\"\n      style={[{ borderWidth: 3 }, getNativeShadowStyle(Tailwind_semantic())]}\n    >\n      <IconBarbell2 isSelected={props.isActive} />\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { ITab } from \"../models/screen\";\nimport { StringUtils_dashcase } from \"../utils/string\";\n\nexport interface IProps {\n  name: ITab;\n  icon: (isActive: boolean) => JSX.Element;\n  currentTab: ITab;\n  hasDot?: boolean;\n  text: string;\n  onClick?: () => void;\n  isActive?: boolean;\n}\n\nexport function FooterButton(props: IProps): JSX.Element {\n  const isActive = props.name === props.currentTab;\n  const dataCy = `footer-${StringUtils_dashcase(props.text)}`;\n  return (\n    <Pressable\n      className=\"items-center flex-1 px-0.5\"\n      data-testid={dataCy}\n      testID={dataCy}\n      onPress={isActive ? undefined : props.onClick}\n    >\n      <View className=\"relative flex-row items-center justify-center w-scaled-6 h-scaled-6\">\n        {props.icon(isActive)}\n        {props.hasDot && <View className=\"absolute w-2 h-2 rounded-full bg-redv2-700\" style={{ top: -1, right: -1 }} />}\n      </View>\n      <Text numberOfLines={1} className={`pt-1 text-2xs ${isActive ? \"text-text-purple\" : \"text-text-secondary\"}`}>\n        {props.text}\n      </Text>\n    </Pressable>\n  );\n}\n","import { JSX, memo, useCallback, useMemo, useState } from \"react\";\nimport { usePerfWhyRender } from \"../utils/usePerfWhyRender\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Select } from \"./primitives/select\";\nimport { CollectionUtils_sort, CollectionUtils_inGroupsOf } from \"../utils/collection\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { equipmentName, Exercise_eq, Exercise_get, Exercise_getVolumeMultiplier } from \"../models/exercise\";\nimport {\n  Weight_convertTo,\n  Weight_build,\n  Weight_getOneRepMax,\n  Weight_isOrPct,\n  Weight_display,\n  Weight_multiply,\n} from \"../models/weight\";\nimport { IHistoryRecord, IExerciseType, ISettings, IExerciseSelectedType } from \"../types\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Reps_volume } from \"../models/set\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { History_getMaxWeightSetFromEntry, History_getMax1RMSetFromEntry } from \"../models/history\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { Thunk_editHistoryRecord } from \"../ducks/thunks\";\nimport { LineChart, ILineChartSeries } from \"./lineChart\";\nimport { GraphLegendOverlay, useGraphActiveCursor } from \"./graphLegendOverlay\";\n\ninterface IGraphProps {\n  id?: string;\n  history: IHistoryRecord[];\n  isWithOneRm?: boolean;\n  isWithProgramLines?: boolean;\n  exercise: IExerciseType;\n  settings: ISettings;\n  title?: string;\n  subtitle?: string;\n  isSameXAxis?: boolean;\n  minX: number;\n  maxX: number;\n  bodyweightData?: [number, number][];\n  initialType?: IExerciseSelectedType;\n  dispatch?: IDispatch;\n  isInteractive?: boolean;\n  onInteract?: (reason: \"manipulate\" | \"type\") => void;\n}\n\ninterface IGraphData {\n  data: [number[], (number | null)[], (number | null)[], (number | null)[], (number | null)[], (number | null)[]];\n  historyRecords: { [key: number]: IHistoryRecord };\n  changeProgramTimes: [number, string][];\n}\n\nfunction getData(\n  history: IHistoryRecord[],\n  exerciseType: IExerciseType,\n  settings: ISettings,\n  isWithOneRm?: boolean,\n  bodyweightData?: [number, number][]\n): IGraphData {\n  const changeProgramTimes: [number, string][] = [];\n  let currentProgram: string | undefined = undefined;\n  const historyRecords: { [key: number]: IHistoryRecord } = {};\n  const normalizedData = CollectionUtils_sort(history, (a, b) => a.startTime - b.startTime).reduce<\n    [number, number | null, number | null, number | null, number | null, number | null][]\n  >((acc, i) => {\n    if (!currentProgram || currentProgram !== i.programName) {\n      currentProgram = i.programName;\n      changeProgramTimes.push([new Date(Date.parse(i.date)).getTime() / 1000, currentProgram]);\n    }\n    const entry = i.entries.filter((e) => Exercise_eq(e.exercise, exerciseType))[0];\n    if (entry != null) {\n      const maxSet = History_getMaxWeightSetFromEntry(entry);\n      const maxe1RMSet = History_getMax1RMSetFromEntry(entry);\n      const volume = Weight_multiply(\n        Reps_volume(entry.sets, settings.units),\n        Exercise_getVolumeMultiplier(entry.exercise, settings)\n      );\n      if (maxSet != null) {\n        const convertedWeight = Weight_convertTo(\n          maxSet.completedWeight ?? maxSet.weight ?? Weight_build(0, settings.units),\n          settings.units\n        );\n        let onerm = null;\n        if (isWithOneRm) {\n          const set = maxe1RMSet || maxSet;\n          onerm = Weight_getOneRepMax(\n            Weight_convertTo(set.completedWeight ?? set.weight ?? Weight_build(0, settings.units), settings.units),\n            set.completedReps || 0,\n            set.completedRpe ?? set.rpe ?? 10\n          ).value;\n        }\n        const timestamp = new Date(Date.parse(i.date)).getTime() / 1000;\n        historyRecords[timestamp] = i;\n        acc.push([\n          timestamp,\n          Weight_convertTo(convertedWeight, settings.units).value,\n          maxSet.completedReps!,\n          onerm,\n          volume.value,\n          null,\n        ]);\n      }\n    }\n    return acc;\n  }, []);\n  const normalizedBodyweightData = (bodyweightData || []).map<\n    [number, number | null, number | null, number | null, number | null, number | null]\n  >((i) => {\n    return [i[0], null, null, null, null, i[1]];\n  });\n  const sorted = CollectionUtils_sort(\n    normalizedData.concat(normalizedBodyweightData),\n    (a, b) => (a[0] || 0) - (b[0] || 0)\n  );\n  const data = sorted.reduce<\n    [number[], (number | null)[], (number | null)[], (number | null)[], (number | null)[], (number | null)[]]\n  >(\n    (acc, i) => {\n      const lastIdx = acc[0].length - 1;\n      if (lastIdx >= 0 && acc[0][lastIdx] === i[0]) {\n        acc[1][lastIdx] = acc[1][lastIdx] ?? i[1];\n        acc[2][lastIdx] = acc[2][lastIdx] ?? i[2];\n        acc[3][lastIdx] = acc[3][lastIdx] ?? i[3];\n        acc[4][lastIdx] = acc[4][lastIdx] ?? i[4];\n        acc[5][lastIdx] = acc[5][lastIdx] ?? i[5];\n        return acc;\n      }\n      acc[0].push(i[0]);\n      acc[1].push(i[1]);\n      acc[2].push(i[2]);\n      acc[3].push(i[3]);\n      acc[4].push(i[4]);\n      acc[5].push(i[5]);\n      return acc;\n    },\n    [[], [], [], [], [], []]\n  );\n  return { data, changeProgramTimes, historyRecords };\n}\n\nfunction GraphExerciseInner(props: IGraphProps): JSX.Element {\n  usePerfWhyRender(\"graph\", props as unknown as Record<string, unknown>);\n  const [selectedType, setSelectedType] = useState<IExerciseSelectedType>(props.initialType || \"weight\");\n  const eqName = equipmentName(props.exercise.equipment);\n  const units = props.settings.units;\n  const exercise = Exercise_get(props.exercise, props.settings.exercises);\n\n  const result = useMemo(\n    () => getData(props.history, props.exercise, props.settings, props.isWithOneRm, props.bodyweightData),\n    [props.history, props.exercise, props.settings, props.isWithOneRm, props.bodyweightData]\n  );\n\n  const series: ILineChartSeries[] = useMemo(\n    () => [\n      {\n        label: \"Weight\",\n        show: selectedType === \"weight\",\n        color: Tailwind_colors().red[500],\n        width: 1.5,\n      },\n      {\n        label: \"Reps\",\n        show: false,\n        color: Tailwind_colors().yellow[500],\n        width: 1,\n      },\n      {\n        label: \"e1RM\",\n        show: Boolean(props.isWithOneRm) && selectedType === \"weight\",\n        color: Tailwind_colors().blue[500],\n        width: 1.5,\n      },\n      {\n        label: \"Volume\",\n        show: selectedType === \"volume\",\n        color: Tailwind_colors().red[500],\n        width: 1.5,\n      },\n      {\n        label: \"Bodyweight\",\n        show: true,\n        color: Tailwind_colors().green[500],\n        width: 1,\n      },\n    ],\n    [selectedType, props.isWithOneRm]\n  );\n\n  const yearSec = 365 * 24 * 60 * 60;\n  const xMin = props.isSameXAxis ? Math.max(props.minX, props.maxX - yearSec) : undefined;\n  const xMax = props.isSameXAxis ? props.maxX : undefined;\n\n  const { cursorIdx, chartRef, handleCursorChange, onCloseOverlay, overlayVisible } = useGraphActiveCursor(props.id);\n\n  const propsOnInteract = props.onInteract;\n  const onChartInteract = useCallback(() => propsOnInteract?.(\"manipulate\"), [propsOnInteract]);\n\n  const timestamps = result.data[0];\n  const cursorTimestamp = cursorIdx != null ? timestamps[cursorIdx] : null;\n  const cursorRecord = cursorTimestamp != null ? result.historyRecords[cursorTimestamp] : undefined;\n\n  return (\n    <View className=\"relative\" testID=\"graph\" data-testid=\"graph\">\n      <View testID=\"graph-data\" data-testid=\"graph-data\">\n        <View className=\"flex-row items-center mb-1\">\n          <View className=\"flex-1\">\n            <View>\n              <Text className=\"text-lg font-semibold leading-scaled-6 text-left u-title\">\n                {props.title || exercise.name}\n              </Text>\n            </View>\n            <View>\n              <Text className=\"text-xs leading-scaled-4 text-left text-text-secondary\">{props.subtitle || eqName}</Text>\n            </View>\n          </View>\n          <View>\n            <Select\n              value={selectedType}\n              onChange={(v) => {\n                props.onInteract?.(\"type\");\n                setSelectedType(v as IExerciseSelectedType);\n              }}\n              options={[\n                { value: \"weight\", label: \"Max Weight\" },\n                { value: \"volume\", label: \"Volume\" },\n              ]}\n              className=\"p-2 text-xs text-right bg-background-default\"\n            />\n          </View>\n        </View>\n        <View className=\"relative\">\n          <LineChart\n            ref={chartRef}\n            data={result.data}\n            series={series}\n            height={320}\n            xMin={xMin}\n            xMax={xMax}\n            programLines={props.isWithProgramLines ? result.changeProgramTimes : undefined}\n            onCursorChange={handleCursorChange}\n            onInteract={onChartInteract}\n            yAxisFormatter={(v) => `${Math.round(v)}`}\n            isInteractive={props.isInteractive}\n          />\n          <GraphLegendOverlay visible={overlayVisible} onClose={onCloseOverlay}>\n            <GraphExerciseLegend\n              cursorIdx={cursorIdx}\n              data={result.data}\n              units={units}\n              selectedType={selectedType}\n              isWithOneRm={props.isWithOneRm}\n              record={cursorRecord}\n              exercise={props.exercise}\n              dispatch={props.dispatch}\n            />\n          </GraphLegendOverlay>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nexport const GraphExercise = memo(GraphExerciseInner);\n\ninterface IGraphExerciseLegendProps {\n  cursorIdx: number | null;\n  data: IGraphData[\"data\"];\n  units: string;\n  selectedType: IExerciseSelectedType;\n  isWithOneRm?: boolean;\n  record?: IHistoryRecord;\n  exercise: IExerciseType;\n  dispatch?: IDispatch;\n}\n\nfunction GraphExerciseLegend(props: IGraphExerciseLegendProps): JSX.Element | null {\n  const { cursorIdx, data, units } = props;\n  if (cursorIdx == null) {\n    return null;\n  }\n  const timestamp = data[0][cursorIdx];\n  const weight = data[1][cursorIdx];\n  const reps = data[2][cursorIdx];\n  const onerm = data[3][cursorIdx];\n  const volume = data[4][cursorIdx];\n  const bodyweight = data[5][cursorIdx];\n  const date = new Date(timestamp * 1000);\n\n  const entryNotes = (props.record?.entries || [])\n    .filter((e) => Exercise_eq(props.exercise, e.exercise))\n    .map((e) => e.notes)\n    .filter((e): e is string => !!e);\n\n  const entries = (props.record?.entries || []).filter((e) => e.exercise.id === props.exercise.id);\n  const stateVars: string[] = [];\n  for (const entry of entries) {\n    for (const key of ObjectUtils_keys(entry.state || {})) {\n      const value = entry.state?.[key];\n      const displayValue = Weight_isOrPct(value) ? Weight_display(value) : value;\n      stateVars.push(`${key}: ${displayValue}`);\n    }\n    for (const key of ObjectUtils_keys(entry.vars || {})) {\n      const name = ({ rm1: \"1 Rep Max\" } as Record<string, string>)[key] || key;\n      const value = entry.vars?.[key];\n      const displayValue = Weight_isOrPct(value) ? Weight_display(value) : value;\n      stateVars.push(`${name}: ${displayValue}`);\n    }\n  }\n  const groups = CollectionUtils_inGroupsOf(2, stateVars);\n\n  const onWorkoutPress = (): void => {\n    if (props.record && props.dispatch) {\n      props.dispatch(Thunk_editHistoryRecord(props.record));\n    }\n  };\n\n  return (\n    <View className=\"pr-6\">\n      {weight != null && reps != null ? (\n        <View className=\"flex-row flex-wrap items-center\">\n          {props.selectedType === \"weight\" ? (\n            <>\n              <Text className=\"text-sm\">\n                {DateUtils_format(date)}, <Text className=\"text-sm font-bold\">{weight}</Text> {units}s x{\" \"}\n                <Text className=\"text-sm font-bold\">{reps}</Text> reps\n                {props.isWithOneRm && onerm != null && (\n                  <Text className=\"text-sm\">\n                    , e1RM = <Text className=\"text-sm font-bold\">{onerm.toFixed(2)}</Text> {units}s\n                  </Text>\n                )}\n              </Text>\n              {!!(props.record && props.dispatch) && (\n                <Pressable onPress={onWorkoutPress}>\n                  <Text className=\"ml-2 text-sm font-bold underline text-text-link\">Workout</Text>\n                </Pressable>\n              )}\n            </>\n          ) : (\n            <>\n              <Text className=\"text-sm\">\n                {DateUtils_format(date)}, Volume:{\" \"}\n                <Text className=\"text-sm font-bold\">\n                  {volume} {units}s\n                </Text>\n              </Text>\n              {!!(props.record && props.dispatch) && (\n                <Pressable onPress={onWorkoutPress}>\n                  <Text className=\"ml-2 text-sm font-bold underline text-text-link\">Workout</Text>\n                </Pressable>\n              )}\n            </>\n          )}\n        </View>\n      ) : bodyweight != null ? (\n        <Text className=\"text-sm\">\n          {DateUtils_format(date)}, Bodyweight - <Text className=\"text-sm font-bold\">{bodyweight}</Text> {units}\n        </Text>\n      ) : null}\n      {!!(entryNotes.length > 0 || props.record?.notes) && (\n        <View className=\"mt-1\">\n          {entryNotes.map((n, i) => (\n            <Text key={i} className=\"text-xs text-text-secondary\">\n              • {n}\n            </Text>\n          ))}\n          {!!props.record?.notes && (\n            <Text className=\"text-xs text-text-secondary\">\n              <Text className=\"text-xs font-bold\">Workout: </Text>\n              {props.record.notes}\n            </Text>\n          )}\n        </View>\n      )}\n      {groups.length > 0 && (\n        <View className=\"mt-1\">\n          {groups.map(([a, b], i) => (\n            <View key={i} className=\"flex-row gap-4\">\n              <Text className=\"flex-1 text-xs\">{a}</Text>\n              <Text className=\"flex-1 text-xs\">{b ?? \"\"}</Text>\n            </View>\n          ))}\n        </View>\n      )}\n    </View>\n  );\n}\n","import { JSX, ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { IconCloseCircle } from \"./icons/iconCloseCircle\";\nimport { useActiveGraph } from \"./activeGraphContext\";\nimport { ILineChartHandle } from \"./lineChart\";\n\ninterface IGraphLegendOverlayProps {\n  visible: boolean;\n  onClose: () => void;\n  children: ReactNode;\n}\n\nexport function GraphLegendOverlay(props: IGraphLegendOverlayProps): JSX.Element | null {\n  if (!props.visible) {\n    return null;\n  }\n  return (\n    <View\n      className=\"absolute border rounded-lg left-2 right-2 border-border-cardpurple bg-background-subtlecardpurple/90\"\n      dataSet={{ graphLegend: \"true\" }}\n      style={{ top: -60, zIndex: 10, padding: 8 }}\n    >\n      <Pressable onPress={props.onClose} style={{ position: \"absolute\", top: 4, right: 4, zIndex: 20 }}>\n        <IconCloseCircle size={18} />\n      </Pressable>\n      {props.children}\n    </View>\n  );\n}\n\ninterface IGraphActiveCursor {\n  cursorIdx: number | null;\n  chartRef: React.RefObject<ILineChartHandle | null>;\n  handleCursorChange: (idx: number | null) => void;\n  onCloseOverlay: () => void;\n  overlayVisible: boolean;\n}\n\nexport function useGraphActiveCursor(id: string | undefined): IGraphActiveCursor {\n  const { activeId, setActive } = useActiveGraph();\n  const otherIsActive = id != null && activeId != null && activeId !== id;\n  const chartRef = useRef<ILineChartHandle | null>(null);\n  const [cursorIdx, setCursorIdx] = useState<number | null>(null);\n\n  const handleCursorChange = useCallback(\n    (idx: number | null) => {\n      setCursorIdx(idx);\n      if (idx != null && id != null && activeId !== id) {\n        setActive(id);\n      }\n    },\n    [activeId, id, setActive]\n  );\n\n  useEffect(() => {\n    if (otherIsActive) {\n      setCursorIdx(null);\n      chartRef.current?.clearCursor();\n    }\n  }, [otherIsActive]);\n\n  const onCloseOverlay = useCallback(() => {\n    chartRef.current?.clearCursor();\n    setCursorIdx(null);\n    if (id != null) {\n      setActive(null);\n    }\n  }, [id, setActive]);\n\n  return {\n    cursorIdx,\n    chartRef,\n    handleCursorChange,\n    onCloseOverlay,\n    overlayVisible: cursorIdx != null && !otherIsActive,\n  };\n}\n","import { JSX, memo, useMemo, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Select } from \"./primitives/select\";\nimport { ISettings, IVolumeSelectedType } from \"../types\";\nimport { StringUtils_capitalize } from \"../utils/string\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { MathUtils_formatCompact } from \"../utils/math\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { Muscle_getMuscleGroupName } from \"../models/muscle\";\nimport { LineChart, ILineChartSeries } from \"./lineChart\";\nimport { GraphLegendOverlay, useGraphActiveCursor } from \"./graphLegendOverlay\";\n\ninterface IGraphMuscleGroupProps {\n  id?: string;\n  data: [number[], number[], number[]];\n  programChangeTimes?: [number, string][];\n  muscleGroup: string;\n  settings: ISettings;\n  initialType?: IVolumeSelectedType;\n}\n\nfunction GraphMuscleGroupInner(props: IGraphMuscleGroupProps): JSX.Element {\n  const [selectedType, setSelectedType] = useState<IVolumeSelectedType>(props.initialType || \"volume\");\n  const { cursorIdx, chartRef, handleCursorChange, onCloseOverlay, overlayVisible } = useGraphActiveCursor(props.id);\n\n  const series: ILineChartSeries[] = useMemo(\n    () => [\n      {\n        label: \"Volume\",\n        show: selectedType === \"volume\",\n        color: Tailwind_colors().red[500],\n        width: 1.5,\n      },\n      {\n        label: \"Sets\",\n        show: selectedType === \"sets\",\n        color: Tailwind_colors().red[500],\n        width: 1.5,\n      },\n    ],\n    [selectedType]\n  );\n\n  const title = `${Muscle_getMuscleGroupName(props.muscleGroup, props.settings)} Weekly ${StringUtils_capitalize(\n    selectedType\n  )}`;\n\n  const timestamp = cursorIdx != null ? props.data[0][cursorIdx] : null;\n  const volume = cursorIdx != null ? props.data[1][cursorIdx] : null;\n  const sets = cursorIdx != null ? props.data[2][cursorIdx] : null;\n  const units = props.settings.units;\n\n  return (\n    <View className=\"relative\" testID=\"graph\" data-testid=\"graph\">\n      <View testID=\"graph-data\" data-testid=\"graph-data\">\n        <View className=\"flex-row items-center mb-1\">\n          <View className=\"flex-1\">\n            <Text className=\"text-lg font-semibold leading-scaled-6 text-left u-title\">{title}</Text>\n          </View>\n          <View>\n            <Select\n              value={selectedType}\n              onChange={(v) => setSelectedType(v as IVolumeSelectedType)}\n              options={[\n                { value: \"volume\", label: \"Volume\" },\n                { value: \"sets\", label: \"Sets\" },\n              ]}\n              className=\"p-2 text-xs text-right bg-background-default\"\n            />\n          </View>\n        </View>\n        <View className=\"relative\">\n          <LineChart\n            ref={chartRef}\n            data={props.data}\n            series={series}\n            height={320}\n            programLines={props.programChangeTimes}\n            onCursorChange={handleCursorChange}\n            yAxisFormatter={(v) => MathUtils_formatCompact(v)}\n          />\n          <GraphLegendOverlay visible={overlayVisible} onClose={onCloseOverlay}>\n            {timestamp != null && selectedType === \"volume\" && volume != null && (\n              <Text className=\"text-sm\">\n                {DateUtils_format(new Date(timestamp * 1000))}, Volume:{\" \"}\n                <Text className=\"text-sm font-bold\">\n                  {volume} {units}s\n                </Text>\n              </Text>\n            )}\n            {timestamp != null && selectedType === \"sets\" && sets != null && (\n              <Text className=\"text-sm\">\n                {DateUtils_format(new Date(timestamp * 1000))}, Sets: <Text className=\"text-sm font-bold\">{sets}</Text>\n              </Text>\n            )}\n          </GraphLegendOverlay>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nexport const GraphMuscleGroup = memo(GraphMuscleGroupInner);\n","import { JSX, memo, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { INutritionGraphId, IStats, IUnit } from \"../types\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { LineChart, ILineChartSeries } from \"./lineChart\";\nimport { GraphLegendOverlay, useGraphActiveCursor } from \"./graphLegendOverlay\";\nimport { NutritionGraph_data, NutritionGraph_name, NutritionGraph_units } from \"../models/nutritionGraph\";\nimport { Food_localDate } from \"../models/food\";\n\ninterface IGraphNutritionProps {\n  id?: string;\n  graphId: INutritionGraphId;\n  stats: IStats;\n  units: IUnit;\n  isSameXAxis?: boolean;\n  minX: number;\n  maxX: number;\n}\n\nfunction GraphNutritionInner(props: IGraphNutritionProps): JSX.Element {\n  const { cursorIdx, chartRef, handleCursorChange, onCloseOverlay, overlayVisible } = useGraphActiveCursor(props.id);\n  const { data, bodyweight } = useMemo(\n    () => NutritionGraph_data(props.stats, props.graphId, props.units, Food_localDate(Date.now())),\n    [props.stats, props.graphId, props.units]\n  );\n  const isCalories = props.graphId === \"nutritionCalories\";\n  const unit = NutritionGraph_units(props.graphId);\n\n  const series: ILineChartSeries[] = useMemo(\n    () => [\n      { label: \"Logged\", show: true, color: Tailwind_colors().red[500], width: 1 },\n      { label: \"7-day average\", show: true, color: Tailwind_colors().blue[500], width: 2 },\n      { label: \"Est. expenditure\", show: isCalories, color: Tailwind_colors().green[500], width: 1.5 },\n    ],\n    [props.graphId, isCalories]\n  );\n  const weightSeries: ILineChartSeries[] = useMemo(\n    () => [{ label: \"Bodyweight\", show: true, color: Tailwind_colors().purple[500], width: 1.5 }],\n    []\n  );\n\n  const yearSec = 365 * 24 * 60 * 60;\n  const dataMin = data[0][0];\n  const dataMax = data[0][data[0].length - 1];\n  const xMin = props.isSameXAxis ? Math.max(props.minX, props.maxX - yearSec) : dataMin;\n  const xMax = props.isSameXAxis ? props.maxX : dataMax;\n\n  const title = NutritionGraph_name(props.graphId);\n  const timestamp = cursorIdx != null ? data[0][cursorIdx] : null;\n  const value = cursorIdx != null ? data[1][cursorIdx] : null;\n  const avg = cursorIdx != null ? data[2][cursorIdx] : null;\n  const tdee = cursorIdx != null ? data[3][cursorIdx] : null;\n\n  return (\n    <View className=\"relative\" testID=\"graph\" data-testid=\"graph\">\n      <View className=\"mb-1\">\n        <Text className=\"text-lg font-semibold leading-scaled-6 text-left u-title\">{title}</Text>\n        <View className=\"flex-row flex-wrap\">\n          {series\n            .filter((s) => s.show)\n            .map((s) => (\n              <View key={s.label} className=\"flex-row items-center mr-3\">\n                <View className=\"w-2 h-2 mr-1 rounded-full\" style={{ backgroundColor: s.color }} />\n                <Text className=\"text-xs text-text-secondary\">{s.label}</Text>\n              </View>\n            ))}\n        </View>\n      </View>\n      {data[0].length === 0 ? (\n        <Text className=\"py-6 text-sm text-center text-text-secondary\">Nothing logged in the Food tab yet.</Text>\n      ) : (\n        <>\n          <View className=\"relative\">\n            <LineChart\n              ref={chartRef}\n              data={data}\n              series={series}\n              height={260}\n              xMin={xMin}\n              xMax={xMax}\n              onCursorChange={handleCursorChange}\n              yAxisFormatter={(v) => `${Math.round(v)}`}\n            />\n            <GraphLegendOverlay visible={overlayVisible} onClose={onCloseOverlay}>\n              {timestamp != null && value != null && (\n                <Text className=\"text-sm\">\n                  {DateUtils_format(new Date(timestamp * 1000))}, <Text className=\"text-sm font-bold\">{value}</Text>{\" \"}\n                  {unit}\n                  {avg != null && (\n                    <Text className=\"text-sm text-text-secondary\">\n                      {\" \"}\n                      (7-day avg. {Math.round(avg)} {unit})\n                    </Text>\n                  )}\n                  {tdee != null && (\n                    <Text className=\"text-sm text-text-secondary\">\n                      {\" \"}\n                      · expenditure {tdee} {unit}\n                    </Text>\n                  )}\n                </Text>\n              )}\n            </GraphLegendOverlay>\n          </View>\n          {bodyweight[0].length > 1 && (\n            <View className=\"mt-1\">\n              <Text className=\"text-xs text-text-secondary\">Bodyweight ({props.units})</Text>\n              <LineChart\n                data={bodyweight}\n                series={weightSeries}\n                height={120}\n                xMin={xMin}\n                xMax={xMax}\n                yAxisFormatter={(v) => `${Math.round(v * 10) / 10}`}\n                isInteractive={false}\n              />\n            </View>\n          )}\n        </>\n      )}\n    </View>\n  );\n}\n\nexport const GraphNutrition = memo(GraphNutritionInner);\n","import { JSX, memo, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\nimport { Weight_convertTo } from \"../models/weight\";\nimport {\n  ILengthUnit,\n  ISettings,\n  IStatsHealthKey,\n  IStatsHealthValue,\n  IStatsKey,\n  IStatsLengthValue,\n  IStatsPercentageValue,\n  IStatsWeightValue,\n  IUnit,\n} from \"../types\";\nimport { Length_convertTo } from \"../models/length\";\nimport { Stats_name } from \"../models/stats\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { IPercentageUnit } from \"../types\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { LineChart, ILineChartSeries } from \"./lineChart\";\nimport { GraphLegendOverlay, useGraphActiveCursor } from \"./graphLegendOverlay\";\n\ninterface IGraphStatsProps {\n  id?: string;\n  collection: [number, number][];\n  units: IUnit | ILengthUnit | IPercentageUnit | string;\n  statsKey: IStatsKey | IStatsHealthKey;\n  settings: ISettings;\n  title?: string | null;\n  isSameXAxis?: boolean;\n  minX: number;\n  maxX: number;\n  movingAverageWindowSize?: number;\n  isInteractive?: boolean;\n}\n\nexport function getWeightDataForGraph(coll: IStatsWeightValue[], settings: ISettings): [number, number][] {\n  const sortedCollection = CollectionUtils_sort(coll, (a, b) => a.timestamp - b.timestamp);\n  return sortedCollection.map((i) => {\n    return [i.timestamp / 1000, Weight_convertTo(i.value, settings.units).value];\n  });\n}\n\nexport function getLengthDataForGraph(coll: IStatsLengthValue[], settings: ISettings): [number, number][] {\n  const sortedCollection = CollectionUtils_sort(coll, (a, b) => a.timestamp - b.timestamp);\n  return sortedCollection.map((i) => {\n    return [i.timestamp / 1000, Length_convertTo(i.value, settings.lengthUnits).value];\n  });\n}\n\nexport function getPercentageDataForGraph(coll: IStatsPercentageValue[], settings: ISettings): [number, number][] {\n  const sortedCollection = CollectionUtils_sort(coll, (a, b) => a.timestamp - b.timestamp);\n  return sortedCollection.map((i) => {\n    return [i.timestamp / 1000, i.value.value];\n  });\n}\n\nexport function getHealthDataForGraph(coll: IStatsHealthValue[], key: IStatsHealthKey): [number, number][] {\n  const sortedCollection = CollectionUtils_sort(coll, (a, b) => a.timestamp - b.timestamp);\n  // Sleep is stored in minutes; graph it in hours so the axis stays readable.\n  const divisor = key === \"sleep\" ? 60 : 1;\n  return sortedCollection.map((i) => [i.timestamp / 1000, Math.round((i.value / divisor) * 10) / 10]);\n}\n\nfunction GraphStatsInner(props: IGraphStatsProps): JSX.Element {\n  const { cursorIdx, chartRef, handleCursorChange, onCloseOverlay, overlayVisible } = useGraphActiveCursor(props.id);\n  const movingAverageWindowSize = props.movingAverageWindowSize;\n\n  const data = useMemo(() => {\n    const result: [number[], number[], number[]] = [[], [], []];\n    for (let index = 0; index < props.collection.length; index++) {\n      const i = props.collection[index];\n      result[0].push(i[0]);\n      result[1].push(i[1]);\n      if (movingAverageWindowSize != null) {\n        if (index >= movingAverageWindowSize - 1) {\n          let sum = 0;\n          for (let j = index - movingAverageWindowSize + 1; j <= index; j++) {\n            sum += result[1][j];\n          }\n          const movingAvg = sum / movingAverageWindowSize;\n          result[2].push(Math.round(movingAvg * 10) / 10);\n        } else {\n          result[2].push(i[1]);\n        }\n      }\n    }\n    return result;\n  }, [props.collection, movingAverageWindowSize]);\n\n  const series: ILineChartSeries[] = useMemo(() => {\n    const label =\n      props.statsKey === \"weight\"\n        ? \"Weight\"\n        : props.statsKey === \"bodyfat\"\n          ? \"Percentage\"\n          : props.statsKey === \"sleep\" || props.statsKey === \"calories\" || props.statsKey === \"protein\"\n            ? Stats_name(props.statsKey)\n            : \"Size\";\n    const out: ILineChartSeries[] = [\n      {\n        label,\n        show: true,\n        color: Tailwind_colors().red[500],\n        width: 1.5,\n      },\n    ];\n    if (movingAverageWindowSize != null) {\n      out.push({\n        label: \"Moving Average\",\n        show: true,\n        color: Tailwind_colors().blue[500],\n        width: 1.5,\n      });\n    }\n    return out;\n  }, [props.statsKey, movingAverageWindowSize]);\n\n  const yearSec = 365 * 24 * 60 * 60;\n  const xMin = props.isSameXAxis ? Math.max(props.minX, props.maxX - yearSec) : undefined;\n  const xMax = props.isSameXAxis ? props.maxX : undefined;\n\n  const title = props.title === undefined ? Stats_name(props.statsKey) : props.title || undefined;\n\n  const timestamp = cursorIdx != null ? data[0][cursorIdx] : null;\n  const value = cursorIdx != null ? data[1][cursorIdx] : null;\n  const movingAvg = cursorIdx != null && movingAverageWindowSize != null ? data[2][cursorIdx] : null;\n\n  return (\n    <View className=\"relative\" testID=\"graph\" data-testid=\"graph\">\n      <View testID=\"graph-data\" data-testid=\"graph-data\">\n        {title && (\n          <View className=\"mb-1\">\n            <Text className=\"text-lg font-semibold leading-scaled-6 text-left u-title\">{title}</Text>\n          </View>\n        )}\n        <View className=\"relative\">\n          <LineChart\n            ref={chartRef}\n            data={data}\n            series={series}\n            height={320}\n            xMin={xMin}\n            xMax={xMax}\n            onCursorChange={handleCursorChange}\n            yAxisFormatter={(v) => `${Math.round(v * 10) / 10}`}\n            isInteractive={props.isInteractive}\n          />\n          <GraphLegendOverlay visible={overlayVisible} onClose={onCloseOverlay}>\n            {timestamp != null && value != null && props.units != null && (\n              <Text className=\"text-sm\">\n                {DateUtils_format(new Date(timestamp * 1000))}, <Text className=\"text-sm font-bold\">{value}</Text>{\" \"}\n                {props.units}\n                {movingAvg != null && (\n                  <Text className=\"text-sm text-text-secondary\">\n                    {\" \"}\n                    (Avg. {movingAvg} {props.units})\n                  </Text>\n                )}\n              </Text>\n            )}\n          </GraphLegendOverlay>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nexport const GraphStats = memo(GraphStatsInner);\n","import { JSX, Fragment, ReactNode, useState } from \"react\";\nimport { View, Pressable, LayoutAnimation, Platform, UIManager } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { IconArrowDown2 } from \"./icons/iconArrowDown2\";\nimport { IconArrowUp } from \"./icons/iconArrowUp\";\nimport { IconHelp } from \"./icons/iconHelp\";\n\ninterface IProps {\n  name: string;\n  help?: JSX.Element;\n  size?: \"small\" | \"large\";\n  children?: ReactNode;\n  headerClassName?: string;\n  nameAddOn?: JSX.Element;\n  rightAddOn?: JSX.Element;\n  leftExpandIcon?: boolean;\n  isExpanded?: boolean;\n  expandOnIconClick?: boolean;\n  topPadding?: boolean;\n  highlighted?: boolean;\n  onToggle?: () => void;\n}\n\nexport function GroupHeader(props: IProps): JSX.Element {\n  const { name } = props;\n  const isControlled = props.onToggle != null;\n  const [internalExpanded, setInternalExpanded] = useState<boolean>(!!props.isExpanded);\n  const isExpanded = isControlled ? !!props.isExpanded : internalExpanded;\n  const hasToggle = isControlled || !!props.children;\n  const [isHelpShown, setIsHelpShown] = useState<boolean>(false);\n  const size = props.size || \"small\";\n  const testId = `group-header-${StringUtils_dashcase(name)}`;\n\n  function onClick(): void {\n    if (!hasToggle) {\n      return;\n    }\n    if (Platform.OS === \"android\" && UIManager.setLayoutAnimationEnabledExperimental) {\n      UIManager.setLayoutAnimationEnabledExperimental(true);\n    }\n    LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);\n    if (isControlled) {\n      props.onToggle!();\n    } else {\n      setInternalExpanded(!isExpanded);\n    }\n  }\n\n  const wrapperClassName = `flex-row items-center pb-1 ${props.topPadding ? \"mt-6 pt-4\" : \"\"} ${props.headerClassName || \"\"}`;\n  const inner = (\n    <>\n      {hasToggle && props.leftExpandIcon && (\n        <Pressable\n          className=\"flex items-center justify-center mr-2\"\n          onPress={props.expandOnIconClick ? onClick : undefined}\n        >\n          {isExpanded ? <IconArrowUp /> : <IconArrowDown2 />}\n        </Pressable>\n      )}\n      <View className=\"flex-row items-center flex-1\">\n        <Text\n          className={`${size === \"small\" ? \"text-xs\" : \"text-base font-bold\"} ${\n            props.highlighted ? \"text-text-purple\" : \"text-text-secondary\"\n          }`}\n        >\n          {name}\n        </Text>\n        {props.nameAddOn}\n      </View>\n      <View className=\"flex-row items-center justify-center\">\n        {props.rightAddOn}\n        {props.help && (\n          <Pressable style={{ marginRight: -8 }} className=\"px-2\" onPress={() => setIsHelpShown(!isHelpShown)}>\n            <IconHelp size={20} color=\"#607284\" />\n          </Pressable>\n        )}\n        {hasToggle && !props.leftExpandIcon ? isExpanded ? <IconArrowUp /> : <IconArrowDown2 /> : null}\n      </View>\n    </>\n  );\n\n  return (\n    <Fragment>\n      {hasToggle ? (\n        <Pressable\n          testID={testId}\n          data-testid={testId}\n          onPress={!props.expandOnIconClick ? onClick : undefined}\n          className={wrapperClassName}\n        >\n          {inner}\n        </Pressable>\n      ) : (\n        <View testID={testId} data-testid={testId} className={wrapperClassName}>\n          {inner}\n        </View>\n      )}\n      {isHelpShown && props.help}\n      {isExpanded && props.children}\n    </Fragment>\n  );\n}\n","import { StoreRuntime_storeName } from \"../../utils/storeRuntime\";\n\nexport type IHearAboutUsSource =\n  | \"reddit\"\n  | \"ai\"\n  | \"friend\"\n  | \"program\"\n  | \"search\"\n  | \"appstore\"\n  | \"youtube\"\n  | \"ad\"\n  | \"other\";\n\nexport interface IHearAboutUsChip {\n  value: string;\n  label: string;\n  variant?: \"coral\";\n  icon?: \"speaker\";\n}\n\nexport type IHearAboutUsDrill =\n  | { kind: \"chips\"; title: string; sub: string; chips: IHearAboutUsChip[]; freeformPlaceholder?: string }\n  | { kind: \"freeform\"; title: string; sub: string; placeholder: string; allowEmpty?: boolean }\n  | { kind: \"none\" };\n\nexport interface IHearAboutUsOption {\n  source: IHearAboutUsSource;\n  label: string;\n  eyebrow: string;\n  drill: IHearAboutUsDrill;\n}\n\n// Fixed, intentional order (no randomization); \"other\" is always last.\nexport const HEAR_ABOUT_US_OPTIONS: IHearAboutUsOption[] = [\n  {\n    source: \"reddit\",\n    label: \"Reddit\",\n    eyebrow: \"You found us on Reddit\",\n    drill: {\n      kind: \"chips\",\n      title: \"Which subreddit?\",\n      sub: \"Optional - tap one, or type it in.\",\n      chips: [\n        { value: \"r/gzcl\", label: \"r/gzcl\" },\n        { value: \"r/workout\", label: \"r/workout\" },\n        { value: \"r/naturalbodybuilding\", label: \"r/naturalbodybuilding\" },\n        { value: \"r/AverageToSavage\", label: \"r/AverageToSavage\" },\n        { value: \"r/tacticalbarbell\", label: \"r/tacticalbarbell\" },\n        { value: \"r/liftosaur\", label: \"r/liftosaur\" },\n        { value: \"reddit-ad\", label: \"It was a Reddit ad\", variant: \"coral\", icon: \"speaker\" },\n      ],\n      freeformPlaceholder: \"Type a subreddit...\",\n    },\n  },\n  {\n    source: \"ai\",\n    label: \"Asked AI\",\n    eyebrow: \"An AI recommended us\",\n    drill: {\n      kind: \"chips\",\n      title: \"Which AI?\",\n      sub: \"Optional - tap one, or type it in.\",\n      chips: [\n        { value: \"ChatGPT\", label: \"ChatGPT\" },\n        { value: \"Claude\", label: \"Claude\" },\n        { value: \"Gemini\", label: \"Gemini\" },\n        { value: \"Perplexity\", label: \"Perplexity\" },\n        { value: \"Copilot\", label: \"Copilot\" },\n        { value: \"Grok\", label: \"Grok\" },\n      ],\n      freeformPlaceholder: \"Another AI...\",\n    },\n  },\n  {\n    source: \"program\",\n    label: \"Googled a program\",\n    eyebrow: \"Specific program\",\n    drill: {\n      kind: \"chips\",\n      title: \"Which program?\",\n      sub: \"Tap the one that brought you here.\",\n      chips: [\n        { value: \"GZCL\", label: \"GZCL\" },\n        { value: \"RP Hypertrophy\", label: \"RP Hypertrophy\" },\n        { value: \"5/3/1\", label: \"5/3/1\" },\n        { value: \"Tactical Barbell\", label: \"Tactical Barbell\" },\n        { value: \"Arnold split\", label: \"Arnold split\" },\n        { value: \"Mentzer\", label: \"Mentzer\" },\n      ],\n      freeformPlaceholder: \"Type a program...\",\n    },\n  },\n  {\n    source: \"friend\",\n    label: \"Friend or family\",\n    eyebrow: \"Friend or family\",\n    drill: { kind: \"none\" },\n  },\n  {\n    source: \"search\",\n    label: \"Web search\",\n    eyebrow: \"You searched the web\",\n    drill: {\n      kind: \"freeform\",\n      title: \"What were you searching for?\",\n      sub: \"Optional - roughly what you typed.\",\n      placeholder: \"e.g. customizable workout tracker...\",\n    },\n  },\n  {\n    source: \"appstore\",\n    label: \"App Store / Play Store\",\n    eyebrow: \"You found us in the store\",\n    drill: { kind: \"none\" },\n  },\n  {\n    source: \"youtube\",\n    label: \"YouTube\",\n    eyebrow: \"You found us on YouTube\",\n    drill: {\n      kind: \"freeform\",\n      title: \"Remember which video or channel?\",\n      sub: \"Optional - type it in.\",\n      placeholder: \"Channel or video...\",\n    },\n  },\n  {\n    source: \"ad\",\n    label: \"Ads\",\n    eyebrow: \"You saw an ad\",\n    drill: {\n      kind: \"chips\",\n      title: \"Where?\",\n      sub: \"Tap where you saw it.\",\n      chips: [\n        { value: \"Google\", label: \"Google\" },\n        { value: \"Reddit\", label: \"Reddit\" },\n      ],\n      freeformPlaceholder: \"Somewhere else...\",\n    },\n  },\n  {\n    source: \"other\",\n    label: \"Other\",\n    eyebrow: \"Something else\",\n    drill: {\n      kind: \"freeform\",\n      title: \"How did you hear about us?\",\n      sub: \"Tell us in your own words.\",\n      placeholder: \"Type here…\",\n    },\n  },\n];\n\nexport function HearAboutUs_option(source: IHearAboutUsSource): IHearAboutUsOption | undefined {\n  return HEAR_ABOUT_US_OPTIONS.find((o) => o.source === source);\n}\n\n// The store option names only the store this runtime came from — App Review rejects a binary that\n// mentions a competing store (guideline 2.3.10). Resolved here rather than baked into the option so\n// it tracks the runtime, the same way sourceIcon() picks the Apple or Play glyph.\nexport function HearAboutUs_label(option: IHearAboutUsOption): string {\n  return option.source === \"appstore\" ? StoreRuntime_storeName() : option.label;\n}\n","import { JSX, ReactNode, useRef, useState } from \"react\";\nimport { View, Pressable, Image, ScrollView, Platform } from \"react-native\";\nimport { TextInput } from \"../primitives/textInput\";\nimport { Text } from \"../primitives/text\";\nimport { Button } from \"../button\";\nimport { LinkButton } from \"../linkButton\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { ImagePreloader_uri } from \"../../utils/imagePreloader\";\nimport { IconReddit } from \"../icons/iconReddit\";\nimport { IconAi } from \"../icons/iconAi\";\nimport { IconUser } from \"../icons/iconUser\";\nimport { IconDoc } from \"../icons/iconDoc\";\nimport { IconMagnifyingGlass } from \"../icons/iconMagnifyingGlass\";\nimport { IconApple } from \"../icons/iconApple\";\nimport { IconGooglePlay } from \"../icons/iconGooglePlay\";\nimport { IconYoutube } from \"../icons/iconYoutube\";\nimport { IconSpeaker } from \"../icons/iconSpeaker\";\nimport { IconKebab } from \"../icons/iconKebab\";\nimport { IconBack } from \"../icons/iconBack\";\nimport { IconArrowRight } from \"../icons/iconArrowRight\";\nimport { useNavOptions } from \"../../navigation/useNavOptions\";\nimport {\n  HEAR_ABOUT_US_OPTIONS,\n  HearAboutUs_option,\n  HearAboutUs_label,\n  IHearAboutUsChip,\n  IHearAboutUsSource,\n} from \"./hearAboutUsConfig\";\n\nexport interface IHearAboutUsAnswer {\n  source: string;\n  detail?: string;\n  freeform?: string;\n  ts?: number;\n}\n\ninterface IProps {\n  context: \"onboarding\" | \"backfill\";\n  variant: \"screen\" | \"sheet\";\n  initialAnswer?: IHearAboutUsAnswer;\n  onSelectSource: (source: IHearAboutUsSource) => void;\n  onChange: (partial: { detail?: string; freeform?: string }) => void;\n  onComplete: (payload: { source: IHearAboutUsSource; detail: string; freeform: string }) => void;\n  // Called only when the user skips with NO source chosen. If a source was already picked, the survey\n  // finalizes via onComplete instead (we never discard a chosen source).\n  onSkip: () => void;\n  onMaybeLater?: () => void;\n}\n\n// In-content back button for the backfill modal (a formSheet has no real navbar). The onboarding\n// screen uses the real navbar instead (see useNavOptions below).\nfunction BackButton({ onPress }: { onPress: () => void }): JSX.Element {\n  return (\n    <Pressable className=\"p-2\" data-testid=\"hear-about-us-back\" testID=\"hear-about-us-back\" onPress={onPress}>\n      <IconBack color={Tailwind_semantic().icon.neutral} />\n    </Pressable>\n  );\n}\n\nfunction sourceIcon(source: IHearAboutUsSource, color: string): ReactNode {\n  const size = 22;\n  switch (source) {\n    case \"reddit\":\n      return <IconReddit size={size} color={color} secondaryColor={color} />;\n    case \"ai\":\n      return <IconAi size={size} color={color} />;\n    case \"friend\":\n      return <IconUser size={size} color={color} />;\n    case \"program\":\n      return <IconDoc width={size} height={size} color={color} />;\n    case \"search\":\n      return <IconMagnifyingGlass size={size} color={color} />;\n    case \"appstore\":\n      return Platform.OS === \"android\" ? (\n        <IconGooglePlay size={size} color={color} />\n      ) : (\n        <IconApple size={size} color={color} />\n      );\n    case \"youtube\":\n      return <IconYoutube size={size} color={color} />;\n    case \"ad\":\n      return <IconSpeaker size={size} color={color} />;\n    case \"other\":\n      return <IconKebab color={color} />;\n  }\n}\n\nfunction Mascot({ size }: { size: number }): JSX.Element {\n  return (\n    <Image\n      source={{ uri: ImagePreloader_uri(\"/images/dino-scope.png\") }}\n      style={{ width: size, height: size }}\n      resizeMode=\"contain\"\n      accessibilityLabel=\"Liftosaur mascot with a telescope\"\n    />\n  );\n}\n\nfunction SkipButton({ onPress }: { onPress: () => void }): JSX.Element {\n  return (\n    <LinkButton\n      name=\"hear-about-us-skip\"\n      testID=\"hear-about-us-skip\"\n      className=\"text-sm ls-hear-about-us-skip p-2\"\n      onPress={onPress}\n    >\n      Skip\n    </LinkButton>\n  );\n}\n\nexport function HearAboutUsSurvey(props: IProps): JSX.Element {\n  const [step, setStep] = useState<1 | 2>(props.initialAnswer?.source ? 2 : 1);\n  const [source, setSource] = useState<IHearAboutUsSource | undefined>(\n    props.initialAnswer?.source as IHearAboutUsSource | undefined\n  );\n  const freeformRef = useRef<string>(props.initialAnswer?.freeform ?? \"\");\n\n  const option = source != null ? HearAboutUs_option(source) : undefined;\n\n  // Tapping a chip is the answer — finalize and advance immediately (like the Step-1 rows), no\n  // \"selected\" state. \"Done\" is only for the \"or type it in\" freeform path (detail stays empty).\n  const complete = (detail: string): void => {\n    if (source == null) {\n      return;\n    }\n    props.onComplete({ source, detail, freeform: freeformRef.current });\n  };\n\n  const selectSource = (s: IHearAboutUsSource): void => {\n    setSource(s);\n    freeformRef.current = \"\";\n    props.onSelectSource(s);\n    const opt = HearAboutUs_option(s);\n    if (opt?.drill.kind === \"none\") {\n      props.onComplete({ source: s, detail: \"\", freeform: \"\" });\n    } else {\n      setStep(2);\n    }\n  };\n\n  const skipPress = (): void => {\n    if (source != null) {\n      complete(\"\");\n    } else {\n      props.onSkip();\n    }\n  };\n\n  // Onboarding drives the real navbar (standard back + a \"Skip\" right button). Step 2's back returns\n  // to Step 1 (navOnBack returns false to cancel the pop); Step 1's back falls through to the default\n  // pop, returning to the previous onboarding screen. The backfill modal is a formSheet with no\n  // navbar, so it renders its own in-content header (below) instead.\n  const isScreen = props.variant === \"screen\";\n  const stepTwoTitle = option?.drill != null && option.drill.kind !== \"none\" ? option.drill.title : undefined;\n  const navTitle = step === 1 ? \"How'd you hear about us?\" : stepTwoTitle;\n  useNavOptions(\n    isScreen\n      ? {\n          navTitle,\n          navRightButtons: [\n            <LinkButton\n              key=\"skip\"\n              name=\"hear-about-us-skip\"\n              testID=\"hear-about-us-skip\"\n              className=\"p-2 text-sm ls-hear-about-us-skip\"\n              onPress={skipPress}\n            >\n              Skip\n            </LinkButton>,\n          ],\n          navOnBack: () => {\n            if (step === 2) {\n              setStep(1);\n              return false;\n            }\n            return true;\n          },\n        }\n      : { navHidden: true }\n  );\n\n  if (step === 1) {\n    const body = (\n      <View className=\"px-4\">\n        <View className=\"flex-row items-center mb-4\" style={{ gap: 13 }}>\n          <Mascot size={64} />\n          <View className=\"flex-1\">\n            {!isScreen && (\n              <Text className=\"mb-1 text-xl font-bold text-text-primary\">How did you hear about Liftosaur?</Text>\n            )}\n            <Text className=\"text-sm font-semibold text-text-secondary\">\n              It'd really help us out - just a tap or two.\n            </Text>\n          </View>\n          {!isScreen && <SkipButton onPress={skipPress} />}\n        </View>\n        <View style={{ gap: 8 }}>\n          {HEAR_ABOUT_US_OPTIONS.map((opt) => (\n            <Pressable\n              key={opt.source}\n              className=\"flex-row items-center w-full px-3 py-3 border rounded-2xl bg-background-subtle border-border-neutral ls-hear-about-us-option\"\n              style={{ minHeight: 56 }}\n              data-testid={`hear-about-us-option-${opt.source}`}\n              testID={`hear-about-us-option-${opt.source}`}\n              onPress={() => selectSource(opt.source)}\n            >\n              <View\n                className=\"items-center justify-center rounded-xl bg-background-neutral\"\n                style={{ width: 38, height: 38 }}\n              >\n                {sourceIcon(opt.source, Tailwind_semantic().text.secondary)}\n              </View>\n              <Text className=\"flex-1 ml-3 text-base font-bold text-text-primary\">{HearAboutUs_label(opt)}</Text>\n              <View className=\"pl-2\">\n                <IconArrowRight />\n              </View>\n            </Pressable>\n          ))}\n        </View>\n        {props.context === \"backfill\" && (\n          <View className=\"items-center pb-4 mt-5\">\n            <Pressable\n              className=\"px-4 py-2 ls-hear-about-us-later\"\n              data-testid=\"hear-about-us-later\"\n              testID=\"hear-about-us-later\"\n              onPress={() => props.onMaybeLater?.()}\n            >\n              <Text className=\"text-sm font-bold text-text-secondary\">Maybe later</Text>\n            </Pressable>\n          </View>\n        )}\n      </View>\n    );\n    if (isScreen) {\n      return (\n        <View className=\"flex-1\">\n          <ScrollView\n            className=\"flex-1\"\n            keyboardShouldPersistTaps=\"handled\"\n            contentContainerStyle={{ paddingBottom: 24 }}\n          >\n            {body}\n          </ScrollView>\n        </View>\n      );\n    }\n    return <View className=\"pt-6\">{body}</View>;\n  }\n\n  const drill = option?.drill;\n\n  const body = (\n    <View className=\"px-4\">\n      {isScreen && (\n        <View className=\"flex-row items-center mb-3\" style={{ gap: 11 }}>\n          <Mascot size={52} />\n          <Text className=\"text-xs font-bold uppercase text-text-error\" style={{ letterSpacing: 1 }}>\n            {option?.eyebrow}\n          </Text>\n        </View>\n      )}\n      {drill != null && drill.kind !== \"none\" && (\n        <>\n          {!isScreen && <Text className=\"text-2xl font-bold text-text-primary\">{drill.title}</Text>}\n          <Text className=\"mt-2 mb-4 text-sm font-semibold text-text-secondary\">{drill.sub}</Text>\n        </>\n      )}\n      {drill?.kind === \"chips\" && (\n        <View className=\"flex-row flex-wrap\" style={{ gap: 9 }}>\n          {drill.chips.map((chip) => (\n            <ChipView key={chip.value} chip={chip} onPress={() => complete(chip.value)} />\n          ))}\n        </View>\n      )}\n      {drill?.kind === \"chips\" && drill.freeformPlaceholder != null && (\n        <View className=\"mt-5\">\n          <Text className=\"mb-2 text-xs font-bold uppercase text-text-disabled\" style={{ letterSpacing: 0.8 }}>\n            Or type it in\n          </Text>\n          <FreeformInput\n            placeholder={drill.freeformPlaceholder}\n            defaultValue={freeformRef.current}\n            onChangeText={(t) => (freeformRef.current = t)}\n            onEndEditing={() => props.onChange({ freeform: freeformRef.current })}\n          />\n        </View>\n      )}\n      {drill?.kind === \"freeform\" && (\n        <FreeformInput\n          placeholder={drill.placeholder}\n          defaultValue={freeformRef.current}\n          onChangeText={(t) => (freeformRef.current = t)}\n          onEndEditing={() => props.onChange({ freeform: freeformRef.current })}\n        />\n      )}\n    </View>\n  );\n\n  const footer = (\n    <View className=\"px-4 pt-3 pb-4 bg-background-default\">\n      <Button\n        name=\"hear-about-us-done\"\n        kind=\"purple\"\n        buttonSize=\"lg\"\n        className=\"w-full ls-hear-about-us-done\"\n        testID=\"hear-about-us-done\"\n        onPress={() => complete(\"\")}\n      >\n        Done\n      </Button>\n      <View className=\"items-center mt-2\">\n        <Pressable\n          className=\"px-4 py-2 ls-hear-about-us-skip-step\"\n          data-testid=\"hear-about-us-skip-step\"\n          testID=\"hear-about-us-skip-step\"\n          onPress={() => complete(\"\")}\n        >\n          <Text className=\"text-sm font-bold text-text-secondary\">Skip this step</Text>\n        </Pressable>\n      </View>\n    </View>\n  );\n\n  if (isScreen) {\n    return (\n      <View className=\"flex-1\">\n        <ScrollView\n          className=\"flex-1\"\n          keyboardShouldPersistTaps=\"handled\"\n          contentContainerStyle={{ paddingBottom: 16 }}\n        >\n          {body}\n        </ScrollView>\n        {footer}\n      </View>\n    );\n  }\n\n  return (\n    <View>\n      <View className=\"flex-row items-center px-3 pt-3 pb-2\" style={{ gap: 4 }}>\n        <BackButton onPress={() => setStep(1)} />\n        <Text\n          className=\"flex-1 pl-2 text-xs font-bold uppercase text-text-error\"\n          numberOfLines={1}\n          style={{ letterSpacing: 1 }}\n        >\n          {option?.eyebrow}\n        </Text>\n        <SkipButton onPress={skipPress} />\n      </View>\n      {body}\n      {footer}\n    </View>\n  );\n}\n\nfunction ChipView({ chip, onPress }: { chip: IHearAboutUsChip; onPress: () => void }): JSX.Element {\n  const isCoral = chip.variant === \"coral\";\n  const baseCn = isCoral\n    ? \"border-border-cardyellow bg-background-lighterror\"\n    : \"border-border-neutral bg-background-subtle\";\n  const textCn = isCoral ? \"text-text-error\" : \"text-text-primary\";\n  const iconColor = isCoral ? Tailwind_semantic().text.error : Tailwind_semantic().text.primary;\n  return (\n    <Pressable\n      className={`flex-row items-center border rounded-full px-3 py-2 ls-hear-about-us-chip ${baseCn}`}\n      style={{ borderRadius: 999, minHeight: 32 }}\n      data-testid={`hear-about-us-chip-${chip.value}`}\n      testID={`hear-about-us-chip-${chip.value}`}\n      onPress={onPress}\n    >\n      {chip.icon === \"speaker\" && (\n        <View className=\"mr-2\">\n          <IconSpeaker size={18} color={iconColor} />\n        </View>\n      )}\n      <Text className={`text-sm font-semibold ${textCn}`} numberOfLines={1}>\n        {chip.label}\n      </Text>\n    </Pressable>\n  );\n}\n\nfunction FreeformInput(props: {\n  placeholder: string;\n  defaultValue: string;\n  onChangeText: (t: string) => void;\n  onEndEditing: () => void;\n}): JSX.Element {\n  return (\n    <TextInput\n      className=\"w-full px-4 py-4 text-base border rounded-2xl border-border-neutral bg-background-subtle text-text-primary\"\n      style={\n        Platform.OS === \"android\"\n          ? { minHeight: 52, paddingVertical: 16, includeFontPadding: false }\n          : { minHeight: 52 }\n      }\n      placeholder={props.placeholder}\n      placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n      defaultValue={props.defaultValue}\n      onChangeText={props.onChangeText}\n      onEndEditing={props.onEndEditing}\n      autoCapitalize=\"none\"\n      autoCorrect={false}\n      data-testid=\"hear-about-us-freeform\"\n      testID=\"hear-about-us-freeform\"\n    />\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpAccount(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Settings - Account</Text>\n      <Text className=\"pb-2 text-sm\">You can log in and log out on this screen.</Text>\n      <Text className=\"pb-2 text-sm\">\n        For now, we only support <Text className=\"text-sm font-bold\">login via Google</Text>.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        After you log in, your data will be synced to the cloud, so even if you lose your phone, your progress won't be\n        lost.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { Link } from \"../link\";\n\nexport function HelpChooseProgram(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Choose a program to clone</Text>\n      <Text className=\"pb-2 text-sm\">\n        This screen lists your programs, as well as the available pre-built programs, so you can{\" \"}\n        <Text className=\"text-sm font-bold\">clone</Text> them.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Tapping on one of your programs selects it for the next workout. If you want to{\" \"}\n        <Text className=\"text-sm font-bold\">edit</Text> it or <Text className=\"text-sm font-bold\">remove</Text> it,\n        press the <Text className=\"text-sm font-bold\">\"Edit\"</Text> button on the right.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        <Text className=\"text-sm font-bold\">Cloning</Text> a pre-built means you copy the program to the list of your\n        programs.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        A program defines the list of workout days and the exercises for each day. It also defines the logic for\n        increasing or decreasing reps and weights over time, depending on your workout performance.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        After you clone a program, you can modify it in any way you want. The app is very flexible, you can change the\n        reps/weights logic, using a special scripting language called{\" \"}\n        <Link className=\"text-sm\" href=\"/doc\">\n          Liftoscript\n        </Link>\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { Link } from \"../link\";\n\nexport function HelpChooseProgramFirstTime(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Choose a program</Text>\n      <Text className=\"pb-2 text-sm\">\n        This screen lists the available pre-built programs, and gives you an option to create your own.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        If you're a beginner, consider starting with the pre-built program rather than creating your own.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        A program defines the list of workout days and the exercises for each day. It also defines the logic for\n        increasing or decreasing reps and weights over time, depending on your workout performance.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        After you pick a program, you can modify it in any way you want. The app is very flexible, you can change the\n        reps/weights logic, using a special scripting language called{\" \"}\n        <Link className=\"text-sm\" href=\"/doc\">\n          Liftoscript\n        </Link>\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IconCog2 } from \"../icons/iconCog2\";\n\nexport function HelpEditProgramDaysList(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Edit Program</Text>\n      <Text className=\"pb-2 text-sm\">\n        A <Text className=\"text-sm font-bold\">program</Text> consists of <Text className=\"text-sm font-bold\">days</Text>\n        , a <Text className=\"text-sm font-bold\">day</Text> consists of{\" \"}\n        <Text className=\"text-sm font-bold\">exercises</Text>. Each exercise contains the sets, reps and logic for\n        increasing/decreasing reps and weights.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        At the top, below the program name, you <Text className=\"text-sm font-bold\">choose a day</Text> for the next\n        workout. You usually don't need to change it, it increments automatically after each workout, but you can force\n        change it to another day if you want to skip or return to previous days for some reason.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Then, there's a list of days and a list of exercises. You can create those exercises and add them to days. You\n        can copy days and exercises, sometimes it helps to speed up program creation/editing process.\n      </Text>\n      <Text className=\"pb-2 text-sm\">You can reorder days, by dragging them by that 6-dot handle icon</Text>\n      <Text className=\"pb-2 text-sm\">\n        Each exercise tracks its own state, like what's its current weight, or reps, or anything like that. You can\n        reuse the same exercise between days, and it will update the state can copy days and exercises, sometimes it\n        helps to speed up program creation/editing process.\n      </Text>\n      <View className=\"flex-row flex-wrap items-center pb-2\">\n        <Text className=\"text-sm\">\n          You can also export the currently editing program to a file, in case you want to edit it in your text editor\n          (it's a JSON file), or you want to share with somebody. You can later on import it on the Setting screen\n          (the{\" \"}\n        </Text>\n        <IconCog2 size={14} />\n        <Text className=\"text-sm\"> icon in the right bottom corner).</Text>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { PlannerCodeBlock } from \"../../pages/planner/components/plannerCodeBlock\";\nimport { IconGraphsE } from \"../icons/iconGraphsE\";\nimport { IconMusclesD } from \"../icons/iconMusclesD\";\nimport { IconMusclesW } from \"../icons/iconMusclesW\";\nimport { Link } from \"../link\";\nimport { IconDoc } from \"../icons/iconDoc\";\n\nexport function HelpEditProgramV2(): JSX.Element {\n  const script = \"Squat / 3x3-5\\nRomanian Deadlift / 3x8\";\n  const script2 = \"Squat / 3x3-5 65%\\nRomanian Deadlift / 3x8 150lb\";\n\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Edit Program</Text>\n      <Text className=\"mb-2 text-sm\">\n        In Liftosaur, you need to build a weightlifting program in order to do workouts. This is the screen where you\n        can do it. You can build your weightlifting program and ensure you have proper{\" \"}\n        <Text className=\"text-sm font-bold\">weekly volume per muscle group</Text>, and balance it with the{\" \"}\n        <Text className=\"text-sm font-bold\">time you spend in a gym</Text>. You can build multi-week programs, plan your\n        mesocycles, deload weeks, testing 1RM weeks, and see the weekly undulation of volume and intensity of each\n        exercise on a graph.\n      </Text>\n      <View className=\"flex-row flex-wrap items-center mb-2\">\n        <Text className=\"text-sm\">\n          The source of truth for a program is the program text. It uses a special syntax to describe programs called{\" \"}\n          <Text className=\"text-sm font-bold\">Liftoscript</Text>, which looks kinda similar to how you would write a\n          program on paper. By default, in the app there's UI to edit the program, but it really just edits the program\n          text under the hood. To access all the features (editing progressions, descriptions, etc) - you can switch to\n          the plain text mode (by clicking on{\" \"}\n        </Text>\n        <IconDoc width={14} height={14} />\n        <Text className=\"text-sm\">)</Text>\n      </View>\n      <View className=\"flex-row flex-wrap items-center mb-2\">\n        <Text className=\"text-sm\">\n          Set the program name, create weeks and days. Then, either create exercises through UI, or switch to the plain\n          text mode (by tapping on{\" \"}\n        </Text>\n        <IconDoc width={14} height={14} />\n        <Text className=\"text-sm\">\n          ), type the list of exercises for each day, putting each exercise on a new line, along with the number of sets\n          and reps after slash (\n          <Text className=\"text-sm\" style={{ fontFamily: \"Courier\" }}>\n            /\n          </Text>\n          ) character, like this:\n        </Text>\n      </View>\n      <View className=\"px-4 py-2 my-1 mb-2 bg-background-default border rounded-md border-border-neutral\">\n        <PlannerCodeBlock script={script} />\n      </View>\n      <Text className=\"mb-2 text-sm\">\n        You can specify weight - either in absolute units (<Text className=\"text-sm font-bold\">kg</Text> or{\" \"}\n        <Text className=\"text-sm font-bold\">lb</Text>) or as a percentage of your 1RM (One Rep Max - the maximum weight\n        you can lift for one repetition):\n      </Text>\n      <View className=\"px-4 py-2 my-1 mb-2 bg-background-default border rounded-md border-border-neutral\">\n        <PlannerCodeBlock script={script2} />\n      </View>\n      <Text className=\"mb-2 text-sm\">\n        Autocomplete will help you with the exercise names. You can also create custom exercises if they're missing in\n        the library.\n      </Text>\n      <View className=\"flex-row flex-wrap items-center mb-2\">\n        <Text className=\"text-sm\">The </Text>\n        <IconMusclesW size={14} />\n        <Text className=\"text-sm\">\n          {\" \"}\n          opens <Text className=\"text-sm font-bold\">Weekly Stats</Text>, where you can see the number of sets per week\n          per muscle group, whether you're in the recommended range (indicated by color), strength/hypertrophy split,\n          and if you tap the numbers - you'll see what exercises contribute to that number, and how much.\n        </Text>\n      </View>\n      <View className=\"flex-row flex-wrap items-center mb-2\">\n        <Text className=\"text-sm\">Same thing exists for the day - </Text>\n        <IconMusclesD size={14} />\n        <Text className=\"text-sm\">, and you can also see exercise details and undulation graphs by tapping on </Text>\n        <IconGraphsE width={14} height={14} />\n        <Text className=\"text-sm\">.</Text>\n      </View>\n      <Text className=\"mb-2 text-sm\">\n        The exercise syntax supports RPEs (Rate of Perceived Exertion - a subjective measure of how hard the set was),\n        rest timers, various progressive overload types, etc. It's very powerful, read more about all the features{\" \"}\n        <Link className=\"text-sm\" href=\"https://www.liftosaur.com/doc\">\n          in the docs\n        </Link>\n        !\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IconFilter } from \"../icons/iconFilter\";\n\nexport function HelpExerciseStats(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Exercise Stats</Text>\n      <Text className=\"pb-2 text-sm\">\n        All the information about specific exercise is collected on this screen. Progress graph, your personal records,\n        and history of the exercise.\n      </Text>\n      <Text className=\"pb-2 text-sm\">You can switch between exercises via a selector at the top of the screen.</Text>\n      <Text className=\"pb-2 text-sm\">\n        If you tap on the personal records or on history records, you'll navigate to the workout where that happened.\n      </Text>\n      <View className=\"flex-row flex-wrap items-center pb-2\">\n        <Text className=\"text-sm\">You can sort/filter the history, by tapping on the </Text>\n        <IconFilter size={14} />\n        <Text className=\"text-sm\"> at the history header, e.g. sort by date ascending or descending.</Text>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpExercises(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Settings - Exercises</Text>\n      <Text className=\"pb-2 text-sm\">\n        You specify your available equipment here, and specifically - what plates and what fixed weights you have\n        available.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IconFilter } from \"../icons/iconFilter\";\nimport { Link } from \"../link\";\n\nexport function HelpGraphs(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Graphs</Text>\n      <Text className=\"pb-2 text-sm\">\n        Here you can see <Text className=\"text-sm font-bold\">graphs of your exercises and measurements</Text> (like\n        bodyweight, bicep size, etc).\n      </Text>\n      <View className=\"flex-row flex-wrap items-center pb-2\">\n        <Text className=\"text-sm\">You can configure the list of graphs by tapping on the </Text>\n        <IconFilter size={14} />\n        <Text className=\"text-sm\"> icon in the navbar. There, you can also enable the following options there:</Text>\n      </View>\n      <View className=\"pb-2\">\n        <View className=\"flex-row pb-1 ml-6\">\n          <Text className=\"text-sm\">{\"• \"}</Text>\n          <Text className=\"flex-1 text-sm\">\n            You can enable <Text className=\"text-sm font-bold\">same range on X axis for all graphs</Text>. By default\n            they start from the first date of the exercise/measurement, and finish at the last one. But if you want to\n            see correlation between graphs, it's convenient to use the same scale, so there's an option for that.\n          </Text>\n        </View>\n        <View className=\"flex-row pb-1 ml-6\">\n          <Text className=\"text-sm\">{\"• \"}</Text>\n          <Text className=\"flex-1 text-sm\">\n            You can add <Text className=\"text-sm font-bold\">bodyweight overlay</Text> to the graphs, to see how your\n            lifts were affected by your weight.\n          </Text>\n        </View>\n        <View className=\"flex-row pb-1 ml-6\">\n          <Text className=\"text-sm\">{\"• \"}</Text>\n          <Text className=\"flex-1 text-sm\">\n            And you can add <Text className=\"text-sm font-bold\">1RM overlay</Text> (One Rep Max - the max weight you can\n            lift for one rep) to the graphs. It tries to predict what would be your 1RM based on how much weight and how\n            many reps you did, using{\" \"}\n            <Link className=\"text-sm\" href=\"https://en.wikipedia.org/wiki/One-repetition_maximum\">\n              Epley formula\n            </Link>\n            . It's a good way to track progress in your lifts, when you have different reps and weights in sets.\n          </Text>\n        </View>\n      </View>\n      <Text className=\"pb-2 text-sm\">\n        If you move your finger over graphs, you could see the date and the value at that point.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpMeasurements(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Measurements</Text>\n      <Text className=\"pb-2 text-sm\">\n        Here you can track your <Text className=\"text-sm font-bold\">body measurements</Text> - bodyweight, size of your\n        biceps, shoulders, calfs, etc.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Then, on the <Text className=\"text-sm font-bold\">\"Graphs\"</Text> screen, you can see correlation of the\n        measurement graphs and the workout graphs, and see how the lifted weights and body measurements correlate.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        To see specific data points, pick the measurement <Text className=\"text-sm font-bold\">Type</Text> at the top of\n        the screen.\n      </Text>\n      <Text className=\"pb-2 text-sm\">If you have more than 3 data points, you'll also see the graph.</Text>\n      <Text className=\"pb-2 text-sm\">\n        You can edit and remove the data points below the graph, and you can add new data points by clicking on a button\n        in the footer.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpMuscles(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Muscles Map - Program</Text>\n      <Text className=\"pb-2 text-sm\">\n        Shows how much specific muscles are used in the program. You may use it to find imbalances in your program.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        We calculate usage for <Text className=\"text-sm font-bold\">strength</Text> and{\" \"}\n        <Text className=\"text-sm font-bold\">hypertrophy</Text> separately. For{\" \"}\n        <Text className=\"text-sm font-bold\">strength</Text> we consider sets with reps {\"<\"} 8, for{\" \"}\n        <Text className=\"text-sm font-bold\">hypertrophy</Text> - sets with reps {\">\"}= 8.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        In the <Text className=\"text-sm font-bold\">Muscles used, relatively to each other</Text> section, for\n        calculating percentages, we assume each{\" \"}\n        <Text className=\"text-sm font-bold\">target muscle is 3x of each synergist muscle</Text>, we combine all sets and\n        reps, and then normalize by the most used muscle - it will be 100%. So all other muscles would be less than\n        100%.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        In the <Text className=\"text-sm font-bold\">List of exercises</Text> section, you could see the muscles for each\n        exercise, split into target and synergist. It also shows the same numbers as above - how much each muscle is\n        used in the day relatively to the top muscle.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpMusclesDay(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Muscles Map - Day</Text>\n      <Text className=\"pb-2 text-sm\">\n        Shows how much specific muscles are used in the current day. You may use it to find imbalances in your program.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        We calculate usage for <Text className=\"text-sm font-bold\">strength</Text> and{\" \"}\n        <Text className=\"text-sm font-bold\">hypertrophy</Text> separately. For{\" \"}\n        <Text className=\"text-sm font-bold\">strength</Text> we consider sets with reps {\"<\"} 8, for{\" \"}\n        <Text className=\"text-sm font-bold\">hypertrophy</Text> - sets with reps {\">\"}= 8.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        In the <Text className=\"text-sm font-bold\">Muscles used, relatively to each other</Text> section, for\n        calculating percentages, we assume each{\" \"}\n        <Text className=\"text-sm font-bold\">target muscle is 3x of each synergist muscle</Text>, we combine all sets and\n        reps, and then normalize by the most used muscle - it will be 100%. So all other muscles would be less than\n        100%.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        In the <Text className=\"text-sm font-bold\">List of exercises</Text> section, you could see the muscles for each\n        exercise, split into target and synergist. It also shows the same numbers as above - how much each muscle is\n        used in the day relatively to the top muscle.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpPlates(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Settings - Equipment</Text>\n      <Text className=\"pb-2 text-sm\">\n        You specify your available equipment here, and specifically - what plates and what fixed weights you have\n        available.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        For each equipment type (Barbell, Dumbbell, Cable, etc) you can choose whether you use{\" \"}\n        <Text className=\"text-sm font-bold\">fixed weight</Text> or <Text className=\"text-sm font-bold\">plates</Text>.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        <Text className=\"text-sm font-bold\">Fixed weight</Text> means you have e.g. 4 pairs of dumbbells of weight 10lb,\n        15lb, 20lb and 25lb, and that's it. They don't have plates which you can add to the dumbbell. It's fixed weight,\n        you cannot add weight to a dumbbell. You can specify pairs of dumbbells of what weight you have, and the app\n        would use only those.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        You also may have a <Text className=\"text-sm font-bold\">Dumbbell with plates</Text>. It'd consist of a{\" \"}\n        <Text className=\"text-sm font-bold\">bar</Text> (which is e.g. 10lb), and a set of{\" \"}\n        <Text className=\"text-sm font-bold\">pairs of plates</Text> - e.g. 4x2.5lb, 2x5lb, 2x10lb, etc. So you can add\n        and remove plates to the bar, this way getting the weight you need. You can specify the bar weight and what\n        number of plates you have of what weight. The app would round up the weights of the exercise sets to the\n        available plates.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Note that it only allow you to enter <Text className=\"text-sm font-bold\">even number of plates</Text>, because\n        you need to balance the bar.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { HelpAccount } from \"./helpAccount\";\nimport { HelpChooseProgram } from \"./helpChooseProgram\";\nimport { HelpChooseProgramFirstTime } from \"./helpChooseProgramFirstTime\";\nimport { HelpEditProgramDaysList } from \"./helpEditProgramDaysList\";\nimport { HelpEditProgramV2 } from \"./helpEditProgramV2\";\nimport { HelpExercises } from \"./helpExercises\";\nimport { HelpExerciseStats } from \"./helpExerciseStats\";\nimport { HelpGraphs } from \"./helpGraphs\";\nimport { HelpMeasurements } from \"./helpMeasurements\";\nimport { HelpMuscles } from \"./helpMuscles\";\nimport { HelpMusclesDay } from \"./helpMusclesDay\";\nimport { HelpPlates } from \"./helpPlates\";\nimport { HelpSettings } from \"./helpSettings\";\nimport { HelpStats } from \"./helpStats\";\nimport { HelpTimers } from \"./helpTimers\";\nimport { HelpWorkout } from \"./helpWorkout\";\n\nexport type IHelpKey =\n  | \"account\"\n  | \"chooseProgram\"\n  | \"chooseProgramFirstTime\"\n  | \"editProgramDaysList\"\n  | \"editProgramV2\"\n  | \"exercises\"\n  | \"exerciseStats\"\n  | \"graphs\"\n  | \"measurements\"\n  | \"muscles\"\n  | \"musclesDay\"\n  | \"plates\"\n  | \"settings\"\n  | \"stats\"\n  | \"timers\"\n  | \"workout\";\n\nexport const HelpComponents: Record<IHelpKey, () => JSX.Element> = {\n  account: HelpAccount,\n  chooseProgram: HelpChooseProgram,\n  chooseProgramFirstTime: HelpChooseProgramFirstTime,\n  editProgramDaysList: HelpEditProgramDaysList,\n  editProgramV2: HelpEditProgramV2,\n  exercises: HelpExercises,\n  exerciseStats: HelpExerciseStats,\n  graphs: HelpGraphs,\n  measurements: HelpMeasurements,\n  muscles: HelpMuscles,\n  musclesDay: HelpMusclesDay,\n  plates: HelpPlates,\n  settings: HelpSettings,\n  stats: HelpStats,\n  timers: HelpTimers,\n  workout: HelpWorkout,\n};\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpSettings(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Settings</Text>\n      <Text className=\"pb-2 text-sm\">\n        This is the main settings screen. The settings are grouped by a common theme (Account, Workout, etc). Some\n        settings are only visible if you're logged in.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Under <Text className=\"text-sm font-bold\">Account</Text> section, you can go to the account screen, and log in\n        there. For now, we only support <Text className=\"text-sm font-bold\">login via Google</Text>. After you log in,\n        your data will be synced to the cloud, so even if you lose your phone, your progress won't be lost.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Make sure to set your <Text className=\"text-sm font-bold\">Available Equipment</Text>. The plates you specify\n        there would be used when calculating weight for exercises, and the weight would be round up so that you can get\n        it with your available equipment. Like if you have only <Text className=\"text-sm font-bold\">4x45lb</Text> plates\n        and a barbell, you won't be able to get <Text className=\"text-sm font-bold\">150lb</Text>, so the app would\n        convert it to <Text className=\"text-sm font-bold\">135lb (bar + 2x45lb plates)</Text> - the weight you can\n        actually get with your available plates.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        In <Text className=\"text-sm font-bold\">Import / Export</Text> section, you can import and export all your stored\n        app data to a JSON file. You can use it to backup your data, or to transfer it to another device (e.g. if you\n        don't want to create an account and sync data to the cloud). You can also import programs there (which you\n        previously exported on the \"Edit Program\" screen).\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        You can also export your history to CSV file, and then open it e.g. in Excel, if you want to analyze your data\n        there.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IconFilter } from \"../icons/iconFilter\";\n\nexport function HelpStats(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Add Measurement</Text>\n      <Text className=\"pb-2 text-sm\">\n        Here you enter your data points, what is your current bodyweight, calf size, bicep size, etc.\n      </Text>\n      <View className=\"flex-row flex-wrap items-center pb-2\">\n        <Text className=\"text-sm\">\n          You may track only the measurements you care about. You can setup the available input fields by clicking on\n          the{\" \"}\n        </Text>\n        <IconFilter size={14} />\n        <Text className=\"text-sm\"> icon in the navbar.</Text>\n      </View>\n      <Text className=\"pb-2 text-sm\">\n        All fields are optional, if you skip them, those measurements just won't be added this time.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\n\nexport function HelpTimers(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Settings - Timers</Text>\n      <Text className=\"pb-2 text-sm\">You can specify warmup and regular workout timers here.</Text>\n      <Text className=\"pb-2 text-sm\">\n        Warmup timer is fired after finishing a warmup set, and regular workout timer - after finishing a regular set.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        You'll see the timer on the workout screen. When it times out on Android, it will make a sound and send a\n        notification. Unfortunately, we don't support the sound/notification on iOS yet.\n      </Text>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IconCog2 } from \"../icons/iconCog2\";\n\nexport function HelpWorkout(): JSX.Element {\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-semibold\">Workout Screen</Text>\n      <Text className=\"pb-2 text-sm\">This is where all your exercises for the current workout are.</Text>\n      <Text className=\"pb-2 text-sm\">\n        You have to finish all the exercises' sets and reps. Each time you finish a set, you tap on a square to record\n        it. By tapping on it again you can lower the number of reps you did.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        Some reps have <Text className=\"text-sm font-bold\">+</Text> in it (like{\" \"}\n        <Text className=\"text-sm font-bold\">5+</Text>). That is <Text className=\"text-sm font-bold\">AMRAP</Text> - As\n        Many Reps As Possible. You should strive to do as many reps as you can there, but if you do less than the number\n        on the square, it's considered as an unsuccessful set.\n      </Text>\n      <Text className=\"pb-2 text-sm\">\n        In the <Text className=\"text-sm font-bold\">Plates for each bar side</Text> section, you can see all the weights\n        you use for that exercise, and the plates you have to put on each side of the bar to get that weight. E.g.{\" \"}\n        <Text className=\"text-sm font-bold\">185lb - 45/25</Text> means that to get{\" \"}\n        <Text className=\"text-sm font-bold\">185lb</Text> you need to put one{\" \"}\n        <Text className=\"text-sm font-bold\">45lb</Text> and one <Text className=\"text-sm font-bold\">25lb</Text> plate on\n        each side of the bar. By tapping on the weights there you can change them for that workout. It won't change the\n        weight in the program though, only for that workout.\n      </Text>\n      <View className=\"flex-row flex-wrap items-center pb-2\">\n        <Text className=\"text-sm\">\n          Note that it <Text className=\"text-sm font-bold\">only will use the available plates</Text> in the plates\n          calculator, and it will round up the weights to available plates. Set up what plates you have in the{\" \"}\n          <Text className=\"text-sm font-bold\">Settings</Text> screen (bottom right corner, the{\" \"}\n        </Text>\n        <IconCog2 size={14} />\n        <Text className=\"text-sm\"> icon).</Text>\n      </View>\n      <Text className=\"pb-2 text-sm\">\n        The order of doing exercises and sets is not important, the app doesn't enforce it at all. You can do\n        \"supersets\", i.e. simultaneously going through e.g. 2 exercises one after another, without rest period, to save\n        time in gym.\n      </Text>\n      <Text className=\"text-sm\">\n        After you've done all the sets for an exercise, the \"Finish Day Script\" for that exercise will be run. It may\n        increase or decrease weight or reps, depending on the logic defined in the program for that exercise. If there\n        are any changes applied, you'll see that under the exercise, in the{\" \"}\n        <Text className=\"text-sm font-bold\">Exercise State Variables changes</Text> block.\n      </Text>\n    </View>\n  );\n}\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Equipment_getUnitOrDefaultForExerciseType } from \"../models/equipment\";\nimport { Exercise_get, Exercise_nameWithEquipment } from \"../models/exercise\";\nimport { Weight_roundConvertTo } from \"../models/weight\";\nimport { IHistoryEntry, ISettings } from \"../types\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { IHistoryEntryPersonalRecords } from \"../models/history\";\nimport { HistoryRecordSetsView } from \"./historyRecordSets\";\nimport { ObjectUtils_values } from \"../utils/object\";\n\ninterface IHistoryEntryProps {\n  entry: IHistoryEntry;\n  prs?: IHistoryEntryPersonalRecords;\n  isOngoing?: boolean;\n  isLast?: boolean;\n  isNext: boolean;\n  supersetColor?: string;\n  settings: ISettings;\n  showNotes: boolean;\n}\n\nexport const HistoryEntryView = memo((props: IHistoryEntryProps): JSX.Element => {\n  const { entry, isNext, settings, showNotes, isOngoing, isLast } = props;\n  const exercise = Exercise_get(entry.exercise, settings.exercises);\n  const exerciseUnit = Equipment_getUnitOrDefaultForExerciseType(settings, exercise);\n  const isPr = ObjectUtils_values(props.prs || {}).some((v) => v);\n  return (\n    <View data-testid=\"history-entry-exercise\" testID=\"history-entry-exercise\" className=\"flex-row items-center gap-2\">\n      {props.supersetColor && (\n        <View\n          data-testid=\"history-entry-superset-line\"\n          testID=\"history-entry-superset-line\"\n          style={{\n            position: \"absolute\",\n            left: -10,\n            top: 5,\n            bottom: 5,\n            width: 3,\n            backgroundColor: props.supersetColor,\n          }}\n        />\n      )}\n      <View\n        data-testid=\"history-entry-exercise-img\"\n        testID=\"history-entry-exercise-img\"\n        className=\"items-center justify-center py-1 rounded-lg bg-background-image\"\n        style={{ minWidth: 36 }}\n      >\n        <ExerciseImage settings={props.settings} className=\"w-scaled-8\" exerciseType={exercise} size=\"small\" />\n      </View>\n      <View\n        className={`flex-1 py-2 min-h-scaled-16 flex-row items-center ${\n          !isLast\n            ? `border-b ${isNext ? (isOngoing ? \"border-border-cardyellow\" : \"border-border-cardpurple\") : \"border-border-neutral\"}`\n            : \"\"\n        }`}\n      >\n        <View className=\"flex-row items-center w-full gap-2 min-h-scaled-8\">\n          <View className=\"flex-1 shrink\" style={{ minWidth: \"45%\" }}>\n            <Text\n              data-testid=\"history-entry-exercise-name\"\n              testID=\"history-entry-exercise-name\"\n              className=\"text-sm font-semibold\"\n            >\n              {Exercise_nameWithEquipment(exercise, props.settings)}\n              {isPr && \" \\u{1F3C6}\"}\n            </Text>\n            {showNotes && entry.notes && (\n              <View>\n                <Text className=\"mt-1 text-sm text-text-secondary\">{entry.notes}</Text>\n              </View>\n            )}\n          </View>\n          <View className=\"shrink\">\n            <HistoryRecordSetsView\n              sets={entry.sets.map((set) => ({\n                ...set,\n                weight:\n                  isNext && set.weight\n                    ? Weight_roundConvertTo(set.weight, props.settings, exerciseUnit, entry.exercise)\n                    : set.weight,\n              }))}\n              prs={props.prs}\n              units={props.settings.units}\n              isNext={isNext}\n            />\n          </View>\n        </View>\n      </View>\n    </View>\n  );\n});\n","import { JSX, memo, useMemo } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { TimeUtils_formatHOrMin } from \"../utils/time\";\nimport { Progress_isCurrent, Progress_isFullyEmptySet, Progress_getSupersetToColor } from \"../models/progress\";\nimport { ComparerUtils_noFns } from \"../utils/comparer\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport {\n  IPersonalRecords,\n  History_workoutTime,\n  History_totalRecordWeight,\n  History_totalRecordReps,\n  History_totalRecordSets,\n} from \"../models/history\";\nimport { IconWatch } from \"./icons/iconWatch\";\nimport { HistoryEntryView } from \"./historyEntry\";\nimport { Button } from \"./button\";\nimport { Exercise_toKey } from \"../models/exercise\";\nimport { SimpleMarkdown } from \"./simpleMarkdown\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { n } from \"../utils/math\";\nimport { IEvaluatedProgramDay } from \"../models/program\";\nimport { Thunk_startProgramDay, Thunk_editHistoryRecord } from \"../ducks/thunks\";\n\ninterface IProps {\n  historyRecord: IHistoryRecord;\n  showTitle?: boolean;\n  programDay?: IEvaluatedProgramDay;\n  isOngoing: boolean;\n  prs?: IPersonalRecords;\n  settings: ISettings;\n  dispatch: IDispatch;\n}\n\nfunction getNativeCardShadow(): Record<string, unknown> {\n  return Platform.select({\n    ios: {\n      shadowColor: \"#000\",\n      shadowOffset: { width: 0, height: 3 },\n      shadowOpacity: 0.1,\n      shadowRadius: 3,\n    },\n    android: { elevation: 2 },\n    default: {},\n  }) as Record<string, unknown>;\n}\n\nexport const HistoryRecordView = memo((props: IProps): JSX.Element => {\n  const { historyRecord, dispatch } = props;\n  const isCurrent = Progress_isCurrent(historyRecord);\n  const description = isCurrent ? props.programDay?.description : undefined;\n\n  const entries = historyRecord.entries;\n  const supersetToColor = useMemo(() => Progress_getSupersetToColor(entries), [entries]);\n\n  const handleCardPress = (): void => {\n    if (Progress_isCurrent(historyRecord)) {\n      dispatch(Thunk_startProgramDay());\n    } else {\n      editHistoryRecord(\n        historyRecord,\n        dispatch,\n        Progress_isCurrent(historyRecord) && Progress_isFullyEmptySet(historyRecord)\n      );\n    }\n  };\n\n  return (\n    <View data-testid=\"history-record\" testID=\"history-record\" className=\"pt-2\">\n      {props.showTitle && (\n        <Text\n          data-testid=\"history-record-date\"\n          testID=\"history-record-date\"\n          className=\"mx-1 mb-1 text-base font-semibold\"\n        >\n          {!isCurrent ? DateUtils_format(historyRecord.date) : props.isOngoing ? \"Ongoing workout\" : \"Next workout\"}\n        </Text>\n      )}\n      <Pressable\n        className={`rounded-2xl px-4 ${\n          isCurrent\n            ? props.isOngoing\n              ? \"bg-background-cardyellow border border-border-cardyellow\"\n              : \"border border-border-cardpurple bg-background-cardpurple\"\n            : \"bg-background-cardpurple border border-border-cardpurple\"\n        }`}\n        style={getNativeCardShadow()}\n        onPress={handleCardPress}\n      >\n        <View className=\"py-4\">\n          <View className=\"pb-2\">\n            <View data-testid=\"history-record-program\" testID=\"history-record-program\">\n              <Text className=\"text-sm font-semibold\">{historyRecord.dayName}</Text>\n              <Text className=\"text-xs text-text-secondary\">{historyRecord.programName}</Text>\n            </View>\n          </View>\n          {description && (\n            <View className=\"text-sm\">\n              <SimpleMarkdown value={description} />\n            </View>\n          )}\n          <View data-testid=\"history-entry\" testID=\"history-entry\">\n            {entries.map((entry, i) => {\n              const isNext = isCurrent && Progress_isFullyEmptySet(historyRecord);\n              const exerciseKey = Exercise_toKey(entry.exercise);\n              const pr = props.prs?.[props.historyRecord.id]?.[exerciseKey] || undefined;\n              return (\n                <HistoryEntryView\n                  key={i}\n                  entry={entry}\n                  prs={pr}\n                  isOngoing={props.isOngoing}\n                  isNext={isNext}\n                  isLast={isNext && i === entries.length - 1}\n                  supersetColor={entry.superset != null ? supersetToColor[entry.superset] : undefined}\n                  settings={props.settings}\n                  showNotes={true}\n                />\n              );\n            })}\n          </View>\n          {!isCurrent && <HistoryRecordStats historyRecord={historyRecord} settings={props.settings} />}\n          {historyRecord.notes && (\n            <View className=\"mt-2\">\n              <Text>\n                <Text className=\"text-sm\">Note: </Text>\n                <Text className=\"text-sm text-text-secondary\">{historyRecord.notes}</Text>\n              </Text>\n            </View>\n          )}\n          {isCurrent && (\n            <View className=\"mt-2\">\n              {!props.isOngoing ? (\n                <Button\n                  name=\"start-workout-button\"\n                  data-testid=\"start-workout\"\n                  testID=\"start-workout\"\n                  kind=\"purple\"\n                  className=\"w-full\"\n                  onPress={handleCardPress}\n                >\n                  Start\n                </Button>\n              ) : (\n                <Button\n                  name=\"continue-workout-button\"\n                  data-testid=\"start-workout\"\n                  testID=\"start-workout\"\n                  kind=\"purple\"\n                  className=\"w-full\"\n                  onPress={handleCardPress}\n                >\n                  Continue\n                </Button>\n              )}\n            </View>\n          )}\n        </View>\n      </Pressable>\n    </View>\n  );\n}, ComparerUtils_noFns);\n\ninterface IHistoryRecordStats {\n  historyRecord: IHistoryRecord;\n  settings: ISettings;\n}\n\nfunction HistoryRecordStats(props: IHistoryRecordStats): JSX.Element {\n  const record = props.historyRecord;\n  const { value: time, unit: timeUnit } = TimeUtils_formatHOrMin(History_workoutTime(record));\n  const totalWeight = History_totalRecordWeight(record, props.settings);\n  const totalReps = History_totalRecordReps(record);\n  const totalSets = History_totalRecordSets(record);\n  const setsUnit = StringUtils_pluralize(\"set\", totalSets);\n  const repsUnit = StringUtils_pluralize(\"rep\", totalReps);\n\n  return (\n    <View className=\"flex-row justify-between mt-4\">\n      <HistoryRecordProperty\n        icon={\n          <View className=\"mb-1 mr-1\">\n            <IconWatch />\n          </View>\n        }\n        value={time}\n        hasPadding={true}\n        unit={timeUnit}\n      />\n      <HistoryRecordProperty value={n(totalWeight.value)} unit={totalWeight.unit} />\n      <HistoryRecordProperty value={totalSets} hasPadding={true} unit={setsUnit} />\n      <HistoryRecordProperty value={totalReps} hasPadding={true} unit={repsUnit} />\n    </View>\n  );\n}\n\ninterface IHistoryRecordPropertyProps {\n  icon?: JSX.Element;\n  value: string | number;\n  hasPadding?: boolean;\n  unit?: string;\n}\n\nfunction HistoryRecordProperty(props: IHistoryRecordPropertyProps): JSX.Element {\n  return (\n    <View className=\"flex-row items-center\">\n      {props.icon}\n      <Text className=\"text-base font-semibold\">{props.value}</Text>\n      {props.unit && (\n        <Text className={`text-sm text-text-secondary ${props.hasPadding ? \"ml-1\" : \"\"}`}>{props.unit}</Text>\n      )}\n    </View>\n  );\n}\n\nfunction editHistoryRecord(historyRecord: IHistoryRecord, dispatch: IDispatch, isNext: boolean): void {\n  if (!isNext) {\n    dispatch(Thunk_editHistoryRecord(historyRecord));\n  }\n}\n","import { JSX, memo, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { FastText } from \"./primitives/fastText\";\nimport { IDisplaySet, Reps_group, Reps_setToDisplaySet } from \"../models/set\";\nimport { ISet, IUnit } from \"../types\";\nimport { CollectionUtils_compact } from \"../utils/collection\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { IHistoryEntryPersonalRecords } from \"../models/history\";\nimport { StyledText, StyledText_remToPx } from \"../utils/styledText\";\nimport { useRem } from \"../utils/useRem\";\nimport { Tailwind_semantic, Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { TimeUtils_formatMMSS } from \"../utils/time\";\n\nfunction addRecordedDuration(\n  builder: StyledText,\n  seconds: number,\n  timerColor: string,\n  xs: number,\n  testID: string\n): void {\n  if (seconds < 60) {\n    builder.add(`${seconds}`, { fontWeight: \"600\", color: timerColor }, testID);\n    builder.add(\"s\", { fontSize: xs, color: timerColor });\n  } else {\n    builder.add(TimeUtils_formatMMSS(seconds * 1000), { fontWeight: \"600\", color: timerColor }, testID);\n  }\n}\n\nfunction isSameDisplaySet(a: IDisplaySet, b: IDisplaySet): boolean {\n  return (\n    a.reps === b.reps &&\n    a.weight === b.weight &&\n    a.rpe === b.rpe &&\n    a.askWeight === b.askWeight &&\n    a.timer === b.timer &&\n    a.setTimer === b.setTimer &&\n    a.setTimerLeft === b.setTimerLeft &&\n    a.isOverflowSetTimer === b.isOverflowSetTimer &&\n    a.auto === b.auto\n  );\n}\n\ninterface IHistoryRecordSetsProps {\n  showPrDetails?: boolean;\n  sets: ISet[];\n  isNext: boolean;\n  units: IUnit;\n  prs?: IHistoryEntryPersonalRecords;\n}\n\nexport const HistoryRecordSetsView = memo(function HistoryRecordSetsView(props: IHistoryRecordSetsProps): JSX.Element {\n  const { sets, isNext, units } = props;\n  const displayGroups = useMemo(() => {\n    const groups = Reps_group(sets, isNext);\n    return groups.map((g) => g.map((set) => Reps_setToDisplaySet(set, isNext, units)));\n  }, [sets, isNext, units]);\n  return (\n    <View className=\"text-sm\" style={{ alignItems: \"flex-end\" }}>\n      {displayGroups.map((g, i) => (\n        <HistoryRecordSet\n          key={i}\n          sets={g}\n          prs={props.prs}\n          isNext={props.isNext}\n          showPrDetails={props.showPrDetails}\n          units={props.units}\n        />\n      ))}\n    </View>\n  );\n});\n\ninterface IHistoryRecordSet2Props {\n  prs?: IHistoryEntryPersonalRecords;\n  units: IUnit;\n  showPrDetails?: boolean;\n  sets: IDisplaySet[];\n  isNext: boolean;\n}\n\nexport const HistoryRecordSet = memo(function HistoryRecordSet(props: IHistoryRecordSet2Props): JSX.Element {\n  const { isNext } = props;\n  const group = props.sets;\n  const set = group[0];\n  if (set == null) {\n    return <View />;\n  }\n  const prTypes = CollectionUtils_compact(\n    ObjectUtils_keys(props.prs || {}).map<\"e1RM\" | \"Weight\" | undefined>((k) => {\n      const prset = (props.prs || {})[k];\n      if (!prset) {\n        return undefined;\n      }\n      const displayPrSet = Reps_setToDisplaySet(prset, isNext, props.units);\n      return isSameDisplaySet(set, displayPrSet)\n        ? k === \"max1RMSet\"\n          ? \"e1RM\"\n          : k === \"maxWeightSet\"\n            ? \"Weight\"\n            : undefined\n        : undefined;\n    })\n  );\n  const isPr = prTypes.length > 0;\n  const rem = useRem();\n  const sem = Tailwind_semantic();\n  const primary = sem.text.primary;\n  const secondary = sem.text.secondary;\n  const purple = sem.text.purple;\n  // `text-orange-400` (in-range reps) has no semantic/stock entry; reuse the project's\n  // warning yellow as the closest design-system color.\n  const repsColor = isNext\n    ? secondary\n    : set.isCompleted\n      ? sem.text.success\n      : set.isInRange\n        ? Tailwind_colors().yellow[600]\n        : sem.text.error;\n  const rpeColor = isNext ? secondary : set.isRpeFailed ? sem.text.error : sem.text.success;\n  const timerColor = isNext ? secondary : purple;\n  const autoColor = isNext ? secondary : sem.syntax.auto;\n  const dataCy = isNext\n    ? \"history-entry-sets-next\"\n    : set.isCompleted\n      ? \"history-entry-sets-completed\"\n      : set.isInRange\n        ? \"history-entry-sets-in-range\"\n        : \"history-entry-sets-incompleted\";\n\n  const sm = StyledText_remToPx(\"sm\", rem);\n  const xs = StyledText_remToPx(\"xs\", rem);\n  const builder = new StyledText();\n  if (group.length > 1) {\n    builder.add(`${group.length}`, { fontWeight: \"600\", color: purple }, \"history-entry-sets\");\n    builder.add(\" \\u00D7 \", { color: secondary });\n  }\n  builder.add(`${set.reps}`, { fontWeight: \"600\", color: repsColor }, \"history-entry-reps\");\n  if (set.weight) {\n    builder.add(\" \\u00D7 \", { color: secondary });\n    builder.add(`${set.weight}`, { fontWeight: \"600\" }, \"history-entry-weight\");\n    builder.add(set.askWeight ? \"+\" : \"\");\n    if (set.unit != null) {\n      builder.add(`${set.unit}`, { color: secondary }, \"history-entry-unit\");\n    }\n  }\n  if (set.rpe != null) {\n    builder.add(\" @\", { fontSize: xs, color: rpeColor });\n    builder.add(`${set.rpe}`, { color: rpeColor }, \"history-entry-rpe\");\n  }\n  if (isNext && set.setTimer != null) {\n    builder.add(\" \");\n    builder.add(`${set.setTimer}`, { fontWeight: \"600\", color: timerColor }, \"history-entry-set-timer\");\n    builder.add(\"s\", { fontSize: xs, color: timerColor });\n    builder.add(`${set.isOverflowSetTimer ? \"+\" : \"\"}|`, { fontWeight: \"600\", color: timerColor });\n    if (set.timer != null) {\n      builder.add(`${set.timer}`, { fontWeight: \"600\", color: timerColor }, \"history-entry-timer\");\n      builder.add(\"s\", { fontSize: xs, color: timerColor });\n    } else {\n      builder.add(\"?\", { fontWeight: \"600\", color: timerColor });\n    }\n  } else if (!isNext && (set.setTimer != null || set.setTimerLeft != null)) {\n    builder.add(\" \");\n    if (set.setTimerLeft != null) {\n      addRecordedDuration(builder, set.setTimerLeft, timerColor, xs, \"history-entry-set-timer-left\");\n      builder.add(\"/\", { fontWeight: \"600\", color: timerColor });\n      if (set.setTimer == null) {\n        builder.add(\"-\", { fontWeight: \"600\", color: timerColor }, \"history-entry-set-timer\");\n      }\n    }\n    if (set.setTimer != null) {\n      addRecordedDuration(builder, set.setTimer, timerColor, xs, \"history-entry-set-timer\");\n    }\n  } else if (set.timer != null) {\n    builder.add(\" \");\n    builder.add(`${set.timer}`, { color: timerColor }, \"history-entry-timer\");\n    builder.add(\"s\", { fontSize: xs, color: timerColor });\n  }\n  if (set.auto) {\n    builder.add(\" auto\", { color: autoColor }, \"history-entry-auto\");\n  }\n  const built = builder.build();\n\n  return (\n    <View className=\"flex-row items-center\" data-testid={dataCy} testID={dataCy}>\n      {props.showPrDetails && isPr && (\n        <View className=\"flex-row items-center mr-2\">\n          <Text className=\"text-xs font-semibold leading-scaled-6 text-yellow-600\">{prTypes.join(\", \")} </Text>\n          <Text className=\"text-sm leading-scaled-6\">{\"\\u{1F3C6}\"}</Text>\n        </View>\n      )}\n      <FastText\n        text={built.text}\n        fragments={built.fragments}\n        color={primary}\n        fontSize={sm}\n        paddingHorizontal={rem / 4}\n        backgroundColor={isPr ? sem.color.yellow150 : undefined}\n      />\n    </View>\n  );\n});\n","import type { JSX } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport { SvgUri, SvgXml } from \"./primitives/svg\";\nimport { Text } from \"./primitives/text\";\nimport { IconArrowDown3 } from \"./icons/iconArrowDown3\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\nimport { BundledImages_svgXml } from \"../utils/bundledImages\";\n\nexport function HistoryRecordsNullState(): JSX.Element {\n  return (\n    <View className=\"flex-1\">\n      <View className=\"items-center justify-center flex-1\">\n        {Platform.OS === \"web\" ? (\n          <SvgUri uri={HostConfig_resolveUrl(\"/images/dinocoach.svg\")} width={188} height={240} />\n        ) : (\n          <SvgXml xml={BundledImages_svgXml(\"/images/dinocoach.svg\") ?? \"\"} width={188} height={240} />\n        )}\n      </View>\n      <View className=\"items-center w-full py-4 border border-border-cardpurple bg-background-cardpurple rounded-tl-2xl rounded-se-2xl\">\n        <Text className=\"py-2 text-base font-semibold\">Welcome to Liftosaur!</Text>\n        <Text className=\"text-sm\">Tap here to start a workout</Text>\n        <View className=\"py-2\">\n          <IconArrowDown3 />\n        </View>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconAi(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M10.2603 6.4945L10.7766 7.92823C11.0599 8.71421 11.513 9.42802 12.1038 10.0188C12.6946 10.6096 13.4084 11.0627 14.1944 11.346L15.6281 11.8623C15.6564 11.8727 15.6809 11.8915 15.6981 11.9162C15.7154 11.9409 15.7246 11.9704 15.7246 12.0005C15.7246 12.0307 15.7154 12.0601 15.6981 12.0848C15.6809 12.1095 15.6564 12.1284 15.6281 12.1387L14.1944 12.655C13.4084 12.9383 12.6946 13.3915 12.1038 13.9822C11.513 14.573 11.0599 15.2868 10.7766 16.0728L10.2603 17.5065C10.2499 17.5348 10.2311 17.5593 10.2064 17.5765C10.1817 17.5938 10.1522 17.6031 10.1221 17.6031C10.0919 17.6031 10.0625 17.5938 10.0378 17.5765C10.0131 17.5593 9.99424 17.5348 9.98386 17.5065L9.46759 16.0728C9.18431 15.2868 8.73113 14.573 8.14036 13.9822C7.54959 13.3915 6.83578 12.9383 6.0498 12.655L4.61607 12.1387C4.58776 12.1284 4.56332 12.1095 4.54606 12.0848C4.52879 12.0601 4.51953 12.0307 4.51953 12.0005C4.51953 11.9704 4.52879 11.9409 4.54606 11.9162C4.56332 11.8915 4.58776 11.8727 4.61607 11.8623L6.0498 11.346C6.83578 11.0627 7.54959 10.6096 8.14036 10.0188C8.73113 9.42802 9.18431 8.71421 9.46759 7.92823L9.98386 6.4945C9.99395 6.4659 10.0127 6.44114 10.0374 6.42363C10.0622 6.40611 10.0918 6.3967 10.1221 6.3967C10.1524 6.3967 10.182 6.40611 10.2067 6.42363C10.2315 6.44114 10.2502 6.4659 10.2603 6.4945ZM16.714 3.04906L16.9757 3.77493C17.1192 4.17288 17.3488 4.53429 17.6479 4.83344C17.9471 5.13259 18.3085 5.36211 18.7064 5.50568L19.4323 5.76735C19.4467 5.77259 19.4591 5.78212 19.4679 5.79466C19.4766 5.80719 19.4814 5.82213 19.4814 5.83743C19.4814 5.85274 19.4766 5.86767 19.4679 5.88021C19.4591 5.89274 19.4467 5.90227 19.4323 5.90751L18.7064 6.16918C18.3085 6.31275 17.9471 6.54228 17.6479 6.84142C17.3488 7.14057 17.1192 7.50198 16.9757 7.89994L16.714 8.6258C16.7088 8.64018 16.6992 8.6526 16.6867 8.66138C16.6742 8.67016 16.6592 8.67486 16.6439 8.67486C16.6286 8.67486 16.6137 8.67016 16.6011 8.66138C16.5886 8.6526 16.5791 8.64018 16.5738 8.6258L16.3122 7.89994C16.1686 7.50198 15.9391 7.14057 15.6399 6.84142C15.3408 6.54228 14.9794 6.31275 14.5814 6.16918L13.8556 5.90751C13.8412 5.90227 13.8288 5.89274 13.82 5.88021C13.8112 5.86767 13.8065 5.85274 13.8065 5.83743C13.8065 5.82213 13.8112 5.80719 13.82 5.79466C13.8288 5.78212 13.8412 5.77259 13.8556 5.76735L14.5814 5.50568C14.9794 5.36211 15.3408 5.13259 15.6399 4.83344C15.9391 4.53429 16.1686 4.17288 16.3122 3.77493L16.5738 3.04906C16.5791 3.03468 16.5886 3.02226 16.6011 3.01349C16.6137 3.00471 16.6286 3 16.6439 3C16.6592 3 16.6742 3.00471 16.6867 3.01349C16.6992 3.02226 16.7088 3.03468 16.714 3.04906ZM16.714 15.3759L16.9757 16.1017C17.1192 16.4997 17.3488 16.8611 17.6479 17.1602C17.9471 17.4594 18.3085 17.6889 18.7064 17.8325L19.4323 18.0942C19.4467 18.0994 19.4591 18.1089 19.4679 18.1215C19.4766 18.134 19.4814 18.1489 19.4814 18.1642C19.4814 18.1795 19.4766 18.1945 19.4679 18.207C19.4591 18.2196 19.4467 18.2291 19.4323 18.2343L18.7064 18.496C18.3085 18.6396 17.9471 18.8691 17.6479 19.1682C17.3488 19.4674 17.1192 19.8288 16.9757 20.2267L16.714 20.9526C16.7088 20.967 16.6992 20.9794 16.6867 20.9882C16.6742 20.997 16.6592 21.0017 16.6439 21.0017C16.6286 21.0017 16.6137 20.997 16.6011 20.9882C16.5886 20.9794 16.5791 20.967 16.5738 20.9526L16.3122 20.2267C16.1686 19.8288 15.9391 19.4674 15.6399 19.1682C15.3408 18.8691 14.9794 18.6396 14.5814 18.496L13.8556 18.2343C13.8412 18.2291 13.8288 18.2196 13.82 18.207C13.8112 18.1945 13.8065 18.1795 13.8065 18.1642C13.8065 18.1489 13.8112 18.134 13.82 18.1215C13.8288 18.1089 13.8412 18.0994 13.8556 18.0942L14.5814 17.8325C14.9794 17.6889 15.3408 17.4594 15.6399 17.1602C15.9391 16.8611 16.1686 16.4997 16.3122 16.1017L16.5738 15.3759C16.5976 15.3103 16.6909 15.3103 16.714 15.3759Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\nexport function IconApple(props: { color?: string; size?: number }): JSX.Element {\n  const color = props.color || \"white\";\n  const size = props.size || 20;\n  const height = size * 1.2;\n  return (\n    <IconSvg width={size} height={height} viewBox=\"0 0 20 24\" fill=\"none\">\n      <Path\n        d=\"M19.1266 18.424C18.7788 19.2275 18.3671 19.9672 17.8901 20.6472C17.2398 21.5743 16.7074 22.216 16.2971 22.5724C15.6611 23.1573 14.9797 23.4568 14.2499 23.4739C13.726 23.4739 13.0943 23.3248 12.3589 23.0224C11.621 22.7214 10.943 22.5724 10.323 22.5724C9.67278 22.5724 8.97542 22.7214 8.2295 23.0224C7.48245 23.3248 6.88063 23.4824 6.42051 23.498C5.72073 23.5278 5.02323 23.2197 4.327 22.5724C3.88263 22.1848 3.32682 21.5204 2.66097 20.5791C1.94657 19.5739 1.35924 18.4084 0.899113 17.0795C0.406331 15.6442 0.159302 14.2543 0.159302 12.9087C0.159302 11.3673 0.492366 10.0379 1.15949 8.92385C1.68379 8.029 2.38129 7.32312 3.25427 6.80493C4.12725 6.28674 5.0705 6.02267 6.08631 6.00578C6.64212 6.00578 7.371 6.1777 8.27678 6.51559C9.18 6.85462 9.75995 7.02655 10.0142 7.02655C10.2043 7.02655 10.8486 6.82552 11.9408 6.42473C12.9736 6.05305 13.8453 5.89916 14.5594 5.95978C16.4945 6.11595 17.9483 6.87876 18.9151 8.25303C17.1845 9.30163 16.3284 10.7703 16.3454 12.6544C16.361 14.122 16.8934 15.3432 17.9397 16.3129C18.4139 16.7629 18.9435 17.1107 19.5327 17.3578C19.4049 17.7283 19.27 18.0832 19.1266 18.424ZM14.6886 0.960131C14.6886 2.11039 14.2684 3.18439 13.4307 4.17847C12.4199 5.36023 11.1973 6.04311 9.8714 5.93536C9.8545 5.79736 9.8447 5.65213 9.8447 5.49951C9.8447 4.39526 10.3254 3.21349 11.1791 2.24724C11.6053 1.75801 12.1473 1.35122 12.8047 1.02671C13.4606 0.707053 14.081 0.530273 14.6645 0.5C14.6815 0.653772 14.6886 0.807554 14.6886 0.960116V0.960131Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  className?: string;\n  color?: string;\n  width?: number;\n  height?: number;\n}\n\nexport function IconArrowDown2(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg style={props.style} width={props.width || 13} height={props.height || 8} viewBox=\"0 0 13 8\" fill=\"none\">\n      <Path\n        d=\"M11.5 1.5L6.5 6.5L1.5 1.5\"\n        stroke={color}\n        strokeWidth={1.5}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n  style?: Record<string, unknown>;\n}\n\nexport function IconArrowDown3(props: IProps): JSX.Element {\n  const size = props.size || 18;\n  const color = props.color || Tailwind_semantic().icon.purple;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 18 18\" fill=\"none\">\n      <Path\n        d=\"M16 10.3333L9 17M9 17L2 10.3333M9 17L9 1\"\n        stroke={color}\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  width?: number;\n  height?: number;\n  className?: string;\n}\n\nexport function IconArrowRight(props: IProps): JSX.Element {\n  const width = props.width || 7;\n  const height = props.height || 12;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={width} height={height} viewBox=\"0 0 7 12\" fill=\"none\">\n      <Path d=\"M1 1L6 6L1 11\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  className?: string;\n  color?: string;\n}\n\nexport function IconArrowUp(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg style={props.style} width={13} height={8} viewBox=\"0 0 13 8\" fill=\"none\">\n      <Path\n        d=\"M1.5 6.5L6.5 1.5L11.5 6.5\"\n        stroke={color}\n        strokeWidth={1.5}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  color?: string;\n}\n\nexport function IconBack(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={15} height={22} viewBox=\"0 0 15 22\">\n      <Path d=\"M13 2L3 10.9041L13 20\" stroke={color} strokeWidth=\"3\" strokeLinecap=\"round\" fill=\"none\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconBackspace(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill={color}>\n      <Path d=\"M11.2485 9.67073C10.9684 9.39505 10.9684 8.94813 11.2485 8.67245C11.5287 8.39677 11.983 8.39677 12.2631 8.67245L14.6304 11.0018L16.9977 8.67245C17.2778 8.39677 17.732 8.39677 18.0122 8.67245C18.2924 8.94807 18.2924 9.39505 18.0122 9.67073L15.6449 12L18.0122 14.3293C18.2924 14.605 18.2924 15.0519 18.0122 15.3276C17.732 15.6032 17.2778 15.6032 16.9977 15.3276L14.6304 12.9983L12.2631 15.3276C11.983 15.6032 11.5287 15.6032 11.2486 15.3276C10.9684 15.0519 10.9684 14.605 11.2486 14.3293L13.6159 12.0001L11.2485 9.67073Z\" />\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M8.28998 4.82698L1 12L8.28998 19.173C8.82814 19.7026 9.55802 20 10.3191 20H20.1304C21.7153 20 23 18.7359 23 17.1765V6.82353C23 5.26413 21.7153 4 20.1304 4H10.3191C9.55802 4 8.82814 4.29751 8.28998 4.82698ZM20.1304 18.7765H10.3191C9.88776 18.7765 9.47418 18.6079 9.1692 18.3078L2.75857 12L9.1692 5.69215C9.47418 5.39212 9.88776 5.22352 10.3191 5.22352H20.1304C21.0285 5.22352 21.7565 5.93986 21.7565 6.82353V17.1765C21.7565 18.0601 21.0285 18.7765 20.1304 18.7765Z\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n}\n\nexport function IconBarbell(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={24} height={20} viewBox=\"0 0 17 14\" fill=\"none\">\n      <Path d=\"M5.44872 6.10254H0V7.62818H5.44872V6.10254Z\" fill={color} />\n      <Path d=\"M8.2078 0H9.92114V13.7308H8.2078V0Z\" fill={color} />\n      <Path d=\"M10.4142 1.42163H12.1275V12.3092H10.4142V1.42163Z\" fill={color} />\n      <Path d=\"M12.6206 2.82593H14.3339V10.9049H12.6206V2.82593Z\" fill={color} />\n      <Path d=\"M14.7886 6.11975V7.61072H15.8813H15.9073H17V6.11975H15.9073H15.8813H14.7886Z\" fill={color} />\n      <Path d=\"M6.00144 0H7.71478V13.7308H6.00144V0Z\" fill={color} />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_colors } from \"../../utils/tailwindConfig\";\n\ninterface IInnerProps {\n  size?: number;\n  color?: string;\n}\n\ninterface IProps extends IInnerProps {\n  isSelected?: boolean;\n}\n\nexport function IconBarbell2(props: IProps): JSX.Element {\n  const { isSelected, ...rest } = props;\n  return isSelected ? <IconBarbell2Selected {...rest} /> : <IconBarbell2Unselected {...rest} />;\n}\n\nexport function IconBarbell2Unselected(props: IInnerProps): JSX.Element {\n  const width = props.size ?? 40;\n  const height = width / 2.5;\n  const color = props.color ?? Tailwind_colors().white;\n  return (\n    <IconSvg width={width} height={height} viewBox=\"0 0 40 17\" stroke={color} strokeWidth=\"1.5\" fill=\"none\">\n      <Path d=\"M34.812 8.5H38.5661\" strokeMiterlimit=\"10\" />\n      <Path d=\"M13.238 8.5H26.8286\" strokeMiterlimit=\"10\" />\n      <Path d=\"M1.43384 8.5H5.52702\" strokeMiterlimit=\"10\" />\n      <Path\n        d=\"M13.8624 1.41669V15.5834H10.7683C10.0226 15.5834 9.41797 15.0052 9.41797 14.2921V2.70798C9.41797 1.99483 10.0226 1.41669 10.7683 1.41669L13.8624 1.41669Z\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M9.41808 4.25V12.75H6.324C5.57823 12.75 4.97363 12.1719 4.97363 11.4587V5.54129C4.97363 4.82814 5.57823 4.25 6.324 4.25H9.41808Z\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M30.582 2.70798V14.2921C30.582 15.0052 29.9774 15.5834 29.2316 15.5834H26.1376V1.41669L29.2316 1.41669C29.9774 1.41669 30.582 1.99483 30.582 2.70798Z\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M35.0265 5.54129V11.4587C35.0265 12.1719 34.4219 12.75 33.6761 12.75H30.582V4.25H33.6761C34.4219 4.25 35.0265 4.82814 35.0265 5.54129Z\"\n        strokeMiterlimit=\"10\"\n      />\n    </IconSvg>\n  );\n}\n\nexport function IconBarbell2Selected(props: IInnerProps): JSX.Element {\n  const width = props.size ?? 40;\n  const height = width / 2.5;\n  const color = props.color ?? Tailwind_colors().white;\n  return (\n    <IconSvg width={width} height={height} viewBox=\"0 0 40 17\" fill=\"none\" stroke={color} strokeWidth=\"1.5\">\n      <Path d=\"M34.812 8.5H38.5661\" strokeMiterlimit=\"10\" />\n      <Path d=\"M13.238 8.5H28.4761\" strokeMiterlimit=\"10\" />\n      <Path d=\"M1.43384 8.5H5.52702\" strokeMiterlimit=\"10\" />\n      <Path\n        d=\"M13.8624 1.41669V15.5834H10.7683C10.0226 15.5834 9.41797 15.0052 9.41797 14.2921V2.70798C9.41797 1.99483 10.0226 1.41669 10.7683 1.41669L13.8624 1.41669Z\"\n        fill=\"white\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M9.41808 4.25V12.75H6.324C5.57823 12.75 4.97363 12.1719 4.97363 11.4587V5.54129C4.97363 4.82814 5.57823 4.25 6.324 4.25H9.41808Z\"\n        fill=\"white\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M30.582 2.70798V14.2921C30.582 15.0052 29.9774 15.5834 29.2316 15.5834H26.1376V1.41669L29.2316 1.41669C29.9774 1.41669 30.582 1.99483 30.582 2.70798Z\"\n        fill=\"white\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M35.0265 5.54129V11.4587C35.0265 12.1719 34.4219 12.75 33.6761 12.75H30.582V4.25H33.6761C34.4219 4.25 35.0265 4.82814 35.0265 5.54129Z\"\n        fill=\"white\"\n        strokeMiterlimit=\"10\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  size?: number;\n}\n\nexport function IconBarbellPlates(props: IProps): JSX.Element {\n  const fill = props.color ?? Tailwind_semantic().icon.blue;\n  const width = props.size ?? 17;\n  return (\n    <IconSvg width={width} height={Math.round((width * 14) / 17)} viewBox=\"0 0 17 14\" fill=\"none\">\n      <Path d=\"M5.44872 6.10254H0V7.62818H5.44872V6.10254Z\" fill={fill} />\n      <Path d=\"M8.2078 0H9.92114V13.7308H8.2078V0Z\" fill={fill} />\n      <Path d=\"M10.4142 1.42163H12.1275V12.3092H10.4142V1.42163Z\" fill={fill} />\n      <Path d=\"M12.6206 2.82593H14.3339V10.9049H12.6206V2.82593Z\" fill={fill} />\n      <Path d=\"M14.7886 6.11975V7.61072H15.8813H15.9073H17V6.11975H15.9073H15.8813H14.7886Z\" fill={fill} />\n      <Path d=\"M6.00144 0H7.71478V13.7308H6.00144V0Z\" fill={fill} />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconBarbellSide(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill={color}>\n      <Path d=\"M8.0513 11.5555H1V13.4444H8.0513V11.5555Z\" />\n      <Path d=\"M11.6219 4H13.8392V21H11.6219V4Z\" />\n      <Path d=\"M14.4773 5.75981H16.6945V19.2396H14.4773V5.75981Z\" />\n      <Path d=\"M17.3325 7.49846H19.5497V17.501H17.3325V7.49846Z\" />\n      <Path d=\"M20.1382 11.5767V13.4226H23V11.5767H20.1382Z\" />\n      <Path d=\"M8.76666 4H10.9839V21H8.76666V4Z\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n}\n\nexport function IconBell(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={20} height={24} viewBox=\"0 0 20 24\" fill=\"none\">\n      <Path\n        d=\"M10.7159 22.1765H10.3422C8.69105 22.1765 7.35254 20.838 7.35254 19.1869C7.35254 19.0837 7.43621 19 7.53939 19H13.5187C13.6219 19 13.7055 19.0837 13.7055 19.1869C13.7055 20.838 12.367 22.1765 10.7159 22.1765Z\"\n        stroke={color}\n        strokeWidth=\"2\"\n      />\n      <Path\n        d=\"M13.2776 3.79296C15.5798 5.02218 17.1537 7.50596 17.1537 10.3699V14.802L18.6389 16.5413C19.4546 17.4965 18.7988 19 17.5664 19H2.43353C1.20125 19 0.54541 17.4965 1.36106 16.5413L2.84627 14.802V10.3699C2.84627 7.50596 4.42021 5.02218 6.72236 3.79296C7.01989 2.2017 8.37423 1 10 1C11.6258 1 12.9801 2.2017 13.2776 3.79296Z\"\n        stroke={color}\n        strokeWidth=\"2\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  size?: number;\n  className?: string;\n}\n\nexport function IconCalculator(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size ?? 20;\n  return (\n    <IconSvg className={props.className} width={size} height={Math.ceil(size * 1.3)} viewBox=\"0 0 40 52\" fill=\"none\">\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M0 7.12593C0 3.19038 3.09635 0 6.91592 0H33.0841C36.9037 0 40 3.19038 40 7.12593V44.874C40 48.8096 36.9037 52 33.0841 52H6.91592C3.09635 52 0 48.8096 0 44.874V7.12593ZM6.91592 3.46667C4.95454 3.46667 3.36448 5.10497 3.36448 7.12593V44.874C3.36448 46.895 4.95454 48.5333 6.91592 48.5333H33.0841C35.0455 48.5333 36.6355 46.895 36.6355 44.874V7.12593C36.6355 5.10498 35.0455 3.46667 33.0841 3.46667H6.91592ZM10.4672 12.5185C10.4672 11.5612 11.2204 10.7851 12.1495 10.7851H27.8504C28.7796 10.7851 29.5326 11.5612 29.5326 12.5185C29.5326 13.4759 28.7796 14.2518 27.8504 14.2518H12.1495C11.2204 14.2518 10.4672 13.4759 10.4672 12.5185ZM10.4672 23.3037C10.4672 22.3464 11.2204 21.5704 12.1495 21.5704H12.1757C13.1048 21.5704 13.858 22.3464 13.858 23.3037C13.858 24.261 13.1048 25.0371 12.1757 25.0371H12.1495C11.2204 25.0371 10.4672 24.261 10.4672 23.3037ZM18.3177 23.3037C18.3177 22.3464 19.0709 21.5704 19.9999 21.5704H20.0262C20.9552 21.5704 21.7084 22.3464 21.7084 23.3037C21.7084 24.261 20.9552 25.0371 20.0262 25.0371H19.9999C19.0709 25.0371 18.3177 24.261 18.3177 23.3037ZM26.1682 23.3037C26.1682 22.3464 26.9214 21.5704 27.8504 21.5704H27.8766C28.8057 21.5704 29.5589 22.3464 29.5589 23.3037C29.5589 24.261 28.8057 25.0371 27.8766 25.0371H27.8504C26.9214 25.0371 26.1682 24.261 26.1682 23.3037ZM10.4672 31.3926C10.4672 30.4353 11.2204 29.6593 12.1495 29.6593H12.1757C13.1048 29.6593 13.858 30.4353 13.858 31.3926C13.858 32.3499 13.1048 33.126 12.1757 33.126H12.1495C11.2204 33.126 10.4672 32.3499 10.4672 31.3926ZM18.3177 31.3926C18.3177 30.4353 19.0709 29.6593 19.9999 29.6593H20.0262C20.9552 29.6593 21.7084 30.4353 21.7084 31.3926C21.7084 32.3499 20.9552 33.126 20.0262 33.126H19.9999C19.0709 33.126 18.3177 32.3499 18.3177 31.3926ZM27.8504 29.6593C28.7796 29.6593 29.5326 30.4353 29.5326 31.3926V39.4815C29.5326 40.4388 28.7796 41.2149 27.8504 41.2149C26.9214 41.2149 26.1682 40.4388 26.1682 39.4815V31.3926C26.1682 30.4353 26.9214 29.6593 27.8504 29.6593ZM10.4672 39.4815C10.4672 38.5241 11.2204 37.7482 12.1495 37.7482H12.1757C13.1048 37.7482 13.858 38.5241 13.858 39.4815C13.858 40.4388 13.1048 41.2149 12.1757 41.2149H12.1495C11.2204 41.2149 10.4672 40.4388 10.4672 39.4815ZM18.3177 39.4815C18.3177 38.5241 19.0709 37.7482 19.9999 37.7482H20.0262C20.9552 37.7482 21.7084 38.5241 21.7084 39.4815C21.7084 40.4388 20.9552 41.2149 20.0262 41.2149H19.9999C19.0709 41.2149 18.3177 40.4388 18.3177 39.4815Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconCalendarSmall(props: IProps): JSX.Element {\n  const size = props.size ?? 14;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 14 14\" fill=\"none\">\n      <Path\n        d=\"M10.1529 3.2428H3.74706C2.78218 3.2428 2 4.07387 2 5.09905V11.2865C2 12.3117 2.78218 13.1428 3.74706 13.1428H10.1529C11.1178 13.1428 11.9 12.3117 11.9 11.2865V5.09905C11.9 4.07387 11.1178 3.2428 10.1529 3.2428Z\"\n        stroke={color}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path d=\"M2 6.54285H11.9\" stroke={color} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M4.2002 2.14282V4.34282\" stroke={color} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M9.7002 2.14282V4.34282\" stroke={color} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  size?: number;\n  className?: string;\n}\n\nexport function IconCamera(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size ?? 51;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 51 51\" fill=\"none\">\n      <Path\n        d=\"M6.81159 46.1842H44.1884C48.7004 46.1842 51 43.9281 51 39.4593V16.747C51 12.2782 48.7004 10.0438 44.1884 10.0438H39.1122C37.4202 10.0438 36.8996 9.69675 35.9234 8.61208L34.1663 6.6597C33.1034 5.46665 31.9971 4.8158 29.7409 4.8158H21.1072C18.8728 4.8158 17.7665 5.46665 16.6819 6.6597L14.9247 8.61208C13.9703 9.675 13.428 10.0438 11.7359 10.0438H6.81159C2.29947 10.0438 0 12.2782 0 16.747V39.4593C0 43.9281 2.29947 46.1842 6.81159 46.1842ZM6.87666 42.6916C4.72907 42.6916 3.49261 41.5419 3.49261 39.2858V16.9422C3.49261 14.6861 4.72907 13.5364 6.87666 13.5364H12.6036C14.556 13.5364 15.5972 13.1676 16.6819 11.9528L18.3956 10.0438C19.6321 8.65549 20.2611 8.30841 22.1919 8.30841H28.6564C30.587 8.30841 31.2161 8.65549 32.4526 10.0438L34.1663 11.9528C35.251 13.1676 36.2923 13.5364 38.2446 13.5364H44.1235C46.2711 13.5364 47.5076 14.6861 47.5076 16.9422V39.2858C47.5076 41.5419 46.2711 42.6916 44.1235 42.6916H6.87666ZM25.4892 39.2425C32.0621 39.2425 37.3335 33.971 37.3335 27.3764C37.3335 20.7818 32.0838 15.5105 25.4892 15.5105C18.9379 15.5105 13.6666 20.7818 13.6666 27.3764C13.6666 33.971 18.9379 39.2425 25.4892 39.2425ZM41.0865 22.0834C42.5615 22.0834 43.7762 20.8902 43.7762 19.4152C43.7762 17.9183 42.5615 16.7252 41.0865 16.7252C39.6111 16.7252 38.3964 17.9183 38.3964 19.4152C38.3964 20.8902 39.6111 22.0834 41.0865 22.0834ZM25.4892 35.9452C20.7819 35.9452 16.9422 32.1272 16.9422 27.3764C16.9422 22.6257 20.7601 18.8077 25.4892 18.8077C30.2182 18.8077 34.0578 22.6257 34.0578 27.3764C34.0578 32.1272 30.2182 35.9452 25.4892 35.9452Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { useRemScale } from \"../../utils/useRem\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  isChecked: boolean;\n  checkColor?: string;\n  color?: string;\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n}\n\nexport function IconCheckCircle(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.purple;\n  const checkColor = props.checkColor || Tailwind_semantic().background.default;\n  const size = props.size || 20;\n  const scale = useRemScale();\n  if (props.isChecked) {\n    return (\n      <IconSvg\n        style={props.style}\n        className={props.className}\n        width={size}\n        height={size}\n        viewBox=\"0 0 20 20\"\n        fill=\"none\"\n      >\n        <Path\n          d=\"M0 10C0 4.47715 4.47715 0 10 0C15.5228 0 20 4.47715 20 10C20 15.5228 15.5228 20 10 20C4.47715 20 0 15.5228 0 10Z\"\n          fill={color}\n        />\n        <Path\n          d=\"M14.5 7L8.70846 13L6.5 10.6139\"\n          stroke={checkColor}\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n      </IconSvg>\n    );\n  } else {\n    const scaledSize = Math.round(size * scale);\n    return (\n      <View\n        style={{\n          ...(props.style as object),\n          width: scaledSize,\n          height: scaledSize,\n          borderWidth: 2 * scale,\n          borderRadius: scaledSize / 2,\n          borderColor: Tailwind_semantic().border.prominent,\n        }}\n        className={props.className ?? \"\"}\n      />\n    );\n  }\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n}\n\nexport function IconClose(props: IProps = {}): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 512 512\">\n      <Path\n        fill={color}\n        d=\"M443.6,387.1L312.4,255.4l131.5-130c5.4-5.4,5.4-14.2,0-19.6l-37.4-37.6c-2.6-2.6-6.1-4-9.8-4c-3.7,0-7.2,1.5-9.8,4  L256,197.8L124.9,68.3c-2.6-2.6-6.1-4-9.8-4c-3.7,0-7.2,1.5-9.8,4L68,105.9c-5.4,5.4-5.4,14.2,0,19.6l131.5,130L68.4,387.1  c-2.6,2.6-4.1,6.1-4.1,9.8c0,3.7,1.4,7.2,4.1,9.8l37.4,37.6c2.7,2.7,6.2,4.1,9.8,4.1c3.5,0,7.1-1.3,9.8-4.1L256,313.1l130.7,131.1  c2.7,2.7,6.2,4.1,9.8,4.1c3.5,0,7.1-1.3,9.8-4.1l37.4-37.6c2.6-2.6,4.1-6.1,4.1-9.8C447.7,393.2,446.2,389.7,443.6,387.1z\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconClose2(props: IProps): JSX.Element {\n  const size = props.size ?? 12;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 12 12\" fill=\"none\">\n      <Path\n        d=\"M9.87472 9.87485C9.56901 10.1806 9.07335 10.1806 8.76764 9.87485L5.99994 7.10714L3.23224 9.87485C2.92653 10.1806 2.43087 10.1806 2.12516 9.87485C1.81945 9.56913 1.81945 9.07348 2.12516 8.76776L4.89286 6.00006L2.12516 3.23236C1.81945 2.92665 1.81945 2.43099 2.12516 2.12528C2.43087 1.81957 2.92653 1.81957 3.23224 2.12528L5.99994 4.89298L8.76764 2.12528C9.07335 1.81957 9.56901 1.81957 9.87472 2.12528C10.1804 2.43099 10.1804 2.92665 9.87472 3.23236L7.10702 6.00006L9.87472 8.76777C10.1804 9.07348 10.1804 9.56913 9.87472 9.87485Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Circle } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_colors } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n}\n\nexport function IconCloseCircle(props: IProps = {}): JSX.Element {\n  const size = props.size ?? 20;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Circle cx={10} cy={10} r={10} fill={Tailwind_colors().red[600]} />\n      <Path\n        d=\"M14.5609 13.1774L11.372 9.97805L14.5682 6.81998C14.6995 6.6888 14.6995 6.47502 14.5682 6.34384L13.6592 5.43042C13.596 5.36726 13.5109 5.33325 13.421 5.33325C13.3311 5.33325 13.246 5.36969 13.1828 5.43042L10.0012 8.57878L6.81474 5.43285C6.75154 5.36969 6.66647 5.33568 6.57654 5.33568C6.48661 5.33568 6.40154 5.37212 6.33835 5.43285L5.43175 6.34627C5.3005 6.47745 5.3005 6.69123 5.43175 6.82241L8.62793 9.98048L5.44147 13.1774C5.37828 13.2406 5.34182 13.3256 5.34182 13.4155C5.34182 13.5054 5.37585 13.5904 5.44147 13.6536L6.3505 14.567C6.41613 14.6326 6.50119 14.6666 6.58869 14.6666C6.67376 14.6666 6.76126 14.635 6.82689 14.567L10.0012 11.3798L13.1779 14.5646C13.2436 14.6301 13.3286 14.6642 13.4161 14.6642C13.5012 14.6642 13.5887 14.6326 13.6543 14.5646L14.5633 13.6511C14.6265 13.588 14.663 13.503 14.663 13.4131C14.6606 13.3256 14.6241 13.2406 14.5609 13.1774Z\"\n        fill=\"white\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  bgColor?: string;\n}\n\nexport function IconCloseCircleOutline(props: IProps = {}): JSX.Element {\n  const size = props.size ?? 20;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  const bgColor = props.bgColor ?? Tailwind_semantic().background.subtle;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\">\n      <Rect width=\"32\" height=\"32\" rx=\"16\" fill={bgColor} />\n      <Path\n        d=\"M21.9081 21.4999C21.4635 21.9446 20.7425 21.9446 20.2978 21.4999L16.2721 17.4742L12.2463 21.4999C11.8017 21.9446 11.0807 21.9446 10.636 21.4999C10.1914 21.0553 10.1914 20.3343 10.636 19.8896L14.6618 15.8639L10.636 11.8381C10.1914 11.3935 10.1914 10.6725 10.636 10.2278C11.0807 9.78317 11.8017 9.78317 12.2463 10.2278L16.2721 14.2536L20.2978 10.2278C20.7425 9.78317 21.4635 9.78317 21.9081 10.2278C22.3528 10.6725 22.3528 11.3935 21.9081 11.8381L17.8824 15.8639L21.9081 19.8896C22.3528 20.3343 22.3528 21.0553 21.9081 21.4999Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  size?: number;\n}\n\nexport function IconCog2(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size ?? 21;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 21 21\" fill=\"none\">\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M8.45345 1.53857C8.49726 1.29675 8.76045 0.999576 9.08511 1H12.4894C12.7906 0.999466 13.0739 1.24105 13.121 1.53857L13.48 3.85904C13.5831 3.89954 13.6857 3.9407 13.7859 3.98537L15.6742 2.59575C15.9186 2.41689 16.2925 2.4468 16.5053 2.66224L18.9122 5.06915C19.1223 5.28291 19.1491 5.65176 18.9721 5.89362L17.5824 7.78192C17.6285 7.88489 17.6738 7.98847 17.7154 8.09442L20.0359 8.45346C20.3334 8.50055 20.5745 8.78389 20.5745 9.08511V12.4894C20.5719 12.7884 20.3313 13.0676 20.0359 13.1144L17.7154 13.4734C17.6738 13.5794 17.6285 13.6829 17.5824 13.7859L18.9721 15.6742C19.1491 15.9161 19.1223 16.2849 18.9122 16.4987L16.5053 18.9056C16.2925 19.121 15.9186 19.1509 15.6742 18.9721L13.7859 17.5825C13.6857 17.6271 13.5831 17.6683 13.48 17.7088L13.121 20.0293C13.0768 20.3291 12.7925 20.5745 12.4894 20.5745H9.08511C8.78198 20.5745 8.4977 20.3291 8.45345 20.0293L8.09443 17.7088C7.99143 17.6683 7.88877 17.6271 7.78855 17.5825L5.90026 18.9721C5.6559 19.1509 5.28198 19.121 5.06915 18.9056L2.66224 16.4987C2.45215 16.2849 2.42541 15.9161 2.60238 15.6742L3.99202 13.7859C3.94598 13.6829 3.90066 13.5794 3.85904 13.4734L1.53856 13.1144C1.24324 13.0676 1.00256 12.7884 1 12.4894V9.08511C0.999449 8.78389 1.24107 8.50055 1.53856 8.45346L3.85904 8.09442C3.90066 7.98847 3.94598 7.88489 3.99202 7.78192L2.60238 5.89362C2.42541 5.65176 2.45215 5.28291 2.66224 5.06915L5.06915 2.66224C5.28198 2.4468 5.6559 2.41689 5.90026 2.59575L7.78855 3.98537C7.88877 3.9407 7.99143 3.89954 8.09443 3.85904L8.45345 1.53857ZM11.9442 2.2766H9.63032L9.30451 4.40426C9.26972 4.63677 9.0957 4.84288 8.87234 4.91623C8.5706 5.01458 8.27983 5.13673 7.99468 5.28192C7.78451 5.39047 7.5136 5.36901 7.32315 5.22873L5.58111 3.95213L3.95213 5.58112L5.22872 7.32314C5.36856 7.51096 5.39264 7.77826 5.28855 7.98803C5.14338 8.2732 5.0146 8.56396 4.91621 8.86569C4.84392 9.08732 4.64107 9.26079 4.4109 9.29787L2.2766 9.63033V11.9375L4.4109 12.2699C4.64107 12.307 4.84392 12.4805 4.91621 12.7021C5.0146 13.0039 5.14338 13.2946 5.28855 13.5798C5.39264 13.7896 5.36856 14.0569 5.22872 14.2447L3.95213 15.9867L5.58111 17.6157L7.32315 16.3391C7.5136 16.1988 7.78451 16.1774 7.99468 16.2859C8.27983 16.4311 8.5706 16.5532 8.87234 16.6516C9.0957 16.7249 9.26972 16.9311 9.30451 17.1636L9.63698 19.2979H11.9375L12.27 17.1636C12.3048 16.9311 12.4787 16.7249 12.7021 16.6516C13.0039 16.5532 13.2946 16.4311 13.5798 16.2859C13.7899 16.1774 14.0609 16.1988 14.2513 16.3391L15.9934 17.6157L17.6223 15.9867L16.3457 14.2447C16.2059 14.0569 16.1819 13.7896 16.2859 13.5798C16.4311 13.2946 16.5599 13.0039 16.6583 12.7021C16.7306 12.4805 16.9334 12.307 17.1636 12.2699L19.2979 11.9375V9.63033L17.1636 9.29787C16.9334 9.26079 16.7306 9.08732 16.6583 8.86569C16.5599 8.56396 16.4311 8.2732 16.2859 7.98803C16.1819 7.77826 16.2059 7.51096 16.3457 7.32314L17.6223 5.58112L15.9934 3.95213L14.2513 5.22873C14.0609 5.36901 13.7899 5.39047 13.5798 5.28192C13.2946 5.13673 13.0039 5.01458 12.7021 4.91623C12.4787 4.84288 12.3048 4.63677 12.27 4.40426L11.9442 2.2766ZM10.7872 6.10638C8.20964 6.10638 6.10638 8.20964 6.10638 10.7872C6.10638 13.3648 8.20964 15.4681 10.7872 15.4681C13.3649 15.4681 15.4681 13.3648 15.4681 10.7872C15.4681 8.20965 13.3649 6.10638 10.7872 6.10638ZM14.1915 10.7872C14.1915 8.89957 12.6749 7.38298 10.7872 7.38298C8.89955 7.38298 7.38298 8.89957 7.38298 10.7872C7.38298 12.6749 8.89955 14.1915 10.7872 14.1915C12.6749 14.1915 14.1915 12.6749 14.1915 10.7872Z\"\n        fill={color}\n        stroke={color}\n        strokeWidth={0.3}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconCrown(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M1.88924 17.0768L0.487417 5.45726C0.38372 4.78438 1.15031 4.32504 1.69491 4.73369L6.06246 8.00897C6.17599 8.09401 6.30565 8.15503 6.44355 8.18829C6.58144 8.22155 6.72466 8.22636 6.86448 8.20242C7.00429 8.17848 7.13776 8.1263 7.25673 8.04906C7.37571 7.97182 7.47769 7.87115 7.55646 7.75318L11.1928 2.2995C11.5768 1.72341 12.4233 1.72341 12.8074 2.2995L16.4437 7.75318C16.5224 7.87115 16.6244 7.97182 16.7434 8.04906C16.8624 8.1263 16.9958 8.17848 17.1356 8.20242C17.2755 8.22636 17.4187 8.22155 17.5566 8.18829C17.6945 8.15503 17.8241 8.09401 17.9377 8.00897L22.3052 4.73369C22.8506 4.32504 23.6164 4.78438 23.5127 5.45726L22.1109 17.0768H1.88924ZM21.0562 22.1326H2.94388C2.80538 22.1326 2.66824 22.1053 2.54029 22.0523C2.41233 21.9993 2.29607 21.9216 2.19814 21.8237C2.00036 21.6259 1.88924 21.3577 1.88924 21.078V18.7621H22.1109V21.078C22.1109 21.6602 21.6385 22.1326 21.0562 22.1326Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconDayTextMode(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M4.75253 21.5H4.34685C3.2266 21.5 2.31846 20.5407 2.31846 19.3573V12.5357C2.31845 11.8756 1 11.5715 1 11.5715C1 11.5715 2.31846 11.3173 2.31846 10.6072V4.64273C2.31846 3.45933 3.2266 2.5 4.34685 2.5H4.75253M19.2475 2.5H19.6532C20.7734 2.5 21.6815 3.45933 21.6815 4.64273V11.4643C21.6815 12.1244 23 12.4285 23 12.4285C23 12.4285 21.6815 12.6827 21.6815 13.3928L21.6815 19.3573C21.6815 20.5407 20.7734 21.5 19.6532 21.5H19.2475\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M17.5 17.1723C17.5 17.9885 16.8858 18.6501 16.1282 18.6501L7.87175 18.6501C7.11415 18.6501 6.5 17.9885 6.5 17.1723L6.5 14.9557C6.5 14.1395 7.11415 13.4779 7.87175 13.4779L16.1282 13.4779C16.8858 13.4779 17.5 14.1395 17.5 14.9557V17.1723Z\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M17.5 6.82788C17.5 6.01172 16.8858 5.3501 16.1282 5.3501L7.87175 5.3501C7.11415 5.3501 6.5 6.01172 6.5 6.82788L6.5 9.04454C6.5 9.8607 7.11415 10.5223 7.87175 10.5223H16.1282C16.8858 10.5223 17.5 9.8607 17.5 9.04454V6.82788Z\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  size?: number;\n  className?: string;\n}\n\nexport function IconDefaultExercise(props: IProps = {}): JSX.Element {\n  const size = props.size ?? 24;\n  return (\n    <IconSvg noRemScale={true} width={size} height={size} viewBox=\"0 0 64 64\" fill=\"none\">\n      <Rect width=\"64\" height=\"64\" rx=\"16\" fill=\"#D9D9D9\" />\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M25.5716 14.9039C24.7645 15.1393 23.9687 15.4203 23.1866 15.7469L23.1757 15.7515C22.5413 16.0162 22.1752 16.6773 22.2922 17.3471L23.4988 24.2642C23.589 24.7813 23.3914 25.3056 22.9838 25.6432C19.9371 28.1663 18 31.952 18 36.1839C18 44.6348 25.725 51.3062 34.5875 49.6987C40.2007 48.6802 44.6108 44.3261 45.6397 38.7873C46.6168 33.5285 44.5595 28.6763 40.9008 25.6451C40.4923 25.3066 40.2931 24.7825 40.3834 24.264L41.5883 17.3588C41.7061 16.6822 41.3366 16.0141 40.6953 15.7469C39.9132 15.4203 39.1174 15.1393 38.3106 14.9039C36.2521 14.3032 34.1188 14 31.941 14C29.7637 14 27.6301 14.3032 25.5716 14.9039ZM26.4243 19.7917C26.2912 19.0293 26.7795 18.2932 27.5418 18.1127C28.9733 17.7739 30.4446 17.6032 31.941 17.6032C33.4378 17.6032 34.9088 17.7739 36.3404 18.1127C37.1026 18.2932 37.591 19.0293 37.4576 19.7917L36.8452 23.3044C35.3197 22.7381 33.6668 22.4286 31.941 22.4286C30.2152 22.4286 28.5624 22.7381 27.037 23.3044L26.4243 19.7917Z\"\n        fill=\"#BCBCBC\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, G, Defs, ClipPath, Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  width?: number;\n  height?: number;\n}\n\nexport function IconDinoSunglasses(props: IProps): JSX.Element {\n  return (\n    <IconSvg width={props.width ?? 93} height={props.height ?? 125} viewBox=\"0 0 93 125\" fill=\"none\">\n      <G clipPath=\"url(#clip0_3477_1842)\">\n        <Path\n          d=\"M19.079 15.1035C16.6279 14.7037 16.0394 14.4729 13.4229 15.1035C9.83193 15.9691 9.67568 17.2806 9.07214 20.7427C9.517 20.4584 14.3422 18.4249 15.1632 18.14C16.7619 17.5853 19.1108 17.1597 20.8193 16.8387L19.079 15.1035Z\"\n          fill=\"#252147\"\n        />\n        <Path\n          d=\"M19.1723 66.0982C18.958 69.5689 17.8352 74.4736 13.9482 75.0586C11.2993 75.4572 9.09125 74.5147 8.61366 74.301C6.27502 73.255 4.74433 71.9628 0.160156 71.566C0.216607 70.7022 1.27435 68.3988 3.20446 67.3514C4.68871 66.5458 6.868 66.1208 10.5576 67.7745C13.1471 66.6777 13.9031 60.6143 13.9031 60.6143\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          opacity=\"0.5\"\n          d=\"M10.5577 67.7745C6.86811 66.1208 4.68881 66.5458 3.20451 67.3514C1.28203 68.3948 0.22528 70.6836 0.161255 71.5553C0.262711 71.5711 0.329446 71.5812 0.340283 71.5822C1.15481 70.3191 3.02951 68.0876 5.85426 67.9381C9.00687 67.7706 12.6785 69.7253 12.7748 69.8067L12.1317 68.8601C12.1317 68.8601 15.3699 66.2952 13.9032 60.6143C13.9032 60.6143 13.1472 66.6777 10.5577 67.7745Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M19.1723 66.0977C19.1723 66.0977 17.5136 71.4842 14.4334 72.4313C11.3531 73.3784 7.67575 71.0743 7.67575 71.0743L6.34155 73.1858C7.10742 73.5557 7.81325 73.9425 8.61362 74.3005C9.09122 74.5141 11.2993 75.4566 13.9482 75.058C17.8353 74.473 18.9579 69.5683 19.1723 66.0977Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M0.590133 70.658C-0.845241 72.8313 0.678264 76.3919 1.58374 76.4519C2.48922 76.5119 3.02636 73.5611 4.72618 72.6767C4.72618 72.6767 3.26947 67.9153 0.590133 70.658Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M4.72629 72.6764C3.02558 73.5618 2.48927 76.5127 1.58291 76.4521C1.13241 76.4222 0.527209 75.521 0.211063 74.3567C-0.106134 73.1855 -0.129743 71.747 0.590515 70.6586C1.74126 69.4793 2.66647 69.6871 3.34936 70.3045C4.25224 71.1277 4.72629 72.6764 4.72629 72.6764Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M4.72629 72.6766C3.02558 73.5619 2.48927 76.5129 1.58291 76.4522C1.13241 76.4224 0.527206 75.5212 0.21106 74.3569C0.618433 74.6565 1.20517 74.9624 1.67341 74.6931C2.49734 74.2204 2.35961 73.3797 3.43643 72.4748C3.94057 72.0502 3.64311 71.0208 3.3493 70.3047C4.25218 71.1279 4.72629 72.6766 4.72629 72.6766Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M4.22501 71.498C2.89983 74.3139 5.10002 77.2399 5.73884 77.1992C6.64443 77.1415 7.3251 74.6268 8.08937 73.8045C8.73012 72.7152 6.87233 68.5305 4.22501 71.498Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M8.08894 73.8041C7.325 74.627 6.64389 77.1412 5.73791 77.199C5.32064 77.2269 4.22867 75.9752 3.90252 74.3171L3.90224 74.3154C3.73051 73.4467 3.76927 72.4661 4.22436 71.4979C5.73039 69.8117 6.97906 70.4347 7.65973 71.4884C7.66172 71.4899 7.66221 71.4933 7.66443 71.4964C8.17873 72.2944 8.36428 73.3354 8.08894 73.8041Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M8.08901 73.8047C7.32507 74.6277 6.64396 77.1418 5.73798 77.1996C5.32071 77.2275 4.22874 75.9759 3.90259 74.3178C3.92078 74.3569 4.52642 75.7236 5.72919 75.281C6.36889 75.047 6.37464 74.4497 6.8791 73.7496C7.44306 72.969 8.04975 72.2395 7.66455 71.4971C8.17885 72.295 8.36435 73.3361 8.08901 73.8047Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          d=\"M20.5662 75.6419C26.6613 75.6419 31.6023 70.4769 31.6023 64.1056C31.6023 57.7343 26.6613 52.5693 20.5662 52.5693C14.4712 52.5693 9.53015 57.7343 9.53015 64.1056C9.53015 70.4769 14.4712 75.6419 20.5662 75.6419Z\"\n          fill=\"#EF6654\"\n        />\n        <Path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M14.5999 110.787C11.1211 107.799 8.9155 103.378 8.9155 98.4405C8.9155 92.8504 11.7402 87.9194 16.0424 84.9844C16.186 86.0425 16.385 87.0897 16.6393 88.1093C16.6855 88.2966 16.7435 88.479 16.7934 88.6648C17.8647 92.6545 19.7631 96.3028 22.3073 99.4144C22.307 99.4142 22.3073 99.4145 22.3073 99.4144C22.3089 99.4163 22.3106 99.4188 22.3122 99.4208C25.7788 103.671 30.4342 106.923 35.7753 108.671C36.1397 108.792 36.5044 108.902 36.8692 109.001C36.8511 109.025 36.8311 109.047 36.813 109.071C37.1574 109.109 37.4571 109.198 37.6644 109.384C37.4166 109.924 30.4444 125 30.4444 125L7.92737 124.987C7.92737 124.987 12.5916 115.237 14.5999 110.787Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M13.7164 125C13.7164 125 12.7533 122.183 9.52473 122.183C6.29615 122.183 5.16907 125 5.16907 125H13.7164Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M21.5611 125C21.5611 125 20.598 122.183 17.3695 122.183C14.1409 122.183 13.0138 125 13.0138 125H21.5611Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M69.0514 72.82L62.8197 76.9924L74.9307 84.5548L75.9756 77.1435C76.5143 73.3234 72.2637 70.669 69.0514 72.82Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M41.4745 1.32953L32.9479 10.6811L49.6403 14.4483L48.6733 3.78542C48.3488 0.207307 43.9296 -1.30034 41.4745 1.32953Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M78.457 78.2103C80.5928 75.0034 85.5283 75.8292 86.4968 79.5554L88.2825 86.4241L74.5203 84.1215L78.457 78.2103Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M56.9024 10.3819C60.8746 9.64623 63.8468 13.9448 61.7441 17.3844L56.7439 25.564L47.4562 12.1317L56.9024 10.3819Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M63.1428 34.1048L54.8465 38.9361L53.0699 22.7178L62.2166 25.6498C66.0627 26.8828 66.6313 32.0732 63.1428 34.1048Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M63.0533 48.9285L54.2889 52.5072L54.7914 36.4326L63.3152 40.5485C66.8995 42.2793 66.7387 47.4236 63.0533 48.9285Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M63.9052 60.1887L57.288 65.978L52.8514 51.6982L61.5923 52.7444C65.2678 53.1844 66.6876 57.7543 63.9052 60.1887Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M68.478 69.7275L64.2559 77.1174L55.6597 65.4401L63.9966 63.6399C67.5023 62.883 70.2533 66.6201 68.478 69.7275Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M35.6677 72.4873C41.177 89.1091 53.0324 102.717 68.2471 110.634C67.1783 110.804 66.0914 110.924 64.9862 110.982L57.0468 111.399C40.0771 112.29 25.5952 99.2975 24.7009 82.3785L24.2598 74.033C24.2428 73.7035 24.1436 73.3835 23.9712 73.1018L35.6677 72.4873Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M18.4622 52.0229C18.5484 51.7307 18.6358 51.4389 18.7242 51.1474C18.9634 50.3591 20.8054 43.4128 21.1381 43.4484L27.4813 44.09C27.8099 44.09 28.2565 43.9766 28.5844 43.9983C28.5238 43.9934 28.6453 44.0023 28.5844 43.9983C28.9062 44.0243 28.9121 44.6853 29.2279 44.7316C29.2852 44.7399 29.6306 44.1727 29.6876 44.1816C29.9851 44.2287 30.5909 44.3921 30.8827 44.4566C30.8459 44.4481 30.9197 44.4648 30.8827 44.4566C39.343 46.4023 36.2147 56.3718 36.9501 65.354C37.2254 68.7156 38.0533 70.8533 39.1691 75.2018C39.3354 75.8499 43.0472 82.8241 42.4794 83.06C36.5712 85.5147 31.864 91.3259 31.864 98.106C31.864 102.137 33.3353 105.824 35.7675 108.668C30.4299 106.92 24.1186 103.669 20.6535 99.4212C15.3208 92.8834 13.6786 84.3552 14.1422 76.1205C14.4587 70.4973 15.2931 64.9075 16.5343 59.4148C17.0956 56.9307 17.7408 54.4656 18.4622 52.0229Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M18.1376 15.6815C18.6629 15.6098 19.1883 15.5381 19.7134 15.472C23.2186 10.1966 29.2287 6.71826 36.0571 6.71826C43.8694 6.71826 50.6149 11.2715 53.7662 17.8644C53.9765 18.2006 54.159 18.5534 54.3191 18.9338C60.2077 33.0401 53.5065 48.078 57.9022 63.0938C57.9022 63.0938 61.4169 71.2203 62.8836 73.7769C67.176 81.2587 76.3632 85.3475 85.547 84.8623C86.6857 84.8017 87.8082 84.6694 88.8973 84.4654C91.4131 83.9914 93.564 86.2956 92.8672 88.7541C92.7014 89.355 92.5133 89.9503 92.3032 90.5401H92.3089C91.5846 91.4662 90.8713 92.3427 90.1635 93.1585C90.1414 93.1916 90.1192 93.2192 90.0863 93.2467L83.114 101.763L79.8798 102.061C75.2796 104.768 70.8011 105.854 66.1014 106.653C64.9017 106.857 63.6855 107.039 62.4468 107.226C61.6507 107.348 60.8435 107.474 60.0306 107.601L59.8041 107.64L50.5596 109.111L45.4949 104.668L38.678 98.6875L39.7227 98.1528L35.1338 94.1232L34.133 89.829C34.6959 88.8799 35.3619 88.0007 36.0992 87.1877C36.1983 87.0782 36.2939 86.966 36.3959 86.8593C36.5557 86.6924 36.7228 86.5334 36.8897 86.3734C37.0193 86.2487 37.1483 86.1236 37.2819 86.0032C37.4415 85.8598 37.6051 85.7217 37.7703 85.5845C37.925 85.4558 38.0816 85.3295 38.2412 85.2064C38.3989 85.085 38.5579 84.966 38.7198 84.8503C38.9029 84.7195 39.0896 84.5945 39.2784 84.4712C39.4285 84.3731 39.5778 84.2739 39.7314 84.1806C39.9565 84.0438 40.1874 83.9165 40.4195 83.7905C40.5472 83.7212 40.6719 83.6476 40.8018 83.5816C41.1692 83.3947 41.5434 83.2187 41.9265 83.0596L38.9412 75.0334L42.1902 54.0801C39.8911 48.7853 38.317 45.5204 32.2808 45.5204H25.5467C25.5521 45.5149 25.5578 45.5148 25.5632 45.5093H25.5246C25.4085 45.5148 25.3035 45.5204 25.2204 45.5204C25.0435 45.5258 24.9496 45.5314 24.9496 45.5314H23.6502L20.1671 45.5369C12.5813 45.5369 6.18436 39.9032 5.23891 32.4008C4.21599 24.2479 9.96589 16.7895 18.1376 15.6815Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M48.2078 114.4C57.2342 114.4 64.5516 107.105 64.5516 98.1054C64.5516 89.106 57.2342 81.8105 48.2078 81.8105C39.1814 81.8105 31.864 89.106 31.864 98.1054C31.864 107.105 39.1814 114.4 48.2078 114.4Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M60.0306 107.601C60.8435 107.474 61.6507 107.347 62.4468 107.226C63.6854 107.039 64.9016 106.857 66.1014 106.653C70.801 105.854 75.2796 104.768 79.8798 102.061C83.1804 100.121 86.5421 97.3479 90.0863 93.2466C90.1192 93.2191 90.1413 93.1915 90.1635 93.1584C90.8713 92.3426 91.5846 91.4661 92.3089 90.54C88.6708 100.92 79.5534 108.836 68.2469 110.638H68.2248L64.5148 110.319L57.974 109.751L50.5596 109.111L59.8041 107.64L60.0306 107.601Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M36.8524 124.979C36.8524 124.979 42.1884 113.655 43.6946 110.302C43.9458 109.743 44.1359 109.315 43.5639 108.741C37.2637 102.422 38.5295 90.7507 48.1624 86.4219C48.821 89.3813 49.4591 92.3454 50.142 95.2992C51.0873 99.388 52.8462 102.73 55.4045 105.342C60.0605 102.09 62.7493 99.3376 69.5259 98.2412C69.8294 98.9814 70.1364 99.7194 70.449 100.454L62.3519 119.13L59.6706 125L39.5591 124.979H36.8524Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M43.5019 125C43.5019 125 42.5388 122.183 39.3103 122.183C36.0817 122.183 34.9546 125 34.9546 125H43.5019Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M51.3465 125C51.3465 125 50.3834 122.183 47.1549 122.183C43.9263 122.183 42.7992 125 42.7992 125H51.3465Z\"\n          fill=\"#FFB544\"\n        />\n        <Path\n          d=\"M18.3666 39.2258C13.7798 39.2261 9.06343 37.9037 6.65319 37.2281C6.13861 37.0839 5.83894 36.5512 5.98368 36.0384C6.12838 35.5251 6.66402 35.2261 7.17694 35.3709C9.58558 36.046 15.2258 37.6295 19.9751 37.2325C24.4733 36.8589 31.9315 33.7608 32.006 33.7296C32.1707 33.6607 32.3516 33.6384 32.5255 33.6655L34.6917 33.9936C35.2203 34.0736 35.5831 34.5653 35.5033 35.0921C35.4228 35.6189 34.9336 35.9833 34.4012 35.9009L32.5006 35.6132C31.1076 36.1809 24.5069 38.792 20.1361 39.1554C19.5524 39.2038 18.9605 39.2258 18.3666 39.2258Z\"\n          fill=\"#994D6A\"\n        />\n        <Path\n          d=\"M34.7068 28.0868C37.3018 28.5349 39.7964 26.7356 40.2995 24.0528C40.8029 21.368 39.1039 18.8558 36.4885 18.4181C33.8216 17.9717 31.4127 19.7033 30.913 22.426C30.4186 25.12 32.1059 27.6377 34.7068 28.0868Z\"\n          fill=\"#252147\"\n        />\n        <Path\n          d=\"M34.3068 23.252C35.3021 23.26 36.113 22.489 36.1249 21.5236C36.1367 20.5575 35.34 19.7776 34.3378 19.7744C33.3159 19.7712 32.5324 20.5135 32.5245 21.4927C32.5166 22.4615 33.3094 23.244 34.3068 23.252Z\"\n          fill=\"white\"\n        />\n        <Path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M30.8827 45.3727C30.8827 45.3727 29.4118 59.121 33.2729 69.9363C35.2079 75.3564 41.8224 85.1511 41.8224 85.1511L44.8561 69.7531L37.7775 43.9062L30.8827 45.3727Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M34.6519 43.4482C34.6519 43.4482 35.4792 59.4879 39.3403 70.3033C41.2753 75.7233 46.3577 83.8072 46.3577 83.8072L50.9235 70.12L43.5691 49.0393L34.6519 43.4482Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M42.899 66.0982C42.6846 69.5689 41.5619 74.4736 37.6749 75.0586C35.026 75.4572 32.8179 74.5147 32.3403 74.301C30.0017 73.255 28.471 71.9628 23.8868 71.566C23.9433 70.7022 25.001 68.3988 26.9311 67.3514C28.4154 66.5458 30.5947 66.1208 34.2843 67.7745C36.8738 66.6777 37.6298 60.6143 37.6298 60.6143\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          opacity=\"0.5\"\n          d=\"M34.2843 67.7745C30.5947 66.1208 28.4154 66.5458 26.9311 67.3514C25.0086 68.3948 23.9518 70.6836 23.8878 71.5553C23.9893 71.5711 24.056 71.5812 24.0668 71.5822C24.8814 70.3191 26.7561 68.0876 29.5808 67.9381C32.7334 67.7706 36.4051 69.7253 36.5014 69.8067C36.5013 69.8062 35.8582 68.8601 35.8582 68.8601C35.8582 68.8601 39.0965 66.2952 37.6297 60.6143C37.6297 60.6143 36.8737 66.6777 34.2843 67.7745Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M42.8991 66.0977C42.8991 66.0977 41.2405 71.4842 38.1602 72.4313C35.0799 73.3784 31.4026 71.0743 31.4026 71.0743L30.0684 73.1858C30.8342 73.5557 31.5401 73.9425 32.3404 74.3005C32.818 74.5141 35.0261 75.4566 37.675 75.058C41.5621 74.473 42.6847 69.5683 42.8991 66.0977Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M24.3168 70.658C22.8814 72.8313 24.4049 76.3919 25.3104 76.4519C26.2159 76.5119 26.753 73.5611 28.4529 72.6767C28.4529 72.6767 26.9962 67.9153 24.3168 70.658Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M28.453 72.6764C26.7523 73.5618 26.216 76.5127 25.3096 76.4521C24.8591 76.4222 24.2539 75.521 23.9377 74.3567C23.6206 73.1855 23.5969 71.747 24.3172 70.6586C25.4679 69.4793 26.3932 69.6871 27.076 70.3045C27.9789 71.1277 28.453 72.6764 28.453 72.6764Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M28.453 72.6766C26.7523 73.5619 26.216 76.5129 25.3096 76.4522C24.8591 76.4224 24.2539 75.5212 23.9377 74.3569C24.3451 74.6565 24.9319 74.9624 25.4001 74.6931C26.224 74.2204 26.0863 73.3797 27.1631 72.4748C27.6672 72.0502 27.3698 71.0208 27.076 70.3047C27.9789 71.1279 28.453 72.6766 28.453 72.6766Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M27.9517 71.498C26.6265 74.3139 28.8267 77.2399 29.4655 77.1992C30.3711 77.1415 31.0518 74.6268 31.8161 73.8045C32.4568 72.7152 30.599 68.5305 27.9517 71.498Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M31.8156 73.8041C31.0517 74.627 30.3706 77.1412 29.4646 77.199C29.0473 77.2269 27.9554 75.9752 27.6292 74.3171L27.6289 74.3154C27.4572 73.4467 27.496 72.4661 27.951 71.4979C29.4571 69.8117 30.7057 70.4347 31.3864 71.4884C31.3884 71.4899 31.3889 71.4933 31.3911 71.4964C31.9054 72.2944 32.091 73.3354 31.8156 73.8041Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M31.8157 73.8047C31.0518 74.6277 30.3706 77.1418 29.4647 77.1996C29.0474 77.2275 27.9554 75.9759 27.6293 74.3178C27.6475 74.3569 28.2531 75.7236 29.4559 75.281C30.0956 75.047 30.1013 74.4497 30.6058 73.7496C31.1697 72.969 31.7764 72.2395 31.3912 71.4971C31.9055 72.295 32.091 73.3361 31.8157 73.8047Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M44.2929 75.6419C50.388 75.6419 55.329 70.4769 55.329 64.1056C55.329 57.7343 50.388 52.5693 44.2929 52.5693C38.1979 52.5693 33.2568 57.7343 33.2568 64.1056C33.2568 70.4769 38.1979 75.6419 44.2929 75.6419Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M27.6624 14.1248C27.6624 14.1248 24.5537 12.3402 21.8492 13.505C21.8492 13.505 21.9339 14.4889 21.7095 16.1713C21.7095 16.1713 25.567 15.5309 27.0798 17.3247C27.0798 17.3247 27.3398 14.9935 27.6624 14.1248Z\"\n          fill=\"#252147\"\n        />\n        <Path\n          d=\"M26.6247 17.7061C25.5665 16.4512 22.7879 16.5948 21.807 16.756C21.6221 16.7867 21.4316 16.7282 21.2959 16.5973C21.1605 16.4666 21.0952 16.2795 21.1201 16.0931C21.3315 14.5081 21.2576 13.5636 21.2568 13.5554C21.2351 13.3014 21.3787 13.0618 21.6135 12.9606C24.5582 11.6927 27.8218 13.5321 27.959 13.611C28.2104 13.7554 28.3206 14.0595 28.2199 14.3306C27.9762 14.9866 27.7408 16.7615 27.6706 17.39C27.6443 17.6256 27.4797 17.8231 27.2522 17.8918C27.1852 17.9121 27.1164 17.92 27.049 17.9165C26.8873 17.9081 26.7327 17.8341 26.6247 17.7061ZM22.4589 13.9099C22.4626 14.2584 22.4512 14.7978 22.3844 15.5C23.418 15.4226 25.2708 15.4228 26.6262 16.198C26.7072 15.6391 26.8192 14.9652 26.9516 14.4334C26.128 14.0592 24.2154 13.3542 22.4589 13.9099Z\"\n          fill=\"#252147\"\n        />\n        <Path\n          d=\"M31.1139 26.4939C32.8402 27.3725 34.4712 27.8774 35.9618 28.1023C36.3252 28.1559 36.679 28.194 37.0246 28.2168C38.1757 28.2925 39.2292 28.1983 40.1618 27.9823C40.8025 27.8354 41.3869 27.6299 41.9073 27.3845C42.4309 27.1381 42.8895 26.8485 43.2752 26.5343C46.0188 24.298 47.8357 17.6448 47.4001 16.2085C46.6964 13.892 41.5417 12.4683 37.3807 12.1666C36.3328 12.0914 35.3467 12.0865 34.5128 12.1563C34.0491 12.1949 33.6142 12.2444 33.2059 12.3015C32.3576 12.4196 31.6251 12.5725 30.996 12.7414C30.0152 13.006 29.2868 13.307 28.7637 13.578C27.9455 14.0004 27.6268 14.3458 27.6268 14.3458C27.6268 14.3458 24.7869 23.275 31.1139 26.4939Z\"\n          fill=\"#252147\"\n        />\n        <G opacity=\"0.4\">\n          <Path\n            d=\"M33.2059 12.302L40.1619 27.9828C40.8026 27.8359 41.387 27.6304 41.9074 27.385L37.3808 12.1671C36.3328 12.0919 35.3468 12.087 34.5129 12.1568C34.0492 12.1954 33.6143 12.2449 33.2059 12.302Z\"\n            fill=\"#4946AF\"\n          />\n        </G>\n        <G opacity=\"0.4\">\n          <Path\n            d=\"M28.7637 13.5784L35.9618 28.1027C36.3253 28.1562 36.679 28.1943 37.0247 28.2172L30.9961 12.7417C30.0153 13.0063 29.2868 13.3073 28.7637 13.5784Z\"\n            fill=\"#4946AF\"\n          />\n        </G>\n        <Path\n          d=\"M8.96896 21.9522C10.1189 23.4919 12.7319 24.8752 16.5397 24.1073C16.7834 24.0588 17.032 24.001 17.2855 23.9327C17.4065 23.9016 17.5292 23.8665 17.6532 23.8301C18.3632 23.6204 18.963 23.3064 19.4696 22.9177C19.8664 22.6142 20.2063 22.2644 20.4978 21.8841C22.7722 18.9015 22.0215 13.9991 22.0215 13.9991C22.0215 13.9991 20.894 12.3343 16.7581 11.5336C16.382 11.4613 15.9677 11.4067 15.5288 11.3723C14.3346 11.2762 12.961 11.3229 11.6806 11.5232C11.2345 11.5931 10.7979 11.6815 10.386 11.7893C9.54419 12.0089 8.79933 12.3075 8.24809 12.6903C7.83608 12.9765 7.53281 13.3097 7.37922 13.6914C6.96278 14.7291 7.43688 19.8971 8.96896 21.9522Z\"\n          fill=\"#252147\"\n        />\n        <G opacity=\"0.4\">\n          <Path\n            d=\"M11.6805 11.5232L19.4695 22.9178C19.8663 22.6142 20.2063 22.2645 20.4977 21.8842L15.5288 11.3723C14.3346 11.2762 12.9609 11.323 11.6805 11.5232Z\"\n            fill=\"#4946AF\"\n          />\n        </G>\n        <G opacity=\"0.4\">\n          <Path\n            d=\"M8.24805 12.6906L16.5396 24.1077C16.7833 24.0592 17.0319 24.0014 17.2854 23.9331L10.386 11.7896C9.54415 12.0092 8.79928 12.3078 8.24805 12.6906Z\"\n            fill=\"#4946AF\"\n          />\n        </G>\n        <Path\n          d=\"M30.8433 27.0213C28.0518 25.6011 26.5166 22.9071 26.4034 19.2305C26.3201 16.5259 27.0293 14.2612 27.0594 14.1661C27.0858 14.083 27.1302 14.0069 27.1893 13.943C27.2619 13.8648 29.0261 12.0219 34.4623 11.5653C38.6396 11.2145 46.9396 12.6455 47.9693 16.0372C48.4944 17.7671 46.508 24.665 43.6512 26.9936C42.2752 28.1151 40.0099 28.9685 37.1544 28.8203C35.2774 28.7229 33.1454 28.1927 30.8433 27.0213ZM34.5622 12.7466C30.2957 13.1049 28.5416 14.3461 28.1507 14.6696C27.8346 15.8048 26.0082 23.2304 31.3838 25.9655C36.6779 28.6589 40.8955 27.7084 42.8987 26.0757C45.54 23.9227 47.156 17.4502 46.8314 16.3806C46.0949 13.9582 38.6636 12.4025 34.5622 12.7466Z\"\n          fill=\"#252147\"\n        />\n        <Path\n          d=\"M8.5411 22.2694C6.93444 20.1153 6.37358 14.7635 6.88352 13.4944C7.9474 10.8447 14.0315 10.4647 16.8597 11.012C21.1635 11.8452 22.4132 13.6254 22.4642 13.7008C22.5086 13.7662 22.5377 13.8406 22.5498 13.9186C22.5629 14.0054 22.8705 16.0728 22.4703 18.3815C21.9231 21.5383 20.3097 23.5989 17.8046 24.3403C16.7705 24.6464 15.8069 24.8044 14.9179 24.8453C11.7942 24.9888 9.59675 23.6852 8.5411 22.2694ZM16.6562 12.057C13.4657 11.4393 8.54033 12.2325 7.8747 13.8899C7.5601 14.6731 7.91705 19.649 9.39787 21.6344C10.5486 23.1777 13.361 24.5447 17.5007 23.3198C22.2233 21.9222 21.6354 15.2642 21.512 14.2172C21.2155 13.889 19.9408 12.6928 16.6562 12.057Z\"\n          fill=\"#252147\"\n        />\n        <Path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M19.5245 15.4974C19.0623 15.5567 18.6 15.6187 18.1376 15.6818C10.249 16.7514 4.61901 23.7392 5.15852 31.5567C9.29164 31.0151 13.6262 28.8496 16.9484 27.2191C19.9131 25.764 22.5178 24.1075 23.4107 20.7222C23.7932 19.2721 26.8647 18.2183 26.3966 16.9518C24.3593 14.7127 19.6964 15.5986 19.5245 15.4974Z\"\n          fill=\"#FF775D\"\n        />\n        <Path\n          d=\"M15.7907 28.5726C16.1166 27.7747 15.9056 26.9349 15.3194 26.6969C14.7331 26.4588 13.9937 26.9126 13.6677 27.7105C13.3418 28.5084 13.5528 29.3483 14.139 29.5863C14.7252 29.8244 15.4647 29.3705 15.7907 28.5726Z\"\n          fill=\"#994D6A\"\n        />\n        <Path\n          d=\"M10.2031 27.2146C10.3526 26.4169 9.99862 25.6818 9.41258 25.5727C8.82654 25.4635 8.23031 26.0217 8.08088 26.8194C7.93144 27.617 8.28538 28.3521 8.87143 28.4613C9.45747 28.5704 10.0537 28.0122 10.2031 27.2146Z\"\n          fill=\"#994D6A\"\n        />\n      </G>\n      <Defs>\n        <ClipPath id=\"clip0_3477_1842\">\n          <Rect width=\"93\" height=\"125\" fill=\"white\" />\n        </ClipPath>\n      </Defs>\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconDiscord(props: IProps): JSX.Element {\n  const size = props.size || 24;\n  const color = props.color || \"#5865F2\";\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 -28.5 256 256\">\n      <Path\n        d=\"M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z\"\n        fill={color}\n        fillRule=\"nonzero\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  width?: number;\n  height?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconDoc(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const width = props.width || 17;\n  const height = props.height || 22;\n  return (\n    <IconSvg\n      style={props.style}\n      className={`inline-block ${props.className ?? \"\"}`}\n      width={width}\n      height={height}\n      viewBox=\"0 0 17 22\"\n      fill=\"none\"\n    >\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M13.1195 20.807H3.88537C2.29826 20.807 1 19.4965 1 17.8944V3.91333C1 2.31123 2.29826 1 3.88537 1H8.06936C8.50281 1 9.00786 1.21825 9.36866 1.43649L15.5725 7.69895C15.9333 8.06281 16.0049 8.50035 16.0049 9.01053V17.894C16.0049 19.4965 14.7793 20.807 13.1195 20.807Z\"\n        stroke={color}\n        strokeWidth=\"1.6\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M8.50246 1.27441V5.68669C8.50246 5.68669 8.42252 8.66424 10.9655 8.61336H15.6448\"\n        stroke={color}\n        strokeWidth=\"1.6\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M4.46238 12.4861H12.5425\"\n        stroke={color}\n        strokeWidth=\"1.6\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M4.42206 16.3123H12.5019\"\n        stroke={color}\n        strokeWidth=\"1.6\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IInnerProps {\n  size?: number;\n  color?: string;\n  bgColor?: string;\n}\n\ninterface IProps extends IInnerProps {\n  isSelected?: boolean;\n}\n\nexport function IconDoc2(props: IProps): JSX.Element {\n  const { isSelected, ...rest } = props;\n  return isSelected ? <IconDoc2Selected {...rest} /> : <IconDoc2Unselected {...rest} />;\n}\n\nexport function IconDoc2Unselected(props: IInnerProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} stroke={color} height={size} viewBox=\"0 0 23 23\" fill=\"none\">\n      <Path d=\"M19 7L15 3H12H5V12V21H12H19V14V7Z\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n      <Path\n        d=\"M14 3V4C14 5.88562 14 6.82843 14.5858 7.41421C15.1716 8 16.1144 8 18 8H19\"\n        strokeWidth=\"1.5\"\n        strokeLinejoin=\"round\"\n      />\n      <Path d=\"M9 12L15 12\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M9 16L13 16\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    </IconSvg>\n  );\n}\n\nfunction IconDoc2Selected(props: IInnerProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.purple;\n  const bgColor = props.bgColor ?? Tailwind_semantic().background.default;\n  return (\n    <IconSvg width={size} stroke={color} height={size} viewBox=\"0 0 23 23\" fill=\"none\">\n      <Path\n        d=\"M19 7L15 3H12H5V12V21H12H19V14V7Z\"\n        fill={color}\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinejoin=\"round\"\n      />\n      <Path d=\"M14 4V3L19 8H18C16.1144 8 15.1716 8 14.5858 7.41421C14 6.82843 14 5.88562 14 4Z\" fill={bgColor} />\n      <Path d=\"M9 12L15 12\" stroke={bgColor} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M9 16L13 16\" stroke={bgColor} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  className?: string;\n  color?: string;\n  width?: number;\n  height?: number;\n}\n\nexport function IconDumbbell(props: IProps): JSX.Element {\n  const width = props.width || 32;\n  const height = props.height || 21;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg\n      style={props.style}\n      className={`inline-block ${props.className ?? \"\"}`}\n      width={width}\n      height={height}\n      viewBox=\"0 0 32 21\"\n      fill=\"none\"\n    >\n      <Path d=\"M9.09267 8.46919L22.7291 8.46919M22.7291 13.0846L9.09272 13.0846\" stroke={color} />\n      <Path\n        d=\"M9.09286 6.16169C9.09286 4.88719 8.17708 3.854 7.04741 3.854C5.91773 3.854 5.00195 4.88719 5.00195 6.16169L5.00195 15.3924C5.00195 16.667 5.91773 17.7001 7.04741 17.7001C8.17708 17.7001 9.09286 16.667 9.09286 15.3924L9.09286 6.16169Z\"\n        stroke={color}\n      />\n      <Path\n        d=\"M5.00156 8.46882C5.00156 7.19432 4.08577 6.16113 2.9561 6.16113C1.82643 6.16113 0.910644 7.19432 0.910644 8.46882L0.910644 13.0842C0.910643 14.3587 1.82643 15.3919 2.9561 15.3919C4.08577 15.3919 5.00156 14.3587 5.00156 13.0842L5.00156 8.46882Z\"\n        stroke={color}\n      />\n      <Path\n        d=\"M30.9105 8.46882C30.9105 7.19432 29.9947 6.16113 28.865 6.16113C27.7354 6.16113 26.8196 7.19432 26.8196 8.46882L26.8196 13.0842C26.8196 14.3587 27.7354 15.3919 28.865 15.3919C29.9947 15.3919 30.9105 14.3587 30.9105 13.0842L30.9105 8.46882Z\"\n        stroke={color}\n      />\n      <Path\n        d=\"M26.8199 6.16169C26.8199 4.88719 25.9041 3.854 24.7745 3.854C23.6448 3.854 22.729 4.88719 22.729 6.16169L22.729 15.3924C22.729 16.667 23.6448 17.7001 24.7745 17.7001C25.9041 17.7001 26.8199 16.667 26.8199 15.3925L26.8199 6.16169Z\"\n        stroke={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconDuplicate2Props {\n  width?: number;\n  height?: number;\n}\n\nexport function IconDuplicate2(props: IIconDuplicate2Props): JSX.Element {\n  const color = Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={props.width ?? 18} height={props.height ?? 19} viewBox=\"0 0 18 19\" fill=\"none\">\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M0 3.26562C0 1.78999 1.19624 0.59375 2.67188 0.59375H10.9844C12.46 0.59375 13.6562 1.78999 13.6562 3.26562V4.75H15.1406C16.6163 4.75 17.8125 5.94625 17.8125 7.42188V15.7344C17.8125 17.21 16.6163 18.4062 15.1406 18.4062H6.82812C5.3525 18.4062 4.15625 17.21 4.15625 15.7344V14.25H2.67188C1.19624 14.25 0 13.0538 0 11.5781V3.26562ZM5.34375 15.7344C5.34375 16.5542 6.00831 17.2188 6.82812 17.2188H15.1406C15.9604 17.2188 16.625 16.5542 16.625 15.7344V7.42188C16.625 6.60206 15.9604 5.9375 15.1406 5.9375H6.82812C6.00831 5.9375 5.34375 6.60206 5.34375 7.42188V15.7344ZM12.4688 4.75H6.82812C5.3525 4.75 4.15625 5.94625 4.15625 7.42188V13.0625H2.67188C1.85208 13.0625 1.1875 12.3979 1.1875 11.5781V3.26562C1.1875 2.44583 1.85208 1.78125 2.67188 1.78125H10.9844C11.8042 1.78125 12.4688 2.44583 12.4688 3.26562V4.75Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEdit2Props {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEdit2(props: IIconEdit2Props): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Path\n        d=\"M13.4486 6.95168L17.0486 10.5517M4.44867 19.5517L8.81465 18.672C9.04643 18.6253 9.25925 18.5111 9.42639 18.3439L19.2001 8.56486C19.6687 8.096 19.6683 7.33602 19.1993 6.86755L17.1289 4.79948C16.6601 4.33121 15.9005 4.33153 15.4321 4.80019L5.65743 14.5802C5.49062 14.7471 5.37672 14.9595 5.32997 15.1908L4.44867 19.5517Z\"\n        strokeWidth=\"1.6\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  className?: string;\n  color?: string;\n}\n\nexport function IconEditSquare(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={17} height={18} viewBox=\"0 0 17 18\" className={props.className} fill=\"none\">\n      <Path\n        d=\"M8.5 1.91663H2.25C1.55965 1.91663 1 2.47627 1 3.16663V15.6666C1 16.357 1.55965 16.9166 2.25 16.9166H14.75C15.4404 16.9166 16 16.357 16 15.6666V9.41663\"\n        stroke={color}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M8.5 7.74999V9.83332L10.5833 9.20832L16.1193 3.49378C16.6117 2.9855 16.5539 2.16227 15.9953 1.72779C15.5219 1.35961 14.8485 1.40154 14.4244 1.82558L8.5 7.74999Z\"\n        stroke={color}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEditor(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M5.94578 19.2283C4.58004 19.2283 3.47289 18.1496 3.47289 16.819V16.1734C3.47289 14.4517 2.53026 12.8609 1 12.0001C2.53026 11.1393 3.47289 9.54848 3.47289 7.82678V7.18124C3.47289 5.85056 4.58004 4.77185 5.94578 4.77185M18.0545 4.77167C19.4202 4.77167 20.5274 5.85047 20.5274 7.18105V7.8266C20.5274 9.5483 21.47 11.1392 23.0002 11.9999C21.47 12.8607 20.5274 14.4515 20.5274 16.1732V16.8188C20.5274 18.1494 19.4202 19.2282 18.0545 19.2282M17.834 12H18.7316M9.75591 12H14.2437M5.26823 12H6.1658M8.14028 9.34963H9.7559V14.6504H8.14028C7.54582 14.6504 7.0632 14.1754 7.0632 13.5903V10.4098C7.0632 9.82467 7.54582 9.34963 8.14028 9.34963ZM15.8597 14.6504H14.2441V9.34963H15.8597C16.4542 9.34963 16.9368 9.82467 16.9368 10.4098V13.5903C16.9368 14.1754 16.4542 14.6504 15.8597 14.6504Z\"\n        stroke={color}\n        strokeWidth=\"1.8\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentBarbellProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentBarbell(props: IIconEquipmentBarbellProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Path\n        d=\"M6 8L6 16L4.21533 16C3.54413 16 3 15.4559 3 14.7847L3 9.21533C3 8.54413 3.54413 8 4.21533 8L6 8Z\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M9 6L9 18L6.9115 18C6.4081 18 6 17.5103 6 16.9062L6 7.0938C6 6.48972 6.4081 6 6.9115 6L9 6Z\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path d=\"M-1 12.053L2.98113 12.053\" strokeWidth=\"2\" strokeMiterlimit=\"10\" />\n      <Path d=\"M9.5 12L25 12\" strokeWidth=\"2\" strokeMiterlimit=\"10\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentCableProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentCable(props: IIconEquipmentCableProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Path\n        d=\"M0.59082 16.6636L2.95859 15.2261C3.74081 14.7511 4.63837 14.5 5.55348 14.5H18.1381C19.087 14.5 20.0162 14.77 20.8174 15.2785L22.9999 16.6636\"\n        strokeWidth=\"2\"\n      />\n      <Path d=\"M12 6L12 14\" strokeWidth=\"1.5\" />\n      <Path d=\"M5 26.5686V8C5 6.34315 6.34315 5 8 5H16C17.6569 5 19 6.34315 19 8V27\" strokeWidth=\"1.5\" />\n      <Rect x=\"8.93654\" y=\"4.61818\" width=\"6.18182\" height=\"1.23636\" strokeWidth=\"1.23636\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentDumbbellProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentDumbbell(props: IIconEquipmentDumbbellProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Rect x=\"1\" y=\"10.3\" width=\"22\" height=\"4.4\" rx=\"1\" stroke={color} strokeWidth=\"1.5\" />\n      <Rect x=\"3.2002\" y=\"7\" width=\"5.5\" height=\"11\" rx=\"1\" fill=\"#FAF8FF\" stroke={color} strokeWidth=\"1.5\" />\n      <Rect x=\"15.2998\" y=\"7\" width=\"5.5\" height=\"11\" rx=\"1\" fill=\"#FAF8FF\" stroke={color} strokeWidth=\"1.5\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentEzBarProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentEzBar(props: IIconEquipmentEzBarProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Path\n        d=\"M8 11.9556H12.1312C12.2608 11.9556 12.3854 12.0059 12.4787 12.0961L15.6527 15.1643C15.8464 15.3516 16.1537 15.3517 16.3475 15.1646L19.5223 12.1001C19.6155 12.0102 19.7399 11.9599 19.8693 11.9599L29.8889 11.9556\"\n        strokeWidth=\"1.5\"\n      />\n      <Path\n        d=\"M5 8L5 16L3.21533 16C2.54413 16 2 15.4559 2 14.7847L2 9.21533C2 8.54413 2.54413 8 3.21533 8L5 8Z\"\n        fill=\"#FAF8FF\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M8 6L8 12L8 18L5.9115 18C5.4081 18 5 17.5103 5 16.9062L5 7.0938C5 6.48972 5.4081 6 5.9115 6L8 6Z\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path d=\"M-2 12.053L1.98113 12.053\" strokeWidth=\"2\" strokeMiterlimit=\"10\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentKettlebellProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentKettlebell(props: IIconEquipmentKettlebellProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M5.0178 15.4906C5.11793 14.1873 5.64217 12.9968 6.45221 12.0197L5.58858 8.30797C5.35922 7.24573 5.6531 6.15611 6.39448 5.31827C7.13587 4.48042 8.2318 4 9.40152 4H14.5984C15.7681 4 16.8641 4.48051 17.6054 5.31827C18.3467 6.15611 18.6407 7.24573 18.4113 8.30797L17.5434 12.0398C18.444 13.1309 19 14.4782 19 15.9576C19 17.5213 18.3904 18.9428 17.3894 20.0566C16.8278 20.6814 15.9598 21 15.0819 21H8.91812C8.04017 21 7.17222 20.6814 6.61062 20.0566C5.6095 18.9428 5 17.5214 5 15.9576C5 15.8006 5.00587 15.6448 5.0178 15.4906ZM8.63902 7.74238L9.19566 10.3208C10.0565 9.97057 10.9997 9.76274 12 9.76274C12.9996 9.76274 13.9458 9.96352 14.806 10.3131L15.361 7.74238C15.4233 7.45185 15.2865 7.2436 15.1992 7.14517C15.1125 7.04666 14.9181 6.88133 14.5984 6.88133H9.40152C9.08176 6.88133 8.88728 7.04666 8.80074 7.14517C8.71336 7.2436 8.5768 7.45185 8.63902 7.74238Z\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Rect, Line } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentLeverageMachineProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentLeverageMachine(props: IIconEquipmentLeverageMachineProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Rect x=\"7.75\" y=\"5.75\" width=\"7.5\" height=\"11.5\" strokeWidth=\"1.5\" />\n      <Rect width=\"8\" height=\"3\" rx=\"1\" transform=\"matrix(1 0 0 -1 7.5 20)\" strokeWidth=\"1.5\" />\n      <Line\n        y1=\"-0.75\"\n        x2=\"5\"\n        y2=\"-0.75\"\n        transform=\"matrix(-3.68525e-08 -1 -1 5.18468e-08 9.2998 24.615)\"\n        strokeWidth=\"1.5\"\n      />\n      <Line\n        y1=\"-0.75\"\n        x2=\"5\"\n        y2=\"-0.75\"\n        transform=\"matrix(-3.68525e-08 -1 -1 5.18468e-08 12.2998 24.615)\"\n        strokeWidth=\"1.5\"\n      />\n      <Path d=\"M6.20318 8.11542L1.96191 15.5745\" strokeWidth=\"1.5\" />\n      <Path d=\"M16.7499 8.11542L20.9912 15.5745\" strokeWidth=\"1.5\" />\n      <Path d=\"M4 2L3.99857 12\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n      <Line x1=\"19.3676\" y1=\"11.3816\" x2=\"22.5756\" y2=\"9.17996\" strokeWidth=\"1.5\" />\n      <Line\n        y1=\"-0.75\"\n        x2=\"3.89084\"\n        y2=\"-0.75\"\n        transform=\"matrix(-0.824503 -0.565858 -0.565858 0.824503 3.19971 12)\"\n        strokeWidth=\"1.5\"\n      />\n      <Path d=\"M19 2L19 12\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentSmithProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentSmith(props: IIconEquipmentSmithProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Path d=\"M6 5L18 5\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n      <Path d=\"M5.98145 2L5.98144 25\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n      <Path d=\"M17.9814 2L17.9814 25\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n      <Path\n        d=\"M21.5 12L21.5 14L22.0949 14C22.3186 14 22.5 13.864 22.5 13.6962L22.5 12.3038C22.5 12.136 22.3186 12 22.0949 12L21.5 12Z\"\n        fill=\"#FAF8FF\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M20 10.8733L20 14.8733L20.6962 14.8733C20.864 14.8733 21 14.7101 21 14.5087L21 11.2379C21 11.0365 20.864 10.8733 20.6962 10.8733L20 10.8733Z\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M2.5 12L2.5 14L1.90511 14C1.68138 14 1.5 13.864 1.5 13.6962L1.5 12.3038C1.5 12.136 1.68138 12 1.90511 12L2.5 12Z\"\n        fill=\"#FAF8FF\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path\n        d=\"M4 10.8733L4 14.8733L3.30383 14.8733C3.13603 14.8733 3 14.7101 3 14.5087L3 11.2379C3 11.0365 3.13603 10.8733 3.30383 10.8733L4 10.8733Z\"\n        strokeWidth=\"1.5\"\n        strokeMiterlimit=\"10\"\n      />\n      <Path d=\"M4.37988 12.8733L19.6288 12.8733\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n      <Path d=\"M-0.371582 12.8972L1.42983 12.8972\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n      <Path d=\"M22.5698 12.8972L24.3712 12.8972\" strokeWidth=\"1.5\" strokeMiterlimit=\"10\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconEquipmentTrapbarProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEquipmentTrapbar(props: IIconEquipmentTrapbarProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color}>\n      <Path\n        d=\"M23.0423 0.957573L18.9859 5.01397M18.9859 5.01397L11.7946 3.98665C10.8599 3.85311 9.91675 4.16748 9.24905 4.83518L4.83507 9.24916C4.16737 9.91686 3.853 10.86 3.98654 11.7947L5.01386 18.986M18.9859 5.01397L20.0132 12.2052C20.1468 13.14 19.8324 14.0831 19.1647 14.7508L14.7507 19.1648C14.083 19.8325 13.1399 20.1469 12.2051 20.0133L5.01386 18.986M5.01386 18.986L0.957465 23.0424\"\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n      />\n      <Path d=\"M14.1411 4.45044L19.5496 9.85897\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n      <Path d=\"M4.44971 14.1409L9.85824 19.5494\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconExternalLinkProps {\n  className?: string;\n  size?: number;\n  color?: string;\n}\n\nexport function IconExternalLink(props: IIconExternalLinkProps): JSX.Element {\n  return (\n    <IconSvg\n      className={props.className}\n      width={props.size || 20}\n      height={props.size || 20}\n      viewBox=\"0 0 20 20\"\n      fill=\"none\"\n    >\n      <Path\n        d=\"M16 11V17C16 17.5304 15.7893 18.0391 15.4142 18.4142C15.0391 18.7893 14.5304 19 14 19H3C2.46957 19 1.96086 18.7893 1.58579 18.4142C1.21071 18.0391 1 17.5304 1 17V6C1 5.46957 1.21071 4.96086 1.58579 4.58579C1.96086 4.21071 2.46957 4 3 4H9M13 1H19M19 1V7M19 1L8 12\"\n        stroke={props.color || Tailwind_semantic().icon.neutral}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconEyeClosed(props: IProps): JSX.Element {\n  const size = props.size ?? 20;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Path\n        d=\"M14.9499 14.9499C13.5254 16.0358 11.7908 16.6373 9.99992 16.6666C4.16658 16.6666 0.833252 9.99992 0.833252 9.99992C1.86983 8.06816 3.30753 6.38042 5.04992 5.04992M8.24992 3.53325C8.82353 3.39898 9.4108 3.33187 9.99992 3.33325C15.8333 3.33325 19.1666 9.99992 19.1666 9.99992C18.6607 10.9463 18.0575 11.8372 17.3666 12.6582M11.7666 11.7666C11.5377 12.0122 11.2617 12.2092 10.955 12.3459C10.6484 12.4825 10.3173 12.556 9.98166 12.5619C9.64598 12.5678 9.31255 12.5061 9.00126 12.3803C8.68997 12.2546 8.40719 12.0674 8.16979 11.83C7.93239 11.5926 7.74525 11.3099 7.61951 10.9986C7.49377 10.6873 7.43202 10.3539 7.43795 10.0182C7.44387 9.6825 7.51734 9.35146 7.65398 9.04479C7.79062 8.73813 7.98763 8.46212 8.23325 8.23325M0.833252 0.833252L19.1666 19.1666\"\n        stroke={color}\n        strokeWidth=\"1.42657\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Circle } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n}\n\nexport function IconFilter(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 48 48\" fill=\"none\">\n      <Circle cx={34} cy={9} r={5} stroke={color} strokeWidth={2} />\n      <Circle cx={14} cy={24} r={5} stroke={color} strokeWidth={2} />\n      <Circle cx={27} cy={39} r={5} stroke={color} strokeWidth={2} />\n      <Path d=\"M3 9H21\" stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n      <Path d=\"M3 24L9 24\" stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n      <Path d=\"M43 39H32\" stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n      <Path d=\"M3 39L13 39\" stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n      <Path d=\"M39 9L45 9\" stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n      <Path d=\"M43 24H27\" stroke={color} strokeWidth={2} strokeLinecap=\"round\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconFilter2(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M6.46154 12H17.5385M4 7H20M10.1538 17H13.8462\"\n        stroke={color}\n        strokeWidth={2}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconFire(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M5.17608 6.98208C5.35985 6.53496 5.90469 6.36484 6.31021 6.62796L7.61456 7.47427C8.66582 8.15638 10.0492 8.02017 10.9472 7.14613C11.6031 6.50777 11.8885 5.57916 11.7043 4.68263L11.1651 2.05901C10.9994 1.25239 11.9029 0.65652 12.5791 1.12656L16.6322 3.94422C18.6428 5.342 20.0391 7.45933 20.532 9.85799C20.8792 11.5475 20.8792 13.29 20.532 14.9796L20.3267 15.9789C19.9603 17.7615 19.0616 19.391 17.7492 20.6519C14.5375 23.7377 9.46244 23.7377 6.25068 20.6519C4.93833 19.391 4.03958 17.7615 3.67325 15.9789L3.55701 15.4132C3.15592 13.4614 3.34628 11.4343 4.10375 9.59125L5.17608 6.98208Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  isSelected?: boolean;\n}\n\nexport function IconFood(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const semantic = Tailwind_semantic();\n  const color = props.color ?? (props.isSelected ? semantic.icon.purple : semantic.icon.neutral);\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Path\n        d=\"M3 1V6C3 7.1 3.9 8 5 8C6.1 8 7 7.1 7 6V1M5 1V19M14 19V1C16.2 2 17 4.5 17 7.5V11H14\"\n        stroke={color}\n        strokeWidth={props.isSelected ? 2.5 : 2}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconFullTextMode(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M7.58399 6.4209L12.6413 6.4209M10.9112 9.83058L17.2993 9.83058M10.9112 13.2403L17.2993 13.2403M7.58399 16.6499L12.6413 16.6499\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M4.76498 21.5H4.35795C3.23399 21.5 2.32283 20.5407 2.32283 19.3573V12.5357C2.32283 11.8756 1 11.5715 1 11.5715C1 11.5715 2.32283 11.3173 2.32283 10.6072V4.64273C2.32283 3.45933 3.23399 2.5 4.35795 2.5H4.76498M19.235 2.5H19.642C20.766 2.5 21.6772 3.45933 21.6772 4.64273V11.4643C21.6772 12.1244 23 12.4285 23 12.4285C23 12.4285 21.6772 12.6827 21.6772 13.3928V19.3573C21.6772 20.5407 20.766 21.5 19.642 21.5H19.235\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\nexport function IconGoogle(): JSX.Element {\n  return (\n    <IconSvg width={24} height={24} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M23.04 12.2613C23.04 11.4459 22.9668 10.6618 22.8309 9.90906H12V14.3575H18.1891C17.9225 15.795 17.1123 17.0129 15.8943 17.8284V20.7138H19.6109C21.7855 18.7118 23.04 15.7636 23.04 12.2613Z\"\n        fill=\"#4285F4\"\n      />\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 23.4998C15.105 23.4998 17.7081 22.47 19.6109 20.7137L15.8943 17.8282C14.8645 18.5182 13.5472 18.9259 12 18.9259C9.00474 18.9259 6.46951 16.903 5.56519 14.1848H1.72314V17.1644C3.61542 20.9228 7.50451 23.4998 12 23.4998Z\"\n        fill=\"#34A853\"\n      />\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M5.56523 14.1851C5.33523 13.4951 5.20455 12.7581 5.20455 12.0001C5.20455 11.2422 5.33523 10.5051 5.56523 9.81512V6.83557H1.72318C0.944318 8.38807 0.5 10.1444 0.5 12.0001C0.5 13.8558 0.944318 15.6122 1.72318 17.1647L5.56523 14.1851Z\"\n        fill=\"#FBBC05\"\n      />\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M12 5.07386C13.6884 5.07386 15.2043 5.65409 16.3961 6.79364L19.6945 3.49523C17.7029 1.63955 15.0997 0.5 12 0.5C7.50451 0.5 3.61542 3.07705 1.72314 6.83545L5.56519 9.815C6.46951 7.09682 9.00474 5.07386 12 5.07386Z\"\n        fill=\"#EA4335\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconGooglePlay(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M12.6225 12.75L3.17246 3.5775C3.05288 3.82352 2.99374 4.09453 2.99996 4.368V21.135C2.99996 21.456 3.06596 21.723 3.17846 21.936L12.6225 12.75ZM13.17 12.219L16.08 9.3885L4.98296 3.258C4.71764 3.09893 4.41614 3.01014 4.10696 3C3.98064 2.99976 3.85526 3.02159 3.73646 3.0645L13.17 12.219ZM20.184 11.6565L16.782 9.777L13.722 12.7545L16.782 15.7245L20.184 13.8435C21.273 13.2435 21.273 12.258 20.184 11.6565ZM13.176 13.287L3.76346 22.4445C4.09946 22.5555 4.52096 22.503 4.98296 22.2495L16.086 16.11L13.176 13.287Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  size?: number;\n}\n\nexport function IconGraphs(props: IProps): JSX.Element {\n  const size = props.size ?? 20;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} stroke={color} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Path d=\"M1 1V19H19\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path\n        d=\"M4.16663 16.1667L9.62117 10.4067L12.8598 13.8267L19.1666 7.16675\"\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M4.16663 10.1667L9.62117 4.40675L12.8598 7.82675L19.1666 1.16675\"\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, G, Defs, ClipPath, Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { UidFactory_generateUid } from \"../../utils/generator\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconGraphsEProps {\n  width?: number;\n  height?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconGraphsE(props: IIconGraphsEProps): JSX.Element {\n  const width = props.width || 20;\n  const height = props.height || 27;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const id = UidFactory_generateUid(8);\n  return (\n    <IconSvg className={props.className} width={width} height={height} viewBox=\"0 0 20 27\" fill=\"none\">\n      <Path\n        d=\"M9.56288 1.64587V3.3518H12.0819V4.9376H9.56288V6.7877H12.4119V8.43357H7.68188V0H12.4119V1.64587H9.56288Z\"\n        fill={color}\n      />\n      <G clipPath={`url(#${id})`}>\n        <Path d=\"M0.833252 6.06714V26.0898H19.1666\" stroke={color} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n        <Path\n          d=\"M0.833252 24.2696L7.49992 16.9886L11.4583 21.3117L19.1666 12.8931\"\n          stroke={color}\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n        <Path\n          d=\"M0.833252 17.4437L7.49992 10.1627L11.4583 14.4858L19.1666 6.06714\"\n          stroke={color}\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n      </G>\n      <Defs>\n        <ClipPath id={id}>\n          <Rect width=\"20\" height=\"21.843\" fill=\"white\" transform=\"translate(0 5.15698)\" />\n        </ClipPath>\n      </Defs>\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\nexport function IconHandle(): JSX.Element {\n  const color = Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={20} height={20} viewBox=\"0 0 20 20\">\n      <Path\n        fill={color}\n        d=\"M7 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 2m0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 8m0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 14m6-8a2 2 0 1 0-.001-4.001A2 2 0 0 0 13 6m0 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 8m0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 14\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconHeart(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" className={props.className}>\n      <Path\n        d=\"M13.8936 3.07333C13.5531 2.73267 13.1488 2.46243 12.7038 2.27805C12.2588 2.09368 11.7819 1.99878 11.3002 1.99878C10.8186 1.99878 10.3416 2.09368 9.89667 2.27805C9.4517 2.46243 9.04741 2.73267 8.70691 3.07333L8.00024 3.78L7.29358 3.07333C6.60578 2.38554 5.67293 1.99914 4.70024 1.99914C3.72755 1.99914 2.7947 2.38554 2.10691 3.07333C1.41911 3.76112 1.03271 4.69397 1.03271 5.66666C1.03271 6.63935 1.41911 7.5722 2.10691 8.26L8.00024 14.1533L13.8936 8.26C14.2342 7.91949 14.5045 7.51521 14.6889 7.07023C14.8732 6.62526 14.9681 6.14832 14.9681 5.66666C14.9681 5.185 14.8732 4.70807 14.6889 4.26309C14.5045 3.81812 14.2342 3.41383 13.8936 3.07333Z\"\n        stroke={color}\n        strokeWidth=\"1.6\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  fill?: string;\n  className?: string;\n}\n\nexport function IconHelp(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M12 22C17.5229 22 22 17.5229 22 12C22 6.47715 17.5229 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5229 6.47715 22 12 22Z\"\n        stroke={color}\n        fill={props.fill}\n      />\n      <Path\n        d=\"M11.0232 14C11.0232 13.4078 11.1 12.9358 11.2535 12.584C11.407 12.2322 11.7093 11.847 12.1604 11.4284C12.6163 11.0054 12.9047 10.7049 13.0256 10.5267C13.2117 10.2551 13.3047 9.9612 13.3047 9.64505C13.3047 9.22645 13.1954 8.9081 12.9768 8.6899C12.7628 8.46725 12.4465 8.3559 12.0279 8.3559C11.6279 8.3559 11.3047 8.465 11.0582 8.6832C10.8163 8.89695 10.6953 9.1886 10.6953 9.5582H9C9.0093 8.77005 9.28835 8.14665 9.8372 7.688C10.3907 7.22935 11.1209 7 12.0279 7C12.9628 7 13.6907 7.2271 14.2116 7.6813C14.7372 8.1355 15 8.77005 15 9.5849C15 10.3107 14.6465 11.0255 13.9396 11.729L13.0814 12.5372C12.7744 12.8712 12.6163 13.3588 12.607 14H11.0232Z\"\n        fill={color}\n      />\n      <Path d=\"M12.5 15.5H11V17H12.5V15.5Z\" fill={color} />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IInnerProps {\n  size?: number;\n  color?: string;\n}\n\ninterface IProps extends IInnerProps {\n  isSelected?: boolean;\n}\n\nexport function IconHome(props: IProps): JSX.Element {\n  const { isSelected, ...rest } = props;\n  return isSelected ? <IconHomeSelected {...rest} /> : <IconHomeUnselected {...rest} />;\n}\n\nexport function IconHomeUnselected(props: IInnerProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Path\n        d=\"M7 19V12.1528C7 11.5226 7.53726 11.0116 8.2 11.0116H11.8C12.4627 11.0116 13 11.5226 13 12.1528V19M9.30457 1.21117L1.50457 6.48603C1.18802 6.7001 1 7.04665 1 7.41605V17.2882C1 18.2336 1.80589 19 2.8 19H17.2C18.1941 19 19 18.2336 19 17.2882V7.41605C19 7.04665 18.812 6.70011 18.4954 6.48603L10.6954 1.21117C10.2791 0.92961 9.72092 0.929609 9.30457 1.21117Z\"\n        stroke={color}\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n      />\n    </IconSvg>\n  );\n}\n\nexport function IconHomeSelected(props: IInnerProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.purple;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Path\n        d=\"M19 17.2882V7.41605C19 7.04665 18.812 6.70011 18.4954 6.48603L10.6954 1.21117C10.2791 0.92961 9.72092 0.929609 9.30457 1.21117L1.50457 6.48603C1.18802 6.7001 1 7.04665 1 7.41605V17.2882C1 18.2336 1.80589 19 2.8 19H5.999V13.0139C5.999 11.6627 6.97364 10.9798 8.04577 10.9798H12.0459C13.0057 10.9798 14.0968 11.5129 14.0968 13.1144V19H17.2C18.1941 19 19 18.2336 19 17.2882Z\"\n        fill={color}\n        stroke={color}\n        strokeWidth=\"1.5\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Defs, G, Path, LinearGradient, Stop } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  size?: number;\n  className?: string;\n}\n\nexport function IconInstagram(props: IProps): JSX.Element {\n  const size = props.size ?? 40;\n\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 256 256\">\n      <Defs>\n        <LinearGradient\n          id=\"lftIgGradOuter\"\n          gradientUnits=\"userSpaceOnUse\"\n          gradientTransform=\"matrix(1 0 0 -1 0 92)\"\n          x1=\"7.5528\"\n          y1=\"9.5531\"\n          x2=\"82.4473\"\n          y2=\"84.4475\"\n        >\n          <Stop offset=\"0%\" stopColor=\"rgb(255,214,0)\" stopOpacity={1} />\n          <Stop offset=\"50%\" stopColor=\"rgb(255,1,0)\" stopOpacity={1} />\n          <Stop offset=\"100%\" stopColor=\"rgb(216,0,185)\" stopOpacity={1} />\n        </LinearGradient>\n        <LinearGradient\n          id=\"lftIgGradLens\"\n          gradientUnits=\"userSpaceOnUse\"\n          gradientTransform=\"matrix(1 0 0 -1 0 92)\"\n          x1=\"28.6598\"\n          y1=\"30.66\"\n          x2=\"61.3394\"\n          y2=\"63.3397\"\n        >\n          <Stop offset=\"0%\" stopColor=\"rgb(255,100,0)\" stopOpacity={1} />\n          <Stop offset=\"50%\" stopColor=\"rgb(255,1,0)\" stopOpacity={1} />\n          <Stop offset=\"100%\" stopColor=\"rgb(253,0,86)\" stopOpacity={1} />\n        </LinearGradient>\n        <LinearGradient\n          id=\"lftIgGradDot\"\n          gradientUnits=\"userSpaceOnUse\"\n          gradientTransform=\"matrix(1 0 0 -1 0 92)\"\n          x1=\"65.2021\"\n          y1=\"67.2024\"\n          x2=\"72.8391\"\n          y2=\"74.8394\"\n        >\n          <Stop offset=\"0%\" stopColor=\"rgb(243,0,114)\" stopOpacity={1} />\n          <Stop offset=\"100%\" stopColor=\"rgb(229,0,151)\" stopOpacity={1} />\n        </LinearGradient>\n      </Defs>\n      <G transform=\"translate(1.4065934065934016 1.4065934065934016) scale(2.81 2.81)\">\n        <Path\n          d=\"M 89.729 26.447 c -0.219 -4.79 -0.98 -8.061 -2.092 -10.923 c -1.13 -3.003 -2.901 -5.723 -5.19 -7.971 c -2.247 -2.289 -4.968 -4.062 -7.971 -5.192 C 71.614 1.25 68.343 0.49 63.553 0.272 C 58.754 0.053 57.221 0 45 0 S 31.246 0.053 26.447 0.271 c -4.79 0.219 -8.061 0.98 -10.923 2.092 c -3.003 1.13 -5.723 2.901 -7.971 5.19 c -2.289 2.247 -4.062 4.967 -5.192 7.97 C 1.25 18.386 0.49 21.657 0.272 26.446 C 0.052 31.246 0 32.779 0 45 c 0 12.222 0.052 13.755 0.272 18.554 c 0.218 4.789 0.979 8.061 2.092 10.923 c 1.13 3.002 2.901 5.723 5.19 7.97 c 2.247 2.289 4.968 4.061 7.971 5.19 c 2.862 1.113 6.133 1.873 10.923 2.092 C 31.247 89.948 32.78 90 45.001 90 s 13.754 -0.051 18.553 -0.271 c 4.79 -0.219 8.061 -0.979 10.923 -2.092 c 6.045 -2.337 10.823 -7.116 13.16 -13.16 c 1.113 -2.863 1.873 -6.134 2.092 -10.923 C 89.948 58.754 90 57.221 90 45 C 90 32.779 89.948 31.246 89.729 26.447 z M 81.629 63.185 c -0.2 4.388 -0.933 6.77 -1.549 8.356 c -1.514 3.925 -4.616 7.026 -8.54 8.54 c -1.585 0.616 -3.968 1.349 -8.356 1.549 C 58.44 81.847 57.016 81.892 45 81.892 c -12.017 0 -13.44 -0.045 -18.184 -0.262 c -4.387 -0.2 -6.77 -0.933 -8.356 -1.549 c -1.954 -0.722 -3.722 -1.872 -5.174 -3.367 c -1.495 -1.452 -2.645 -3.219 -3.367 -5.174 c -0.616 -1.585 -1.349 -3.968 -1.549 -8.356 c -0.216 -4.745 -0.262 -6.168 -0.262 -18.184 c 0 -12.016 0.046 -13.439 0.262 -18.184 c 0.201 -4.388 0.933 -6.77 1.549 -8.356 c 0.722 -1.955 1.872 -3.723 3.367 -5.175 c 1.452 -1.495 3.22 -2.645 5.175 -3.366 c 1.585 -0.617 3.968 -1.349 8.356 -1.55 C 31.561 8.154 32.984 8.108 45 8.108 h -0.001 c 12.016 0 13.439 0.046 18.184 0.263 c 4.388 0.2 6.77 0.933 8.356 1.549 c 1.954 0.722 3.722 1.872 5.174 3.366 c 1.495 1.452 2.645 3.22 3.366 5.175 c 0.617 1.585 1.35 3.968 1.55 8.356 c 0.216 4.745 0.262 6.168 0.262 18.184 C 81.891 57.017 81.846 58.439 81.629 63.185 z\"\n          fill=\"url(#lftIgGradOuter)\"\n        />\n        <Path\n          d=\"M 44.999 21.892 c -12.762 0 -23.108 10.346 -23.108 23.108 s 10.346 23.108 23.108 23.108 c 12.763 0 23.108 -10.346 23.108 -23.108 S 57.762 21.892 44.999 21.892 z M 44.999 60 C 36.716 59.999 30 53.284 30 45 c 0 -8.284 6.715 -15 15 -15 c 8.284 0.001 15 6.716 15 15 C 60 53.284 53.284 60 44.999 60 z\"\n          fill=\"url(#lftIgGradLens)\"\n        />\n        <Path\n          d=\"M 74.421 20.979 c 0 2.982 -2.418 5.4 -5.4 5.4 c -2.983 0 -5.4 -2.418 -5.4 -5.4 c 0 -2.983 2.418 -5.4 5.4 -5.4 C 72.003 15.579 74.421 17.997 74.421 20.979 z\"\n          fill=\"url(#lftIgGradDot)\"\n        />\n      </G>\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Circle } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  className?: string;\n  isVertical?: boolean;\n}\n\nexport function IconKebab(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const isVertical = !!props.isVertical;\n  const width = isVertical ? 4 : 16;\n  const height = isVertical ? 16 : 4;\n  return (\n    <IconSvg width={width} height={height} viewBox={`0 0 ${width} ${height}`} fill=\"none\" className={props.className}>\n      {[2, 8, 14].map((along) => (\n        <Circle key={along} cx={isVertical ? 2 : along} cy={isVertical ? along : 2} r={2} fill={color} />\n      ))}\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconKettlebell(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M17.9835 15.0706C17.8905 13.7323 17.4037 12.5101 16.6515 11.5068L17.4535 7.69586C17.6664 6.60521 17.3936 5.48647 16.7051 4.62622C16.0167 3.76597 14.999 3.27271 13.9129 3.27271H9.08721C8.00104 3.27271 6.98331 3.76606 6.29496 4.62622C5.60662 5.48647 5.33365 6.60521 5.54662 7.69586L6.35257 11.5275C5.51628 12.6477 5 14.0311 5 15.5501C5 17.1555 5.56605 18.6151 6.49558 19.7586C7.01706 20.4002 7.82301 20.7273 8.63825 20.7273H14.3617C15.177 20.7273 15.9829 20.4002 16.5044 19.7586C17.434 18.6151 18 17.1556 18 15.5501C18 15.3889 17.9945 15.2289 17.9835 15.0706ZM14.6209 7.11515L14.104 9.76248C13.3047 9.40292 12.4289 9.18953 11.5 9.18953C10.5718 9.18953 9.69314 9.39567 8.89443 9.75463L8.37909 7.11515C8.32122 6.81685 8.44821 6.60303 8.52934 6.50197C8.60979 6.40082 8.79029 6.23108 9.08721 6.23108H13.9129C14.2098 6.23108 14.3904 6.40082 14.4707 6.50197C14.5519 6.60303 14.6787 6.81685 14.6209 7.11515Z\"\n        stroke={color}\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconKettlebellSmall(props: IProps): JSX.Element {\n  const size = props.size ?? 14;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 14 14\" fill=\"none\">\n      <Path\n        d=\"M4.96875 7.14282L4.34705 3.82711C4.23166 3.2117 4.70379 2.64282 5.32993 2.64282H9.67007C10.2962 2.64282 10.7683 3.2117 10.6529 3.82711L10.0312 7.14282\"\n        stroke={color}\n      />\n      <Path\n        d=\"M9.30261 6.88928C7.59166 6.28746 5.47318 6.56206 4.1662 7.73766C3.4028 8.42434 3 9.33953 3 10.2888C3 11.232 3.39188 12.0895 4.0354 12.7613C4.39642 13.1382 4.95439 13.3303 5.51879 13.3303H9.48121C10.0456 13.3303 10.6036 13.1382 10.9646 12.7613C11.6082 12.0895 12 11.232 12 10.2888C12 10.1941 11.9962 10.1001 11.9885 10.0071C11.8956 8.87296 11.2302 7.86353 10.1194 7.25335C9.86046 7.11113 9.58664 6.98915 9.30261 6.88928Z\"\n        stroke={color}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconKeyboardClose(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill={color}>\n      <Path d=\"M4 16C3.45 16 2.97917 15.8042 2.5875 15.4125C2.19583 15.0208 2 14.55 2 14V4C2 3.45 2.19583 2.97917 2.5875 2.5875C2.97917 2.19583 3.45 2 4 2H20C20.55 2 21.0208 2.19583 21.4125 2.5875C21.8042 2.97917 22 3.45 22 4V14C22 14.55 21.8042 15.0208 21.4125 15.4125C21.0208 15.8042 20.55 16 20 16H4ZM4 14H20V4H4V14ZM8 13H16V11H8V13ZM5 10H7V8H5V10ZM8 10H10V8H8V10ZM11 10H13V8H11V10ZM14 10H16V8H14V10ZM17 10H19V8H17V10ZM5 7H7V5H5V7ZM8 7H10V5H8V7ZM11 7H13V5H11V7ZM14 7H16V5H14V7ZM17 7H19V5H17V7Z\" />\n      <Path d=\"M9 18.5L12.5 22L16 18.5H9Z\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconLink(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 48 48\" fill=\"none\">\n      <Path\n        d=\"M31.1109 9.11091C33.2587 6.96303 36.7412 6.96303 38.889 9.11091C41.0369 11.2588 41.0369 14.7412 38.889 16.8891L30.639 25.1391C28.4912 27.287 25.0087 27.287 22.8609 25.1391C21.7869 24.0651 20.0457 24.0651 18.9718 25.1391C17.8978 26.213 17.8978 27.9542 18.9718 29.0282C23.2675 33.3239 30.2324 33.3239 34.5281 29.0282L42.7781 20.7782C47.0739 16.4824 47.0739 9.51759 42.7781 5.22183C38.4824 0.926058 31.5175 0.926058 27.2218 5.22183L23.0968 9.34682C22.0228 10.4208 22.0228 12.162 23.0968 13.2359C24.1707 14.3099 25.9119 14.3099 26.9859 13.2359L31.1109 9.11091Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M17.3609 22.8609C19.5088 20.713 22.9912 20.713 25.1391 22.8609C26.213 23.9349 27.9542 23.9349 29.0282 22.8609C30.1021 21.787 30.1021 20.0458 29.0282 18.9718C24.7324 14.6761 17.7676 14.6761 13.4718 18.9718L5.22182 27.2218C0.926058 31.5176 0.926059 38.4824 5.22182 42.7782C9.51759 47.0739 16.4824 47.0739 20.7782 42.7782L24.9032 38.6532C25.9771 37.5792 25.9771 35.838 24.9032 34.7641C23.8292 33.6901 22.088 33.6901 21.0141 34.7641L16.8891 38.8891C14.7412 41.037 11.2588 41.037 9.11091 38.8891C6.96303 36.7412 6.96303 33.2588 9.11091 31.1109L17.3609 22.8609Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconMagnifyingGlass(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg\n      style={props.style}\n      className={props.className}\n      width={props.size || 18}\n      height={props.size || 18}\n      viewBox=\"0 0 18 18\"\n      fill=\"none\"\n    >\n      <Path\n        d=\"M7.56787 13.877C8.9541 13.877 10.2324 13.4287 11.2783 12.6816L15.2129 16.6162C15.3955 16.7988 15.6362 16.8901 15.8936 16.8901C16.4331 16.8901 16.8149 16.4751 16.8149 15.9438C16.8149 15.6948 16.7319 15.4541 16.5493 15.2798L12.6396 11.3618C13.4614 10.2827 13.9512 8.94629 13.9512 7.49365C13.9512 3.98242 11.0791 1.11035 7.56787 1.11035C4.06494 1.11035 1.18457 3.97412 1.18457 7.49365C1.18457 11.0049 4.05664 13.877 7.56787 13.877ZM7.56787 12.499C4.82861 12.499 2.5625 10.2329 2.5625 7.49365C2.5625 4.75439 4.82861 2.48828 7.56787 2.48828C10.3071 2.48828 12.5732 4.75439 12.5732 7.49365C12.5732 10.2329 10.3071 12.499 7.56787 12.499Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IInnerProps {\n  size?: number;\n  color?: string;\n}\n\ninterface IProps extends IInnerProps {\n  isSelected?: boolean;\n}\n\nexport function IconMe(props: IProps): JSX.Element {\n  const { isSelected, ...rest } = props;\n  return isSelected ? <IconMeSelected {...rest} /> : <IconMeUnselected {...rest} />;\n}\n\nfunction IconMeUnselected(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} stroke={color} height={size} viewBox=\"0 0 23 23\" fill=\"none\">\n      <Path d=\"M13.6154 15.9506L12.1148 14.684\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path\n        d=\"M4.96121 10.5659C0.838258 15.7236 2.06397 19.5278 2.06397 19.5278C4.40407 21.2471 8.50406 21.62 11.2106 21.62H16.8184C19.1873 21.5397 21.1064 19.9424 21.1064 16.9673C21.1064 13.6142 18.7045 12.6144 16.5694 12.5375C14.9666 12.5373 13.4865 13.383 12.6913 14.7534L12.5288 15.0332L12.1149 14.6839C10.8944 13.6537 9.09328 13.6537 7.87275 14.6839L7.45884 15.0332L9.01152 11.913\"\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M8.32785 11.6487C11.2072 11.6487 13.5414 9.34999 13.5414 6.51436C13.5414 3.67874 11.2072 1.38 8.32785 1.38C5.44848 1.38 3.11429 3.67874 3.11429 6.51436C3.11429 9.34999 5.44848 11.6487 8.32785 11.6487Z\"\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M8.98961 6.51434C8.98961 6.85719 8.7042 7.15465 8.32785 7.15465C7.95151 7.15465 7.66609 6.85719 7.66609 6.51434C7.66609 6.17148 7.95151 5.87402 8.32785 5.87402C8.7042 5.87402 8.98961 6.17148 8.98961 6.51434Z\"\n        strokeWidth=\"1.5\"\n      />\n    </IconSvg>\n  );\n}\n\nfunction IconMeSelected(props: IInnerProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.purple;\n  return (\n    <IconSvg width={size} fill={color} height={size} viewBox=\"0 0 23 23\">\n      <Path d=\"M8.30005 0.5C5.26253 0.5 2.80005 2.96242 2.80005 5.99995C2.80005 9.03748 5.26253 11.5 8.30005 11.5C11.3376 11.5 13.8 9.03758 13.8 5.99995C13.8 2.96231 11.3376 0.5 8.30005 0.5ZM8.30005 7.4415C7.46566 7.4415 6.83301 6.77183 6.83301 6.00005C6.83301 5.22827 7.46577 4.5586 8.30005 4.5586C9.13433 4.5586 9.76719 5.22817 9.76719 6.00005C9.76719 6.77194 9.13443 7.4415 8.30005 7.4415Z\" />\n      <Path d=\"M16.6388 11.1214H16.6378C15.1977 11.1214 13.8392 11.723 12.8559 12.7388C12.8725 12.7526 12.8911 12.7627 12.9074 12.7768L13.3273 13.139C13.3278 13.1394 13.328 13.1402 13.3286 13.1406L14.4285 14.0908C14.7503 14.3684 14.7899 14.8592 14.5195 15.1874C14.369 15.3698 14.1541 15.4635 13.9383 15.4635C13.765 15.4635 13.5907 15.4032 13.4481 15.2801L11.9271 13.9661C11.3324 13.4538 10.5392 13.2563 9.79198 13.3959C9.77829 13.3989 9.76389 13.403 9.7499 13.4064C9.56819 13.4436 9.39438 13.5178 9.2222 13.5958C8.56928 13.8962 7.08578 14.5966 7.08578 14.5966L7.40245 12.5828C7.36189 12.5774 7.32154 12.5713 7.28118 12.5652C5.77435 12.3447 4.42115 11.6395 3.39172 10.6C0.0801574 15.588 1.15552 19.2258 1.20683 19.3899C1.25631 19.5454 1.35143 19.6816 1.48011 19.7784C4.16765 21.7986 8.72676 22.1 11.2053 22.1L16.9171 22.0995C19.9571 21.9935 22 19.7415 22 16.495C22 13.2531 20.0056 11.2445 16.6388 11.1214Z\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconMuscleSettings(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M7.73291 0.509843C7.13291 0.609843 6.43291 1.00984 5.73291 1.50984C3.63291 1.70984 0.85791 3.11609 0.85791 6.41609C0.85791 7.21609 0.85166 7.61609 0.95166 7.91609C0.55166 8.41609 0.0454102 9.41609 0.0454102 11.4161C0.0454102 11.9161 0.33291 12.3973 0.73291 12.6973L3.13916 14.0098C3.33916 14.1098 3.65166 14.1973 3.95166 14.1973C4.05166 14.1973 4.35791 13.6973 4.35791 13.6973V14.5098C4.35791 14.8098 4.23291 14.9973 4.23291 15.1973C4.13291 15.5973 4.13916 15.9098 4.13916 16.5098C4.13916 18.1098 5.85791 19.5036 6.85791 20.1036C7.15791 20.4036 7.43291 20.5098 7.73291 20.5098H12.3579C12.6579 20.5098 12.9329 20.3973 13.2329 20.1973C14.2329 19.4973 15.8579 18.1036 15.8579 16.6036C15.8579 16.0036 15.8329 15.7223 15.7329 15.3223C15.7329 15.1223 15.6392 14.9036 15.6392 14.6036V13.8223C15.6392 13.8223 15.9454 14.3223 16.0454 14.3223C16.3454 14.3223 16.5579 14.2036 16.8579 14.1036L19.2329 12.8223C19.7329 12.5223 19.9517 12.0098 19.9517 11.5098C20.0517 9.40984 19.5392 8.41609 19.1392 7.91609C19.1392 7.61609 19.2329 7.21609 19.2329 6.41609C19.2329 3.11609 16.4579 1.70984 14.3579 1.50984C13.6579 1.00984 12.9579 0.703593 12.3579 0.603593H8.04541C7.94541 0.503593 7.83291 0.509843 7.73291 0.509843ZM7.95166 2.10359H11.9517C12.3517 2.20359 12.8579 2.42234 13.3579 2.82234L13.6392 3.00984H14.0454C14.4454 3.00984 17.5454 3.41609 17.5454 6.41609C17.5454 7.01609 17.5517 7.39734 17.4517 7.69734L17.3579 8.19734L17.6392 8.60359C17.8392 8.90359 18.2329 9.61609 18.2329 11.4161L16.6392 12.5098C15.5392 12.4098 15.2454 10.9036 15.0454 10.6036C14.8454 12.7036 14.2329 13.6973 14.2329 13.6973V14.8223C14.2329 15.1223 14.3579 15.3098 14.3579 15.5098C14.3579 15.9098 14.4517 16.1036 14.4517 16.6036C14.4517 17.2036 13.6517 18.2098 12.4517 19.0098H7.85791C6.65791 18.2098 5.85791 17.2036 5.85791 16.6036C5.85791 16.1036 5.85166 15.9098 5.95166 15.5098C5.95166 15.3098 6.04541 15.1223 6.04541 14.8223V13.6973C6.04541 13.6973 5.13916 12.6036 5.13916 10.6036C4.53916 11.6036 3.54541 12.5098 3.54541 12.5098L1.63916 11.5098C1.63916 9.80984 2.13291 9.02234 2.23291 8.82234L2.54541 8.41609L2.45166 7.69734C2.45166 7.39734 2.35791 6.91609 2.35791 6.41609C2.35791 3.41609 5.55791 3.00984 5.85791 3.00984H6.23291L6.54541 2.82234C7.04541 2.42234 7.55166 2.20359 7.95166 2.10359ZM7.23291 10.5098C6.73291 10.5098 6.54541 11.1161 6.54541 11.4161C6.54541 11.7161 6.84541 12.1223 7.04541 12.3223C7.24541 12.5223 9.13291 12.7973 9.73291 12.1973C9.93291 11.9973 9.85791 11.4973 9.85791 11.1973C9.75791 10.5973 8.95166 10.5098 8.95166 10.5098H7.23291ZM11.1392 10.5098C11.1392 10.5098 10.3329 10.5973 10.2329 11.1973C10.2329 11.4973 10.1579 11.9973 10.3579 12.1973C10.9579 12.7973 12.8454 12.5223 13.0454 12.3223C13.2454 12.1223 13.5454 11.7161 13.5454 11.4161C13.5454 11.1161 13.3579 10.5098 12.8579 10.5098H11.1392ZM8.04541 12.8536C7.89541 12.8583 7.73916 12.8911 7.63916 12.9161C7.13916 13.0161 6.95166 13.5223 6.95166 13.8223C6.85166 14.0223 7.15791 14.3098 7.35791 14.5098C7.55791 14.7098 9.23291 15.1098 9.73291 14.5098C9.93291 14.3098 9.85791 13.9036 9.85791 13.6036C9.75791 13.0036 9.04541 12.9161 9.04541 12.9161C9.04541 12.9161 8.49541 12.8395 8.04541 12.8536ZM12.0454 12.8536C11.5954 12.8395 11.0454 12.9161 11.0454 12.9161C11.0454 12.9161 10.3329 13.0036 10.2329 13.6036C10.2329 13.9036 10.1579 14.3098 10.3579 14.5098C10.8579 15.1098 12.5329 14.7098 12.7329 14.5098C12.9329 14.3098 13.2392 14.0223 13.1392 13.8223C13.1392 13.5223 12.9517 13.0161 12.4517 12.9161C12.3517 12.8911 12.1954 12.8583 12.0454 12.8536ZM8.17041 15.1661C8.01572 15.1708 7.85791 15.1723 7.73291 15.1973C7.33291 15.2973 7.23291 15.6098 7.23291 16.0098C7.23291 16.6098 7.75166 17.2098 7.95166 17.5098C8.15166 17.8098 9.33291 18.4223 9.73291 17.8223C9.93291 17.6223 9.85791 16.5973 9.85791 16.1973C9.85791 15.2973 9.13916 15.1973 9.13916 15.1973C9.13916 15.1973 8.63447 15.152 8.17041 15.1661ZM11.4517 15.1661C11.1642 15.1786 10.9517 15.1973 10.9517 15.1973C10.9517 15.1973 10.2329 15.2973 10.2329 16.1973C10.2329 16.5973 10.1579 17.6223 10.3579 17.8223C10.7579 18.4223 11.9392 17.8098 12.1392 17.5098C12.3392 17.2098 12.8579 16.6098 12.8579 16.0098C12.8579 15.6098 12.7579 15.2973 12.3579 15.1973C12.1079 15.1473 11.7392 15.1536 11.4517 15.1661Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M23.7999 20.2498L22.9799 19.6198C22.9799 19.5298 22.9799 19.4898 22.9799 19.3998L23.7799 18.7698C23.9399 18.6498 23.9799 18.4298 23.8799 18.2598L23.0299 16.7798C22.9599 16.6498 22.8199 16.5798 22.6799 16.5798C22.6299 16.5798 22.5799 16.5898 22.5299 16.6098L21.5799 16.9898C21.4999 16.9398 21.4699 16.9198 21.3899 16.8798L21.2399 15.8698C21.2099 15.6598 21.0399 15.5098 20.8399 15.5098H19.1299C18.9299 15.5098 18.7599 15.6598 18.7299 15.8498L18.5899 16.8598C18.5599 16.8798 18.5199 16.8898 18.4899 16.9098C18.4599 16.9298 18.4299 16.9498 18.3999 16.9698L17.4499 16.5898C17.3999 16.5698 17.3499 16.5598 17.2999 16.5598C17.1599 16.5598 17.0299 16.6298 16.9499 16.7598L16.0999 18.2398C15.9999 18.4098 16.0399 18.6298 16.1999 18.7498L16.9999 19.3798C16.9999 19.4698 16.9999 19.5098 16.9999 19.6098L16.1999 20.2398C16.0399 20.3598 15.9999 20.5798 16.0999 20.7498L16.9499 22.2298C17.0199 22.3598 17.1599 22.4298 17.2999 22.4298C17.3499 22.4298 17.3999 22.4198 17.4499 22.3998L18.3999 22.0298C18.4799 22.0798 18.5199 22.0998 18.5999 22.1398L18.7499 23.1498C18.7799 23.3498 18.9499 23.4898 19.1499 23.4898H20.8599C21.0599 23.4898 21.2299 23.3398 21.2599 23.1498L21.4099 22.1398C21.4399 22.1198 21.4799 22.1098 21.5099 22.0898C21.5399 22.0698 21.5699 22.0498 21.5999 22.0298L22.5499 22.4098C22.5999 22.4298 22.6499 22.4398 22.6999 22.4398C22.8399 22.4398 22.9699 22.3698 23.0499 22.2398L23.8999 20.7598C23.9999 20.5898 23.9599 20.3698 23.7999 20.2498ZM19.9899 21.0098C19.1599 21.0098 18.4899 20.3398 18.4899 19.5098C18.4899 18.6798 19.1599 18.0098 19.9899 18.0098C20.8199 18.0098 21.4899 18.6798 21.4899 19.5098C21.4899 20.3398 20.8199 21.0098 19.9899 21.0098Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  color?: string;\n  isSelected?: boolean;\n}\n\nexport function IconMuscles2(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg\n      style={props.style}\n      className=\"inline-block\"\n      width={props.size || 20}\n      height={props.size || 20}\n      viewBox=\"0 0 20 20\"\n      fill=\"none\"\n    >\n      {props.isSelected ? (\n        <Path\n          d=\"M7.72803 7.45644e-05C7.828 7.45644e-05 7.94055 -0.00609579 8.04053 0.0938246H12.353C12.953 0.193821 13.6531 0.500105 14.353 1.00007C16.453 1.20007 19.2279 2.60643 19.228 5.90632C19.228 6.70619 19.1343 7.10634 19.1343 7.40632C19.5343 7.90631 20.0467 8.90018 19.9468 11.0001C19.9468 11.5001 19.728 12.0126 19.228 12.3126L16.853 13.5938C16.553 13.6938 16.3405 13.8126 16.0405 13.8126C15.9405 13.8126 15.6343 13.3126 15.6343 13.3126V14.0938C15.6343 14.3937 15.728 14.6126 15.728 14.8126C15.828 15.2125 15.853 15.4939 15.853 16.0938C15.853 17.5938 14.228 18.9876 13.228 19.6876C12.928 19.8876 12.653 20.0001 12.353 20.0001H7.72803C7.42803 20.0001 7.15303 19.8938 6.85303 19.5938C5.85302 18.9938 4.13428 17.6 4.13428 16.0001C4.13428 15.4002 4.12804 15.0875 4.22803 14.6876C4.22809 14.4876 4.35303 14.3 4.35303 14.0001V13.1876C4.35303 13.1876 4.04678 13.6876 3.94678 13.6876C3.64678 13.6876 3.33428 13.6001 3.13428 13.5001L0.728027 12.1876C0.328066 11.8876 0.0405273 11.4063 0.0405273 10.9063C0.0405532 8.90643 0.546788 7.90631 0.946777 7.40632C0.846825 7.10634 0.853027 6.7062 0.853027 5.90632C0.853113 2.60643 3.62806 1.20007 5.72803 1.00007C6.428 0.500099 7.12805 0.100071 7.72803 7.45644e-05ZM8.16553 14.6563C8.01085 14.661 7.85302 14.6626 7.72803 14.6876C7.32809 14.7876 7.22803 15.1001 7.22803 15.5001C7.22816 16.1 7.7468 16.7001 7.94678 17.0001C8.14705 17.3001 9.32799 17.9122 9.72803 17.3126C9.92799 17.1126 9.85306 16.0877 9.85303 15.6876C9.85303 14.7898 9.13787 14.6881 9.13428 14.6876C9.13428 14.6876 8.62959 14.6423 8.16553 14.6563ZM11.4468 14.6563C11.1593 14.6688 10.9468 14.6876 10.9468 14.6876C10.9399 14.6885 10.228 14.7919 10.228 15.6876C10.228 16.0877 10.1531 17.1126 10.353 17.3126C10.7531 17.9122 11.934 17.3001 12.1343 17.0001C12.3343 16.7001 12.8529 16.1 12.853 15.5001C12.853 15.1001 12.753 14.7876 12.353 14.6876C12.103 14.6376 11.7343 14.6438 11.4468 14.6563ZM8.04053 12.3438C7.89054 12.3485 7.73427 12.3813 7.63428 12.4063C7.13432 12.5064 6.94678 13.0126 6.94678 13.3126C6.84707 13.5126 7.15309 13.8001 7.35303 14.0001C7.55349 14.2001 9.22797 14.5998 9.72803 14.0001C9.92798 13.8001 9.85307 13.3938 9.85303 13.0938C9.75324 12.4951 9.04357 12.4067 9.04053 12.4063C9.04053 12.4063 8.49053 12.3298 8.04053 12.3438ZM12.0405 12.3438C11.5905 12.3298 11.0405 12.4063 11.0405 12.4063C11.034 12.4071 10.3276 12.4966 10.228 13.0938C10.228 13.3938 10.1531 13.8001 10.353 14.0001C10.8531 14.5998 12.5275 14.2001 12.728 14.0001C12.928 13.8001 13.234 13.5126 13.1343 13.3126C13.1343 13.0126 12.9468 12.5063 12.4468 12.4063C12.3468 12.3813 12.1905 12.3485 12.0405 12.3438ZM7.22803 10.0001C6.72803 10.0001 6.54053 10.6063 6.54053 10.9063C6.54053 11.2063 6.84053 11.6126 7.04053 11.8126C7.24053 12.0126 9.12803 12.2876 9.72803 11.6876C9.92803 11.4876 9.85303 10.9876 9.85303 10.6876C9.75303 10.0876 8.94678 10.0001 8.94678 10.0001H7.22803ZM11.1343 10.0001C11.1343 10.0001 10.328 10.0876 10.228 10.6876C10.228 10.9876 10.153 11.4876 10.353 11.6876C10.953 12.2876 12.8405 12.0126 13.0405 11.8126C13.2405 11.6126 13.5405 11.2063 13.5405 10.9063C13.5405 10.6063 13.353 10.0001 12.853 10.0001H11.1343Z\"\n          fill={color}\n        />\n      ) : (\n        <Path\n          d=\"M7.6875 7.71605e-05C7.0875 0.100077 6.3875 0.500077 5.6875 1.00008C3.5875 1.20008 0.8125 2.60633 0.8125 5.90633C0.8125 6.70633 0.80625 7.10633 0.90625 7.40633C0.50625 7.90633 0 8.90633 0 10.9063C0 11.4063 0.2875 11.8876 0.6875 12.1876L3.09375 13.5001C3.29375 13.6001 3.60625 13.6876 3.90625 13.6876C4.00625 13.6876 4.3125 13.1876 4.3125 13.1876V14.0001C4.3125 14.3001 4.1875 14.4876 4.1875 14.6876C4.0875 15.0876 4.09375 15.4001 4.09375 16.0001C4.09375 17.6001 5.8125 18.9938 6.8125 19.5938C7.1125 19.8938 7.3875 20.0001 7.6875 20.0001H12.3125C12.6125 20.0001 12.8875 19.8876 13.1875 19.6876C14.1875 18.9876 15.8125 17.5938 15.8125 16.0938C15.8125 15.4938 15.7875 15.2126 15.6875 14.8126C15.6875 14.6126 15.5938 14.3938 15.5938 14.0938V13.3126C15.5938 13.3126 15.9 13.8126 16 13.8126C16.3 13.8126 16.5125 13.6938 16.8125 13.5938L19.1875 12.3126C19.6875 12.0126 19.9062 11.5001 19.9062 11.0001C20.0063 8.90008 19.4937 7.90633 19.0938 7.40633C19.0938 7.10633 19.1875 6.70633 19.1875 5.90633C19.1875 2.60633 16.4125 1.20008 14.3125 1.00008C13.6125 0.500077 12.9125 0.193827 12.3125 0.0938272H12H8C7.9 -0.00617284 7.7875 7.71605e-05 7.6875 7.71605e-05ZM7.90625 1.59383H11.9062C12.3062 1.69383 12.8125 1.91258 13.3125 2.31258L13.5938 2.50008H14C14.4 2.50008 17.5 2.90633 17.5 5.90633C17.5 6.50633 17.5063 6.88758 17.4062 7.18758L17.3125 7.68758L17.5938 8.09383C17.7938 8.39383 18.1875 9.10633 18.1875 10.9063L16.5938 12.0001C15.4937 11.9001 15.2 10.3938 15 10.0938C14.8 12.1938 14.1875 13.1876 14.1875 13.1876V14.3126C14.1875 14.6126 14.3125 14.8001 14.3125 15.0001C14.3125 15.4001 14.4062 15.5938 14.4062 16.0938C14.4062 16.6938 13.6062 17.7001 12.4062 18.5001H7.8125C6.6125 17.7001 5.8125 16.6938 5.8125 16.0938C5.8125 15.5938 5.80625 15.4001 5.90625 15.0001C5.90625 14.8001 6 14.6126 6 14.3126V13.1876C6 13.1876 5.09375 12.0938 5.09375 10.0938C4.49375 11.0938 3.5 12.0001 3.5 12.0001L1.59375 11.0001C1.59375 9.30008 2.0875 8.51258 2.1875 8.31258L2.5 7.90633L2.40625 7.18758C2.40625 6.88758 2.3125 6.40633 2.3125 5.90633C2.3125 2.90633 5.5125 2.50008 5.8125 2.50008H6.1875L6.5 2.31258C7 1.91258 7.50625 1.69383 7.90625 1.59383ZM7.1875 10.0001C6.6875 10.0001 6.5 10.6063 6.5 10.9063C6.5 11.2063 6.8 11.6126 7 11.8126C7.2 12.0126 9.0875 12.2876 9.6875 11.6876C9.8875 11.4876 9.8125 10.9876 9.8125 10.6876C9.7125 10.0876 8.90625 10.0001 8.90625 10.0001H7.1875ZM11.0938 10.0001C11.0938 10.0001 10.2875 10.0876 10.1875 10.6876C10.1875 10.9876 10.1125 11.4876 10.3125 11.6876C10.9125 12.2876 12.8 12.0126 13 11.8126C13.2 11.6126 13.5 11.2063 13.5 10.9063C13.5 10.6063 13.3125 10.0001 12.8125 10.0001H11.0938ZM8 12.3438C7.85 12.3485 7.69375 12.3813 7.59375 12.4063C7.09375 12.5063 6.90625 13.0126 6.90625 13.3126C6.80625 13.5126 7.1125 13.8001 7.3125 14.0001C7.5125 14.2001 9.1875 14.6001 9.6875 14.0001C9.8875 13.8001 9.8125 13.3938 9.8125 13.0938C9.7125 12.4938 9 12.4063 9 12.4063C9 12.4063 8.45 12.3298 8 12.3438ZM12 12.3438C11.55 12.3298 11 12.4063 11 12.4063C11 12.4063 10.2875 12.4938 10.1875 13.0938C10.1875 13.3938 10.1125 13.8001 10.3125 14.0001C10.8125 14.6001 12.4875 14.2001 12.6875 14.0001C12.8875 13.8001 13.1938 13.5126 13.0938 13.3126C13.0938 13.0126 12.9062 12.5063 12.4062 12.4063C12.3062 12.3813 12.15 12.3485 12 12.3438ZM8.125 14.6563C7.97031 14.661 7.8125 14.6626 7.6875 14.6876C7.2875 14.7876 7.1875 15.1001 7.1875 15.5001C7.1875 16.1001 7.70625 16.7001 7.90625 17.0001C8.10625 17.3001 9.2875 17.9126 9.6875 17.3126C9.8875 17.1126 9.8125 16.0876 9.8125 15.6876C9.8125 14.7876 9.09375 14.6876 9.09375 14.6876C9.09375 14.6876 8.58906 14.6423 8.125 14.6563ZM11.4062 14.6563C11.1187 14.6688 10.9062 14.6876 10.9062 14.6876C10.9062 14.6876 10.1875 14.7876 10.1875 15.6876C10.1875 16.0876 10.1125 17.1126 10.3125 17.3126C10.7125 17.9126 11.8938 17.3001 12.0938 17.0001C12.2937 16.7001 12.8125 16.1001 12.8125 15.5001C12.8125 15.1001 12.7125 14.7876 12.3125 14.6876C12.0625 14.6376 11.6938 14.6438 11.4062 14.6563Z\"\n          fill={color}\n        />\n      )}\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconMusclesDProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconMusclesD(props: IIconMusclesDProps): JSX.Element {\n  const size = props.size || 27;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 27 27\" fill=\"none\">\n      <Path\n        d=\"M13.575 4.278C14.389 4.278 15.1003 4.43933 15.709 4.762C16.3177 5.08467 16.787 5.53933 17.117 6.126C17.4543 6.70533 17.623 7.37633 17.623 8.139C17.623 8.89433 17.4543 9.56533 17.117 10.152C16.787 10.7387 16.314 11.1933 15.698 11.516C15.0893 11.8387 14.3817 12 13.575 12H10.682V4.278H13.575ZM13.454 10.372C14.1653 10.372 14.719 10.1777 15.115 9.789C15.511 9.40033 15.709 8.85033 15.709 8.139C15.709 7.42767 15.511 6.874 15.115 6.478C14.719 6.082 14.1653 5.884 13.454 5.884H12.563V10.372H13.454Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M10.4204 0.000104166C9.60707 0.135104 8.65823 0.675102 7.70938 1.3501C4.86284 1.6201 1.10134 3.51853 1.10134 7.97351C1.10134 9.05351 1.09287 9.59351 1.22842 9.9985C0.686219 10.6735 0 12.0235 0 14.7235C0 15.3985 0.389705 16.0482 0.931903 16.4532L4.19356 18.225C4.46466 18.36 4.88825 18.4782 5.2949 18.4782C5.43045 18.4782 5.84557 17.8032 5.84557 17.8032V18.9C5.84557 19.305 5.67614 19.5582 5.67614 19.8282C5.54059 20.3682 5.54906 20.79 5.54906 21.6C5.54906 23.76 7.87882 25.6416 9.23431 26.4516C9.64096 26.8566 10.0137 27 10.4204 27H16.6895C17.0962 27 17.4689 26.8481 17.8756 26.5781C19.2311 25.6331 21.4338 23.7516 21.4338 21.7266C21.4338 20.9166 21.3999 20.5369 21.2643 19.9969C21.2643 19.7269 21.1373 19.4316 21.1373 19.0266V17.9719C21.1373 17.9719 21.5524 18.6469 21.6879 18.6469C22.0946 18.6469 22.3826 18.4866 22.7893 18.3516L26.0086 16.6219C26.6863 16.2169 26.9828 15.525 26.9828 14.85C27.1184 12.0151 26.4237 10.6735 25.8815 9.9985C25.8815 9.59351 26.0086 9.05351 26.0086 7.97351C26.0086 3.51853 22.2471 1.6201 19.4005 1.3501C18.4517 0.675102 17.5028 0.261666 16.6895 0.126666H16.2659H10.844C10.7084 -0.00833331 10.5559 0.000104166 10.4204 0.000104166ZM10.7169 2.15166H16.1389C16.6811 2.28666 17.3673 2.58197 18.045 3.12197L18.4263 3.37509H18.9769C19.5191 3.37509 23.7212 3.92353 23.7212 7.97351C23.7212 8.78351 23.7296 9.29819 23.5941 9.70319L23.467 10.3782L23.8482 10.9266C24.1193 11.3316 24.6531 12.2935 24.6531 14.7235L22.4927 16.2C21.0017 16.065 20.6035 14.0316 20.3324 13.6266C20.0613 16.4616 19.2311 17.8032 19.2311 17.8032V19.3219C19.2311 19.7269 19.4005 19.98 19.4005 20.25C19.4005 20.79 19.5276 21.0516 19.5276 21.7266C19.5276 22.5366 18.4432 23.895 16.8166 24.975H10.5898C8.96321 23.895 7.87882 22.5366 7.87882 21.7266C7.87882 21.0516 7.87034 20.79 8.00589 20.25C8.00589 19.98 8.13297 19.7269 8.13297 19.3219V17.8032C8.13297 17.8032 6.90455 16.3266 6.90455 13.6266C6.09126 14.9766 4.74423 16.2 4.74423 16.2L2.16032 14.85C2.16032 12.5551 2.8296 11.4919 2.96515 11.2219L3.38874 10.6735L3.26166 9.70319C3.26166 9.29819 3.13458 8.64851 3.13458 7.97351C3.13458 3.92353 7.47217 3.37509 7.87882 3.37509H8.38713L8.81072 3.12197C9.48847 2.58197 10.1747 2.28666 10.7169 2.15166ZM9.74262 13.5001C9.06487 13.5001 8.81072 14.3185 8.81072 14.7235C8.81072 15.1285 9.21737 15.6769 9.48847 15.9469C9.75956 16.2169 12.3181 16.5882 13.1314 15.7782C13.4025 15.5082 13.3008 14.8332 13.3008 14.4282C13.1652 13.6182 12.0724 13.5001 12.0724 13.5001H9.74262ZM15.0375 13.5001C15.0375 13.5001 13.9447 13.6182 13.8091 14.4282C13.8091 14.8332 13.7074 15.5082 13.9785 15.7782C14.7918 16.5882 17.3503 16.2169 17.6214 15.9469C17.8925 15.6769 18.2992 15.1285 18.2992 14.7235C18.2992 14.3185 18.045 13.5001 17.3673 13.5001H15.0375ZM10.844 16.6641C10.6406 16.6704 10.4288 16.7147 10.2933 16.7485C9.61554 16.8835 9.36139 17.5669 9.36139 17.9719C9.22584 18.2419 9.64096 18.63 9.91206 18.9C10.1832 19.17 12.4536 19.71 13.1314 18.9C13.4025 18.63 13.3008 18.0816 13.3008 17.6766C13.1652 16.8666 12.1995 16.7485 12.1995 16.7485C12.1995 16.7485 11.4539 16.6451 10.844 16.6641ZM16.2659 16.6641C15.656 16.6451 14.9104 16.7485 14.9104 16.7485C14.9104 16.7485 13.9447 16.8666 13.8091 17.6766C13.8091 18.0816 13.7074 18.63 13.9785 18.9C14.6563 19.71 16.9267 19.17 17.1978 18.9C17.4689 18.63 17.8841 18.2419 17.7485 17.9719C17.7485 17.5669 17.4944 16.8835 16.8166 16.7485C16.6811 16.7147 16.4693 16.6704 16.2659 16.6641ZM11.0134 19.786C10.8037 19.7923 10.5898 19.7944 10.4204 19.8282C9.87817 19.9632 9.74262 20.385 9.74262 20.925C9.74262 21.735 10.4458 22.545 10.7169 22.95C10.988 23.355 12.5892 24.1819 13.1314 23.3719C13.4025 23.1019 13.3008 21.7181 13.3008 21.1782C13.3008 19.9632 12.3265 19.8282 12.3265 19.8282C12.3265 19.8282 11.6424 19.767 11.0134 19.786ZM15.4611 19.786C15.0714 19.8028 14.7834 19.8282 14.7834 19.8282C14.7834 19.8282 13.8091 19.9632 13.8091 21.1782C13.8091 21.7181 13.7074 23.1019 13.9785 23.3719C14.5207 24.1819 16.1219 23.355 16.393 22.95C16.6641 22.545 17.3673 21.735 17.3673 20.925C17.3673 20.385 17.2317 19.9632 16.6895 19.8282C16.3507 19.7607 15.8508 19.7691 15.4611 19.786Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IIconMusclesWProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconMusclesW(props: IIconMusclesWProps): JSX.Element {\n  const size = props.size || 27;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 27 27\" fill=\"none\">\n      <Path\n        d=\"M19.308 4.278L17.295 12H15.018L13.786 6.918L12.51 12H10.233L8.275 4.278H10.288L11.399 9.899L12.774 4.278H14.842L16.162 9.899L17.284 4.278H19.308Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M10.4204 0.000104166C9.60707 0.135104 8.65823 0.675102 7.70938 1.3501C4.86284 1.6201 1.10134 3.51853 1.10134 7.97351C1.10134 9.05351 1.09287 9.59351 1.22842 9.9985C0.686219 10.6735 0 12.0235 0 14.7235C0 15.3985 0.389705 16.0482 0.931903 16.4532L4.19356 18.225C4.46466 18.36 4.88825 18.4782 5.2949 18.4782C5.43045 18.4782 5.84557 17.8032 5.84557 17.8032V18.9C5.84557 19.305 5.67614 19.5582 5.67614 19.8282C5.54059 20.3682 5.54906 20.79 5.54906 21.6C5.54906 23.76 7.87882 25.6416 9.23431 26.4516C9.64096 26.8566 10.0137 27 10.4204 27H16.6895C17.0962 27 17.4689 26.8481 17.8756 26.5781C19.2311 25.6331 21.4338 23.7516 21.4338 21.7266C21.4338 20.9166 21.3999 20.5369 21.2643 19.9969C21.2643 19.7269 21.1373 19.4316 21.1373 19.0266V17.9719C21.1373 17.9719 21.5524 18.6469 21.6879 18.6469C22.0946 18.6469 22.3826 18.4866 22.7893 18.3516L26.0086 16.6219C26.6863 16.2169 26.9828 15.525 26.9828 14.85C27.1184 12.0151 26.4237 10.6735 25.8815 9.9985C25.8815 9.59351 26.0086 9.05351 26.0086 7.97351C26.0086 3.51853 22.2471 1.6201 19.4005 1.3501C18.4517 0.675102 17.5028 0.261666 16.6895 0.126666H16.2659H10.844C10.7084 -0.00833331 10.5559 0.000104166 10.4204 0.000104166ZM10.7169 2.15166H16.1389C16.6811 2.28666 17.3673 2.58197 18.045 3.12197L18.4263 3.37509H18.9769C19.5191 3.37509 23.7212 3.92353 23.7212 7.97351C23.7212 8.78351 23.7296 9.29819 23.5941 9.70319L23.467 10.3782L23.8482 10.9266C24.1193 11.3316 24.6531 12.2935 24.6531 14.7235L22.4927 16.2C21.0017 16.065 20.6035 14.0316 20.3324 13.6266C20.0613 16.4616 19.2311 17.8032 19.2311 17.8032V19.3219C19.2311 19.7269 19.4005 19.98 19.4005 20.25C19.4005 20.79 19.5276 21.0516 19.5276 21.7266C19.5276 22.5366 18.4432 23.895 16.8166 24.975H10.5898C8.96321 23.895 7.87882 22.5366 7.87882 21.7266C7.87882 21.0516 7.87034 20.79 8.00589 20.25C8.00589 19.98 8.13297 19.7269 8.13297 19.3219V17.8032C8.13297 17.8032 6.90455 16.3266 6.90455 13.6266C6.09126 14.9766 4.74423 16.2 4.74423 16.2L2.16032 14.85C2.16032 12.5551 2.8296 11.4919 2.96515 11.2219L3.38874 10.6735L3.26166 9.70319C3.26166 9.29819 3.13458 8.64851 3.13458 7.97351C3.13458 3.92353 7.47217 3.37509 7.87882 3.37509H8.38713L8.81072 3.12197C9.48847 2.58197 10.1747 2.28666 10.7169 2.15166ZM9.74262 13.5001C9.06487 13.5001 8.81072 14.3185 8.81072 14.7235C8.81072 15.1285 9.21737 15.6769 9.48847 15.9469C9.75956 16.2169 12.3181 16.5882 13.1314 15.7782C13.4025 15.5082 13.3008 14.8332 13.3008 14.4282C13.1652 13.6182 12.0724 13.5001 12.0724 13.5001H9.74262ZM15.0375 13.5001C15.0375 13.5001 13.9447 13.6182 13.8091 14.4282C13.8091 14.8332 13.7074 15.5082 13.9785 15.7782C14.7918 16.5882 17.3503 16.2169 17.6214 15.9469C17.8925 15.6769 18.2992 15.1285 18.2992 14.7235C18.2992 14.3185 18.045 13.5001 17.3673 13.5001H15.0375ZM10.844 16.6641C10.6406 16.6704 10.4288 16.7147 10.2933 16.7485C9.61554 16.8835 9.36139 17.5669 9.36139 17.9719C9.22584 18.2419 9.64096 18.63 9.91206 18.9C10.1832 19.17 12.4536 19.71 13.1314 18.9C13.4025 18.63 13.3008 18.0816 13.3008 17.6766C13.1652 16.8666 12.1995 16.7485 12.1995 16.7485C12.1995 16.7485 11.4539 16.6451 10.844 16.6641ZM16.2659 16.6641C15.656 16.6451 14.9104 16.7485 14.9104 16.7485C14.9104 16.7485 13.9447 16.8666 13.8091 17.6766C13.8091 18.0816 13.7074 18.63 13.9785 18.9C14.6563 19.71 16.9267 19.17 17.1978 18.9C17.4689 18.63 17.8841 18.2419 17.7485 17.9719C17.7485 17.5669 17.4944 16.8835 16.8166 16.7485C16.6811 16.7147 16.4693 16.6704 16.2659 16.6641ZM11.0134 19.786C10.8037 19.7923 10.5898 19.7944 10.4204 19.8282C9.87817 19.9632 9.74262 20.385 9.74262 20.925C9.74262 21.735 10.4458 22.545 10.7169 22.95C10.988 23.355 12.5892 24.1819 13.1314 23.3719C13.4025 23.1019 13.3008 21.7181 13.3008 21.1782C13.3008 19.9632 12.3265 19.8282 12.3265 19.8282C12.3265 19.8282 11.6424 19.767 11.0134 19.786ZM15.4611 19.786C15.0714 19.8028 14.7834 19.8282 14.7834 19.8282C14.7834 19.8282 13.8091 19.9632 13.8091 21.1782C13.8091 21.7181 13.7074 23.1019 13.9785 23.3719C14.5207 24.1819 16.1219 23.355 16.393 22.95C16.6641 22.545 17.3673 21.735 17.3673 20.925C17.3673 20.385 17.2317 19.9632 16.6895 19.8282C16.3507 19.7607 15.8508 19.7691 15.4611 19.786Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconNotebook(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const width = props.size || 24;\n  const height = props.size || 24;\n  return (\n    <IconSvg\n      style={props.style}\n      className={`inline-block ${props.className}`}\n      width={width}\n      height={height}\n      viewBox=\"0 0 22 22\"\n      fill=\"none\"\n    >\n      <Path\n        d=\"M18.5 1H4.5C3.39543 1 2.5 1.89543 2.5 3V19C2.5 20.1046 3.39543 21 4.5 21H18.5C19.6046 21 20.5 20.1046 20.5 19V3C20.5 1.89543 19.6046 1 18.5 1Z\"\n        stroke={color}\n        strokeWidth=\"2\"\n      />\n      <Path d=\"M1.5 6H3.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M1.5 16H3.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M7.5 7H15.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M7.5 11H15.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path d=\"M7.5 15H15.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Circle, Rect } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconPause(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size || 24;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 19 19\" fill=\"none\" className={props.className}>\n      <Circle cx={9.81024} cy={9.79712} r={8} stroke={color} strokeWidth={2} />\n      <Rect x={7.31024} y={6.29712} width={1} height={7} rx={0.5} fill={color} stroke={color} />\n      <Rect x={11.3102} y={6.29712} width={1} height={7} rx={0.5} fill={color} stroke={color} />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: Record<string, unknown>;\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconPicture(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const width = props.size || 24;\n  const height = props.size || 24;\n  return (\n    <IconSvg\n      style={props.style}\n      className={props.className}\n      width={width}\n      height={height}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n    >\n      <Path\n        d=\"M0 1.91992V22.0799H24V1.91992H0ZM0.96 2.87992H23.04V21.1199H0.96V2.87992ZM1.92 3.83992V14.7749C1.90687 14.8387 1.90687 14.9062 1.92 14.9699V20.1599H22.08V17.8349C22.0931 17.7712 22.0931 17.7037 22.08 17.6399V3.83992H1.92ZM2.88 4.79992H21.12V16.5899L16.665 12.1349C16.5581 12.0299 16.4081 11.9793 16.26 11.9999C16.1531 12.0112 16.0519 12.0599 15.975 12.1349L13.935 14.1749L9 8.78992C8.88937 8.66992 8.72625 8.6118 8.565 8.63992C8.46937 8.65305 8.38125 8.69617 8.31 8.75992L2.88 13.7699V4.79992ZM16.8 7.19992C16.005 7.19992 15.36 7.84492 15.36 8.63992C15.36 9.43492 16.005 10.0799 16.8 10.0799C17.595 10.0799 18.24 9.43492 18.24 8.63992C18.24 7.84492 17.595 7.19992 16.8 7.19992ZM8.61 9.80992L13.245 14.8649L12.135 15.9749C11.9437 16.1662 11.9437 16.4737 12.135 16.6649C12.3262 16.8562 12.6337 16.8562 12.825 16.6649L14.19 15.2849C14.2575 15.2437 14.3137 15.1874 14.355 15.1199L16.32 13.1699L21.12 17.9699V19.1999H2.88V15.1049L8.61 9.80992Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path, Circle } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconPlay(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size || 19;\n  return (\n    <IconSvg\n      style={props.style}\n      className={`inline-block ${props.className ?? \"\"}`}\n      width={size}\n      height={size}\n      viewBox=\"0 0 19 19\"\n      fill=\"none\"\n    >\n      <Circle cx=\"9.81024\" cy=\"9.79712\" r=\"8\" stroke={color} strokeWidth=\"2\" />\n      <Path\n        d=\"M14.3102 8.93109C14.9769 9.31599 14.9769 10.2782 14.3102 10.6631L8.31024 14.1272C7.64357 14.5121 6.81024 14.031 6.81024 13.2612L6.81024 6.33302C6.81024 5.56322 7.64358 5.08209 8.31024 5.46699L14.3102 8.93109Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  playColor?: string;\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n}\n\nexport function IconPlayCircle(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.purple;\n  const playColor = props.playColor || Tailwind_semantic().background.default;\n  const size = props.size || 20;\n  return (\n    <IconSvg style={props.style} className={props.className} width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n      <Path\n        d=\"M0 10C0 4.47715 4.47715 0 10 0C15.5228 0 20 4.47715 20 10C20 15.5228 15.5228 20 10 20C4.47715 20 0 15.5228 0 10Z\"\n        fill={color}\n      />\n      <Path d=\"M8 6.5L14 10L8 13.5V6.5Z\" fill={playColor} stroke={playColor} strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n    </IconSvg>\n  );\n}\n","import React, { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  color?: string;\n  size?: number;\n  style?: React.CSSProperties;\n  className?: string;\n}\n\nexport function IconPlus2(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size || 18;\n  return (\n    <IconSvg style={props.style} className={props.className} width={size} height={size} viewBox=\"0 0 18 18\" fill=\"none\">\n      <Path\n        d=\"M18 9C18 9.71008 17.4244 10.2857 16.7143 10.2857H10.2857V16.7143C10.2857 17.4244 9.71008 18 9 18C8.28992 18 7.71429 17.4244 7.71429 16.7143V10.2857H1.28571C0.575635 10.2857 0 9.71008 0 9C0 8.28992 0.575634 7.71429 1.28571 7.71429H7.71429V1.28571C7.71429 0.575635 8.28992 0 9 0C9.71008 0 10.2857 0.575634 10.2857 1.28571V7.71429H16.7143C17.4244 7.71429 18 8.28992 18 9Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconPreview(props: IProps): JSX.Element {\n  const size = props.size ?? 20;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 101 101\" fill=\"none\">\n      <Path\n        d=\"M55.7412 94.2857H9.85911C8.18346 94.2857 6.81248 92.8865 6.81248 91.1763V9.833C6.81248 8.1228 8.18346 6.72354 9.85911 6.72354H75.7271C77.4027 6.72354 78.7737 8.1228 78.7737 9.833V30.3243C78.7737 32.0345 80.1447 33.4337 81.8203 33.4337C83.496 33.4337 84.8669 32.0345 84.8669 30.3243V9.833C84.8669 4.68685 80.7692 0.504639 75.7271 0.504639H9.85911C4.81695 0.504639 0.719238 4.68685 0.719238 9.833V91.1763C0.719238 96.3224 4.81695 100.505 9.85911 100.505H55.7412C57.4169 100.505 58.7879 99.1054 58.7879 97.3952C58.7879 95.685 57.4321 94.2857 55.7412 94.2857Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M99.8563 93.6949L86.3293 79.4381C89.8938 74.976 92.0417 69.2702 92.0417 63.0668C92.0417 48.7478 80.6321 37.1029 66.6024 37.1029C52.5727 37.1029 41.1631 48.7478 41.1631 63.0668C41.1631 77.3859 52.5727 89.0308 66.6024 89.0308C72.3605 89.0308 77.6769 87.0718 81.9421 83.7602L95.4996 98.0326C96.0937 98.6545 96.8858 98.9655 97.6779 98.9655C98.4396 98.9655 99.2165 98.6701 99.8106 98.0793C100.999 96.8977 101.029 94.9232 99.8563 93.6949ZM66.5872 82.8274C55.924 82.8274 47.2411 73.9655 47.2411 63.0824C47.2411 52.1993 55.924 43.3374 66.5872 43.3374C77.2503 43.3374 85.9332 52.1993 85.9332 63.0824C85.9332 73.9655 77.2503 82.8274 66.5872 82.8274ZM58.7878 30.3243C58.7878 28.6141 57.4168 27.2148 55.7412 27.2148H19.7454C18.0697 27.2148 16.6987 28.6141 16.6987 30.3243C16.6987 32.0345 18.0697 33.4337 19.7454 33.4337H55.7412C57.4321 33.4337 58.7878 32.0345 58.7878 30.3243ZM40.2796 47.6284C40.2796 45.9182 38.9086 44.5189 37.233 44.5189H19.7454C18.0697 44.5189 16.6987 45.9182 16.6987 47.6284C16.6987 49.3386 18.0697 50.7379 19.7454 50.7379H37.233C38.9238 50.7379 40.2796 49.3541 40.2796 47.6284ZM19.7454 61.8231C18.0697 61.8231 16.6987 63.2223 16.6987 64.9325C16.6987 66.6427 18.0697 68.042 19.7454 68.042H29.1442C30.8198 68.042 32.1908 66.6427 32.1908 64.9325C32.1908 63.2223 30.8198 61.8231 29.1442 61.8231H19.7454Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n  secondaryColor?: string;\n}\n\nexport function IconReddit(props: IProps): JSX.Element {\n  const size = props.size || 24;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const secondaryColor = props.secondaryColor || Tailwind_semantic().icon.white;\n  return (\n    <IconSvg width={size} height={size} className={props.className} style={props.style} viewBox=\"0 0 26 26\" fill=\"none\">\n      <Path\n        d=\"M25.2943 11.7445C25.3958 12.8278 24.8871 13.6315 24.049 14.2517C23.8477 14.4006 23.7855 14.5257 23.8212 14.7842C24.0838 16.7224 23.5183 18.4213 22.242 19.8828C20.6325 21.7251 18.5419 22.7307 16.1941 23.2596C14.5627 23.6267 12.9112 23.7053 11.2505 23.4979C9.35197 23.2596 7.54126 22.7389 5.90896 21.7104C4.47888 20.8098 3.30132 19.6681 2.61693 18.0889C2.13566 16.9782 2.01213 15.8237 2.21068 14.6335C2.23173 14.5057 2.20611 14.4353 2.08899 14.3577C1.37898 13.8827 0.863856 13.257 0.731187 12.3921C0.393565 10.1917 2.35342 8.8527 4.00401 9.2893C4.48162 9.41534 4.92355 9.67566 5.37645 9.88482C5.48716 9.93597 5.56128 9.96885 5.68205 9.88665C7.006 8.98514 8.46171 8.39509 10.0272 8.06444C10.9001 7.87994 11.7803 7.75389 12.6733 7.76029C12.8499 7.7612 12.8846 7.66621 12.9258 7.53468C13.4016 6.0212 13.881 4.50954 14.3586 2.99697C14.5279 2.4599 14.785 2.30919 15.3349 2.42702C16.6589 2.70925 17.9828 2.98692 19.3049 3.27647C19.4687 3.31209 19.562 3.28195 19.6718 3.15407C20.7945 1.85067 22.5366 2.4462 23.0975 3.44179C23.7983 4.68765 23.0133 6.24315 21.5667 6.47606C20.5145 6.64504 19.4724 5.97918 19.1924 4.93426C19.1329 4.71323 19.0286 4.64015 18.8191 4.59722C17.798 4.38989 16.7815 4.16428 15.764 3.94598C15.6835 3.92863 15.6012 3.91949 15.4987 3.90305C15.0723 5.22746 14.6505 6.53909 14.2168 7.88542C14.473 7.91191 14.6963 7.93566 14.9195 7.95849C16.9132 8.16035 18.7624 8.77871 20.4404 9.883C20.5465 9.95241 20.6097 9.94876 20.7131 9.86473C21.618 9.12671 22.6272 8.9961 23.6821 9.4601C24.6566 9.89213 25.1946 10.6822 25.2943 11.7445ZM16.797 15.9908C17.6818 15.9899 18.4687 15.2071 18.465 14.3321C18.4613 13.4005 17.7047 12.6387 16.7879 12.6414C15.8976 12.6442 15.1217 13.4041 15.1226 14.2709C15.1236 15.219 15.8766 15.9917 16.797 15.9908ZM17.1923 19.1639C17.3844 18.942 17.335 18.678 17.1584 18.5035C16.9132 18.2606 16.5966 18.193 16.3505 18.3337C16.2517 18.3903 16.1611 18.4606 16.0641 18.52C14.3687 19.5485 12.5973 19.7083 10.7619 18.9465C10.3859 18.7904 10.04 18.5584 9.68593 18.3528C9.42242 18.1994 9.0912 18.2533 8.83867 18.5081C8.67215 18.6753 8.65111 18.963 8.81763 19.1986C8.91187 19.3311 9.03905 19.4507 9.17264 19.5439C10.32 20.3477 11.6101 20.6829 13.1024 20.7002C13.2644 20.6884 13.5297 20.6738 13.795 20.6491C14.7228 20.5641 15.6076 20.3203 16.4082 19.8398C16.7 19.6626 16.9672 19.4215 17.1923 19.1639ZM9.26413 15.9908C10.0958 15.989 10.8928 15.1742 10.8891 14.3285C10.8854 13.4114 10.1141 12.6414 9.201 12.6423C8.29976 12.6423 7.53211 13.4151 7.53394 14.3202C7.53668 15.2354 8.32081 15.9926 9.26413 15.9908Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M18.4649 14.3319C18.4686 15.207 17.6817 15.9897 16.7969 15.9906C15.8765 15.9916 15.1235 15.2188 15.1226 14.2707C15.1216 13.403 15.8975 12.644 16.7878 12.6412C17.7046 12.6376 18.4603 13.3994 18.4649 14.3319Z\"\n        fill={secondaryColor}\n      />\n      <Path\n        d=\"M17.1585 18.5035C17.3351 18.678 17.3845 18.9419 17.1923 19.1639C16.9673 19.4224 16.7001 19.6635 16.4073 19.8389C15.6067 20.3193 14.7219 20.5632 13.7942 20.6481C13.5288 20.6728 13.2644 20.6874 13.1015 20.6993C11.6092 20.6828 10.3191 20.3467 9.17178 19.5429C9.03728 19.4489 8.91101 19.3301 8.81677 19.1977C8.65025 18.962 8.67129 18.6734 8.83782 18.5072C9.09126 18.2523 9.42156 18.1993 9.68507 18.3519C10.0392 18.5583 10.385 18.7894 10.7611 18.9456C12.5965 19.7083 14.3679 19.5475 16.0633 18.519C16.1603 18.4606 16.2518 18.3902 16.3497 18.3327C16.5967 18.192 16.9133 18.2605 17.1585 18.5035Z\"\n        fill={secondaryColor}\n      />\n      <Path\n        d=\"M10.8901 14.3276C10.8937 15.1734 10.0968 15.9881 9.26511 15.99C8.32087 15.9918 7.53766 15.2346 7.53492 14.3185C7.53309 13.4133 8.30074 12.6406 9.20198 12.6406C10.1151 12.6406 10.8864 13.4106 10.8901 14.3276Z\"\n        fill={secondaryColor}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconReorder(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M14.75 6.375L18.125 3M18.125 3L21.5 6.375M18.125 3L18.125 21M10.25 17.625L6.875 21M6.875 21L3.5 17.625M6.875 21L6.875 3\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconSpeaker(props: IProps): JSX.Element {\n  const size = props.size || 24;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} viewBox=\"0 0 48 48\">\n      <Path\n        d=\"M39.8854 10.3893C39.2443 9.82081 38.2659 9.8821 37.7 10.5262C37.1341 11.1703 37.1952 12.1533 37.8363 12.7218C40.9461 15.4794 42.9037 19.5091 42.9037 24C42.9037 28.4909 40.9461 32.5206 37.8363 35.2782C37.1952 35.8467 37.1341 36.8297 37.7 37.4738C38.2659 38.1179 39.2443 38.1792 39.8854 37.6107C43.633 34.2876 46.0003 29.4206 46.0003 24C46.0003 18.5794 43.633 13.7124 39.8854 10.3893Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M32.3239 16.3656C31.5837 15.9354 30.6365 16.1895 30.2083 16.9332C29.7802 17.6768 30.0331 18.6284 30.7733 19.0586C32.4742 20.0471 33.613 21.8909 33.613 24.0002C33.613 26.1094 32.4742 27.9532 30.7733 28.9418C30.0331 29.3719 29.7802 30.3235 30.2083 31.0672C30.6365 31.8108 31.5837 32.0649 32.3239 31.6348C34.9423 30.113 36.7096 27.2648 36.7096 24.0002C36.7096 20.7355 34.9423 17.8873 32.3239 16.3656Z\"\n        fill={color}\n      />\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M2 17.4509C2 16.3199 2.89543 15.403 4 15.403H12.6291C12.7507 15.403 12.8682 15.3576 12.9595 15.2753L22.6785 6.51473C23.9704 5.35024 26 6.28953 26 8.05191V39.9481C26 41.7105 23.9704 42.6498 22.6785 41.4853L12.9595 32.7247C12.8682 32.6424 12.7507 32.597 12.6291 32.597H4C2.89543 32.597 2 31.6801 2 30.5491V17.4509Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import { JSX, useEffect, useRef } from \"react\";\nimport { Animated, Easing, Platform } from \"react-native\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { useRemScale } from \"../../utils/useRem\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  width: number;\n  height: number;\n  color?: string;\n}\n\nexport function IconSpinner(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const scale = useRemScale();\n  const spinValue = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    const animation = Animated.loop(\n      Animated.timing(spinValue, {\n        toValue: 1,\n        duration: 1000,\n        easing: Easing.linear,\n        useNativeDriver: Platform.OS !== \"web\",\n      })\n    );\n    animation.start();\n    return () => animation.stop();\n  }, []);\n\n  const rotate = spinValue.interpolate({\n    inputRange: [0, 1],\n    outputRange: [\"0deg\", \"360deg\"],\n  });\n\n  return (\n    <Animated.View\n      style={{\n        width: Math.round(props.width * scale),\n        height: Math.round(props.height * scale),\n        transform: [{ rotate }],\n      }}\n    >\n      <IconSvg viewBox=\"0 0 512 512\" width={props.width} height={props.height}>\n        <Path\n          fill={color}\n          d=\"M256,150.6c-9,0-15.1-6-15.1-15.1V15.1C240.9,6,247,0,256,0c9,0,15.1,6,15.1,15.1v120.5C271.1,144.6,265,150.6,256,150.6z\"\n        />\n        <Path\n          fill={color}\n          d=\"M256,361.4c-9,0-15.1,6-15.1,15.1v120.5c0,9,6,15.1,15.1,15.1c9,0,15.1-6,15.1-15.1V376.5 C271.1,367.4,265,361.4,256,361.4\"\n        />\n        <Path\n          fill={color}\n          d=\"M376.6,34c-4.8,0-9.1,2.7-12.2,6.7l-60.2,103.9c-4.5,7.5-1.5,15.1,4.5,19.6c3,1.5,4.5,1.5,7.5,1.5 c4.5,0,9-3,12-6l60.2-103.9c4.5-7.5,1.5-15.1-4.5-19.6C381.5,34.6,379,34,376.6,34\"\n        />\n        <Path\n          fill={color}\n          d=\"M195.9,347.2c-4.8,0-9.1,2.7-12.2,6.7l-60.2,103.9c-4.5,7.5-1.5,15.1,4.5,19.6c3,1.5,4.5,1.5,7.5,1.5 c4.5,0,9-3,12-6l60.2-103.9c4.5-7.5,1.5-15.1-4.5-19.6C200.8,347.9,198.3,347.2,195.9,347.2\"\n        />\n        <Path\n          fill={color}\n          d=\"M134.7,32.5c-2.4,0-4.7,0.7-6.7,2.2c-6,4.5-9,13.6-4.5,19.6l60.2,103.9c3,4.5,7.5,7.5,12,7.5c3,0,4.5,0,7.5-3 c6-4.5,9-13.6,4.5-19.6L147.6,39.2C144.6,35.1,139.5,32.5,134.7,32.5\"\n        />\n        <Path\n          fill={color}\n          d=\"M315.5,345.7c-2.4,0-4.7,0.7-6.7,2.2c-6,4.5-9,13.6-4.5,19.6l60.2,103.9c3,4.5,7.5,7.5,12,7.5 c3,0,4.5-1.5,7.5-3c6-4.5,9-13.6,4.5-19.6l-60.2-103.9C325.3,348.4,320.3,345.7,315.5,345.7\"\n        />\n        <Path\n          fill={color}\n          d=\"M135.5,240.9H15.1C6,240.9,0,247,0,256c0,9,6,15.1,15.1,15.1h120.5c9,0,15.1-6,15.1-15.1 C150.6,247,144.6,240.9,135.5,240.9\"\n        />\n        <Path\n          fill={color}\n          d=\"M496.9,240.9H376.5c-9,0-15.1,6-15.1,15.1c0,9,6,15.1,15.1,15.1h120.5c9,0,15.1-6,15.1-15.1 C512,247,506,240.9,496.9,240.9\"\n        />\n        <Path\n          fill={color}\n          d=\"M48.3,121.3c-4.8,0-9.1,2.7-12.2,6.7c-4.5,7.5-1.5,15.1,4.5,19.6l103.9,60.2c3,1.5,4.5,1.5,7.5,1.5 c4.5,0,9-1.5,12-6c4.5-7.5,1.5-15.1-4.5-19.6L55.7,123.5C53.2,122,50.7,121.3,48.3,121.3\"\n        />\n        <Path\n          fill={color}\n          d=\"M361.5,302c-4.8,0-9.1,2.7-12.2,6.7c-4.5,7.5-1.5,15.1,4.5,19.6l103.9,60.2c3,1.5,4.5,1.5,7.5,1.5 c4.5,0,9-1.5,12.1-6c4.5-7.5,1.5-15.1-4.5-19.6l-103.9-60.2C366.4,302.7,363.9,302,361.5,302\"\n        />\n        <Path\n          fill={color}\n          d=\"M149.8,300.5c-2.4,0-4.7,0.7-6.7,2.2L39.2,362.9c-6,4.5-9,13.6-4.5,19.6c3,4.5,7.5,7.5,12.1,7.5c3,0,6,0,7.5-3 l103.9-60.2c6-4.5,9-13.6,4.5-19.6C159.6,303.2,154.6,300.5,149.8,300.5\"\n        />\n        <Path\n          fill={color}\n          d=\"M463,119.8c-2.4,0-4.7,0.7-6.8,2.2l-103.9,60.2c-6,4.5-9,13.6-4.5,19.6c3,4.5,7.5,7.5,12,7.5c3,0,4.5,0,7.5-3 l103.9-60.2c6-4.5,9-13.6,4.5-19.6C472.8,122.5,467.8,119.8,463,119.8\"\n        />\n      </IconSvg>\n    </Animated.View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n  isSelected?: boolean;\n  style?: Record<string, unknown>;\n}\n\nexport function IconStar(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} style={props.style} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M12 2.82422C12.1472 3.05725 12.3218 3.41509 12.5869 3.9707L14.3076 7.57812C14.3817 7.73337 14.4588 7.89706 14.5391 8.03125C14.6274 8.17884 14.7459 8.33754 14.9277 8.46973C15.1097 8.60196 15.2981 8.66571 15.4658 8.7041C15.6182 8.73895 15.7974 8.76172 15.9678 8.78418L19.9307 9.30664C20.5401 9.38697 20.9341 9.44193 21.2012 9.50977C21.025 9.72168 20.7391 9.99837 20.293 10.4219L17.3936 13.1738C17.2688 13.2922 17.138 13.4164 17.0352 13.5342C16.922 13.6638 16.8068 13.8252 16.7373 14.0391C16.6678 14.253 16.6663 14.4516 16.6816 14.623C16.6956 14.7787 16.7285 14.956 16.7598 15.125L17.4883 19.0557C17.6002 19.6603 17.6685 20.0522 17.6865 20.3271C17.4306 20.2251 17.0793 20.0383 16.5391 19.7451L13.0254 17.8379C12.8743 17.7559 12.716 17.6697 12.5723 17.6084C12.414 17.5409 12.225 17.4814 12 17.4814C11.775 17.4814 11.586 17.5409 11.4277 17.6084C11.284 17.6697 11.1257 17.7559 10.9746 17.8379L7.46094 19.7451C6.92007 20.0387 6.5685 20.2251 6.3125 20.3271C6.33047 20.0522 6.39976 19.6603 6.51172 19.0557L7.24023 15.125C7.27153 14.956 7.30443 14.7787 7.31836 14.623C7.32986 14.4944 7.33204 14.3505 7.30273 14.1963L7.2627 14.0391L7.20215 13.8887C7.13525 13.7468 7.04972 13.6314 6.96484 13.5342C6.86204 13.4164 6.73118 13.2922 6.60645 13.1738L3.70703 10.4219C3.26056 9.99805 2.97396 9.72174 2.79785 9.50977C3.06492 9.44182 3.45923 9.38706 4.06934 9.30664L8.03223 8.78418C8.20264 8.76172 8.38181 8.73895 8.53418 8.7041C8.70192 8.66571 8.89026 8.60196 9.07227 8.46973C9.2541 8.33754 9.37263 8.17884 9.46094 8.03125C9.54123 7.89706 9.61831 7.73337 9.69238 7.57812L11.4131 3.9707C11.6782 3.41509 11.8528 3.05725 12 2.82422Z\"\n        stroke={props.isSelected ? undefined : color}\n        fill={!props.isSelected ? undefined : color}\n        strokeWidth={1.5}\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Svg } from \"../primitives/svg\";\nimport type { ISvgComponentProps } from \"../primitives/svg\";\nimport { useRemScale } from \"../../utils/useRem\";\n\ntype IIconSvgProps = ISvgComponentProps & { noRemScale?: boolean };\n\nexport function IconSvg(props: IIconSvgProps): JSX.Element {\n  const { noRemScale, width, height, ...rest } = props;\n  const scale = useRemScale();\n  return (\n    <Svg\n      {...rest}\n      width={noRemScale ? width : IconSvg_scale(width, scale)}\n      height={noRemScale ? height : IconSvg_scale(height, scale)}\n    />\n  );\n}\n\nfunction IconSvg_scale(value: ISvgComponentProps[\"width\"], scale: number): ISvgComponentProps[\"width\"] {\n  return typeof value === \"number\" ? Math.round(value * scale) : value;\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconSwap(props: IProps): JSX.Element {\n  const size = props.size ?? 20;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 61 61\" fill=\"none\">\n      <Path\n        d=\"M58.1574 22.1348C57.5571 20.6512 55.7714 19.8993 54.1693 20.4551C52.5663 21.011 51.7552 22.6646 52.3555 24.1481C59.2796 41.2586 41.8841 58.2121 23.1916 52.9027L23.5299 52.2149C24.5126 50.2145 22.7941 47.9577 20.4102 48.1715L12.2173 48.9076C9.84535 49.1205 8.6117 51.6386 9.99591 53.4307L14.7799 59.6324C16.1662 61.4292 19.1353 61.1587 20.1211 59.1528L20.6079 58.1619C44.4367 65.5906 66.9846 43.9496 58.1574 22.1348Z\"\n        fill={color}\n      />\n      <Path\n        d=\"M37.0226 8.79372L36.6846 9.48426C35.6988 11.5017 37.4338 13.7572 39.8016 13.5435L47.9862 12.8044C50.346 12.5917 51.5956 10.0721 50.2066 8.26369L45.4258 2.03673C44.0418 0.233869 41.0743 0.504485 40.0894 2.51824L39.602 3.51485C16.1746 -3.82537 -6.86073 17.459 2.08804 39.6812C2.68776 41.1706 4.4719 41.9264 6.07251 41.3684C7.67312 40.8104 8.48445 39.1503 7.88473 37.66C0.889587 20.2893 18.5625 3.52512 37.0226 8.79372Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconSwapSmall(props: IProps): JSX.Element {\n  const size = props.size ?? 12;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg className={props.className} width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\" stroke={color}>\n      <Path\n        d=\"M9.71106 4.00694C9.01609 2.80719 7.71714 2 6.22939 2C4.54256 2 3.09843 3.03768 2.50217 4.50868M8.4903 4.50868H10.5V2.50174M2.78894 8.02083C3.48391 9.22059 4.78286 10.0278 6.27061 10.0278C7.95744 10.0278 9.40157 8.9901 9.99783 7.5191M4.0097 7.5191H2V9.52604\"\n        strokeWidth=\"1.2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { G, Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  width?: number;\n  height?: number;\n  className?: string;\n}\n\nexport function IconTiktok(props: IProps): JSX.Element {\n  const { width, height } = props;\n\n  return (\n    <IconSvg\n      width={width || 42}\n      height={height || 42}\n      viewBox=\"-0.32296740998066475 -3.1283528999801873 42.68446958125966 42.128352899980186\"\n    >\n      <G fill=\"none\">\n        <Path\n          d=\"M14 15.599v-1.486A13.1 13.1 0 0 0 12.337 14C5.535 14 0 19.18 0 25.547 0 29.452 2.086 32.91 5.267 35c-2.13-2.132-3.315-4.942-3.313-7.861 0-6.276 5.377-11.394 12.046-11.54\"\n          fill=\"#00f2ea\"\n        />\n        <Path\n          d=\"M14.327 32c2.876 0 5.221-2.273 5.328-5.107l.01-25.292h4.65A8.72 8.72 0 0 1 24.164 0h-6.35l-.011 25.293c-.106 2.832-2.453 5.105-5.328 5.105a5.329 5.329 0 0 1-2.476-.61A5.34 5.34 0 0 0 14.327 32m18.672-21.814V8.78a8.818 8.818 0 0 1-4.81-1.421A8.85 8.85 0 0 0 33 10.186\"\n          fill=\"#00f2ea\"\n        />\n        <Path\n          d=\"M28 7.718A8.63 8.63 0 0 1 25.832 2h-1.697A8.735 8.735 0 0 0 28 7.718M12.325 20.065c-2.94.004-5.322 2.361-5.325 5.27A5.267 5.267 0 0 0 9.854 30a5.2 5.2 0 0 1-1.008-3.073c.003-2.91 2.385-5.268 5.325-5.271.55 0 1.075.09 1.572.244v-6.4a11.72 11.72 0 0 0-1.572-.114c-.092 0-.183.006-.274.007v4.916a5.286 5.286 0 0 0-1.572-.244\"\n          fill=\"#ff004f\"\n        />\n        <Path\n          d=\"M32.153 11v4.884a15.15 15.15 0 0 1-8.813-2.811V25.84c0 6.377-5.23 11.565-11.658 11.565-2.485 0-4.789-.778-6.682-2.097A11.67 11.67 0 0 0 13.528 39c6.429 0 11.659-5.188 11.659-11.564V14.668A15.15 15.15 0 0 0 34 17.478v-6.283A8.87 8.87 0 0 1 32.153 11\"\n          fill=\"#ff004f\"\n        />\n        <Path\n          d=\"M23.979 25.42V12.632A15.741 15.741 0 0 0 33 15.448v-4.89a9.083 9.083 0 0 1-4.912-2.82C26.016 6.431 24.586 4.358 24.132 2h-4.747l-.01 25.215c-.11 2.824-2.505 5.09-5.44 5.09-1.754-.002-3.398-.822-4.42-2.204-1.794-.913-2.919-2.716-2.92-4.682.003-2.92 2.44-5.285 5.45-5.289.56 0 1.098.09 1.608.245v-4.933C7.202 15.589 2 20.722 2 27.016c0 3.045 1.219 5.816 3.205 7.885A12.115 12.115 0 0 0 12.045 37c6.58 0 11.934-5.195 11.934-11.58\"\n          fill=\"#000\"\n        />\n      </G>\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconTimerSmall(props: IProps): JSX.Element {\n  const size = props.size ?? 14;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 14 14\" fill=\"none\">\n      <Path\n        d=\"M7.1 5.70455V7.73052M5.6 1H8.6M12.2 7.85714C12.2 10.6975 9.91665 13 7.1 13C4.28335 13 2 10.6975 2 7.85714C2 5.01682 4.28335 2.71429 7.1 2.71429C9.91665 2.71429 12.2 5.01682 12.2 7.85714Z\"\n        stroke={color}\n        strokeLinecap=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconTracker(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path d=\"M2 19.5L22 19.5\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <Path\n        d=\"M2 12.2778L5.33333 15.0556L11.4444 7.83333L15.8889 11.7222L22 4.5\"\n        stroke={color}\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  width?: number;\n  height?: number;\n  color?: string;\n}\n\nexport function IconTrash(props: IProps): JSX.Element {\n  const width = props.width || 17;\n  const height = props.height || 21;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg style={props.style} width={width} height={height} viewBox=\"0 0 17 21\" fill=\"none\">\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M4.86113 2.33333C4.86113 1.40711 5.57621 0.65625 6.45833 0.65625H10.3472C11.2293 0.65625 11.9445 1.40711 11.9445 2.33333V4.73957H15.2019C15.2058 4.73952 15.2096 4.73952 15.2135 4.73957H16.1805C16.5258 4.73957 16.8055 5.03339 16.8055 5.39582C16.8055 5.75829 16.5258 6.05207 16.1805 6.05207H15.7903L14.9885 17.8381C14.8925 19.2499 13.7736 20.3438 12.4256 20.3438H4.37996C3.03192 20.3438 1.91308 19.2499 1.81704 17.8381L1.01527 6.05207H0.625C0.279821 6.05207 0 5.75829 0 5.39582C0 5.03339 0.279821 4.73957 0.625 4.73957H1.59206C1.59594 4.73952 1.59981 4.73952 1.60368 4.73957H4.86113V2.33333ZM2.26846 6.05207L3.06387 17.7445C3.11317 18.4695 3.68771 19.0312 4.37996 19.0312H12.4256C13.1178 19.0312 13.6924 18.4695 13.7417 17.7445L14.5371 6.05207H2.26846ZM10.6945 4.73957H6.11113V2.33333C6.11113 2.13198 6.26658 1.96875 6.45833 1.96875H10.3472C10.539 1.96875 10.6945 2.13198 10.6945 2.33333V4.73957ZM6.45833 8.82293C6.8035 8.82293 7.08333 9.11671 7.08333 9.47918V15.6042C7.08333 15.9666 6.8035 16.2604 6.45833 16.2604C6.11317 16.2604 5.83333 15.9666 5.83333 15.6042V9.47918C5.83333 9.11671 6.11317 8.82293 6.45833 8.82293ZM10.3472 8.82293C10.6924 8.82293 10.9722 9.11671 10.9722 9.47918V15.6042C10.9722 15.9666 10.6924 16.2604 10.3472 16.2604C10.002 16.2604 9.72221 15.9666 9.72221 15.6042V9.47918C9.72221 9.11671 10.002 8.82293 10.3472 8.82293Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconUiMode(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M20.25 18.4167C20.25 19.4292 19.4404 20.25 18.4418 20.25L5.55822 20.25C4.55957 20.25 3.75 19.4292 3.75 18.4167L3.75 15.6667C3.75 14.6541 4.55957 13.8333 5.55822 13.8333L18.4418 13.8333C19.4404 13.8333 20.25 14.6541 20.25 15.6667V18.4167Z\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <Path\n        d=\"M20.25 5.58333C20.25 4.57081 19.4404 3.75 18.4418 3.75L5.55822 3.75C4.55957 3.75 3.75 4.57081 3.75 5.58333L3.75 8.33333C3.75 9.34585 4.55957 10.1667 5.55822 10.1667H18.4418C19.4404 10.1667 20.25 9.34585 20.25 8.33333V5.58333Z\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  style?: Record<string, unknown>;\n  width?: number;\n  height?: number;\n  color?: string;\n}\n\nexport function IconUndo(props: IProps): JSX.Element {\n  const width = props.width || 24;\n  const height = props.height || 24;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={width} height={height} viewBox=\"0 0 48 48\" fill=\"none\">\n      <Path\n        d=\"M2.16645 21.8503C1.94452 21.6506 1.94452 21.3026 2.16645 21.1028L21.0251 4.13007C21.3487 3.83884 21.8643 4.06848 21.8643 4.50381V16.4483C35.1941 16.4483 46 27.2542 46 40.584C46 41.4921 45.9498 42.3885 45.8522 43.2706C45.7924 43.8106 45.034 43.8362 44.8694 43.3185C41.7688 33.5684 32.6415 26.5049 21.8643 26.5049V38.4493C21.8643 38.8847 21.3487 39.1143 21.0251 38.8231L2.16645 21.8503Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n}\n\nexport function IconUser(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const size = props.size || 24;\n  return (\n    <IconSvg style={props.style} className={props.className} width={size} height={size} viewBox=\"0 0 48 48\" fill=\"none\">\n      <Path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M24 4.5C13.2304 4.5 4.5 13.2304 4.5 24C4.5 28.3561 5.92835 32.3786 8.34225 35.6246C13.0342 33.2014 18.3593 31.8333 24 31.8333C29.6407 31.8333 34.9658 33.2014 39.6577 35.6246C42.0716 32.3786 43.5 28.3561 43.5 24C43.5 13.2304 34.7696 4.5 24 4.5ZM41.2135 38.4903C44.5122 34.5756 46.5 29.5199 46.5 24C46.5 11.5736 36.4264 1.5 24 1.5C11.5736 1.5 1.5 11.5736 1.5 24C1.5 29.5199 3.48773 34.5756 6.78646 38.4902C6.79811 38.5045 6.81 38.5186 6.8221 38.5324C10.9493 43.4061 17.1134 46.5 24 46.5C30.8863 46.5 37.0501 43.4064 41.1774 38.5331C41.1896 38.5191 41.2017 38.5048 41.2135 38.4903ZM37.6176 37.9574C33.5048 35.9563 28.8853 34.8333 24 34.8333C19.1147 34.8333 14.4952 35.9563 10.3824 37.9575C13.8968 41.3869 18.7016 43.5 24 43.5C29.2984 43.5 34.1032 41.3869 37.6176 37.9574ZM24 13.8333C20.9624 13.8333 18.5 16.2958 18.5 19.3333C18.5 22.3709 20.9624 24.8333 24 24.8333C27.0376 24.8333 29.5 22.3709 29.5 19.3333C29.5 16.2958 27.0376 13.8333 24 13.8333ZM15.5 19.3333C15.5 14.6389 19.3056 10.8333 24 10.8333C28.6944 10.8333 32.5 14.6389 32.5 19.3333C32.5 24.0278 28.6944 27.8333 24 27.8333C19.3056 27.8333 15.5 24.0278 15.5 19.3333Z\"\n        fill={color}\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  width?: number;\n  height?: number;\n  color?: string;\n  className?: string;\n  style?: Record<string, unknown>;\n}\n\nexport function IconWatch(props: IProps): JSX.Element {\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const width = props.width || 17;\n  const height = props.height || 22;\n  return (\n    <IconSvg width={width} height={height} viewBox=\"0 0 17 22\" fill=\"none\">\n      <Path\n        d=\"M12.187 6.72466L13.2643 5.24117M6.58297 3.66675H10.2496M8.41667 8.2493V11.9167H12.0833M14.8333 11.9167C14.8333 15.4606 11.9605 18.3334 8.41667 18.3334C4.87283 18.3334 2 15.4606 2 11.9167C2 8.37291 4.87283 5.50008 8.41667 5.50008C11.9605 5.50008 14.8333 8.37291 14.8333 11.9167Z\"\n        stroke={color}\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\n\ninterface IProps {\n  size?: number;\n  color?: string;\n  className?: string;\n}\n\nexport function IconWorkoutProgress(props: IProps): JSX.Element {\n  const size = props.size ?? 24;\n  const color = props.color ?? Tailwind_semantic().icon.neutral;\n  return (\n    <IconSvg width={size} height={size} className={props.className} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Path\n        d=\"M18.2798 5.60551L19.9057 3.97961M9.71823 14.1669L13.664 10.2211M3.86475 20.0204L5.63752 18.2476M6.54587 11.1521L12.7331 17.3393L11.393 18.6793C11.07 19.0023 10.5557 19.0117 10.2442 18.7002L5.18493 13.6409C4.87347 13.3295 4.88282 12.8151 5.20582 12.4921L6.54587 11.1521ZM5.85843 14.3146L9.57075 18.0269L8.23069 19.3669C7.90769 19.6899 7.39334 19.6993 7.08188 19.3878L4.49749 16.8034C4.18603 16.492 4.19538 15.9776 4.51838 15.6546L5.85843 14.3146ZM13.5262 5.29966L18.5855 10.3589C18.8969 10.6704 18.8876 11.1847 18.5646 11.5077L17.2245 12.8478L11.0374 6.6606L12.3774 5.32055C12.7004 4.99755 13.2148 4.9882 13.5262 5.29966ZM16.6887 4.61222L19.2731 7.19661C19.5845 7.50807 19.5752 8.02242 19.2522 8.34542L17.9121 9.68547L14.1998 5.97316L15.5399 4.63311C15.8629 4.31011 16.3772 4.30076 16.6887 4.61222Z\"\n        stroke={color}\n        strokeWidth=\"1.75\"\n        strokeMiterlimit=\"10\"\n        strokeLinecap=\"round\"\n      />\n      <Path\n        d=\"M16.8203 18.2479L15.8195 17.246C15.7079 17.1343 15.5306 17.1343 15.4191 17.246C15.3076 17.3576 15.3076 17.5351 15.4191 17.6468L16.6173 18.8463C16.7288 18.9579 16.909 18.9579 17.0205 18.8463L20.0518 15.8145C20.1633 15.7029 20.1633 15.5254 20.0518 15.4138C19.9403 15.3021 19.763 15.3021 19.6514 15.4138L16.8203 18.2479Z\"\n        fill={color}\n        stroke={color}\n        strokeWidth=\"0.875\"\n      />\n    </IconSvg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Path } from \"../primitives/svg\";\nimport { IconSvg } from \"./iconSvg\";\n\ninterface IProps {\n  style?: { [key: string]: string | number };\n  size?: number;\n  className?: string;\n  color?: string;\n  secondaryColor?: string;\n}\n\nexport function IconYoutube(props: IProps): JSX.Element {\n  const size = props.size || 24;\n  const color = props.color || Tailwind_semantic().icon.neutral;\n  const secondaryColor = props.secondaryColor || Tailwind_semantic().icon.white;\n  return (\n    <IconSvg width={size} height={size} className={props.className} style={props.style} viewBox=\"0 0 26 26\" fill=\"none\">\n      <Path\n        d=\"M24.9772 6.98253C24.6892 5.90623 23.8433 5.06041 22.767 4.77229C20.8182 4.24957 13 4.24957 13 4.24957C13 4.24957 5.18183 4.24957 3.23295 4.77229C2.15665 5.06041 1.31083 5.90623 1.02272 6.98253C0.5 8.93141 0.5 13 0.5 13C0.5 13 0.5 17.0686 1.02272 19.0175C1.31083 20.0938 2.15665 20.9396 3.23295 21.2276C5.18183 21.7504 13 21.7504 13 21.7504C13 21.7504 20.8182 21.7504 22.767 21.2276C23.8433 20.9396 24.6892 20.0938 24.9772 19.0175C25.5 17.0686 25.5 13 25.5 13C25.5 13 25.4979 8.93141 24.9772 6.98253Z\"\n        fill={color}\n      />\n      <Path d=\"M10.4978 16.7499L16.9927 13.0003L10.4978 9.25073V16.7499Z\" fill={secondaryColor} />\n    </IconSvg>\n  );\n}\n","import { JSX, ReactNode, useRef } from \"react\";\n\ninterface IImporterProps {\n  children: (onClick: () => void) => ReactNode;\n  onRawFile?: (file: File) => void;\n  onFileSelect?: (contents: string) => void;\n}\n\nexport function Importer(props: IImporterProps): JSX.Element {\n  const fileInput = useRef<HTMLInputElement>(null);\n\n  return (\n    <>\n      <input\n        className=\"hidden\"\n        type=\"file\"\n        ref={fileInput}\n        onChange={() => {\n          const file = fileInput.current?.files?.[0];\n          if (file != null) {\n            if (props.onRawFile != null) {\n              props.onRawFile(file);\n            }\n            const onFileSelect = props.onFileSelect;\n            if (onFileSelect != null) {\n              const reader = new FileReader();\n              reader.addEventListener(\"load\", async (event) => {\n                const result = event.target?.result;\n                if (typeof result === \"string\") {\n                  onFileSelect(result);\n                }\n              });\n              reader.readAsText(file);\n            }\n          }\n        }}\n      />\n      {props.children(() => {\n        fileInput.current?.click();\n      })}\n    </>\n  );\n}\n","import { JSX, useCallback, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { Thunk_importCsvData } from \"../ducks/thunks\";\nimport { FileImport_pickFile } from \"../utils/fileImport\";\nimport { IconHelp } from \"./icons/iconHelp\";\nimport { InternalLink } from \"../internalLink\";\n\ninterface IImporterLiftosaurCsvProps {\n  dispatch: IDispatch;\n}\n\nexport function ImporterLiftosaurCsv(props: IImporterLiftosaurCsvProps): JSX.Element {\n  const [showHelp, setShowHelp] = useState(false);\n\n  const onPress = useCallback(async () => {\n    const contents = await FileImport_pickFile(\"csv\");\n    if (contents == null) {\n      return;\n    }\n    props.dispatch(Thunk_importCsvData(contents));\n  }, [props.dispatch]);\n\n  return (\n    <MenuItemWrapper name=\"Import CSV\">\n      <View className=\"py-1\">\n        <View className=\"flex-row\">\n          <View className=\"flex-1\">\n            <Pressable className=\"py-2\" onPress={onPress}>\n              <Text className=\"text-base text-text-primary\">Import history from CSV file</Text>\n            </Pressable>\n          </View>\n          <View className=\"items-center justify-center ml-2\">\n            <Pressable className=\"p-2\" onPress={() => setShowHelp(!showHelp)}>\n              <IconHelp />\n            </Pressable>\n          </View>\n        </View>\n        {showHelp && (\n          <View>\n            <InternalLink\n              name=\"download-example-csv\"\n              href=\"https://www.liftosaur.com/liftosaur_example_csv.zip\"\n              className=\"text-xs text-center font-bold underline text-text-link\"\n            >\n              Download an example and instructions how to format a CSV file.\n            </InternalLink>\n          </View>\n        )}\n      </View>\n    </MenuItemWrapper>\n  );\n}\n","import { JSX, useCallback } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { Thunk_importProgram } from \"../ducks/thunks\";\nimport { FileImport_pickFile, FileImport_confirm } from \"../utils/fileImport\";\n\ninterface IImporterProgramProps {\n  dispatch: IDispatch;\n}\n\nexport function ImporterProgram(props: IImporterProgramProps): JSX.Element {\n  const onPress = useCallback(async () => {\n    const contents = await FileImport_pickFile(\"json\");\n    if (contents == null) {\n      return;\n    }\n    const ok = await FileImport_confirm(\n      \"Importing new program will overwrite an existing one if a program with the same id exists, or create a new one otherwise.\"\n    );\n    if (ok) {\n      props.dispatch(Thunk_importProgram({ decoded: contents }));\n    }\n  }, [props.dispatch]);\n\n  return (\n    <MenuItemWrapper name=\"Import program from JSON file\" onClick={onPress}>\n      <View className=\"py-3\">\n        <Text className=\"text-base text-text-primary\">Import program from JSON file</Text>\n      </View>\n    </MenuItemWrapper>\n  );\n}\n","import { JSX, useCallback } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { Thunk_importStorage } from \"../ducks/thunks\";\nimport { FileImport_pickFile, FileImport_confirm } from \"../utils/fileImport\";\n\ninterface IImporterStorageProps {\n  dispatch: IDispatch;\n}\n\nexport function ImporterStorage(props: IImporterStorageProps): JSX.Element {\n  const onPress = useCallback(async () => {\n    const contents = await FileImport_pickFile(\"json\");\n    if (contents == null) {\n      return;\n    }\n    const ok = await FileImport_confirm(\n      \"Importing new data will wipe out your current data. If you don't want to lose it, make sure to 'Export data to file' first. Press 'OK' to proceed with import.\"\n    );\n    if (ok) {\n      props.dispatch(Thunk_importStorage(contents));\n    }\n  }, [props.dispatch]);\n\n  return (\n    <MenuItemWrapper name=\"Import data from JSON file\" onClick={onPress}>\n      <View className=\"py-3\">\n        <Text className=\"text-base text-text-primary\">Import data from JSON file</Text>\n      </View>\n    </MenuItemWrapper>\n  );\n}\n","import React, { JSX, Ref, forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { IEither } from \"../utils/types\";\nimport { MathUtils_normalizeNumStr } from \"../utils/math\";\n\nexport const inputClassName =\n  \"inline-block w-full px-4 text-base py-2 leading-normal bg-background-default border border-border-prominent rounded-lg appearance-none focus:outline-none focus:shadow-outline text-base\";\n\nexport type IValidationError = \"required\" | \"pattern-mismatch\";\n\nexport interface IInputHandle {\n  touch: () => void;\n}\n\nexport interface IProps\n  extends Omit<\n    React.InputHTMLAttributes<HTMLInputElement> & React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n    \"ref\" | \"autoCapitalize\" | \"autoCorrect\"\n  > {\n  label?: string;\n  identifier?: string;\n  multiline?: number;\n  changeType?: \"onblur\" | \"oninput\";\n  isLabelOutside?: boolean;\n  defaultValue?: number | string | readonly string[];\n  inputSize?: \"md\" | \"sm\";\n  labelSize?: \"xs\" | \"sm\";\n  errorMessage?: string;\n  patternMessage?: string;\n  requiredMessage?: string;\n  changeHandler?: (e: IEither<string, Set<IValidationError>>) => void;\n  handleRef?: Ref<IInputHandle>;\n  autoCapitalize?: \"none\" | \"sentences\" | \"words\" | \"characters\";\n  autoCorrect?: boolean;\n}\n\nexport function selectInputOnFocus(e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>): boolean | undefined {\n  const target = e.target;\n  if (target instanceof HTMLInputElement) {\n    const handleNumber = target.type === \"number\";\n    if (handleNumber) {\n      target.type = \"text\";\n    }\n    const value = (target as HTMLInputElement).value;\n    target.setSelectionRange(0, value.length);\n    if (handleNumber) {\n      target.type = \"number\";\n    }\n    return false;\n  }\n  return undefined;\n}\n\nexport const Input = forwardRef((props: IProps, ref: Ref<HTMLInputElement> | Ref<HTMLTextAreaElement>): JSX.Element => {\n  const {\n    inputSize,\n    label,\n    changeHandler,\n    errorMessage,\n    patternMessage,\n    requiredMessage,\n    changeType: changeTypeProp,\n    isLabelOutside,\n    labelSize: labelSizeProp,\n    identifier: identifierProp,\n    multiline,\n    value: valueProp,\n    defaultValue: _defaultValue,\n    handleRef: _handleRef,\n    autoCapitalize,\n    autoCorrect,\n    ...otherProps\n  } = props;\n  const autoCorrectStr = autoCorrect == null ? undefined : autoCorrect ? \"on\" : \"off\";\n  const changeType = changeTypeProp || \"onblur\";\n  const identifier = identifierProp || StringUtils_dashcase((label || UidFactory_generateUid(8))?.toLowerCase());\n  const [validationErrors, setValidationErrors] = useState<Set<IValidationError>>(new Set());\n  const [touched, setTouched] = useState(false);\n  const size = inputSize || \"md\";\n\n  const internalInputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n  const setInputRef = useCallback(\n    (el: HTMLInputElement | HTMLTextAreaElement | null) => {\n      internalInputRef.current = el;\n      if (typeof ref === \"function\") {\n        (ref as (instance: HTMLInputElement | HTMLTextAreaElement | null) => void)(el);\n      } else if (ref) {\n        (ref as React.MutableRefObject<HTMLInputElement | HTMLTextAreaElement | null>).current = el;\n      }\n    },\n    [ref]\n  );\n\n  useImperativeHandle(props.handleRef, () => ({\n    touch: () => {\n      setTouched(true);\n      const el = internalInputRef.current;\n      if (el instanceof HTMLInputElement) {\n        validateTarget(el, \"snapshot\");\n      }\n    },\n  }));\n\n  const isControlled = valueProp !== undefined;\n  const [localValue, setLocalValue] = useState(valueProp);\n  useEffect(() => {\n    if (isControlled) {\n      setLocalValue(valueProp);\n    }\n  }, [valueProp, isControlled]);\n\n  const validateTarget = useCallback(\n    (target: HTMLInputElement, displayMode: \"clear-only\" | \"snapshot\") => {\n      if (props.type === \"number\") {\n        const normalized = MathUtils_normalizeNumStr(target.value);\n        if (normalized !== target.value) {\n          target.value = normalized;\n        }\n      }\n      const errors = new Set<IValidationError>();\n      if (target.validity.patternMismatch) {\n        errors.add(\"pattern-mismatch\");\n      }\n      if (target.validity.valueMissing) {\n        errors.add(\"required\");\n      }\n      if (displayMode === \"snapshot\") {\n        setValidationErrors(errors);\n      } else {\n        setValidationErrors((prev) => {\n          const next = new Set<IValidationError>();\n          for (const err of prev) {\n            if (errors.has(err)) {\n              next.add(err);\n            }\n          }\n          return next;\n        });\n      }\n      if (changeHandler != null) {\n        if (errors.size > 0) {\n          changeHandler({ success: false, error: errors });\n        } else {\n          changeHandler({ success: true, data: target.value });\n        }\n      }\n    },\n    [changeHandler, props.type]\n  );\n\n  const onInputHandler = useCallback(\n    (\n      e:\n        | React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>\n        | React.FormEvent<HTMLInputElement | HTMLTextAreaElement>\n    ) => {\n      const target = e.target;\n      if (target instanceof HTMLInputElement) {\n        validateTarget(target, \"clear-only\");\n      }\n    },\n    [validateTarget]\n  );\n\n  let className = \"relative block w-full text-left border rounded-lg appearance-none \";\n  if (errorMessage || (touched && validationErrors.size > 0)) {\n    className += \" border-text-error\";\n  } else {\n    className += \" border-form-inputstroke\";\n  }\n\n  const errorMessages = [];\n  if (errorMessage) {\n    errorMessages.push(errorMessage);\n  }\n  if (touched) {\n    for (const error of validationErrors) {\n      if (error === \"required\") {\n        errorMessages.push(requiredMessage);\n      } else if (error === \"pattern-mismatch\") {\n        errorMessages.push(patternMessage);\n      }\n    }\n  }\n\n  let containerClassName = \"inline-block bg-background-default rounded-lg\";\n  if (className.indexOf(\"w-full\") !== -1) {\n    containerClassName += \" w-full\";\n  }\n  const labelSizeVal = labelSizeProp || \"sm\";\n  return (\n    <div className={containerClassName}>\n      {label && isLabelOutside && (\n        <div className={`leading-none ${labelSizeVal === \"xs\" ? \"text-xs\" : \"text-sm\"} text-text-secondary pb-1`}>\n          {label}\n        </div>\n      )}\n      <label\n        data-testid={`${identifier}-label`}\n        className={className}\n        style={{\n          minHeight: size === \"md\" ? (isLabelOutside ? \"40px\" : \"48px\") : isLabelOutside ? \"32px\" : \"40px\",\n        }}\n      >\n        <div\n          className={`relative ${isLabelOutside ? \"mx-2\" : \"mx-4\"} ${size === \"md\" ? \"my-1\" : \"\"}`}\n          style={size !== \"md\" ? { marginTop: \"1px\", marginBottom: \"1px\" } : {}}\n        >\n          {label && !isLabelOutside && (\n            <div\n              className={`leading-none relative ${labelSizeVal === \"xs\" ? \"text-xs\" : \"text-sm\"} text-text-secondary`}\n              style={{ top: \"2px\", left: \"0\" }}\n            >\n              {label}\n            </div>\n          )}\n          <div className=\"relative flex\" style={{ top: label ? \"3px\" : \"8px\", left: \"0\" }}>\n            {multiline ? (\n              <textarea\n                data-testid={`${identifier}-input`}\n                ref={setInputRef}\n                value={isControlled ? localValue : undefined}\n                defaultValue={!isControlled ? props.defaultValue : undefined}\n                onChange={(e) => {\n                  if (isControlled) {\n                    setLocalValue(e.target.value);\n                  }\n                }}\n                onBlur={(e) => {\n                  setTouched(true);\n                  const target = e.target;\n                  if (target instanceof HTMLInputElement) {\n                    validateTarget(target, \"snapshot\");\n                  }\n                }}\n                onInput={changeType === \"oninput\" ? onInputHandler : undefined}\n                onFocus={selectInputOnFocus}\n                autoCapitalize={autoCapitalize}\n                autoCorrect={autoCorrectStr}\n                className=\"flex-1 w-0 min-w-0 text-base border-none focus:outline-none bg-background-default\"\n                style={{ fontSize: size === \"md\" ? \"16px\" : \"15px\", height: `${multiline * 25}px` }}\n                {...otherProps}\n              />\n            ) : (\n              <input\n                data-testid={`${identifier}-input`}\n                ref={setInputRef}\n                value={isControlled ? localValue : undefined}\n                defaultValue={!isControlled ? props.defaultValue : undefined}\n                onChange={(e) => {\n                  if (isControlled) {\n                    setLocalValue(e.target.value);\n                  }\n                }}\n                onBlur={(e) => {\n                  setTouched(true);\n                  const target = e.target;\n                  if (target instanceof HTMLInputElement) {\n                    validateTarget(target, \"snapshot\");\n                  }\n                }}\n                onInput={changeType === \"oninput\" ? onInputHandler : undefined}\n                onFocus={selectInputOnFocus}\n                autoCapitalize={autoCapitalize}\n                autoCorrect={autoCorrectStr}\n                className=\"flex-1 w-0 min-w-0 text-base border-none focus:outline-none bg-background-default\"\n                style={{ height: \"1.25rem\", fontSize: size === \"md\" ? \"16px\" : \"15px\" }}\n                {...otherProps}\n              />\n            )}\n          </div>\n        </div>\n      </label>\n      {errorMessages.map((message) => (\n        <div className=\"text-xs text-left text-text-error\" key={message}>\n          {message}\n        </div>\n      ))}\n    </div>\n  );\n});\n","import { JSX, useEffect, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { Text } from \"./primitives/text\";\nimport { MathUtils_clamp, MathUtils_normalizeNumStr } from \"../utils/math\";\nimport { StringUtils_dashcase } from \"../utils/string\";\n\ninterface IInputNumberProps {\n  value?: number;\n  label?: string;\n  step?: number;\n  min?: number;\n  max?: number;\n  type?: string;\n  className?: string;\n  size?: \"md\" | \"lg\";\n  onUpdate: (value: number) => void;\n  \"data-name\"?: string;\n  \"data-testid\"?: string;\n  testID?: string;\n}\n\nexport function InputNumber(props: IInputNumberProps): JSX.Element {\n  const { value = 0, label, step = 1, min, max, onUpdate } = props;\n  const isLarge = props.size === \"lg\";\n  const buttonCn = `items-center justify-center ${isLarge ? \"w-scaled-14 h-scaled-14\" : \"w-scaled-10 h-scaled-10\"} border rounded-lg bg-background-purpledark border-border-neutral`;\n  const signCn = isLarge ? \"text-3xl font-bold leading-scaled-10\" : \"text-xl font-bold leading-scaled-8\";\n  const [text, setText] = useState(String(value));\n  const testId = `input-${StringUtils_dashcase(label || \"\")}`;\n\n  useEffect(() => {\n    const parsed = Number(text);\n    if (isNaN(parsed) || parsed !== value) {\n      setText(String(value));\n    }\n  }, [value]);\n\n  function getNumericValue(t: string): number {\n    const v = Number(t);\n    return !isNaN(v) ? MathUtils_clamp(v, min, max) : (min ?? 0);\n  }\n\n  return (\n    <View className=\"w-full\">\n      {label && <Text className={`mb-1 ${isLarge ? \"text-sm\" : \"text-xs\"} text-text-secondary`}>{label}</Text>}\n      <View className=\"flex-row items-center gap-2\">\n        <Pressable\n          className={buttonCn}\n          data-testid={`${testId}-minus`}\n          testID={`${testId}-minus`}\n          onPress={() => {\n            const v = getNumericValue(text);\n            const newValue = MathUtils_clamp(v - step, min, max);\n            setText(String(newValue));\n            onUpdate(newValue);\n          }}\n        >\n          <Text className={signCn}>-</Text>\n        </Pressable>\n        <View className=\"flex-row items-center flex-1\">\n          <TextInput\n            className={`w-full ${isLarge ? \"h-scaled-14 text-2xl\" : \"h-scaled-10 text-base\"} px-4 border rounded-lg bg-background-default border-border-prominent text-text-primary`}\n            style={Platform.OS === \"android\" ? { paddingVertical: 0, includeFontPadding: false } : undefined}\n            keyboardType=\"numeric\"\n            value={text}\n            testID={props.testID || `${testId}-field`}\n            data-testid={props.testID || `${testId}-field`}\n            onChangeText={(t) => {\n              const normalized = MathUtils_normalizeNumStr(t);\n              setText(normalized);\n              if (normalized !== \"\" && !isNaN(Number(normalized))) {\n                onUpdate(getNumericValue(normalized));\n              }\n            }}\n            onBlur={() => {\n              const v = getNumericValue(text);\n              setText(String(v));\n              onUpdate(v);\n            }}\n            selectTextOnFocus={Platform.OS === \"ios\"}\n          />\n        </View>\n        <Pressable\n          className={buttonCn}\n          data-testid={`${testId}-plus`}\n          testID={`${testId}-plus`}\n          onPress={() => {\n            const v = getNumericValue(text);\n            const newValue = MathUtils_clamp(v + step, min, max);\n            setText(String(newValue));\n            onUpdate(newValue);\n          }}\n        >\n          <Text className={signCn}>+</Text>\n        </Pressable>\n      </View>\n    </View>\n  );\n}\n","import React, { JSX, RefObject, forwardRef, memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { IconKeyboardClose } from \"./icons/iconKeyboardClose\";\nimport { n, MathUtils_clamp } from \"../utils/math\";\nimport { IPercentageUnit, IUnit } from \"../types\";\nimport { IconCalculator } from \"./icons/iconCalculator\";\nimport { Mobile_isMobile } from \"../../lambda/utils/mobile\";\nimport { useModal } from \"../navigation/ModalStateContext\";\nimport { IconBackspace } from \"./icons/iconBackspace\";\nimport { lg } from \"../utils/posthog\";\nimport { FocusedInputFlush_register, FocusedInputFlush_unregister } from \"../utils/focusedInputFlush\";\nimport { useRem } from \"../utils/useRem\";\nimport { FitText_fontSize } from \"../utils/fitText\";\n\nexport type IInputCommitMode = \"live\" | \"debounced\" | \"blur\";\n\ninterface IInputNumber2Props {\n  name: string;\n  placeholder?: string;\n  value?: number;\n  width?: number;\n  autowidth?: boolean;\n  size?: \"md\" | \"lg\";\n  fill?: boolean;\n  step?: number;\n  min?: number;\n  max?: number;\n  tabIndex?: number;\n  tabStop?: boolean;\n  initialValue?: number;\n  onNext?: (value: number | undefined) => number;\n  onPrev?: (value: number | undefined) => number;\n  onInput?: (value: number | undefined) => void;\n  onPreview?: (value: number | undefined) => void;\n  onBlur?: (value: number | undefined) => void;\n  keyboardAddon?: JSX.Element;\n  after?: () => JSX.Element | undefined;\n  allowDot?: boolean;\n  allowNegative?: boolean;\n  enableCalculator?: boolean;\n  enableUnits?: (IUnit | IPercentageUnit)[];\n  onChangeUnits?: (unit: IUnit | IPercentageUnit) => void;\n  selectedUnit?: IUnit | IPercentageUnit;\n  showUnitInside?: boolean;\n  cornerLabel?: string;\n  inputCommitMode?: IInputCommitMode;\n  inputDebounceMs?: number;\n  \"data-testid\"?: string;\n  testID?: string;\n}\n\nfunction clamp(value: string | number, min?: number, max?: number): number | undefined {\n  if (value === \"\") {\n    return undefined;\n  }\n  const num = MathUtils_clamp(Number(value), min, max);\n  if (isNaN(num)) {\n    return MathUtils_clamp(0, min, max);\n  }\n  return num;\n}\n\nlet nextPadOwnerId = 1;\nlet activePadOwnerId: number | null = null;\n\nfunction InputNumber2Inner(props: IInputNumber2Props): JSX.Element {\n  const remValue = useRem();\n  const initialValue = props.value != null ? n(props.value) : \"\";\n  const [value, setValue] = useState(initialValue);\n  const [isFocused, setIsFocused] = useState(false);\n  const [isTyping, setIsTyping] = useState(false);\n\n  const inputRef = useRef<HTMLInputElement>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const valueRef = useRef(value);\n  const keyboardRef = useRef<HTMLDivElement>(null);\n  const switchRef = useRef(false);\n  const onClickTarget = useRef<HTMLElement>(null);\n  const isFocusedRef = useRef(isFocused);\n  const isTypingRef = useRef(isTyping);\n  const allowDotRef = useRef(!!props.allowDot);\n  const allowNegativeRef = useRef(!!props.allowNegative);\n  const [isMobile, setIsMobile] = useState(false);\n  const [isCalculatorOpen, setIsCalculatorOpen] = useState(false);\n  const isCalculatorOpenRef = useRef(isCalculatorOpen);\n  const openCalculator = useModal(\"repMaxCalculatorModal\", (weightValue) => {\n    if (debounceTimerRef.current != null) {\n      clearTimeout(debounceTimerRef.current);\n      debounceTimerRef.current = null;\n    }\n    hasPendingInputRef.current = false;\n    pendingInputRef.current = undefined;\n    const newValue = clamp(weightValue, props.min, props.max);\n    valueRef.current = newValue?.toString() ?? \"\";\n    setValue(newValue?.toString() ?? \"\");\n    onPreviewRef.current?.(newValue);\n    if (props.onBlur) {\n      props.onBlur(newValue);\n    }\n    setIsCalculatorOpen(false);\n  });\n  const onBlurRef = useRef<((v: number | undefined) => void) | undefined>(props.onBlur);\n  const onInputRef = useRef<((v: number | undefined) => void) | undefined>(props.onInput);\n  const onPreviewRef = useRef<((v: number | undefined) => void) | undefined>(props.onPreview);\n  const onNextRef = useRef<((v: number | undefined) => number) | undefined>(props.onNext);\n  const onPrevRef = useRef<((v: number | undefined) => number) | undefined>(props.onPrev);\n  const onChangeUnitsRef = useRef<((u: IUnit | IPercentageUnit) => void) | undefined>(props.onChangeUnits);\n  const minRef = useRef(props.min);\n  const maxRef = useRef(props.max);\n  const stepRef = useRef(props.step);\n  const selectedUnitRef = useRef(props.selectedUnit);\n  const initialValueRef = useRef(props.initialValue);\n  const commitMode: IInputCommitMode = props.inputCommitMode ?? \"debounced\";\n  const debounceMs = props.inputDebounceMs ?? 150;\n  const commitModeRef = useRef(commitMode);\n  const debounceMsRef = useRef(debounceMs);\n  const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const pendingInputRef = useRef<number | undefined>(undefined);\n  const hasPendingInputRef = useRef(false);\n  onBlurRef.current = props.onBlur;\n  onInputRef.current = props.onInput;\n  onPreviewRef.current = props.onPreview;\n  onNextRef.current = props.onNext;\n  onPrevRef.current = props.onPrev;\n  onChangeUnitsRef.current = props.onChangeUnits;\n  minRef.current = props.min;\n  maxRef.current = props.max;\n  stepRef.current = props.step;\n  selectedUnitRef.current = props.selectedUnit;\n  initialValueRef.current = props.initialValue;\n  commitModeRef.current = commitMode;\n  debounceMsRef.current = debounceMs;\n  useEffect(() => {\n    setIsMobile(Mobile_isMobile(window.navigator?.userAgent || \"\"));\n  }, []);\n\n  const flushPendingInput = useCallback(() => {\n    if (debounceTimerRef.current != null) {\n      clearTimeout(debounceTimerRef.current);\n      debounceTimerRef.current = null;\n    }\n    if (hasPendingInputRef.current && onInputRef.current) {\n      const pending = pendingInputRef.current;\n      hasPendingInputRef.current = false;\n      pendingInputRef.current = undefined;\n      onInputRef.current(pending);\n    }\n  }, []);\n\n  const cancelPendingInput = useCallback(() => {\n    if (debounceTimerRef.current != null) {\n      clearTimeout(debounceTimerRef.current);\n      debounceTimerRef.current = null;\n    }\n    hasPendingInputRef.current = false;\n    pendingInputRef.current = undefined;\n  }, []);\n\n  useEffect(() => {\n    return () => {\n      flushPendingInput();\n      if (isFocusedRef.current) {\n        const newValueNum = clamp(valueRef.current, minRef.current, maxRef.current);\n        if (onBlurRef.current) {\n          onBlurRef.current(newValueNum);\n        }\n      }\n    };\n  }, [flushPendingInput]);\n\n  const paddedScrollerRef = useRef<HTMLElement | null>(null);\n  const padOwnerIdRef = useRef<number>(0);\n  if (padOwnerIdRef.current === 0) {\n    nextPadOwnerId += 1;\n    padOwnerIdRef.current = nextPadOwnerId;\n  }\n  const debugSessionRef = useRef<number>(0);\n  const outsideTouchCountRef = useRef<number>(0);\n\n  function resetKeyboardStyles(): void {\n    if (activePadOwnerId !== padOwnerIdRef.current) {\n      return;\n    }\n    document.body.classList.remove(\"show-keyboard\");\n    document.querySelectorAll(\".bottom-sticked\").forEach((el) => {\n      if (el instanceof HTMLElement) {\n        el.style.bottom = \"0px\";\n      }\n    });\n    if (paddedScrollerRef.current) {\n      paddedScrollerRef.current.style.paddingBottom = \"\";\n      paddedScrollerRef.current = null;\n    }\n    activePadOwnerId = null;\n  }\n\n  useEffect(() => {\n    if (initialValue === valueRef.current) {\n      return;\n    }\n    if (isTypingRef.current) {\n      return;\n    }\n    valueRef.current = initialValue;\n    setValue(initialValue);\n  }, [props.value]);\n\n  isFocusedRef.current = isFocused;\n  allowDotRef.current = !!props.allowDot;\n  allowNegativeRef.current = !!props.allowNegative;\n  isCalculatorOpenRef.current = !!isCalculatorOpen;\n\n  const blurRef = useRef<((debugCaller?: string) => void) | null>(null);\n  const openCalculatorRef = useRef(openCalculator);\n  openCalculatorRef.current = openCalculator;\n\n  const handleInput = useCallback((key: string): void => {\n    let newValue = valueRef.current;\n    if (!isTypingRef.current) {\n      newValue = \"\";\n    }\n    const dynMaxLength =\n      (maxRef.current?.toString().length ?? 5) + (allowDotRef.current ? 3 : 0) + (allowNegativeRef.current ? 1 : 0);\n    if (key === \"⌫\") {\n      newValue = newValue.slice(0, -1);\n    } else if (key === \"-\") {\n      if (allowNegativeRef.current) {\n        if (newValue[0] === \"-\") {\n          newValue = newValue.slice(1);\n        } else if (!newValue.includes(\"-\")) {\n          newValue = `-${newValue}`;\n        }\n      }\n    } else if (key === \".\" || key === \",\") {\n      if (allowDotRef.current && !newValue.includes(\".\")) {\n        newValue += \".\";\n      }\n    } else if (newValue.length < dynMaxLength) {\n      newValue += key;\n    }\n    if (!isTypingRef.current) {\n      setIsTyping(true);\n      isTypingRef.current = true;\n    }\n    valueRef.current = newValue;\n    setValue(newValue);\n    if (!newValue.endsWith(\".\")) {\n      const newValueNum = clamp(newValue, minRef.current, maxRef.current);\n      onPreviewRef.current?.(newValueNum);\n      if (onInputRef.current) {\n        const mode = commitModeRef.current;\n        if (mode === \"live\") {\n          onInputRef.current(newValueNum);\n        } else if (mode === \"debounced\") {\n          pendingInputRef.current = newValueNum;\n          hasPendingInputRef.current = true;\n          if (debounceTimerRef.current != null) {\n            clearTimeout(debounceTimerRef.current);\n          }\n          debounceTimerRef.current = setTimeout(() => {\n            debounceTimerRef.current = null;\n            if (hasPendingInputRef.current && onInputRef.current) {\n              const v = pendingInputRef.current;\n              hasPendingInputRef.current = false;\n              pendingInputRef.current = undefined;\n              onInputRef.current(v);\n            }\n          }, debounceMsRef.current);\n        }\n      }\n    }\n  }, []);\n\n  const blur = useCallback(\n    (debugCaller: string = \"unknown\") => {\n      if (!isFocusedRef.current) {\n        return;\n      }\n      isFocusedRef.current = false;\n      lg(\"kbd-blur-applied\", { caller: debugCaller, sid: debugSessionRef.current });\n      const closedViaKbdClose = debugCaller === \"keyboard-close-button\" || debugCaller === \"maybeBlur-keyboard-close\";\n      if (closedViaKbdClose && outsideTouchCountRef.current >= 2) {\n        lg(\"kbd-frustration-close\", {\n          sid: debugSessionRef.current,\n          outsideTaps: outsideTouchCountRef.current,\n          caller: debugCaller,\n        });\n      }\n      outsideTouchCountRef.current = 0;\n      cancelPendingInput();\n      setIsFocused(false);\n      setIsTyping(false);\n      isTypingRef.current = false;\n      const newValueNum = clamp(valueRef.current, minRef.current, maxRef.current);\n      valueRef.current = newValueNum != null ? newValueNum.toString() : \"\";\n      setValue(newValueNum != null ? newValueNum.toString() : \"\");\n      onPreviewRef.current?.(newValueNum);\n      if (onBlurRef.current) {\n        onBlurRef.current(newValueNum);\n      }\n      switchRef.current = false;\n    },\n    [cancelPendingInput]\n  );\n\n  useEffect(() => {\n    blurRef.current = blur;\n  }, [blur]);\n\n  const onKeyboardClose = useCallback(() => {\n    blurRef.current?.(\"keyboard-close-button\");\n  }, []);\n\n  const onPlus = useCallback(() => {\n    cancelPendingInput();\n    const current = valueRef.current === \"\" ? (initialValueRef.current ?? 0) : Number(valueRef.current);\n    const nextValue = onNextRef.current ? onNextRef.current(current) : current + (stepRef.current ?? 1);\n    const newValue = clamp(nextValue, minRef.current, maxRef.current);\n    valueRef.current = newValue != null ? newValue.toString() : \"\";\n    setValue(newValue != null ? newValue.toString() : \"\");\n    onPreviewRef.current?.(newValue);\n    if (commitModeRef.current !== \"blur\" && onInputRef.current) {\n      onInputRef.current(newValue);\n    }\n  }, [cancelPendingInput]);\n\n  const onMinus = useCallback(() => {\n    cancelPendingInput();\n    const current = valueRef.current === \"\" ? (initialValueRef.current ?? 0) : Number(valueRef.current);\n    const prevValue = onPrevRef.current ? onPrevRef.current(current) : current - (stepRef.current ?? 1);\n    const newValue = clamp(prevValue, minRef.current, maxRef.current);\n    valueRef.current = newValue != null ? newValue.toString() : \"\";\n    setValue(newValue != null ? newValue.toString() : \"\");\n    onPreviewRef.current?.(newValue);\n    if (commitModeRef.current !== \"blur\" && onInputRef.current) {\n      onInputRef.current(newValue);\n    }\n  }, [cancelPendingInput]);\n\n  const onShowCalculator = useCallback(() => {\n    blurRef.current?.(\"show-calculator\");\n    setIsCalculatorOpen(true);\n    const unit = selectedUnitRef.current;\n    if (unit && unit !== \"%\") {\n      openCalculatorRef.current({ unit });\n    }\n  }, []);\n\n  const onChangeUnits = useCallback((unit: IUnit | IPercentageUnit) => {\n    onChangeUnitsRef.current?.(unit);\n  }, []);\n\n  useEffect(() => {\n    if (!isFocused) {\n      return;\n    }\n    const flush = (): void => {\n      blurRef.current?.(\"flush-from-outside\");\n    };\n    FocusedInputFlush_register(flush);\n    return () => {\n      FocusedInputFlush_unregister(flush);\n    };\n  }, [isFocused]);\n\n  const isTargetOutside = useCallback((target: HTMLElement | null): boolean => {\n    if (!isFocusedRef.current) {\n      return false;\n    }\n    let cur: HTMLElement | null = target;\n    while (cur) {\n      if (cur === containerRef.current || cur === keyboardRef.current) {\n        return false;\n      }\n      if (cur === document.body) {\n        return true;\n      }\n      cur = cur.parentElement;\n    }\n    return true;\n  }, []);\n\n  useEffect(() => {\n    if (isFocused) {\n      if (props.value == null && props.initialValue != null) {\n        valueRef.current = props.initialValue?.toString() ?? \"\";\n        setValue(props.initialValue?.toString() ?? \"\");\n      }\n      if (!isMobile) {\n        return;\n      }\n      document.body.classList.add(\"show-keyboard\");\n      const keyboardHeight = keyboardRef.current?.clientHeight ?? 0;\n\n      document.querySelectorAll(\".bottom-sticked\").forEach((el) => {\n        if (el instanceof HTMLElement) {\n          el.style.bottom = `${keyboardHeight}px`;\n        }\n      });\n\n      let scrollableContainer = containerRef.current?.parentElement as HTMLElement | null;\n      while (scrollableContainer && scrollableContainer !== document.documentElement) {\n        const overflowY = getComputedStyle(scrollableContainer).overflowY;\n        if (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") {\n          break;\n        }\n        scrollableContainer = scrollableContainer.parentElement;\n      }\n      scrollableContainer = scrollableContainer ?? document.documentElement;\n\n      const contentEl = scrollableContainer.firstElementChild as HTMLElement | null;\n      const insideShiftedSheet = scrollableContainer.closest(\".bottom-sticked\") != null;\n      if (scrollableContainer !== document.documentElement && contentEl && !insideShiftedSheet) {\n        contentEl.style.paddingBottom = `${keyboardHeight}px`;\n        paddedScrollerRef.current = contentEl;\n      }\n      activePadOwnerId = padOwnerIdRef.current;\n\n      const inputRect = containerRef.current?.getBoundingClientRect();\n      if (inputRect) {\n        const scrollerRect =\n          scrollableContainer === document.documentElement\n            ? { top: 0, bottom: window.innerHeight }\n            : scrollableContainer.getBoundingClientRect();\n        const visibleTop = scrollerRect.top;\n        const visibleBottom = Math.min(scrollerRect.bottom, window.innerHeight - keyboardHeight);\n        const margin = 16;\n\n        if (inputRect.bottom + margin > visibleBottom || inputRect.top - margin < visibleTop) {\n          const inputCenter = (inputRect.top + inputRect.bottom) / 2;\n          const targetCenter = (visibleTop + visibleBottom) / 2;\n          const delta = inputCenter - targetCenter;\n          scrollableContainer.scrollBy({ top: delta, behavior: \"smooth\" });\n        }\n      }\n    } else {\n      if (!isMobile) {\n        return;\n      }\n      if (!switchRef.current) {\n        resetKeyboardStyles();\n      }\n      switchRef.current = false;\n    }\n    return () => resetKeyboardStyles();\n  }, [isFocused, props.initialValue]);\n\n  useEffect(() => {\n    const keyboardHandler = (event: KeyboardEvent): void => {\n      if (!isFocusedRef.current) {\n        return;\n      }\n      if (event.key === \"Escape\") {\n        blur(\"escape\");\n      } else if (event.key === \"Enter\") {\n        blur(\"enter\");\n      } else if (event.key === \"Backspace\") {\n        handleInput(\"⌫\");\n      } else if (\n        event.key === \"0\" ||\n        event.key === \"1\" ||\n        event.key === \"2\" ||\n        event.key === \"3\" ||\n        event.key === \"4\" ||\n        event.key === \"5\" ||\n        event.key === \"6\" ||\n        event.key === \"7\" ||\n        event.key === \"8\" ||\n        event.key === \"9\" ||\n        (props.allowDot && (event.key === \".\" || event.key === \",\")) ||\n        (props.allowNegative && event.key === \"-\")\n      ) {\n        handleInput(event.key);\n      }\n    };\n    document.addEventListener(\"keydown\", keyboardHandler);\n    return () => {\n      document.removeEventListener(\"keydown\", keyboardHandler);\n    };\n  }, []);\n\n  const maybeBlur = useCallback((target: HTMLElement | null): boolean => {\n    if (target == null) {\n      blur(\"maybeBlur-null-target\");\n      return true;\n    }\n    let foundCurrentInput = false;\n    let foundOtherInput: HTMLElement | null = null;\n    let reachedBody = false;\n    while (target) {\n      if (target.classList?.contains(\"keyboard-close\")) {\n        blur(\"maybeBlur-keyboard-close\");\n        return true;\n      } else if (target === containerRef.current || target === keyboardRef.current) {\n        foundCurrentInput = true;\n        break;\n      } else if (target !== containerRef.current && target.classList?.contains(\"input-number\")) {\n        foundOtherInput = target;\n        break;\n      } else if (target === document.body) {\n        reachedBody = true;\n        break;\n      }\n      target = target.parentElement;\n    }\n    if (foundOtherInput) {\n      blur(\"maybeBlur-switch\");\n      switchRef.current = true;\n      const nextInput = foundOtherInput.querySelector(\".input-number-child\") as HTMLElement | null;\n      const isFocusFree = document.activeElement == null || document.activeElement === document.body;\n      if (nextInput && isFocusFree) {\n        nextInput.focus();\n      }\n      return true;\n    } else if (!foundCurrentInput) {\n      blur(reachedBody ? \"maybeBlur-outside\" : \"maybeBlur-detached\");\n      return true;\n    }\n    return false;\n  }, []);\n\n  useEffect(() => {\n    let armedFinish: (() => void) | null = null;\n    const armDeferredBlur = (target: HTMLElement): void => {\n      if (armedFinish) {\n        return;\n      }\n      let done = false;\n      const finish = (viaFallback: boolean): void => {\n        if (done) {\n          return;\n        }\n        done = true;\n        document.removeEventListener(\"click\", onClick, true);\n        clearTimeout(fallbackTimer);\n        armedFinish = null;\n        if (viaFallback && isFocusedRef.current) {\n          lg(\"kbd-click-suppressed\", {\n            sid: debugSessionRef.current,\n            tag: (target.tagName ?? \"null\").toLowerCase(),\n            cls: (target.className?.toString() ?? \"\").slice(0, 60),\n          });\n        }\n        if (isFocusedRef.current) {\n          maybeBlur(target);\n        }\n      };\n      armedFinish = () => finish(false);\n      const onClick = (): void => {\n        requestAnimationFrame(() => finish(false));\n      };\n      document.addEventListener(\"click\", onClick, true);\n      const fallbackTimer = setTimeout(() => finish(true), 250);\n    };\n\n    const touchHandler = (event: TouchEvent): void => {\n      if (isCalculatorOpenRef.current) {\n        return;\n      }\n      const target = (event.target || event.currentTarget) as HTMLElement;\n      onClickTarget.current = target;\n      if (isTargetOutside(target)) {\n        outsideTouchCountRef.current += 1;\n        armDeferredBlur(target);\n      }\n    };\n    const mouseHandler = (event: MouseEvent): void => {\n      if (isCalculatorOpenRef.current) {\n        return;\n      }\n      const target = (event.target || event.currentTarget) as HTMLElement;\n      onClickTarget.current = target;\n      if (isTargetOutside(target)) {\n        armDeferredBlur(target);\n      }\n    };\n    document.addEventListener(\"touchstart\", touchHandler);\n    document.addEventListener(\"mousedown\", mouseHandler);\n    return () => {\n      document.removeEventListener(\"touchstart\", touchHandler);\n      document.removeEventListener(\"mousedown\", mouseHandler);\n      armedFinish?.();\n    };\n  }, [isTargetOutside, maybeBlur]);\n\n  const isLarge = props.size === \"lg\";\n  const baseFontSize = ((isLarge ? 32 : 14) * remValue) / 16;\n  const availableTextWidth = props.autowidth || props.fill ? 0 : (props.width ?? 4) * remValue - 6;\n  const valueFontSize = FitText_fontSize(value ?? \"\", availableTextWidth, baseFontSize);\n  const placeholderFontSize = FitText_fontSize(props.placeholder ?? \"\", availableTextWidth, baseFontSize);\n\n  return (\n    <div ref={containerRef} className={`input-number ${props.fill ? \"flex-1 min-w-0\" : \"\"}`}>\n      <div\n        className={`relative flex items-center justify-center ${isLarge ? \"h-scaled-12 rounded-lg\" : \"h-scaled-6 rounded\"} border bg-background-default border-border-prominent input-number-child`}\n        style={\n          props.autowidth\n            ? { paddingLeft: \"0.5rem\", paddingRight: \"0.5rem\" }\n            : props.fill\n              ? { width: \"100%\" }\n              : { width: `${props.width ?? 4}rem` }\n        }\n        tabIndex={props.tabIndex ?? 0}\n        data-tab-stop={props.tabStop ? \"1\" : undefined}\n        onFocus={() => {\n          debugSessionRef.current = Date.now();\n          lg(\"kbd-focus\", { sid: debugSessionRef.current });\n          lg(`focus-nm-${props.name}`);\n          setIsFocused(true);\n        }}\n        onBlur={(event) => {\n          setTimeout(() => {\n            const target = (event.relatedTarget || onClickTarget.current) as HTMLElement | null;\n            const result = maybeBlur(target);\n            if (!result) {\n              const currentTarget = event.currentTarget || event.target;\n              event.preventDefault();\n              (event.nativeEvent as Event).stopImmediatePropagation();\n              if (currentTarget) {\n                currentTarget.focus();\n              }\n            }\n          }, 10);\n        }}\n        onClick={(e) => {\n          e.currentTarget.focus();\n        }}\n        data-testid={`input-${StringUtils_dashcase(props.name)}-field`}\n      >\n        <div ref={inputRef} className=\"leading-none\">\n          {!value && !isFocused && props.placeholder ? (\n            <span\n              className={`${isLarge ? \"text-3xl\" : \"text-sm\"} text-text-secondarysubtle text-ellipsis whitespace-nowrap`}\n              style={{ fontSize: `${placeholderFontSize}px` }}\n            >\n              {props.placeholder}\n            </span>\n          ) : (\n            <span\n              className={`${isLarge ? \"text-3xl\" : \"text-sm\"} inline-block whitespace-nowrap ${isFocused && !isTypingRef.current ? \"bg-background-cardpurpleselected\" : \"\"}`}\n              style={{ padding: value ? \"1px\" : \"0\", fontSize: `${valueFontSize}px` }}\n            >\n              {value}\n            </span>\n          )}\n        </div>\n        {isFocused && (\n          <div\n            className=\"inline-block h-scaled-3 leading-none blinking bg-background-darkgray\"\n            style={{ width: \"1px\" }}\n          />\n        )}\n        {props.showUnitInside && props.selectedUnit && props.value != null && (\n          <div className=\"text-xs text-text-secondary\"> {props.selectedUnit}</div>\n        )}\n        {props.cornerLabel && (\n          <div className=\"absolute leading-none pointer-events-none text-2xs text-text-secondary top-0.5 right-1.5\">\n            {props.cornerLabel}\n          </div>\n        )}\n        {props.after && props.after()}\n      </div>\n      {isFocused && isMobile && (\n        <CustomKeyboard\n          ref={keyboardRef}\n          onInput={handleInput}\n          inputRef={inputRef}\n          keyboardAddon={props.keyboardAddon}\n          onBlur={onKeyboardClose}\n          onPlus={onPlus}\n          onMinus={onMinus}\n          allowDot={props.allowDot}\n          allowNegative={props.allowNegative}\n          enableCalculator={props.enableCalculator}\n          onShowCalculator={onShowCalculator}\n          enableUnits={props.enableUnits}\n          onChangeUnits={onChangeUnits}\n          selectedUnit={props.selectedUnit}\n        />\n      )}\n    </div>\n  );\n}\n\nexport const InputNumber2 = memo(InputNumber2Inner);\n\ninterface ICustomKeyboardProps {\n  onInput: (value: string) => void;\n  onBlur: () => void;\n  onPlus: () => void;\n  onMinus: () => void;\n  allowDot?: boolean;\n  allowNegative?: boolean;\n  inputRef: RefObject<HTMLInputElement | null>;\n  keyboardAddon?: JSX.Element;\n\n  enableCalculator?: boolean;\n  onShowCalculator?: () => void;\n\n  enableUnits?: (IUnit | IPercentageUnit)[];\n  onChangeUnits?: (unit: IUnit | IPercentageUnit) => void;\n  selectedUnit?: IUnit | IPercentageUnit;\n}\n\ninterface IKeyboardButtonProps {\n  label: string;\n  onPress: (label: string) => void;\n}\n\nconst KeyboardButton = memo(function KeyboardButton(props: IKeyboardButtonProps): JSX.Element {\n  const onClick = useCallback(() => props.onPress(props.label), [props.onPress, props.label]);\n  return (\n    <button\n      data-testid={`keyboard-button-${props.label}`}\n      className=\"p-2 text-2xl bg-background-default active:bg-background-neutral touch-manipulation text-text-primary\"\n      onClick={onClick}\n    >\n      {props.label}\n    </button>\n  );\n});\n\nconst CustomKeyboardInner = forwardRef((props: ICustomKeyboardProps, ref: React.ForwardedRef<HTMLDivElement>) => {\n  const containerRef = useMemo(\n    () => (typeof window !== \"undefined\" ? window.document.querySelector(\"#keyboard\") : undefined),\n    []\n  );\n  const keys = useMemo<string[]>(\n    () => [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", props.allowNegative ? \"-\" : \"\", \"0\", props.allowDot ? \".\" : \"\"],\n    [props.allowDot, props.allowNegative]\n  );\n  const handleBackspace = useCallback(() => props.onInput(\"⌫\"), [props.onInput]);\n\n  const element = (\n    <div\n      ref={ref}\n      id=\"keyboard-content\"\n      className=\"fixed bottom-0 left-0 w-full keyboard-shadow\"\n      style={{ zIndex: 70 }}\n    >\n      <div className=\"safe-area-inset-bottom bg-background-default\">\n        <div className=\"flex items-center w-full gap-2 px-4 bg-background-subtle\">\n          <div className=\"flex-1\">{props.keyboardAddon}</div>\n          {props.enableCalculator && (\n            <div className=\"py-2\">\n              <button\n                data-testid=\"keyboard-rm-calculator\"\n                className=\"flex items-center justify-center w-scaled-24 px-2 py-1 border rounded keyboard-close border-border-cardpurple bg-background-cardpurple\"\n                onClick={props.onShowCalculator}\n              >\n                <span className=\"mr-2\">RM</span>\n                <span>\n                  <IconCalculator size={14} />\n                </span>\n              </button>\n            </div>\n          )}\n        </div>\n        <div className=\"flex w-full gap-4 p-4 bg-background-default\">\n          <div className=\"grid flex-1 grid-cols-3 gap-2\">\n            {keys.map((key, i) =>\n              key ? <KeyboardButton key={key} label={key} onPress={props.onInput} /> : <div key={`empty-${i}`} />\n            )}\n          </div>\n          <div className=\"w-scaled-24 mt-2\">\n            <div className=\"mb-4\">\n              <button\n                className=\"flex items-center justify-center w-full pt-2 pb-1 border rounded touch-manipulation keyboard-close border-border-cardpurple bg-background-cardpurple\"\n                data-testid=\"keyboard-close\"\n                onClick={props.onBlur}\n              >\n                <IconKeyboardClose />\n              </button>\n            </div>\n            <div className=\"flex gap-1\">\n              <div className=\"flex-1\">\n                <button\n                  className=\"flex items-center justify-center w-full p-2 border rounded touch-manipulation rounded-e-none border-border-cardpurple bg-background-cardpurple text-icon-neutral\"\n                  data-testid=\"keyboard-minus\"\n                  onClick={props.onMinus}\n                >\n                  -\n                </button>\n              </div>\n              <div className=\"flex-1\">\n                <button\n                  className=\"flex items-center justify-center w-full p-2 border rounded touch-manipulation rounded-s-none border-border-cardpurple bg-background-cardpurple text-icon-neutral\"\n                  data-testid=\"keyboard-plus\"\n                  onClick={props.onPlus}\n                >\n                  +\n                </button>\n              </div>\n            </div>\n            {props.enableUnits && props.selectedUnit ? (\n              <div className=\"flex items-center h-scaled-10 gap-2 mt-4\">\n                {props.enableUnits.map((unit) => (\n                  <button\n                    key={unit}\n                    className={`flex text-icon-neutral touch-manipulation items-center  aspect-square justify-center flex-1 w-full border rounded ${unit === props.selectedUnit ? \"border-border-prominent bg-background-cardpurpleselected\" : \" border-border-cardpurple bg-background-cardpurple\"}`}\n                    data-testid={`keyboard-unit-${unit}`}\n                    onClick={() => {\n                      if (props.onChangeUnits) {\n                        props.onChangeUnits(unit);\n                      }\n                    }}\n                  >\n                    {unit}\n                  </button>\n                ))}\n              </div>\n            ) : (\n              <div className=\"h-scaled-10 mt-4\"></div>\n            )}\n            <div className=\"mt-4\">\n              <button\n                className=\"flex items-center justify-center w-full h-scaled-10 border rounded touch-manipulation border-border-cardpurple bg-background-cardpurple\"\n                data-testid={`keyboard-backspace`}\n                onClick={handleBackspace}\n              >\n                <IconBackspace />\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n\n  return containerRef ? createPortal(element, containerRef) : element;\n});\n\nconst CustomKeyboard = memo(CustomKeyboardInner);\n","import { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IconArrowDown2 } from \"./icons/iconArrowDown2\";\nimport { useModal } from \"../navigation/ModalStateContext\";\n\ninterface IInputSelectProps<T extends string> {\n  name: string;\n  label?: string;\n  placeholder?: string;\n  expandValue?: boolean;\n  hint?: string;\n  disabled?: boolean;\n  value?: T;\n  values?: [T, string][];\n  onChange?: (v?: T) => void;\n}\n\nexport function InputSelect<T extends string>(props: IInputSelectProps<T>): JSX.Element {\n  if (props.label != null) {\n    return (\n      <View className=\"flex-row items-center gap-4\">\n        <View className={!props.expandValue ? \"flex-1\" : \"\"}>\n          <Text className=\"text-sm\">{props.label}</Text>\n        </View>\n        <View className=\"flex-1\">\n          <InputSelectValue {...props} />\n        </View>\n      </View>\n    );\n  } else {\n    return <InputSelectValue {...props} />;\n  }\n}\n\nexport function InputSelectValue<T extends string>(props: IInputSelectProps<T>): JSX.Element {\n  const selectedLabel = props.values?.find((v) => v[0] === props.value)?.[1];\n\n  const openModal = useModal(\"inputSelectModal\", (value) => {\n    if (props.onChange) {\n      props.onChange(value === \"\" ? undefined : (value as T));\n    }\n  });\n\n  return (\n    <Pressable\n      data-testid={`select-${props.name}`}\n      testID={`select-${props.name}`}\n      className=\"flex-row items-center w-full gap-2 p-2 border rounded bg-background-default border-border-neutral\"\n      onPress={() => {\n        if (!props.disabled && props.values && props.values.length > 0) {\n          openModal({\n            name: props.name,\n            values: props.values,\n            hint: props.hint,\n            selectedValue: props.value,\n            placeholder: props.placeholder,\n          });\n        }\n      }}\n    >\n      <View className=\"flex-1\">\n        {selectedLabel != null ? (\n          <Text className=\"text-sm\">{selectedLabel}</Text>\n        ) : (\n          <Text className=\"text-sm text-text-secondary\">{props.placeholder}</Text>\n        )}\n      </View>\n      <View>\n        <IconArrowDown2 />\n      </View>\n    </Pressable>\n  );\n}\n","import { JSX, useEffect, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { Text } from \"./primitives/text\";\nimport { Weight_buildPct, Weight_build, Weight_decrement, Weight_increment } from \"../models/weight\";\nimport { IExerciseType, IPercentage, ISettings, IUnit, IWeight } from \"../types\";\nimport { IconCalculator } from \"./icons/iconCalculator\";\nimport { useModal } from \"../navigation/ModalStateContext\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { MathUtils_normalizeNumStr } from \"../utils/math\";\nimport { InputWeightUnit } from \"./inputWeightUnit\";\n\ninterface IInputWeightProps {\n  value: IWeight | IPercentage;\n  label?: string;\n  exerciseType?: IExerciseType;\n  units?: (IUnit | \"%\")[];\n  settings: ISettings;\n  \"data-testid\"?: string;\n  testID?: string;\n  size?: \"md\" | \"lg\";\n  onUpdate: (weight: IWeight | IPercentage) => void;\n}\n\nexport function InputWeight(props: IInputWeightProps): JSX.Element {\n  const isLarge = props.size === \"lg\";\n  const buttonCn = `items-center justify-center ${isLarge ? \"w-scaled-14 h-scaled-14\" : \"w-scaled-10 h-scaled-10\"} border rounded-lg bg-background-purpledark border-border-neutral`;\n  const signCn = isLarge ? \"text-3xl font-bold leading-none\" : \"text-xl font-bold leading-none\";\n  const [text, setText] = useState(String(props.value.value));\n  const [unit, setUnit] = useState<IUnit | \"%\">(props.value.unit);\n  const testId = props.testID || `input-${StringUtils_dashcase(props.label || \"\")}`;\n  const availableUnits = props.units ?? ([\"kg\", \"lb\", \"%\"] as const);\n\n  useEffect(() => {\n    const parsed = Number(text);\n    if (isNaN(parsed) || parsed !== props.value.value) {\n      setText(String(props.value.value));\n    }\n    setUnit(props.value.unit);\n  }, [props.value.value, props.value.unit]);\n\n  function buildWeight(v: number, u: IUnit | \"%\"): IWeight | IPercentage {\n    return u === \"%\" ? Weight_buildPct(v) : Weight_build(v, u);\n  }\n\n  function getValue(): IWeight | IPercentage | undefined {\n    const v = Number(text);\n    if (isNaN(v)) {\n      return undefined;\n    }\n    return buildWeight(v, unit);\n  }\n\n  const openCalculator = useModal(\"repMaxCalculatorModal\", (weightValue) => {\n    if (weightValue != null && unit !== \"%\") {\n      const w = Weight_build(weightValue, unit as IUnit);\n      setText(String(w.value));\n      props.onUpdate(w);\n    }\n  });\n\n  return (\n    <View className=\"w-full\">\n      {props.label && (\n        <Text className={`mb-1 ${isLarge ? \"text-sm\" : \"text-xs\"} text-text-secondary`}>{props.label}</Text>\n      )}\n      <View className=\"flex-row items-center gap-2\">\n        <Pressable\n          className={buttonCn}\n          data-testid=\"edit-weight-minus\"\n          testID=\"edit-weight-minus\"\n          onPress={() => {\n            const value = getValue();\n            if (value) {\n              if (value.unit === \"%\") {\n                const newValue = Weight_buildPct(value.value - 1);\n                setText(String(newValue.value));\n                props.onUpdate(newValue);\n              } else {\n                const newWeight = Weight_decrement(value, props.settings, props.exerciseType);\n                setText(String(newWeight.value));\n                props.onUpdate(newWeight);\n              }\n            }\n          }}\n        >\n          <Text className={signCn}>-</Text>\n        </Pressable>\n        <View className=\"flex-row items-center flex-1 gap-2\">\n          <View className=\"flex-1\">\n            <TextInput\n              className={`w-full px-4 ${isLarge ? \"py-3 text-2xl\" : \"py-2 text-base\"} border rounded-lg bg-background-default border-border-prominent text-text-primary`}\n              keyboardType=\"numeric\"\n              value={text}\n              data-testid={testId}\n              testID={testId}\n              onChangeText={(t) => {\n                const normalized = MathUtils_normalizeNumStr(t);\n                setText(normalized);\n                if (normalized !== \"\" && !isNaN(Number(normalized))) {\n                  props.onUpdate(buildWeight(Number(normalized), unit));\n                }\n              }}\n              onBlur={() => {\n                const value = getValue();\n                if (value != null) {\n                  props.onUpdate(value);\n                }\n              }}\n              selectTextOnFocus={Platform.OS === \"ios\"}\n            />\n          </View>\n          <InputWeightUnit\n            value={unit}\n            units={availableUnits}\n            onChange={(u) => {\n              setUnit(u);\n              const v = Number(text);\n              if (!isNaN(v)) {\n                props.onUpdate(buildWeight(v, u));\n              }\n            }}\n          />\n        </View>\n        {unit !== \"%\" && (\n          <Pressable\n            className={buttonCn}\n            data-testid=\"edit-weight-calculator\"\n            testID=\"edit-weight-calculator\"\n            onPress={() => openCalculator({ unit: unit as IUnit })}\n          >\n            <IconCalculator size={isLarge ? 22 : 16} />\n          </Pressable>\n        )}\n        <Pressable\n          className={buttonCn}\n          data-testid=\"edit-weight-plus\"\n          testID=\"edit-weight-plus\"\n          onPress={() => {\n            const value = getValue();\n            if (value) {\n              if (value.unit === \"%\") {\n                const newValue = Weight_buildPct(value.value + 1);\n                setText(String(newValue.value));\n                props.onUpdate(newValue);\n              } else {\n                const newWeight = Weight_increment(value, props.settings, props.exerciseType);\n                setText(String(newWeight.value));\n                props.onUpdate(newWeight);\n              }\n            }\n          }}\n        >\n          <Text className={signCn}>+</Text>\n        </Pressable>\n      </View>\n    </View>\n  );\n}\n","import { JSX, memo, useCallback, useMemo, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IExerciseType, IPercentage, IPercentageUnit, ISettings, ISubscription, IUnit, IWeight } from \"../types\";\nimport { InputNumber2, IInputCommitMode } from \"./inputNumber2\";\nimport {\n  Weight_evaluateWeight,\n  Weight_is,\n  Weight_build,\n  Weight_increment,\n  Weight_decrement,\n  Weight_buildAny,\n  Weight_calculatePlates,\n  Weight_eq,\n  Weight_formatOneSide,\n} from \"../models/weight\";\nimport { IconBarbellSide } from \"./icons/iconBarbellSide\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { Equipment_getUnitOrDefaultForExerciseType } from \"../models/equipment\";\n\ninterface IInputWeight2Props {\n  value: IWeight | IPercentage | undefined;\n  name: string;\n  max?: number;\n  min?: number;\n  autowidth?: boolean;\n  width?: number;\n  size?: \"md\" | \"lg\";\n  fill?: boolean;\n  fillFlex?: number;\n  showUnitInside?: boolean;\n  showUnitInCorner?: boolean;\n  placeholder?: string;\n  exerciseType?: IExerciseType;\n  units?: (IUnit | IPercentageUnit)[];\n  initialValue?: IWeight | IPercentage;\n  addOn?: () => JSX.Element;\n  settings: ISettings;\n  after?: () => JSX.Element | undefined;\n  onBlur?: (value: IWeight | IPercentage | undefined) => void;\n  onInput?: (value: IWeight | IPercentage | undefined) => void;\n  subscription?: ISubscription;\n  tabIndex?: number;\n  tabStop?: boolean;\n  inputCommitMode?: IInputCommitMode;\n  inputDebounceMs?: number;\n  \"data-testid\"?: string;\n  testID?: string;\n}\n\nfunction InputWeight2Inner(props: IInputWeight2Props): JSX.Element {\n  const [unit, setUnit] = useState<IUnit | IPercentageUnit>(\n    props.value?.unit ??\n      props.initialValue?.unit ??\n      Equipment_getUnitOrDefaultForExerciseType(props.settings, props.exerciseType)\n  );\n  const unitRef = useRef(unit);\n  unitRef.current = unit;\n  const onInputPropRef = useRef(props.onInput);\n  const onBlurPropRef = useRef(props.onBlur);\n  const settingsRef = useRef(props.settings);\n  const exerciseTypeRef = useRef(props.exerciseType);\n  const commitModeRef = useRef<IInputCommitMode | undefined>(props.inputCommitMode);\n  onInputPropRef.current = props.onInput;\n  onBlurPropRef.current = props.onBlur;\n  settingsRef.current = props.settings;\n  exerciseTypeRef.current = props.exerciseType;\n  commitModeRef.current = props.inputCommitMode;\n\n  const [value, setValue] = useState(props.value);\n  const draftValueRef = useRef<number | undefined>(props.value?.value);\n  draftValueRef.current = value?.value;\n  const initialValue = value ?? props.initialValue;\n  const evaluatedWeight = useMemo(\n    () =>\n      initialValue && props.exerciseType\n        ? Weight_evaluateWeight(initialValue, props.exerciseType, props.settings)\n        : undefined,\n    [initialValue, props.exerciseType, props.settings]\n  );\n\n  const onNext = useCallback((current: number | undefined): number => {\n    const u = unitRef.current;\n    if (u === \"%\") {\n      return current != null ? current + 1 : 0;\n    }\n    const weight = current != null ? Weight_build(current, u) : Weight_build(0, u);\n    const newWeight = Weight_increment(weight, settingsRef.current, exerciseTypeRef.current);\n    return newWeight.value;\n  }, []);\n\n  const onPrev = useCallback((current: number | undefined): number => {\n    const u = unitRef.current;\n    if (u === \"%\") {\n      return current != null ? current - 1 : 0;\n    }\n    const weight = current != null ? Weight_build(current, u) : Weight_build(0, u);\n    const newWeight = Weight_decrement(weight, settingsRef.current, exerciseTypeRef.current);\n    return newWeight.value;\n  }, []);\n\n  const onChangeUnits = useCallback((newUnit: IUnit | IPercentageUnit) => {\n    setUnit(newUnit);\n    const draft = draftValueRef.current;\n    const weight = draft != null ? Weight_buildAny(draft, newUnit) : undefined;\n    setValue(weight);\n    if (commitModeRef.current !== \"blur\") {\n      const cb = onInputPropRef.current;\n      if (cb) {\n        cb(weight);\n      }\n    }\n  }, []);\n\n  const onBlur = useCallback((v: number | undefined) => {\n    draftValueRef.current = v;\n    const weight = v != null ? Weight_buildAny(v, unitRef.current) : undefined;\n    setValue(weight);\n    const cb = onBlurPropRef.current;\n    if (cb) {\n      cb(weight);\n    }\n  }, []);\n\n  const onInput = useCallback((newValue: number | undefined) => {\n    draftValueRef.current = newValue;\n    const weight = newValue != null ? Weight_buildAny(newValue, unitRef.current) : undefined;\n    setValue(weight);\n    const cb = onInputPropRef.current;\n    if (cb) {\n      cb(weight);\n    }\n  }, []);\n\n  const onPreview = useCallback((newValue: number | undefined) => {\n    draftValueRef.current = newValue;\n    const weight = newValue != null ? Weight_buildAny(newValue, unitRef.current) : undefined;\n    setValue(weight);\n  }, []);\n\n  const showPlates =\n    props.subscription &&\n    props.exerciseType &&\n    Subscriptions_hasSubscription(props.subscription) &&\n    evaluatedWeight &&\n    Weight_is(evaluatedWeight);\n\n  const keyboardAddon = useMemo(() => {\n    if (!showPlates && !props.addOn) {\n      return undefined;\n    }\n    return (\n      <View className=\"py-2\">\n        {showPlates && (\n          <PlatesCalculator\n            weight={evaluatedWeight as IWeight}\n            settings={props.settings}\n            exerciseType={props.exerciseType!}\n          />\n        )}\n        {props.addOn ? <View>{props.addOn()}</View> : undefined}\n      </View>\n    );\n  }, [showPlates, evaluatedWeight, props.settings, props.exerciseType, props.addOn]);\n\n  return (\n    <View style={props.fill ? { flex: props.fillFlex ?? 1 } : undefined}>\n      <InputNumber2\n        width={props.width}\n        size={props.size}\n        fill={props.fill}\n        tabIndex={props.tabIndex}\n        tabStop={props.tabStop}\n        placeholder={props.placeholder}\n        after={props.after}\n        autowidth={props.autowidth}\n        allowDot={true}\n        allowNegative={true}\n        min={props.min}\n        max={props.max}\n        keyboardAddon={keyboardAddon}\n        onNext={onNext}\n        onPrev={onPrev}\n        value={props.value?.value}\n        initialValue={props.initialValue?.value}\n        name={props.name}\n        enableUnits={props.units}\n        selectedUnit={unit}\n        showUnitInside={props.showUnitInside}\n        cornerLabel={props.showUnitInCorner ? unit : undefined}\n        onChangeUnits={onChangeUnits}\n        enableCalculator={true}\n        inputCommitMode={props.inputCommitMode}\n        inputDebounceMs={props.inputDebounceMs}\n        onBlur={onBlur}\n        onInput={onInput}\n        onPreview={onPreview}\n      />\n    </View>\n  );\n}\n\nexport const InputWeight2 = memo(InputWeight2Inner);\n\ninterface IPlatesCalculatorProps {\n  weight: IWeight;\n  settings: ISettings;\n  exerciseType: IExerciseType;\n}\n\nexport const PlatesCalculator = memo(function PlatesCalculator(props: IPlatesCalculatorProps): JSX.Element {\n  const { plates, totalWeight: weight } = Weight_calculatePlates(\n    props.weight,\n    props.settings,\n    props.weight.unit,\n    props.exerciseType\n  );\n  return (\n    <View className=\"flex-row items-center w-full gap-1\">\n      <View>\n        <IconBarbellSide size={13} color={Tailwind_colors().blue[400]} />\n      </View>\n      <View>\n        <Text className=\"text-xs text-text-secondary\">\n          Plates:{\" \"}\n          <Text\n            className={`text-xs font-semibold ${Weight_eq(weight, props.weight) ? \"text-text-primary\" : \"text-text-error\"}`}\n            data-testid=\"plates-list\"\n            testID=\"plates-list\"\n          >\n            {plates.length > 0 ? Weight_formatOneSide(props.settings, plates, props.exerciseType) : \"None\"}\n          </Text>\n        </Text>\n      </View>\n    </View>\n  );\n});\n","import { JSX } from \"react\";\nimport { IUnit } from \"../types\";\n\ninterface IInputWeightUnitProps {\n  value: IUnit | \"%\";\n  units: readonly (IUnit | \"%\")[];\n  onChange: (unit: IUnit | \"%\") => void;\n}\n\nexport function InputWeightUnit(props: IInputWeightUnitProps): JSX.Element {\n  return (\n    <select\n      data-testid=\"edit-weight-unit\"\n      className=\"px-1 py-1 border rounded border-border-neutral bg-background-default\"\n      value={props.value}\n      onChange={(e) => props.onChange(e.target.value as IUnit | \"%\")}\n    >\n      {props.units.map((u) => (\n        <option key={u} value={u}>\n          {u}\n        </option>\n      ))}\n    </select>\n  );\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { Pressable, ScrollView, View } from \"react-native\";\nimport Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming } from \"react-native-reanimated\";\nimport { lb } from \"lens-shmens\";\nimport { useAppState } from \"../navigation/StateContext\";\nimport { IState, updateState } from \"../models/state\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { useRem } from \"../utils/useRem\";\nimport { useSystemKeyboardHeight } from \"../utils/useSystemKeyboardHeight\";\nimport { Text } from \"./primitives/text\";\nimport { FadeScrollView } from \"./fadeScrollView\";\nimport { IconArrowDown2 } from \"./icons/iconArrowDown2\";\nimport { IconCloseCircleOutline } from \"./icons/iconCloseCircleOutline\";\nimport { IconPreview } from \"./icons/iconPreview\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport type { ILiftoEditorPillCategory } from \"./primitives/liftoEditorActions\";\nimport { ILiftoEditorHint, LiftoEditorHints_helpId } from \"./primitives/liftoEditorHints\";\nimport type { ILiftoEditorController } from \"./liftoEditorController\";\nimport type { ICompletionKind } from \"../pages/planner/plannerCompletions\";\n\nfunction pillHue(category: ILiftoEditorPillCategory): { fg: string; bd: string; bg: string } {\n  const pill = Tailwind_semantic().editorpill;\n  switch (category) {\n    case \"weight\":\n      return { fg: pill.weightfg, bd: pill.weightbd, bg: pill.weightbg };\n    case \"timer\":\n      return { fg: pill.timerfg, bd: pill.timerbd, bg: pill.timerbg };\n    case \"logic\":\n      return { fg: pill.logicfg, bd: pill.logicbd, bg: pill.logicbg };\n    case \"sets\":\n      return { fg: pill.setsfg, bd: pill.setsbd, bg: pill.setsbg };\n    case \"progress\":\n      return { fg: pill.progressfg, bd: pill.progressbd, bg: pill.progressbg };\n    case \"neutral\":\n      return { fg: pill.neutralfg, bd: pill.neutralbd, bg: pill.neutralbg };\n  }\n}\n\nexport function useLiftoEditorHintDismissed(): [boolean, (dismissed: boolean) => void] {\n  const { state, dispatch } = useAppState();\n  const dismissed = state.storage.helps.includes(LiftoEditorHints_helpId);\n  const setDismissed = (value: boolean): void => {\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"helps\")\n          .recordModify((helps) =>\n            value\n              ? helps.includes(LiftoEditorHints_helpId)\n                ? helps\n                : [...helps, LiftoEditorHints_helpId]\n              : helps.filter((h) => h !== LiftoEditorHints_helpId)\n          ),\n      ],\n      value ? \"Dismiss editor hints\" : \"Enable editor hints\"\n    );\n  };\n  return [dismissed, setDismissed];\n}\n\nexport function LiftoEditorCrumbs(props: { controller: ILiftoEditorController }): JSX.Element {\n  const { controller } = props;\n  const levels = controller.context?.levels ?? [];\n  const semantic = Tailwind_semantic();\n  if (levels.length === 0) {\n    return <Text className=\"text-sm text-text-secondary\">Tap a token to focus</Text>;\n  }\n  return (\n    <View className=\"flex-row flex-wrap items-center py-1\">\n      {levels.map((level, i) => {\n        const isActive = i === controller.activeLevelIndex;\n        return (\n          <View key={`${level.nodeName}-${level.start}`} className=\"flex-row items-center\">\n            {i > 0 ? <Text className=\"text-xs text-text-secondary px-1\">/</Text> : null}\n            {/* A line of text-xs is a thin target vertically. Horizontal slop stays at 4 —\n                that's exactly half the px-1 separator either side, so neighbouring crumbs\n                meet without overlapping and stealing each other's taps. */}\n            <Pressable hitSlop={{ top: 10, bottom: 10, left: 4, right: 4 }} onPress={() => controller.selectLevel(i)}>\n              <Text\n                className=\"text-xs text-text-secondary\"\n                style={{\n                  textDecorationLine: \"underline\",\n                  // Android ignores textDecorationStyle and falls back to a solid underline.\n                  textDecorationStyle: \"dotted\",\n                  textDecorationColor: isActive ? semantic.text.purple : semantic.text.disabled,\n                  ...(isActive ? { color: semantic.text.purple } : null),\n                }}\n              >\n                {level.label}\n              </Text>\n            </Pressable>\n          </View>\n        );\n      })}\n    </View>\n  );\n}\n\nexport function LiftoEditorPillRail(props: {\n  controller: ILiftoEditorController;\n  className?: string;\n  // Hosts that own something the focused text can't be the authority on — the editor sheet\n  // forbids removing a section that another day declares.\n  canRemove?: boolean;\n  // Whole-exercise, not token-scoped like the trash beside it, but this is the row of things\n  // you do *to* the text rather than *in* it. Hosts that can't resolve the text (no program to\n  // resolve it against) leave it out.\n  onPreview?: () => void;\n  isPreviewing?: boolean;\n}): JSX.Element {\n  const { controller } = props;\n  const iconScale = useRem() / 16;\n  const pillRailRef = useRef<ScrollView>(null);\n  // Keyed on the level's start (not end) so typing into the focused token — which only\n  // moves its end — doesn't yank the rail back while it's being used.\n  const activeLevel = controller.context?.levels[controller.activeLevelIndex];\n  const pillRailResetKey = `${controller.activeLevelIndex}:${activeLevel?.start ?? -1}`;\n  useEffect(() => {\n    pillRailRef.current?.scrollTo({ x: 0, animated: false });\n  }, [pillRailResetKey]);\n\n  return (\n    <View className={`flex-row items-center ${props.className ?? \"\"}`}>\n      <FadeScrollView className=\"flex-1\" contentClassName=\"gap-2 px-3 py-2\" scrollRef={pillRailRef}>\n        {controller.pills.map((pill) => {\n          const hue = pillHue(pill.category);\n          return (\n            <Pressable\n              key={pill.label}\n              className=\"rounded-lg px-3 py-1.5\"\n              style={{ backgroundColor: hue.bg, borderWidth: 1, borderColor: hue.bd }}\n              onPress={() => controller.pressPill(pill)}\n            >\n              <Text className=\"text-xs font-bold\" style={{ color: hue.fg }}>\n                {pill.label}\n              </Text>\n            </Pressable>\n          );\n        })}\n        {controller.pills.length === 0 ? <Text className=\"text-xs text-text-secondary py-1.5\">No actions</Text> : null}\n      </FadeScrollView>\n      {/* Same w-scaled-10 centered column as the hint bar's dismiss and the dock's close, so the three\n          right-edge affordances share a vertical axis despite differing icon widths. */}\n      <View className=\"flex-row items-center border-l border-border-neutral\">\n        {props.onPreview != null ? (\n          <Pressable\n            testID=\"editor-preview-toggle\"\n            className=\"items-center w-scaled-10 py-2\"\n            hitSlop={{ top: 8, right: 4, bottom: 8, left: 4 }}\n            onPress={props.onPreview}\n          >\n            <IconPreview\n              size={18 * iconScale}\n              color={props.isPreviewing ? Tailwind_semantic().text.purple : undefined}\n            />\n          </Pressable>\n        ) : null}\n        {controller.canRemove && (props.canRemove ?? true) && (controller.context?.levels ?? []).length > 0 ? (\n          <Pressable\n            className=\"items-center w-scaled-10 py-2\"\n            // Left slop stays small so it doesn't swallow taps meant for the last pill.\n            hitSlop={{ top: 8, right: 8, bottom: 8, left: 4 }}\n            onPress={controller.removeFocused}\n          >\n            <IconTrash width={15 * iconScale} height={18 * iconScale} />\n          </Pressable>\n        ) : null}\n      </View>\n    </View>\n  );\n}\n\nfunction completionHue(kind: ICompletionKind): { fg: string; bd: string; bg: string } {\n  switch (kind) {\n    case \"section\":\n    case \"progressFn\":\n      return pillHue(\"progress\");\n    case \"stateVar\":\n    case \"liftoscript\":\n      return pillHue(\"logic\");\n    case \"exercise\":\n    case \"exerciseVariant\":\n    case \"reuse\":\n      return pillHue(\"neutral\");\n  }\n}\n\n// Freeform's answer to the pill rail: the same completions CodeMirror offers on the web, as a\n// strip of words sitting on the system keyboard. Rendered for the whole of freeform rather than\n// only when there's something to offer — an exercise line almost always has suggestions, and a\n// bar that came and went would shove the text around on nearly every keystroke.\nexport function LiftoEditorSuggestBar(props: {\n  controller: ILiftoEditorController;\n  className?: string;\n}): JSX.Element | null {\n  const { controller } = props;\n  const iconScale = useRem() / 16;\n  const scrollRef = useRef<ScrollView>(null);\n  const completions = controller.completions;\n  // The bar is the keyboard's accessory, not the mode's: putting the keyboard away without\n  // leaving freeform — which the sheets allow, since Apply is their only exit — would otherwise\n  // leave it stranded at the bottom of the screen with nothing under it.\n  const hasKeyboard = useSystemKeyboardHeight() > 0;\n  // Keyed on where the completion starts, not on the query: narrowing the same word re-ranks\n  // in place, and yanking the strip back to 0 mid-scroll would fight the finger.\n  const resetKey = `${completions?.kind ?? \"\"}:${completions?.from ?? -1}`;\n  useEffect(() => {\n    scrollRef.current?.scrollTo({ x: 0, animated: false });\n  }, [resetKey]);\n\n  if (!hasKeyboard) {\n    return null;\n  }\n\n  return (\n    // Rounded and outlined, not a square-edged band: the iOS keyboard has rounded top corners\n    // and a hard edge laid across them reads as a misfit. It runs to the screen edges the way\n    // the keyboard does, though — inset sides would make it a card sitting on a slab instead of\n    // the next layer of one. The 2px below is just enough to keep the two roundings apart.\n    // Fixed height, because the row is empty whenever the caret has nothing to offer, and a bar\n    // that shrank to its chevron would bounce the text on every other keystroke.\n    <View\n      className={`flex-row items-center overflow-hidden h-scaled-12 border bg-background-default border-border-neutral ${\n        props.className ?? \"\"\n      }`}\n      // Android's Uniwind drops a className borderRadius when the class list is rebuilt, which\n      // the host's className does here. The margin is the whole gap to the keyboard now — the\n      // sheets drop their own 1rem of IME clearance while this bar is up.\n      style={{ borderRadius: 12, marginBottom: 4 }}\n    >\n      {/* px matches py so the chips sit the same distance from every edge of the card. */}\n      <FadeScrollView className=\"flex-1\" contentClassName=\"gap-2 px-2 py-2 items-center\" scrollRef={scrollRef}>\n        {(completions?.options ?? []).map((option) => {\n          const hue = completionHue(completions!.kind);\n          return (\n            <Pressable\n              key={option.label}\n              testID={`editor-suggestion-${option.label}`}\n              className=\"px-3 py-1.5\"\n              // Same reason as the container's.\n              style={{ borderRadius: 8, backgroundColor: hue.bg, borderWidth: 1, borderColor: hue.bd }}\n              onPress={() => controller.applyCompletion(option)}\n            >\n              <Text className=\"text-xs font-bold\" numberOfLines={1} style={{ color: hue.fg }}>\n                {option.display ?? option.label}\n              </Text>\n            </Pressable>\n          );\n        })}\n      </FadeScrollView>\n      {/* Same w-scaled-10 centered column as the dock's close and the hint bar's dismiss. On iOS\n          this replaces Runestone's own inputAccessoryView toolbar, which would otherwise stack a\n          second bar between this one and the keyboard. Full-height divider, so it reads as part\n          of the card's edge rather than a floating tick next to the last chip. */}\n      <View className=\"flex-row items-center self-stretch border-l border-border-neutral\">\n        <Pressable\n          testID=\"editor-suggestions-hide-keyboard\"\n          className=\"items-center justify-center w-scaled-10 self-stretch\"\n          hitSlop={{ top: 8, right: 8, bottom: 8, left: 4 }}\n          onPress={controller.hideKeyboard}\n        >\n          <IconArrowDown2 width={13 * iconScale} height={8 * iconScale} />\n        </Pressable>\n      </View>\n    </View>\n  );\n}\n\n// Animated expand/collapse without knowing content height upfront: the collapsed row sits\n// in flow (defines the resting height), the expanded content is an invisible absolute layer\n// that only gets measured; tapping interpolates the container height between the two\n// measurements while cross-fading the layers.\nexport function LiftoEditorHintBar(props: { hint: ILiftoEditorHint; onDismiss: () => void }): JSX.Element {\n  const semantic = Tailwind_semantic();\n  const iconScale = useRem() / 16;\n  const [expanded, setExpanded] = useState(false);\n  const collapsedHeight = useSharedValue(0);\n  const expandedHeight = useSharedValue(0);\n  const progress = useSharedValue(0);\n\n  const containerStyle = useAnimatedStyle(() => {\n    if (progress.value === 0 || collapsedHeight.value === 0 || expandedHeight.value === 0) {\n      return { height: \"auto\" };\n    }\n    return { height: collapsedHeight.value + (expandedHeight.value - collapsedHeight.value) * progress.value };\n  });\n  const collapsedStyle = useAnimatedStyle(() => ({ opacity: 1 - progress.value }));\n  const expandedStyle = useAnimatedStyle(() => ({ opacity: progress.value }));\n\n  const toggle = (): void => {\n    const next = !expanded;\n    setExpanded(next);\n    progress.value = withTiming(next ? 1 : 0, { duration: 200, easing: Easing.inOut(Easing.ease) });\n  };\n\n  return (\n    <Pressable\n      style={{\n        backgroundColor: semantic.background.cardyellow,\n        borderBottomWidth: 1,\n        borderBottomColor: semantic.border.cardyellow,\n      }}\n      onPress={toggle}\n      // CustomKeyboardProvider closes the keypad on any stationary tap that bubbles up to\n      // it; expanding/dismissing the hint shouldn't dismiss the keypad.\n      onTouchEnd={(e) => e.stopPropagation()}\n    >\n      <Animated.View style={[{ overflow: \"hidden\" }, containerStyle]}>\n        <Animated.View\n          style={collapsedStyle}\n          className=\"px-3 py-2 pr-10\"\n          onLayout={(e) => {\n            collapsedHeight.value = e.nativeEvent.layout.height;\n          }}\n        >\n          <Text className=\"text-xs font-semibold\" style={{ color: semantic.text.cardyellow }} numberOfLines={1}>\n            {props.hint.short}\n          </Text>\n        </Animated.View>\n        <Animated.View\n          style={[{ position: \"absolute\", top: 0, left: 0, right: 0 }, expandedStyle]}\n          className=\"px-3 py-2 pr-10\"\n          onLayout={(e) => {\n            expandedHeight.value = e.nativeEvent.layout.height;\n          }}\n        >\n          <Text className=\"text-xs font-semibold\" style={{ color: semantic.text.cardyellow }}>\n            {props.hint.short}\n          </Text>\n          <Text className=\"text-xs pt-1\" style={{ color: semantic.text.cardyellowsubtle }}>\n            {props.hint.detail}\n          </Text>\n        </Animated.View>\n      </Animated.View>\n      <Pressable\n        className=\"items-center w-scaled-10 py-2\"\n        style={{ position: \"absolute\", top: 0, right: 0 }}\n        hitSlop={{ top: 8, right: 8, bottom: 8, left: 4 }}\n        onPress={props.onDismiss}\n      >\n        <IconCloseCircleOutline size={20 * iconScale} />\n      </Pressable>\n    </Pressable>\n  );\n}\n","import { JSX, useContext, useMemo } from \"react\";\nimport { Animated, Pressable, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { BottomTabBarHeightContext } from \"@react-navigation/bottom-tabs\";\nimport { useCustomKeyboardAnimatedHeight, useCustomKeyboardHeight } from \"../navigation/CustomKeyboardContext\";\nimport { useSystemKeyboardHeightFromScreenBottom } from \"../utils/useSystemKeyboardHeight\";\nimport { LiftoEditorHints_forContext, LiftoEditorHints_gestures } from \"./primitives/liftoEditorHints\";\nimport {\n  LiftoEditorCrumbs,\n  LiftoEditorHintBar,\n  LiftoEditorPillRail,\n  LiftoEditorSuggestBar,\n  useLiftoEditorHintDismissed,\n} from \"./liftoEditorChrome\";\nimport { useLiftoEditorBlurFocused, useLiftoEditorFocusEntry, useLiftoEditorFreeformEntry } from \"./liftoEditorFocus\";\nimport { IconArrowDown2 } from \"./icons/iconArrowDown2\";\nimport { IconHelp } from \"./icons/iconHelp\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { useRem } from \"../utils/useRem\";\n\n// The screen-level chrome for whichever inline editor holds focus. Sits in\n// NavScreenContent's footer slot (absolute, bottom-anchored, and the scroll content is\n// padded by its height), lifted above the custom keypad — which the root\n// CustomKeyboardProvider draws as its own bottom overlay.\nexport function LiftoEditorDock(): JSX.Element | null {\n  const entry = useLiftoEditorFocusEntry();\n  const freeformEntry = useLiftoEditorFreeformEntry();\n  const [hintDismissed, setHintDismissed] = useLiftoEditorHintDismissed();\n  const blurFocused = useLiftoEditorBlurFocused();\n  const keypadHeight = useCustomKeyboardAnimatedHeight();\n  // This dock bottoms out at the tab bar (NavScreenContent's footer lives inside the screen),\n  // but the keypad is a root-level overlay that covers the tab bar too — so only the part of\n  // it standing above the tab bar actually overlaps us. Clamped at 0 so a keypad shorter than\n  // the tab bar doesn't push the dock down into it.\n  const tabBarHeight = useContext(BottomTabBarHeightContext) ?? 0;\n  // The system keyboard: freeform's own, and the one some other field on the screen — a day\n  // name, say — raises while a token still holds the dock. The two keyboards are mutually\n  // exclusive, so gate the static height on the keypad being shut rather than adding both; a\n  // stale IME height would otherwise stack on top of the keypad.\n  // Measured from the screen bottom, since it's about to be compared with the tab bar.\n  const isKeypadOpen = useCustomKeyboardHeight() > 0;\n  const imeHeight = useSystemKeyboardHeightFromScreenBottom();\n  const systemKeyboardHeight = isKeypadOpen ? 0 : imeHeight;\n  const keypadLift = useMemo(\n    () =>\n      Animated.subtract(Animated.add(keypadHeight, systemKeyboardHeight), tabBarHeight).interpolate({\n        inputRange: [0, 1],\n        outputRange: [0, -1],\n        extrapolateLeft: \"clamp\",\n        extrapolateRight: \"extend\",\n      }),\n    [keypadHeight, systemKeyboardHeight, tabBarHeight]\n  );\n  const iconScale = useRem() / 16;\n\n  // Nothing focused, which includes freeform — that's plain text editing against the system\n  // keyboard, with no focus stack to describe. The dock's own chrome (crumbs, pills, hint) is\n  // all about that stack, so freeform gets only the suggestion strip: the completions for the\n  // caret plus the hide-keyboard chevron.\n  if (entry == null) {\n    if (freeformEntry == null) {\n      return null;\n    }\n    return (\n      // No band behind it, unlike the docked chrome below: the strip is a floating card, and a\n      // full-width ground under it would put its border back in the middle of a solid block.\n      <Animated.View style={{ transform: [{ translateY: keypadLift }] }}>\n        <LiftoEditorSuggestBar controller={freeformEntry.controller} />\n      </Animated.View>\n    );\n  }\n  const hint = LiftoEditorHints_forContext(\n    entry.controller.context,\n    entry.controller.activeLevelIndex,\n    entry.controller.text\n  );\n\n  return (\n    <Animated.View\n      className=\"border-t bg-background-default border-border-neutral\"\n      style={{ transform: [{ translateY: keypadLift }] }}\n    >\n      {/* Centered on the dock rather than over the crumbs: the dock only ever exists while a\n          token holds focus, so these are exactly the two gestures that work right now. */}\n      <Text className=\"pt-2 text-xs text-center text-text-secondary\">{LiftoEditorHints_gestures}</Text>\n      {/* No right padding and no gap: the close button is a w-scaled-10 centered column flush to the\n          edge, which is what aligns it with the hint bar's dismiss and the pill rail's trash.\n          A gap here would push the help icon visibly away from it. */}\n      <View className=\"flex-row items-center py-0 pl-4\">\n        {/* Stretched rather than content-height: the row is already as tall as the w-scaled-10 close\n            button, and spanning it gives the crumbs' padding and hitSlop room to work inside\n            the parent's bounds — Android clips anything past them — without the row growing. */}\n        <View className=\"justify-center flex-1 self-stretch\">\n          <LiftoEditorCrumbs controller={entry.controller} />\n        </View>\n        {hint != null && hintDismissed ? (\n          <Pressable testID=\"editor-dock-show-hint\" className=\"py-2 pl-2 pr-1\" onPress={() => setHintDismissed(false)}>\n            <IconHelp size={20 * iconScale} color={Tailwind_semantic().icon.neutral} />\n          </Pressable>\n        ) : null}\n        {/* A chevron, not an ✕: this dismisses the dock, and an ✕ next to a breadcrumb reads\n            as deleting whatever the breadcrumb points at. */}\n        <Pressable\n          testID=\"editor-dock-close\"\n          className=\"items-center w-scaled-10 py-2\"\n          // Left slop stays small so it doesn't swallow taps meant for the help icon.\n          hitSlop={{ top: 8, right: 8, bottom: 8, left: 4 }}\n          onPress={blurFocused}\n        >\n          <IconArrowDown2 width={13 * iconScale} height={8 * iconScale} />\n        </Pressable>\n      </View>\n      {hint != null && !hintDismissed ? (\n        <LiftoEditorHintBar hint={hint} onDismiss={() => setHintDismissed(true)} />\n      ) : null}\n      {(entry.controller.context?.levels ?? []).length > 0 ? (\n        <LiftoEditorPillRail controller={entry.controller} className=\"pb-4\" />\n      ) : null}\n    </Animated.View>\n  );\n}\n","import { createContext, JSX, ReactNode, useCallback, useContext, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport type { ILiftoEditorController } from \"./liftoEditorController\";\n\nexport interface ILiftoEditorFocusEntry {\n  id: string;\n  controller: ILiftoEditorController;\n}\n\n// An external store rather than context state on purpose: the focused editor republishes its\n// controller on every session change, and holding that in state above the editors would\n// re-render them, which would republish again. Here only the dock subscribes, so a claim\n// never reaches back into the editors.\nclass LiftoEditorFocusStore {\n  private entry: ILiftoEditorFocusEntry | undefined;\n  // Whoever the user is editing in, which is a wider set than the dock's entry: a freeform\n  // editor has no focus stack to show, but it does hold the system keyboard, and that has to\n  // be handed over when another editor takes the screen.\n  private occupant: { id: string; evict: () => void } | undefined;\n  // The occupant when it's a freeform editor, republished on every render like `entry` — the\n  // dock renders its suggestion strip, and that has to follow the caret.\n  private freeformEntry: ILiftoEditorFocusEntry | undefined;\n  private readonly listeners = new Set<() => void>();\n\n  public claim(id: string, controller: ILiftoEditorController, evict: () => void): void {\n    this.takeOver(id, evict);\n    this.entry = { id, controller };\n    this.freeformEntry = undefined;\n    this.emit();\n  }\n\n  // Freeform occupies the screen without holding the dock — the entry has to go even though\n  // the same editor is still the one being edited.\n  public occupy(id: string, controller: ILiftoEditorController, evict: () => void): void {\n    this.takeOver(id, evict);\n    if (this.entry?.id === id) {\n      this.entry = undefined;\n    }\n    this.freeformEntry = { id, controller };\n    this.emit();\n  }\n\n  public release(id: string): void {\n    if (this.occupant?.id === id) {\n      this.occupant = undefined;\n    }\n    const hadFreeform = this.freeformEntry?.id === id;\n    if (hadFreeform) {\n      this.freeformEntry = undefined;\n    }\n    if (this.entry?.id !== id) {\n      if (hadFreeform) {\n        this.emit();\n      }\n      return;\n    }\n    this.entry = undefined;\n    this.emit();\n  }\n\n  // The dock's own dismissal, so it closes the keypad too — unlike a handover, where the\n  // incoming editor owns whatever the keypad is showing.\n  public blurFocused(): void {\n    const entry = this.entry;\n    this.occupant = undefined;\n    this.entry = undefined;\n    this.freeformEntry = undefined;\n    entry?.controller.blur();\n    this.emit();\n  }\n\n  // Eviction runs after the handover is recorded: it dispatches into the outgoing editor,\n  // which re-runs its own claim effect, and a store still pointing at it would take the\n  // registration back.\n  private takeOver(id: string, evict: () => void): void {\n    const previous = this.occupant;\n    this.occupant = { id, evict };\n    if (previous != null && previous.id !== id) {\n      previous.evict();\n    }\n  }\n\n  public readonly getEntry = (): ILiftoEditorFocusEntry | undefined => this.entry;\n\n  public readonly getFreeformEntry = (): ILiftoEditorFocusEntry | undefined => this.freeformEntry;\n\n  public readonly subscribe = (listener: () => void): (() => void) => {\n    this.listeners.add(listener);\n    return () => {\n      this.listeners.delete(listener);\n    };\n  };\n\n  private emit(): void {\n    for (const listener of Array.from(this.listeners)) {\n      listener();\n    }\n  }\n}\n\nconst LiftoEditorFocusContext = createContext<LiftoEditorFocusStore | undefined>(undefined);\n\nconst noopSubscribe = (): (() => void) => () => undefined;\nconst noopEntry = (): ILiftoEditorFocusEntry | undefined => undefined;\n\nexport function LiftoEditorFocusProvider(props: { children: ReactNode }): JSX.Element {\n  const storeRef = useRef<LiftoEditorFocusStore | undefined>(undefined);\n  if (storeRef.current == null) {\n    storeRef.current = new LiftoEditorFocusStore();\n  }\n  return <LiftoEditorFocusContext.Provider value={storeRef.current}>{props.children}</LiftoEditorFocusContext.Provider>;\n}\n\n// An editor holds the dock exactly while it has a focus stack. No dependency array: the claim\n// has to republish on every render of the focused editor so the dock sees the current pills.\n//\n// Releasing on the way out matters as much as claiming: an editor that only ever claimed would\n// stop republishing once it lost focus, leaving the store holding a stale controller — the dock\n// would then render from a mode and pill set that no longer exist.\nexport function useLiftoEditorFocusClaim(id: string, controller: ILiftoEditorController): void {\n  const store = useContext(LiftoEditorFocusContext);\n  const evictRef = useRef(controller.evict);\n  evictRef.current = controller.evict;\n  const hasFocus = controller.context != null;\n  const isFreeform = controller.mode === \"freeform\";\n  useEffect(() => {\n    if (store == null) {\n      return;\n    }\n    if (hasFocus) {\n      store.claim(id, controller, () => evictRef.current());\n    } else if (isFreeform) {\n      store.occupy(id, controller, () => evictRef.current());\n    } else {\n      store.release(id);\n    }\n  });\n  useEffect(() => {\n    return () => store?.release(id);\n  }, [store, id]);\n}\n\nexport function useLiftoEditorFocusEntry(): ILiftoEditorFocusEntry | undefined {\n  const store = useContext(LiftoEditorFocusContext);\n  return useSyncExternalStore(store?.subscribe ?? noopSubscribe, store?.getEntry ?? noopEntry, noopEntry);\n}\n\n// Freeform holds no dock, but it does hold the system keyboard — this is what the dock renders\n// the suggestion strip from.\nexport function useLiftoEditorFreeformEntry(): ILiftoEditorFocusEntry | undefined {\n  const store = useContext(LiftoEditorFocusContext);\n  return useSyncExternalStore(store?.subscribe ?? noopSubscribe, store?.getFreeformEntry ?? noopEntry, noopEntry);\n}\n\nexport function useLiftoEditorBlurFocused(): () => void {\n  const store = useContext(LiftoEditorFocusContext);\n  return () => store?.blurFocused();\n}\n\nexport function useLiftoEditorFocusedControllerGetter(): () => ILiftoEditorController | undefined {\n  const store = useContext(LiftoEditorFocusContext);\n  return useCallback(() => store?.getEntry()?.controller, [store]);\n}\n","import { IEvaluatedProgram, Program_getReuseSetsCandidates, Program_getScriptReuseCandidates } from \"../models/program\";\nimport { ObjectUtils_keys, ObjectUtils_values } from \"../utils/object\";\nimport type { ILiftoEditorReuseSelection } from \"./primitives/liftoEditorActions\";\nimport type { IDayData } from \"../types\";\n\n// What the \"Reuse…\" pills can offer, for whichever exercise is being edited. Needs the\n// evaluated program, so it's built by the host rather than by the editor session.\nexport interface ILiftoEditorReuseCandidates {\n  sets: ILiftoEditorReuseSelection[];\n  progress: string[];\n  update: string[];\n}\n\n// Mirrors the reuse-sets select of the edit-exercise screen: plain `...Name` resolves in\n// the current week, so week/day are attached only when that would be wrong or ambiguous —\n// target absent from this week, present on several of its days, or the same exercise.\nfunction reuseSetsSelections(\n  key: string,\n  evaluatedProgram: IEvaluatedProgram,\n  dayData: Required<IDayData>\n): ILiftoEditorReuseSelection[] {\n  const candidates = Program_getReuseSetsCandidates(key, evaluatedProgram, dayData);\n  return ObjectUtils_values(candidates).map((candidate) => {\n    const currentWeekDays = candidate.weekAndDays[dayData.week];\n    const week = currentWeekDays == null ? Number(ObjectUtils_keys(candidate.weekAndDays)[0]) : undefined;\n    const needsDay =\n      week != null || candidate.exercise.key === key || (currentWeekDays != null && currentWeekDays.size > 1);\n    const day = needsDay ? Array.from(candidate.weekAndDays[week ?? dayData.week] ?? [])[0] : undefined;\n    return { fullName: candidate.exercise.fullName, week, day };\n  });\n}\n\nexport function LiftoEditorReuse_candidates(\n  key: string,\n  notused: boolean,\n  evaluatedProgram: IEvaluatedProgram,\n  dayData: Required<IDayData>\n): ILiftoEditorReuseCandidates {\n  return {\n    sets: reuseSetsSelections(key, evaluatedProgram, dayData),\n    progress: Program_getScriptReuseCandidates(key, notused, evaluatedProgram, \"progress\"),\n    update: Program_getScriptReuseCandidates(key, notused, evaluatedProgram, \"update\"),\n  };\n}\n","import { JSX, useState } from \"react\";\nimport { Pressable, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { InputNumber2 } from \"./inputNumber2\";\nimport { InputWeight2 } from \"./inputWeight2\";\nimport { useModal } from \"../navigation/ModalStateContext\";\nimport type { ILiftoEditorStateVarEntry } from \"./primitives/liftoEditorActions\";\nimport {\n  ILiftoEditorStateVar,\n  ILiftoEditorStateVarRow,\n  ILiftoEditorStateVarValue,\n  LiftoEditorStateVars_fromEntries,\n  LiftoEditorStateVars_isUsed,\n  LiftoEditorStateVars_print,\n  LiftoEditorStateVars_remove,\n  LiftoEditorStateVars_rows,\n  LiftoEditorStateVars_set,\n} from \"./primitives/liftoEditorStateVars\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { Weight_buildAny, Weight_print } from \"../models/weight\";\nimport { IExerciseType, IProgramState, IProgramStateMetadata, ISettings } from \"../types\";\n\nexport interface ILiftoEditorStateVarsSheetProps {\n  // What custom()'s parens hold now; on save, the same list rewritten.\n  entries: ILiftoEditorStateVarEntry[];\n  // The list holds something that isn't a `name: value` pair. Saving would drop it, so the\n  // sheet shows what it could read and leaves the rewrite to the editor.\n  hasUnparsed: boolean;\n  // What the reused progress declares — the values this exercise inherits unless it\n  // overrides them.\n  defaults?: IProgramState;\n  defaultsMetadata?: IProgramStateMetadata;\n  sourceName?: string;\n  // Every script that can reach this state: a variable either one mentions can't be deleted.\n  progressScript?: string;\n  updateScript?: string;\n  exerciseType?: IExerciseType;\n  settings: ISettings;\n  onDone: (args: string) => void;\n}\n\nexport function LiftoEditorStateVarsSheet(props: ILiftoEditorStateVarsSheetProps): JSX.Element {\n  const [vars, setVars] = useState<ILiftoEditorStateVar[]>(() => LiftoEditorStateVars_fromEntries(props.entries));\n  const rows = LiftoEditorStateVars_rows(vars, props.defaults, props.defaultsMetadata);\n  const openCreate = useModal(\"createStateVarModal\", (created) => {\n    if (created != null) {\n      setVars((current) =>\n        LiftoEditorStateVars_set(current, created.name, {\n          value: created.type === \"number\" ? 0 : Weight_buildAny(0, created.type),\n          userPrompted: created.isUserPrompted,\n        })\n      );\n    }\n  });\n\n  const setValue = (row: ILiftoEditorStateVarRow, value: ILiftoEditorStateVarValue): void => {\n    setVars((current) => LiftoEditorStateVars_set(current, row.name, { value, userPrompted: row.userPrompted }));\n  };\n\n  return (\n    <View>\n      <Text className=\"text-xs text-text-secondary\">\n        Values the progress script remembers between workouts. Read and changed via{\" \"}\n        <Text className=\"text-xs font-bold\">state.name</Text> in the script.\n      </Text>\n      {props.sourceName != null && (\n        <Text className=\"pt-2 text-xs text-text-secondary\">\n          Progress is reused from <Text className=\"text-xs font-bold\">{props.sourceName}</Text>. Changing a value here\n          overrides it for this exercise only.\n        </Text>\n      )}\n      {props.hasUnparsed && (\n        <Text className=\"pt-2 text-xs text-text-error\">\n          There's something in this progress' arguments that isn't a state variable, so saving from here would drop it.\n          Fix the line in the editor first.\n        </Text>\n      )}\n      <View className=\"mt-3 border rounded-lg bg-background-cardpurple border-border-cardpurple\">\n        {rows.length === 0 && (\n          <View className=\"p-3\">\n            <Text className=\"text-xs text-text-secondary\">This progress has no state variables yet.</Text>\n          </View>\n        )}\n        {rows.map((row) => (\n          <StateVarRow\n            key={row.name}\n            row={row}\n            settings={props.settings}\n            exerciseType={props.exerciseType}\n            isUsedInScript={LiftoEditorStateVars_isUsed(row.name, props)}\n            onChange={(value) => setValue(row, value)}\n            onReset={() => setVars((current) => LiftoEditorStateVars_remove(current, row.name))}\n            onDelete={() => setVars((current) => LiftoEditorStateVars_remove(current, row.name))}\n          />\n        ))}\n        {!props.hasUnparsed && (\n          <View className=\"p-2\">\n            <Button\n              kind=\"lightpurple\"\n              name=\"add-state-variable\"\n              className=\"w-full text-sm\"\n              onClick={() => openCreate({ existingNames: rows.map((r) => r.name) })}\n            >\n              + Add State Variable\n            </Button>\n          </View>\n        )}\n      </View>\n      <View className=\"items-center pt-4\">\n        <Button\n          kind=\"purple\"\n          name=\"state-vars-save\"\n          disabled={props.hasUnparsed}\n          onClick={() => props.onDone(LiftoEditorStateVars_print(vars))}\n        >\n          Save\n        </Button>\n      </View>\n    </View>\n  );\n}\n\ninterface IStateVarRowProps {\n  row: ILiftoEditorStateVarRow;\n  settings: ISettings;\n  exerciseType?: IExerciseType;\n  isUsedInScript: boolean;\n  onChange: (value: ILiftoEditorStateVarValue) => void;\n  onReset: () => void;\n  onDelete: () => void;\n}\n\nfunction StateVarRow(props: IStateVarRowProps): JSX.Element {\n  const { row } = props;\n  const isInherited = row.defaultValue != null;\n  const isOverridden = isInherited && row.isDeclared;\n  return (\n    <View className=\"p-2 border-b border-border-cardpurple\" testID={`state-var-${row.name}`}>\n      <View className=\"flex-row items-center gap-4\">\n        <View className=\"flex-1\">\n          {/* No leading-none: a line box the size of the font clips Poppins' ascenders. */}\n          <Text>{row.name}</Text>\n          {row.userPrompted && <Text className=\"text-xs text-text-secondary\">User prompted</Text>}\n          {isInherited && !isOverridden && <Text className=\"text-xs text-text-secondary\">Reused</Text>}\n          {isOverridden && row.defaultValue != null && (\n            <Text className=\"text-xs text-text-secondary\">Overrides {Weight_print(row.defaultValue)}</Text>\n          )}\n        </View>\n        <View>\n          {/* Live, not the default debounce: Save serializes the values straight out of\n              state, so a keypad tap followed by an immediate Save would write the old one. */}\n          {typeof row.value === \"number\" ? (\n            <InputNumber2\n              name={row.name}\n              value={row.value}\n              step={1}\n              allowDot={true}\n              inputCommitMode=\"live\"\n              onInput={(value) => {\n                if (value != null) {\n                  props.onChange(value);\n                }\n              }}\n            />\n          ) : (\n            <InputWeight2\n              name={row.name}\n              value={row.value}\n              showUnitInside={true}\n              settings={props.settings}\n              units={[\"lb\", \"kg\", \"%\"]}\n              exerciseType={props.exerciseType}\n              inputCommitMode=\"live\"\n              onInput={(value) => {\n                if (value != null) {\n                  props.onChange(value);\n                }\n              }}\n            />\n          )}\n        </View>\n        {/* Fixed width so the value inputs line up down the column whatever each row's\n            action is — and wide enough for \"Reset\" to stay on one line as the rem grows. */}\n        <View className=\"items-end\" style={{ width: 48 }}>\n          {isOverridden ? (\n            <LinkButton className=\"text-xs\" name={`state-var-reset-${row.name}`} onClick={props.onReset}>\n              Reset\n            </LinkButton>\n          ) : isInherited ? null : (\n            <Pressable\n              className=\"py-1 pl-1 pr-2\"\n              testID={`state-var-delete-${row.name}`}\n              onPress={() => {\n                if (props.isUsedInScript) {\n                  Dialog_alert(\"You cannot delete it, because this state variable is used in the script.\");\n                } else {\n                  props.onDelete();\n                }\n              }}\n            >\n              <IconTrash\n                color={props.isUsedInScript ? Tailwind_colors().lightgray[300] : Tailwind_semantic().icon.neutral}\n                width={14}\n                height={18}\n              />\n            </Pressable>\n          )}\n        </View>\n      </View>\n    </View>\n  );\n}\n","import { forwardRef, JSX, useState, useMemo, useCallback, useEffect, useId, useImperativeHandle } from \"react\";\nimport { View, LayoutChangeEvent, Platform } from \"react-native\";\nimport { Svg, Path, Line, G, SvgText, Circle, Rect, Defs, ClipPath } from \"./primitives/svg\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { MathUtils_formatCompact } from \"../utils/math\";\nimport { useLineChartGestures } from \"./lineChartGestures\";\n\nconst IS_WEB = Platform.OS === \"web\";\n\nexport interface ILineChartSeries {\n  label: string;\n  color: string;\n  show: boolean;\n  width?: number;\n}\n\ninterface ILineChartProps {\n  data: (number | null)[][];\n  series: ILineChartSeries[];\n  height: number;\n  xMin?: number;\n  xMax?: number;\n  xMode?: \"time\" | \"linear\";\n  xAxisFormatter?: (value: number) => string;\n  xAxisTicks?: number[];\n  programLines?: [number, string][];\n  onCursorChange?: (idx: number | null) => void;\n  onInteract?: () => void;\n  yAxisFormatter?: (value: number) => string;\n  yAxisWidth?: number;\n  isInteractive?: boolean;\n}\n\nexport interface ILineChartHandle {\n  clearCursor: () => void;\n}\n\nconst YEAR_SECONDS = 365 * 24 * 60 * 60;\n\nfunction niceTicks(min: number, max: number, targetCount: number): number[] {\n  if (min === max) {\n    return [min];\n  }\n  const range = max - min;\n  const roughStep = range / Math.max(1, targetCount);\n  const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));\n  const normalized = roughStep / magnitude;\n  let step;\n  if (normalized < 1.5) {\n    step = 1 * magnitude;\n  } else if (normalized < 3) {\n    step = 2 * magnitude;\n  } else if (normalized < 7) {\n    step = 5 * magnitude;\n  } else {\n    step = 10 * magnitude;\n  }\n  const first = Math.ceil(min / step) * step;\n  const ticks: number[] = [];\n  for (let v = first; v <= max + 1e-9; v += step) {\n    ticks.push(Number(v.toFixed(10)));\n  }\n  return ticks;\n}\n\nfunction timeTicks(minSec: number, maxSec: number, targetCount: number): number[] {\n  const rangeSec = maxSec - minSec;\n  if (rangeSec <= 0) {\n    return [];\n  }\n  const day = 24 * 60 * 60;\n  const yearApprox = 365 * day;\n\n  if (rangeSec / yearApprox > 1.5) {\n    const yearSteps = [1, 2, 5, 10, 20, 50, 100];\n    const approxYears = rangeSec / yearApprox;\n    let yearStep = yearSteps[yearSteps.length - 1];\n    for (const ys of yearSteps) {\n      if (approxYears / ys <= targetCount * 1.5) {\n        yearStep = ys;\n        break;\n      }\n    }\n    const minDate = new Date(minSec * 1000);\n    const maxDate = new Date(maxSec * 1000);\n    const startYear = Math.ceil(minDate.getFullYear() / yearStep) * yearStep;\n    const endYear = maxDate.getFullYear();\n    const ticks: number[] = [];\n    for (let y = startYear; y <= endYear; y += yearStep) {\n      const t = new Date(y, 0, 1).getTime() / 1000;\n      if (t >= minSec && t <= maxSec) {\n        ticks.push(t);\n      }\n    }\n    return ticks;\n  }\n\n  const intervals = [day, 2 * day, 7 * day, 14 * day, 30 * day, 60 * day, 90 * day, 180 * day, 365 * day];\n  let step = intervals[intervals.length - 1];\n  for (const i of intervals) {\n    if (rangeSec / i <= targetCount * 1.5) {\n      step = i;\n      break;\n    }\n  }\n  const first = Math.ceil(minSec / step) * step;\n  const ticks: number[] = [];\n  for (let v = first; v <= maxSec; v += step) {\n    ticks.push(v);\n  }\n  return ticks;\n}\n\nfunction clipSeriesToViewport(\n  timestamps: (number | null)[],\n  values: (number | null)[],\n  xMin: number,\n  xMax: number\n): [number, number][] {\n  const pts: [number, number][] = [];\n  for (let i = 0; i < timestamps.length; i++) {\n    const t = timestamps[i];\n    const v = values[i];\n    if (t == null || v == null || !isFinite(t) || !isFinite(v)) {\n      continue;\n    }\n    pts.push([t, v]);\n  }\n  const interpAt = (a: [number, number], b: [number, number], xAt: number): [number, number] => {\n    const r = (xAt - a[0]) / (b[0] - a[0]);\n    return [xAt, a[1] + (b[1] - a[1]) * r];\n  };\n  const out: [number, number][] = [];\n  if (pts.length > 0 && pts[0][0] >= xMin && pts[0][0] <= xMax) {\n    out.push(pts[0]);\n  }\n  for (let i = 1; i < pts.length; i++) {\n    const p1 = pts[i - 1];\n    const p2 = pts[i];\n    if (p2[0] < xMin) {\n      continue;\n    }\n    if (p1[0] > xMax) {\n      break;\n    }\n    if (p1[0] < xMin && p2[0] >= xMin) {\n      out.push(interpAt(p1, p2, xMin));\n    }\n    if (p2[0] > xMax) {\n      out.push(interpAt(p1, p2, xMax));\n      break;\n    }\n    out.push(p2);\n  }\n  return out;\n}\n\nfunction buildPath(points: [number, number][], xToPx: (x: number) => number, yToPx: (y: number) => number): string {\n  let d = \"\";\n  let started = false;\n  for (let i = 0; i < points.length; i++) {\n    const [t, v] = points[i];\n    const px = xToPx(t);\n    const py = yToPx(v);\n    // react-native-svg's native Android PathParser throws on a non-numeric \"NaN\" in the path string\n    if (!isFinite(px) || !isFinite(py)) {\n      continue;\n    }\n    d += (started ? \"L\" : \"M\") + `${px.toFixed(2)} ${py.toFixed(2)}`;\n    started = true;\n  }\n  return d;\n}\n\nfunction findNearestIdx(\n  timestamps: (number | null)[],\n  xVal: number,\n  visibleMin: number,\n  visibleMax: number\n): number | null {\n  let bestIdx: number | null = null;\n  let bestDist = Infinity;\n  for (let i = 0; i < timestamps.length; i++) {\n    const t = timestamps[i];\n    if (t == null) {\n      continue;\n    }\n    if (t < visibleMin || t > visibleMax) {\n      continue;\n    }\n    const d = Math.abs(t - xVal);\n    if (d < bestDist) {\n      bestDist = d;\n      bestIdx = i;\n    }\n  }\n  return bestIdx;\n}\n\nexport const LineChart = forwardRef<ILineChartHandle, ILineChartProps>(function LineChart(props, ref): JSX.Element {\n  const [width, setWidth] = useState<number>(0);\n  const rawTimestamps = props.data[0] || [];\n  const timestamps = useMemo(() => rawTimestamps.map((t) => (t != null && isFinite(t) ? t : null)), [rawTimestamps]);\n\n  const xMode = props.xMode ?? \"time\";\n  const finiteTimestamps = useMemo(() => timestamps.filter((t): t is number => t != null), [timestamps]);\n  const dataMaxX = finiteTimestamps.length > 0 ? (finiteTimestamps[finiteTimestamps.length - 1] as number) : 0;\n  const dataMinX =\n    finiteTimestamps.length > 0\n      ? xMode === \"time\"\n        ? Math.max(finiteTimestamps[0] as number, dataMaxX - YEAR_SECONDS)\n        : (finiteTimestamps[0] as number)\n      : 0;\n\n  const initialMin =\n    props.xMin != null\n      ? xMode === \"time\"\n        ? Math.max(props.xMin, (props.xMax ?? dataMaxX) - YEAR_SECONDS)\n        : props.xMin\n      : dataMinX;\n  const initialMax = props.xMax != null ? props.xMax : dataMaxX;\n\n  const [userViewport, setUserViewport] = useState<{ xMin: number; xMax: number } | null>(null);\n  const viewport = useMemo(\n    () => userViewport ?? { xMin: initialMin, xMax: initialMax },\n    [userViewport, initialMin, initialMax]\n  );\n  const setViewport = useCallback((vp: { xMin: number; xMax: number }) => {\n    setUserViewport(vp);\n  }, []);\n  const [cursorIdx, setCursorIdx] = useState<number | null>(null);\n\n  useEffect(() => {\n    props.onCursorChange?.(cursorIdx);\n  }, [cursorIdx]);\n\n  const semantic = Tailwind_semantic();\n  const colors = {\n    axisText: semantic.text.primary,\n    grid: semantic.border.neutral,\n    titleText: semantic.text.primary,\n    secondary: semantic.text.secondary,\n    cursor: semantic.text.secondary,\n    background: semantic.background.default,\n  };\n\n  const padTop = 8;\n  const padBottom = 30;\n  const padLeft = props.yAxisWidth ?? 44;\n  const padRight = 12;\n  const plotWidth = Math.max(0, width - padLeft - padRight);\n  const plotHeight = Math.max(0, props.height - padTop - padBottom);\n\n  const { xMin, xMax } = viewport;\n  const xRange = Math.max(1, xMax - xMin);\n\n  const clippedSeries = useMemo(() => {\n    return props.series.map((s, i) => {\n      if (!s.show) {\n        return [] as [number, number][];\n      }\n      return clipSeriesToViewport(timestamps, props.data[i + 1] || [], xMin, xMax);\n    });\n  }, [props.series, props.data, xMin, xMax, timestamps]);\n\n  const { yMin, yMax } = useMemo(() => {\n    let lo = Infinity;\n    let hi = -Infinity;\n    for (const points of clippedSeries) {\n      for (const [, v] of points) {\n        if (v < lo) {\n          lo = v;\n        }\n        if (v > hi) {\n          hi = v;\n        }\n      }\n    }\n    if (!isFinite(lo) || !isFinite(hi)) {\n      return { yMin: 0, yMax: 1 };\n    }\n    if (lo === hi) {\n      const pad = Math.abs(lo) * 0.1 || 1;\n      return { yMin: lo - pad, yMax: hi + pad };\n    }\n    const pad = (hi - lo) * 0.1;\n    return { yMin: lo - pad, yMax: hi + pad };\n  }, [clippedSeries]);\n\n  const yRange = Math.max(1e-9, yMax - yMin);\n\n  const xToPx = useCallback(\n    (x: number): number => padLeft + ((x - xMin) / xRange) * plotWidth,\n    [padLeft, xMin, xRange, plotWidth]\n  );\n  const yToPx = useCallback(\n    (y: number): number => padTop + plotHeight - ((y - yMin) / yRange) * plotHeight,\n    [padTop, plotHeight, yMin, yRange]\n  );\n  const pxToX = useCallback(\n    (px: number): number => xMin + ((px - padLeft) / Math.max(1, plotWidth)) * xRange,\n    [xMin, padLeft, plotWidth, xRange]\n  );\n\n  const yTicks = useMemo(() => niceTicks(yMin, yMax, 5), [yMin, yMax]);\n  const xTicks = useMemo(() => {\n    const targetCount = Math.max(2, Math.floor(plotWidth / 80));\n    if (props.xAxisTicks) {\n      const visible = props.xAxisTicks.filter((t) => t >= xMin && t <= xMax);\n      if (visible.length <= targetCount) {\n        return visible;\n      }\n      const step = Math.ceil(visible.length / targetCount);\n      return visible.filter((_, i) => i % step === 0);\n    }\n    if (xMode === \"linear\") {\n      return niceTicks(xMin, xMax, targetCount);\n    }\n    return timeTicks(xMin, xMax, targetCount);\n  }, [xMin, xMax, plotWidth, xMode, props.xAxisTicks]);\n\n  const onLayout = useCallback((e: LayoutChangeEvent) => {\n    setWidth(e.nativeEvent.layout.width);\n  }, []);\n\n  const setCursorAtPx = useCallback(\n    (xPx: number): number | null => {\n      const x = pxToX(xPx);\n      const idx = findNearestIdx(timestamps, x, xMin, xMax);\n      setCursorIdx(idx);\n      return idx;\n    },\n    [pxToX, timestamps, xMin, xMax]\n  );\n\n  const clearCursor = useCallback(() => {\n    setCursorIdx(null);\n  }, []);\n\n  const resetViewport = useCallback(() => {\n    setUserViewport(null);\n    setCursorIdx(null);\n  }, []);\n\n  const { Wrap, frozen, clearFrozen } = useLineChartGestures({\n    plotWidth,\n    padLeft,\n    viewport,\n    setViewport,\n    resetViewport,\n    setCursorAtPx,\n    clearCursor,\n    isInteractive: props.isInteractive !== false,\n    onInteract: props.onInteract,\n  });\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      clearCursor: () => {\n        setCursorIdx(null);\n        clearFrozen();\n      },\n    }),\n    [clearFrozen]\n  );\n\n  const cursorTimestamp = cursorIdx != null ? (timestamps[cursorIdx] as number | null) : null;\n  const cursorX = cursorTimestamp != null ? xToPx(cursorTimestamp) : null;\n\n  const yAxisFormatter = props.yAxisFormatter || ((v: number) => `${Math.round(v * 100) / 100}`);\n\n  const programLinePositions = useMemo(() => {\n    if (!props.programLines) {\n      return [];\n    }\n    return props.programLines\n      .map<[number, string]>((p) => [xToPx(p[0]), p[1]])\n      .filter(([px]) => px >= padLeft && px <= padLeft + plotWidth);\n  }, [props.programLines, xToPx, padLeft, plotWidth]);\n\n  const renderSvg = width > 0 && plotHeight > 0;\n  const reactId = useId();\n  const clipId = `lineChart-clip-${reactId.replace(/:/g, \"\")}`;\n\n  const innerStyle = {\n    width,\n    height: props.height,\n    ...(IS_WEB\n      ? {\n          cursor: \"crosshair\",\n          outline: frozen ? `2px solid ${semantic.border.cardpurple}` : \"none\",\n          outlineOffset: \"2px\",\n          borderRadius: 4,\n        }\n      : null),\n  } as object;\n\n  return (\n    <View onLayout={onLayout} style={{ width: \"100%\", height: props.height }}>\n      {renderSvg && (\n        <Wrap style={innerStyle}>\n          <Svg width={width} height={props.height}>\n            <Defs>\n              <ClipPath id={clipId}>\n                <Rect x={padLeft} y={padTop} width={plotWidth} height={plotHeight} />\n              </ClipPath>\n            </Defs>\n            <G>\n              {yTicks.map((t, i) => {\n                const py = yToPx(t);\n                return (\n                  <G key={`y-${i}`}>\n                    <Line\n                      x1={padLeft}\n                      x2={padLeft + plotWidth}\n                      y1={py}\n                      y2={py}\n                      stroke={colors.grid}\n                      strokeWidth={0.5}\n                    />\n                    <SvgText x={padLeft - 6} y={py + 3} fill={colors.axisText} fontSize={10} textAnchor=\"end\">\n                      {yAxisFormatter(t)}\n                    </SvgText>\n                  </G>\n                );\n              })}\n            </G>\n\n            <G>\n              {xTicks.map((t, i) => {\n                const px = xToPx(t);\n                if (px < padLeft - 1 || px > padLeft + plotWidth + 1) {\n                  return null;\n                }\n                return (\n                  <G key={`x-${i}`}>\n                    <Line x1={px} x2={px} y1={padTop} y2={padTop + plotHeight} stroke={colors.grid} strokeWidth={0.5} />\n                    {(() => {\n                      if (props.xAxisFormatter) {\n                        return (\n                          <SvgText\n                            x={px}\n                            y={padTop + plotHeight + 14}\n                            fill={colors.axisText}\n                            fontSize={10}\n                            textAnchor=\"middle\"\n                          >\n                            {props.xAxisFormatter(t)}\n                          </SvgText>\n                        );\n                      }\n                      if (xMode === \"linear\") {\n                        return (\n                          <SvgText\n                            x={px}\n                            y={padTop + plotHeight + 14}\n                            fill={colors.axisText}\n                            fontSize={10}\n                            textAnchor=\"middle\"\n                          >\n                            {MathUtils_formatCompact(t)}\n                          </SvgText>\n                        );\n                      }\n                      const d = new Date(t * 1000);\n                      const showYear = d.getFullYear() !== new Date().getFullYear();\n                      return (\n                        <>\n                          <SvgText\n                            x={px}\n                            y={padTop + plotHeight + 14}\n                            fill={colors.axisText}\n                            fontSize={10}\n                            textAnchor=\"middle\"\n                          >\n                            {DateUtils_format(d, true, true)}\n                          </SvgText>\n                          {showYear && (\n                            <SvgText\n                              x={px}\n                              y={padTop + plotHeight + 26}\n                              fill={colors.axisText}\n                              fontSize={10}\n                              textAnchor=\"middle\"\n                            >\n                              {d.getFullYear()}\n                            </SvgText>\n                          )}\n                        </>\n                      );\n                    })()}\n                  </G>\n                );\n              })}\n            </G>\n\n            <G clipPath={`url(#${clipId})`}>\n              {programLinePositions.map(([px, name], i) => {\n                const labelX = px + 3;\n                const labelY = padTop + 4;\n                return (\n                  <G key={`prog-${i}`}>\n                    <Line x1={px} x2={px} y1={padTop} y2={padTop + plotHeight} stroke={colors.grid} strokeWidth={1} />\n                    <SvgText\n                      x={labelX}\n                      y={labelY}\n                      fill={colors.secondary}\n                      fontSize={9}\n                      transform={`rotate(90, ${labelX}, ${labelY})`}\n                    >\n                      {name}\n                    </SvgText>\n                  </G>\n                );\n              })}\n            </G>\n\n            <G>\n              <Line\n                x1={padLeft}\n                x2={padLeft}\n                y1={padTop}\n                y2={padTop + plotHeight}\n                stroke={colors.grid}\n                strokeWidth={1}\n              />\n              <Line\n                x1={padLeft}\n                x2={padLeft + plotWidth}\n                y1={padTop + plotHeight}\n                y2={padTop + plotHeight}\n                stroke={colors.grid}\n                strokeWidth={1}\n              />\n            </G>\n\n            <G clipPath={`url(#${clipId})`}>\n              {props.series.map((s, i) => {\n                if (!s.show) {\n                  return null;\n                }\n                const d = buildPath(clippedSeries[i], xToPx, yToPx);\n                if (!d) {\n                  return null;\n                }\n                return <Path key={`series-${i}`} d={d} stroke={s.color} strokeWidth={s.width ?? 1.5} fill=\"none\" />;\n              })}\n            </G>\n\n            {cursorX != null && cursorIdx != null && (\n              <G>\n                <Line\n                  x1={cursorX}\n                  x2={cursorX}\n                  y1={padTop}\n                  y2={padTop + plotHeight}\n                  stroke={colors.cursor}\n                  strokeWidth={1}\n                  strokeDasharray=\"3,3\"\n                />\n                {props.series.map((s, i) => {\n                  if (!s.show) {\n                    return null;\n                  }\n                  const v = props.data[i + 1]?.[cursorIdx];\n                  if (v == null || !isFinite(v)) {\n                    return null;\n                  }\n                  return (\n                    <Circle\n                      key={`cursor-${i}`}\n                      cx={cursorX}\n                      cy={yToPx(v)}\n                      r={3.5}\n                      fill={s.color}\n                      stroke={colors.background}\n                      strokeWidth={1}\n                    />\n                  );\n                })}\n              </G>\n            )}\n\n            <Rect x={padLeft} y={padTop} width={plotWidth} height={plotHeight} fill=\"transparent\" stroke=\"none\" />\n          </Svg>\n        </Wrap>\n      )}\n    </View>\n  );\n});\n","import { JSX, ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { View, StyleProp, ViewStyle } from \"react-native\";\n\nfunction targetIsInsideGraphLegend(target: Node): boolean {\n  let el: Node | null = target;\n  while (el) {\n    if (el instanceof HTMLElement && el.dataset && el.dataset.graphLegend === \"true\") {\n      return true;\n    }\n    el = el.parentNode;\n  }\n  return false;\n}\n\nexport interface ILineChartGesturesArgs {\n  plotWidth: number;\n  padLeft: number;\n  viewport: { xMin: number; xMax: number };\n  setViewport: (vp: { xMin: number; xMax: number }) => void;\n  resetViewport: () => void;\n  setCursorAtPx: (xPx: number) => number | null;\n  clearCursor: () => void;\n  isInteractive?: boolean;\n  // Never call this from mousemove — the crosshair follows a plain hover.\n  onInteract?: () => void;\n}\n\nexport interface ILineChartGesturesResult {\n  Wrap: (props: { children: ReactNode; style: StyleProp<ViewStyle> }) => JSX.Element;\n  frozen: boolean;\n  clearFrozen: () => void;\n}\n\nexport function useLineChartGestures(args: ILineChartGesturesArgs): ILineChartGesturesResult {\n  const argsRef = useRef(args);\n  argsRef.current = args;\n\n  const [node, setNode] = useState<HTMLElement | null>(null);\n  const setContainerRef = useCallback((el: View | null) => {\n    setNode((el as unknown as HTMLElement | null) ?? null);\n  }, []);\n\n  const [frozen, setFrozen] = useState(false);\n  const frozenRef = useRef(frozen);\n  useEffect(() => {\n    frozenRef.current = frozen;\n  }, [frozen]);\n\n  const clearFrozen = useCallback(() => {\n    setFrozen(false);\n  }, []);\n\n  useEffect(() => {\n    if (!node || args.isInteractive === false) {\n      return;\n    }\n\n    let dragStart: { clientX: number; xMin: number; xMax: number; moved: boolean } | null = null;\n\n    const updateCursorAtClient = (clientX: number): number | null => {\n      const rect = node.getBoundingClientRect();\n      const xPx = clientX - rect.left;\n      return argsRef.current.setCursorAtPx(xPx);\n    };\n\n    const onMouseDown = (e: MouseEvent): void => {\n      if (e.button !== 0) {\n        return;\n      }\n      argsRef.current.onInteract?.();\n      const v = argsRef.current.viewport;\n      dragStart = { clientX: e.clientX, xMin: v.xMin, xMax: v.xMax, moved: false };\n      e.preventDefault();\n    };\n\n    const onMouseMove = (e: MouseEvent): void => {\n      if (dragStart) {\n        const dx = e.clientX - dragStart.clientX;\n        if (Math.abs(dx) > 2) {\n          dragStart.moved = true;\n        }\n        const pw = argsRef.current.plotWidth;\n        if (pw <= 0) {\n          return;\n        }\n        const range = dragStart.xMax - dragStart.xMin;\n        const deltaSec = -(dx / pw) * range;\n        argsRef.current.setViewport({\n          xMin: dragStart.xMin + deltaSec,\n          xMax: dragStart.xMax + deltaSec,\n        });\n        return;\n      }\n      if (frozenRef.current) {\n        return;\n      }\n      updateCursorAtClient(e.clientX);\n    };\n\n    const onMouseUp = (e: MouseEvent): void => {\n      if (dragStart && !dragStart.moved) {\n        const idx = updateCursorAtClient(e.clientX);\n        if (idx != null) {\n          setFrozen(true);\n        }\n      }\n      dragStart = null;\n    };\n\n    const onMouseLeave = (): void => {\n      if (!dragStart && !frozenRef.current) {\n        argsRef.current.clearCursor();\n      }\n    };\n\n    const onWheel = (e: WheelEvent): void => {\n      if (!frozenRef.current) {\n        return;\n      }\n      argsRef.current.onInteract?.();\n      e.preventDefault();\n      const rect = node.getBoundingClientRect();\n      const focalX = e.clientX - rect.left;\n      const v = argsRef.current.viewport;\n      const pw = argsRef.current.plotWidth;\n      if (pw <= 0) {\n        return;\n      }\n      const range = v.xMax - v.xMin;\n      const focalPct = Math.max(0, Math.min(1, (focalX - argsRef.current.padLeft) / pw));\n      const xAtFocal = v.xMin + focalPct * range;\n      const zoomFactor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n      const newRange = range / zoomFactor;\n      const newXMin = xAtFocal - focalPct * newRange;\n      argsRef.current.setViewport({ xMin: newXMin, xMax: newXMin + newRange });\n    };\n\n    const onDocMouseDown = (e: MouseEvent): void => {\n      if (!frozenRef.current) {\n        return;\n      }\n      const target = e.target as Node | null;\n      if (target && node.contains(target)) {\n        return;\n      }\n      if (target && targetIsInsideGraphLegend(target)) {\n        return;\n      }\n      setFrozen(false);\n      argsRef.current.clearCursor();\n    };\n\n    const onDblClick = (e: MouseEvent): void => {\n      e.preventDefault();\n      argsRef.current.onInteract?.();\n      argsRef.current.resetViewport();\n      setFrozen(false);\n    };\n\n    let twoTouch: {\n      startDist: number;\n      startCenterX: number;\n      xMin: number;\n      xMax: number;\n      padLeft: number;\n      plotWidth: number;\n    } | null = null;\n    let singleTap: { startX: number; startY: number; startTime: number; moved: boolean } | null = null;\n    let lastTapTime = 0;\n    let lastTapX = 0;\n\n    let scrub: { active: boolean; timer: number | null; startX: number; startY: number } | null = null;\n    const SCRUB_HOLD_MS = 200;\n    const SCRUB_CANCEL_PX = 10;\n\n    const cancelScrubTimer = (): void => {\n      if (scrub && scrub.timer != null) {\n        window.clearTimeout(scrub.timer);\n        scrub.timer = null;\n      }\n    };\n\n    const touchDistance = (a: Touch, b: Touch): number => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n\n    const onTouchStart = (e: TouchEvent): void => {\n      if (e.touches.length === 2) {\n        argsRef.current.onInteract?.();\n        e.preventDefault();\n        const a = e.touches[0];\n        const b = e.touches[1];\n        const rect = node.getBoundingClientRect();\n        const centerX = (a.clientX + b.clientX) / 2 - rect.left;\n        const v = argsRef.current.viewport;\n        twoTouch = {\n          startDist: Math.max(1, touchDistance(a, b)),\n          startCenterX: centerX,\n          xMin: v.xMin,\n          xMax: v.xMax,\n          padLeft: argsRef.current.padLeft,\n          plotWidth: argsRef.current.plotWidth,\n        };\n        singleTap = null;\n        cancelScrubTimer();\n        scrub = null;\n      } else if (e.touches.length === 1 && !twoTouch) {\n        const t = e.touches[0];\n        singleTap = {\n          startX: t.clientX,\n          startY: t.clientY,\n          startTime: Date.now(),\n          moved: false,\n        };\n        const session = { active: false, timer: null as number | null, startX: t.clientX, startY: t.clientY };\n        scrub = session;\n        session.timer = window.setTimeout(() => {\n          if (scrub !== session) {\n            return;\n          }\n          session.active = true;\n          session.timer = null;\n          argsRef.current.onInteract?.();\n          const rect = node.getBoundingClientRect();\n          argsRef.current.setCursorAtPx(session.startX - rect.left);\n        }, SCRUB_HOLD_MS);\n      }\n    };\n\n    const onTouchMove = (e: TouchEvent): void => {\n      if (twoTouch && e.touches.length >= 2) {\n        e.preventDefault();\n        const a = e.touches[0];\n        const b = e.touches[1];\n        const rect = node.getBoundingClientRect();\n        const centerX = (a.clientX + b.clientX) / 2 - rect.left;\n        const dist = Math.max(1, touchDistance(a, b));\n        const scale = dist / twoTouch.startDist;\n        const translationX = centerX - twoTouch.startCenterX;\n\n        const startRange = twoTouch.xMax - twoTouch.xMin;\n        const newRange = startRange / Math.max(0.05, scale);\n        const pw = Math.max(1, twoTouch.plotWidth);\n        const focalPct = Math.max(0, Math.min(1, (twoTouch.startCenterX - twoTouch.padLeft) / pw));\n        const xAtFocal = twoTouch.xMin + focalPct * startRange;\n        const deltaSec = -(translationX / pw) * newRange;\n        const newXMin = xAtFocal - focalPct * newRange + deltaSec;\n        argsRef.current.setViewport({ xMin: newXMin, xMax: newXMin + newRange });\n        return;\n      }\n      if (e.touches.length === 1) {\n        const t = e.touches[0];\n        if (scrub && scrub.active) {\n          e.preventDefault();\n          const rect = node.getBoundingClientRect();\n          argsRef.current.setCursorAtPx(t.clientX - rect.left);\n          return;\n        }\n        if (scrub && !scrub.active) {\n          const dx = Math.abs(t.clientX - scrub.startX);\n          const dy = Math.abs(t.clientY - scrub.startY);\n          if (dx > SCRUB_CANCEL_PX || dy > SCRUB_CANCEL_PX) {\n            cancelScrubTimer();\n            scrub = null;\n          }\n        }\n        if (singleTap) {\n          const dx = Math.abs(t.clientX - singleTap.startX);\n          const dy = Math.abs(t.clientY - singleTap.startY);\n          if (dx > 8 || dy > 8) {\n            singleTap.moved = true;\n          }\n        }\n      }\n    };\n\n    const onTouchEnd = (e: TouchEvent): void => {\n      if (twoTouch && e.touches.length < 2) {\n        twoTouch = null;\n        singleTap = null;\n        cancelScrubTimer();\n        scrub = null;\n        return;\n      }\n      if (scrub && scrub.active && e.touches.length === 0) {\n        cancelScrubTimer();\n        scrub = null;\n        singleTap = null;\n        setFrozen(true);\n        return;\n      }\n      if (scrub && !scrub.active) {\n        cancelScrubTimer();\n        scrub = null;\n      }\n      if (singleTap && e.touches.length === 0) {\n        const duration = Date.now() - singleTap.startTime;\n        if (!singleTap.moved && duration < 400) {\n          const rect = node.getBoundingClientRect();\n          const xPx = singleTap.startX - rect.left;\n          const now = Date.now();\n          if (now - lastTapTime < 300 && Math.abs(singleTap.startX - lastTapX) < 30) {\n            argsRef.current.resetViewport();\n            setFrozen(false);\n            lastTapTime = 0;\n          } else {\n            const idx = argsRef.current.setCursorAtPx(xPx);\n            if (idx != null) {\n              setFrozen(true);\n            }\n            lastTapTime = now;\n            lastTapX = singleTap.startX;\n          }\n        }\n        singleTap = null;\n      }\n    };\n\n    const onTouchCancel = (): void => {\n      twoTouch = null;\n      singleTap = null;\n      cancelScrubTimer();\n      scrub = null;\n    };\n\n    const onDocTouchStart = (e: TouchEvent): void => {\n      if (!frozenRef.current) {\n        return;\n      }\n      const target = e.target as Node | null;\n      if (target && node.contains(target)) {\n        return;\n      }\n      if (target && targetIsInsideGraphLegend(target)) {\n        return;\n      }\n      setFrozen(false);\n      argsRef.current.clearCursor();\n    };\n\n    node.addEventListener(\"mousedown\", onMouseDown);\n    node.addEventListener(\"mousemove\", onMouseMove);\n    window.addEventListener(\"mouseup\", onMouseUp);\n    node.addEventListener(\"mouseleave\", onMouseLeave);\n    node.addEventListener(\"wheel\", onWheel, { passive: false });\n    node.addEventListener(\"dblclick\", onDblClick);\n    document.addEventListener(\"mousedown\", onDocMouseDown, true);\n    node.addEventListener(\"touchstart\", onTouchStart, { passive: false });\n    node.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n    node.addEventListener(\"touchend\", onTouchEnd);\n    node.addEventListener(\"touchcancel\", onTouchCancel);\n    document.addEventListener(\"touchstart\", onDocTouchStart, true);\n    return () => {\n      node.removeEventListener(\"mousedown\", onMouseDown);\n      node.removeEventListener(\"mousemove\", onMouseMove);\n      window.removeEventListener(\"mouseup\", onMouseUp);\n      node.removeEventListener(\"mouseleave\", onMouseLeave);\n      node.removeEventListener(\"wheel\", onWheel);\n      node.removeEventListener(\"dblclick\", onDblClick);\n      document.removeEventListener(\"mousedown\", onDocMouseDown, true);\n      node.removeEventListener(\"touchstart\", onTouchStart);\n      node.removeEventListener(\"touchmove\", onTouchMove);\n      node.removeEventListener(\"touchend\", onTouchEnd);\n      node.removeEventListener(\"touchcancel\", onTouchCancel);\n      document.removeEventListener(\"touchstart\", onDocTouchStart, true);\n    };\n  }, [node, args.isInteractive]);\n\n  const Wrap = useCallback(\n    function LineChartGestureWrap(props: { children: ReactNode; style: StyleProp<ViewStyle> }): JSX.Element {\n      return (\n        <View\n          ref={setContainerRef}\n          style={[\n            props.style,\n            {\n              userSelect: \"none\",\n              WebkitUserSelect: \"none\",\n              WebkitTouchCallout: \"none\",\n            } as ViewStyle,\n          ]}\n        >\n          {props.children}\n        </View>\n      );\n    },\n    [setContainerRef]\n  );\n\n  return { Wrap, frozen, clearFrozen };\n}\n","import { JSX, ReactNode } from \"react\";\nimport { Linking, Alert } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { ClipboardUtils_copy } from \"../utils/clipboard\";\n\ninterface IProps {\n  href?: string;\n  className?: string;\n  children?: ReactNode;\n  testID?: string;\n}\n\nexport function Link(props: IProps): JSX.Element {\n  return (\n    <Text\n      data-testid={props.testID}\n      testID={props.testID}\n      className={`text-text-link font-bold underline ${props.className || \"\"}`}\n      onPress={() => {\n        const href = props.href;\n        if (!href) {\n          return;\n        }\n        Linking.openURL(href).catch(() => {\n          if (href.startsWith(\"mailto:\")) {\n            const email = href.replace(/^mailto:/, \"\").split(\"?\")[0];\n            ClipboardUtils_copy(email);\n            Alert.alert(\"Email copied\", `${email} was copied to your clipboard.`);\n          }\n        });\n      }}\n    >\n      {props.children}\n    </Text>\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { GestureResponderEvent, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { useTrackClick } from \"../utils/clickTracking\";\n\ninterface IProps {\n  name: string;\n  onPress?: (e: GestureResponderEvent) => void;\n  onClick?: (e: GestureResponderEvent) => void;\n  className?: string;\n  children?: ReactNode;\n  testID?: string;\n  disabled?: boolean;\n}\n\nfunction containsString(children: ReactNode): boolean {\n  if (typeof children === \"string\" || typeof children === \"number\") {\n    return true;\n  }\n  if (Array.isArray(children)) {\n    return children.some((c) => typeof c === \"string\" || typeof c === \"number\");\n  }\n  return false;\n}\n\nexport function LinkButton(props: IProps): JSX.Element {\n  const { className, children } = props;\n  const testID = props.testID || props.name;\n  const isFontNormal = className?.includes(\"font-normal\");\n  const isNoUnderline = className?.includes(\"no-underline\");\n  const textCn = `text-text-link ${!isFontNormal ? \"font-bold\" : \"\"} ${!isNoUnderline ? \"underline\" : \"\"} ${className || \"\"}`;\n  const accessibilityLabel = typeof children === \"string\" ? children : undefined;\n  const trackClick = useTrackClick();\n  const userOnPress = props.onPress || props.onClick;\n  const onPress = (e: GestureResponderEvent): void => {\n    trackClick(props.name, props.className);\n    userOnPress?.(e);\n  };\n  return (\n    <Pressable\n      accessibilityRole=\"button\"\n      accessibilityLabel={accessibilityLabel}\n      onPress={onPress}\n      testID={testID}\n      data-testid={testID}\n      disabled={props.disabled}\n      hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}\n    >\n      {containsString(children) ? <Text className={textCn}>{children}</Text> : children}\n    </Pressable>\n  );\n}\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { ISubscription } from \"../types\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  topic: string;\n  blur: number;\n}\n\nfunction LockerInner(props: IProps): JSX.Element {\n  const isSubscribed = Subscriptions_hasSubscription(props.subscription);\n\n  if (isSubscribed) {\n    return <></>;\n  }\n  return (\n    <View\n      className=\"absolute inset-0 z-10 flex-col items-center justify-center\"\n      style={\n        {\n          backdropFilter: `blur(${props.blur}px)`,\n          WebkitBackdropFilter: `blur(${props.blur}px)`,\n        } as object\n      }\n    >\n      <View className=\"mx-auto text-center\" style={{ maxWidth: 192 }}>\n        <Text>\n          Get <Text className=\"font-bold text-icon-yellow\">Premium</Text> to unlock{\" \"}\n          <Text className=\"font-bold\">{props.topic}</Text>\n        </Text>\n      </View>\n      <View className=\"pt-1 items-center\">\n        <Button name=\"unlock\" kind=\"purple\" onClick={() => props.dispatch(Thunk_pushScreen(\"subscription\"))}>\n          Unlock\n        </Button>\n      </View>\n    </View>\n  );\n}\n\nexport const Locker = memo(LockerInner);\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport MarkdownIt from \"markdown-it\";\nimport { LinkButton } from \"./linkButton\";\nimport { IEvaluatedProgram } from \"../models/program\";\nimport { ISettings } from \"../types\";\nimport { Exercise_findByNameAndEquipment } from \"../models/exercise\";\nimport { ExerciseTooltip } from \"./exerciseTooltip\";\n\nconst md = new MarkdownIt({ html: true, linkify: true });\n\nfunction preprocessDirectives(text: string, directivesData?: IMarkdownDirectivesData): string {\n  let result = text;\n  if (directivesData?.exercise) {\n    result = result.replace(/\\[\\{([^}]+)\\}\\]/g, (_match, name: string) => {\n      return `<strong class=\"md-exercise-directive md\" data-name=\"${name.trim()}\">${name.trim()}</strong>`;\n    });\n  }\n  if (directivesData?.exerciseExample) {\n    result = result.replace(/^:::exercise-example\\{([^}]*)\\}[ \\t]*$/gm, (_match, attrsStr: string) => {\n      const attrs: Record<string, string> = {};\n      for (const m of attrsStr.matchAll(/(\\w+)=\"([^\"]*)\"/g)) {\n        attrs[m[1]] = m[2];\n      }\n      return `<div class=\"md-exercise-example mb-4\" data-exercise=\"${attrs.exercise || \"\"}\" data-equipment=\"${attrs.equipment || \"\"}\" data-key=\"${attrs.key || \"\"}\" data-weeks=\"${attrs.weeks || \"\"}\" data-week-labels=\"${attrs.weekLabels || \"\"}\" data-onerm=\"${attrs.onerm || \"\"}\"></div>`;\n    });\n  }\n  return result;\n}\n\nexport interface IMarkdownDirectivesData {\n  exercise?: { settings: ISettings };\n  exerciseExample?: { settings: ISettings; evaluatedProgram: IEvaluatedProgram };\n}\n\ninterface IProps {\n  value: string;\n  className?: string;\n  truncate?: number;\n  directivesData?: IMarkdownDirectivesData;\n}\n\nexport function Markdown(props: IProps): JSX.Element {\n  const [shouldTruncate, setShouldTruncate] = useState(props.truncate != null);\n  const [isTruncated, setIsTruncated] = useState(props.truncate != null);\n  const stringValue = typeof props.value === \"string\" ? props.value : String(props.value ?? \"\");\n  const preprocessed = preprocessDirectives(stringValue, props.directivesData);\n  const value = typeof preprocessed === \"string\" ? preprocessed : String(preprocessed ?? \"\");\n  const result = md.render(value);\n  let className = props.className || \"markdown\";\n  if (isTruncated && props.className?.indexOf(\"line-clamp\") === -1) {\n    className += ` line-clamp-${props.truncate}`;\n  }\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    const container = containerRef.current;\n    if (isTruncated) {\n      setShouldTruncate(container!.scrollHeight > container!.clientHeight);\n    }\n    if (container) {\n      for (const element of Array.from(container.querySelectorAll(\"a\"))) {\n        if (!(element.getAttribute(\"href\") || \"\").startsWith(\"/\")) {\n          element.setAttribute(\"target\", \"_blank\");\n        }\n      }\n      hydrateLiftoscriptCodeBlocks(container);\n      setTimeout(() => {\n        if (props.directivesData?.exercise) {\n          hydrateExerciseDirectives(container, props.directivesData.exercise.settings);\n        }\n        if (props.directivesData?.exerciseExample) {\n          hydrateExerciseExampleDirectives(\n            container,\n            props.directivesData.exerciseExample.settings,\n            props.directivesData.exerciseExample.evaluatedProgram\n          );\n        }\n      }, 0);\n    }\n  });\n\n  return (\n    <div>\n      <div ref={containerRef} className={className} dangerouslySetInnerHTML={{ __html: result }} />\n      {shouldTruncate && props.truncate != null && (\n        <div className=\"leading-none\" style={{ marginTop: \"-0.125rem\" }}>\n          <LinkButton\n            name=\"truncate-markdown\"\n            className=\"text-xs font-normal\"\n            onClick={() => setIsTruncated(!isTruncated)}\n          >\n            {isTruncated ? \"Show more\" : \"Show less\"}\n          </LinkButton>\n        </div>\n      )}\n    </div>\n  );\n}\n\nfunction hydrateLiftoscriptCodeBlocks(container: HTMLElement): void {\n  const codeEls = Array.from(container.querySelectorAll(\"code.language-liftoscript\"));\n  if (codeEls.length === 0) {\n    return;\n  }\n  import(\"../pages/planner/components/plannerCodeBlock\").then((mod) => {\n    for (const codeEl of codeEls) {\n      if (codeEl.getAttribute(\"data-hydrated\")) {\n        continue;\n      }\n      codeEl.setAttribute(\"data-hydrated\", \"true\");\n      const script = codeEl.textContent || \"\";\n      const pre = codeEl.parentElement;\n      if (pre && pre.tagName === \"PRE\") {\n        const wrapper = document.createElement(\"div\");\n        wrapper.className = \"md-liftoscript-block\";\n        pre.parentNode!.replaceChild(wrapper, pre);\n        createRoot(wrapper).render(<mod.PlannerCodeBlock script={script} />);\n      }\n    }\n  });\n}\n\nfunction hydrateExerciseDirectives(container: HTMLElement, settings: ISettings): void {\n  for (const el of Array.from(container.querySelectorAll(\".md-exercise-directive\"))) {\n    if (el.getAttribute(\"data-hydrated\")) {\n      continue;\n    }\n    el.setAttribute(\"data-hydrated\", \"true\");\n    const name = el.getAttribute(\"data-name\") || \"\";\n    const exercise = Exercise_findByNameAndEquipment(name, settings.exercises);\n    if (!exercise) {\n      continue;\n    }\n    const exerciseType = { id: exercise.id, equipment: exercise.equipment };\n    el.textContent = \"\";\n    createRoot(el).render(<ExerciseTooltip exerciseType={exerciseType} settings={settings} name={name} />);\n  }\n}\n\nfunction hydrateExerciseExampleDirectives(\n  container: HTMLElement,\n  settings: ISettings,\n  evaluatedProgram: IEvaluatedProgram\n): void {\n  for (const el of Array.from(container.querySelectorAll(\".md-exercise-example\"))) {\n    if (el.getAttribute(\"data-hydrated\")) {\n      continue;\n    }\n    el.setAttribute(\"data-hydrated\", \"true\");\n    const exercise = el.getAttribute(\"data-exercise\") || \"\";\n    const equipment = el.getAttribute(\"data-equipment\") || \"\";\n    const key = el.getAttribute(\"data-key\") || \"\";\n    const weeksStr = el.getAttribute(\"data-weeks\") || \"\";\n    const weekLabelsStr = el.getAttribute(\"data-week-labels\") || \"\";\n    const onermStr = el.getAttribute(\"data-onerm\") || \"\";\n\n    const exerciseType = { id: exercise, equipment };\n    const weekLabels = weekLabelsStr ? weekLabelsStr.split(\",\") : [];\n\n    let weekSetup: { name: string }[] | undefined;\n    if (weeksStr) {\n      const [start, end] = weeksStr.split(\"-\").map(Number);\n      weekSetup = evaluatedProgram.weeks.slice(start - 1, end).map((w, i) => ({\n        name: weekLabels[i] ? `${w.name} (${weekLabels[i]})` : w.name,\n        weekIndex: start - 1 + i,\n      }));\n    } else if (weekLabels.length > 0) {\n      weekSetup = evaluatedProgram.weeks.map((w, i) => ({\n        name: weekLabels[i] ? `${w.name} (${weekLabels[i]})` : w.name,\n      }));\n    }\n\n    import(\"../pages/programs/programDetails/programDetailsExerciseExample\").then((mod) => {\n      createRoot(el as HTMLElement).render(\n        <mod.ProgramDetailsExerciseExample\n          program={evaluatedProgram}\n          settings={settings}\n          programExerciseKey={key}\n          exerciseType={exerciseType}\n          weekSetup={weekSetup}\n          defaultOnerm={onermStr ? parseFloat(onermStr) : undefined}\n        />\n      );\n    });\n  }\n}\n","import { JSX, useEffect, useRef } from \"react\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport { drawSelection, EditorView, highlightSpecialChars, keymap, placeholder } from \"@codemirror/view\";\nimport { EditorState } from \"@codemirror/state\";\nimport { defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { defaultKeymap, historyKeymap, history } from \"@codemirror/commands\";\nimport { TextDiff_minimalEdit } from \"../utils/textDiff\";\n\ninterface IProps {\n  value: string;\n  borderless?: boolean;\n  placeholder?: string;\n  autoFocus?: boolean;\n  hasHistory?: boolean;\n  onChange?: (newValue: string) => void;\n  onBlur?: (value: string) => void;\n}\n\nexport function MarkdownEditor(props: IProps): JSX.Element {\n  const divRef = useRef<HTMLDivElement>(null);\n  const codeEditor = useRef<EditorView | undefined>(undefined);\n  const onBlurRef = useRef(props.onBlur);\n  onBlurRef.current = props.onBlur;\n  useEffect(() => {\n    const updateFacet = EditorView.updateListener.of((update) => {\n      if (update.docChanged && props.onChange && !window.isUndoing) {\n        props.onChange(update.state.doc.toString());\n      }\n    });\n\n    const eventHandlers = EditorView.domEventHandlers({\n      blur: (e, view) => {\n        onBlurRef.current?.(view.state.doc.toString());\n      },\n    });\n\n    const hasHistory = props.hasHistory ?? true;\n    const minimalSetup = [\n      highlightSpecialChars(),\n      hasHistory ? history() : [],\n      drawSelection(),\n      syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n      keymap.of([...defaultKeymap, ...(hasHistory ? historyKeymap : [])]),\n    ];\n\n    const editorState = EditorState.create({\n      doc: props.value,\n      extensions: [\n        minimalSetup,\n        markdown(),\n        updateFacet,\n        eventHandlers,\n        props.placeholder != null ? placeholder(props.placeholder) : [],\n      ],\n    });\n\n    const view = new EditorView({\n      state: editorState,\n      parent: divRef.current ?? undefined,\n    });\n    codeEditor.current = view;\n    if (props.autoFocus) {\n      view.focus();\n    }\n    return () => view.destroy();\n  }, []);\n\n  useEffect(() => {\n    if (window.isUndoing) {\n      const ce = codeEditor.current;\n      const edit = ce != null && props.value != null ? TextDiff_minimalEdit(ce.state.doc.toString(), props.value) : undefined;\n      if (ce != null && edit != null) {\n        ce.dispatch({\n          changes: { from: edit.start, to: edit.end, insert: edit.text },\n          selection: { anchor: edit.start + edit.text.length },\n          scrollIntoView: ce.hasFocus,\n        });\n      }\n    }\n  }, [props.value]);\n\n  const className = props.borderless\n    ? \"block w-full leading-normal text-text-secondary appearance-none focus:outline-none\"\n    : \"block w-full px-2 py-2 leading-normal bg-background-default border rounded-lg appearance-none focus:outline-none focus:shadow-outline border-gray-300\";\n\n  return (\n    <div className=\"markdown-editor-view\" style={{ fontFamily: \"Iosevka Web\" }}>\n      <div data-testid=\"markdown-editor\" className={className} ref={divRef}></div>\n    </div>\n  );\n}\n","import { JSX, useEffect, useMemo, useRef } from \"react\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport { debounce } from \"../utils/throttler\";\nimport { drawSelection, EditorView, highlightSpecialChars, keymap, placeholder } from \"@codemirror/view\";\nimport { EditorState } from \"@codemirror/state\";\nimport { defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { defaultKeymap, historyKeymap, history } from \"@codemirror/commands\";\n\ninterface IProps {\n  value?: string;\n  placeholder: string;\n  isTransparent?: boolean;\n  onChange?: (newValue: string) => void;\n  debounceMs?: number;\n}\n\nexport function MarkdownEditorBorderless(props: IProps): JSX.Element {\n  const divRef = useRef<HTMLDivElement>(null);\n  const codeEditor = useRef<EditorView | undefined>(undefined);\n\n  const debouncedOnChange = useMemo(() => {\n    if (props.onChange && props.debounceMs) {\n      return debounce(props.onChange, props.debounceMs);\n    }\n    return props.onChange;\n  }, [props.onChange, props.debounceMs]);\n\n  const onChangeRef = useRef<((newValue: string) => void) | undefined>(debouncedOnChange);\n  onChangeRef.current = debouncedOnChange;\n\n  useEffect(() => {\n    const updateFacet = EditorView.updateListener.of((update) => {\n      if (update.docChanged && onChangeRef.current && !window.isUndoing) {\n        onChangeRef.current(update.state.doc.toString());\n      }\n    });\n\n    const eventHandlers = EditorView.domEventHandlers({\n      blur: (e, view) => {},\n    });\n\n    const minimalSetup = [\n      highlightSpecialChars(),\n      history(),\n      drawSelection(),\n      syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n      placeholder(props.placeholder),\n      keymap.of([...defaultKeymap, ...historyKeymap]),\n    ];\n\n    const editorState = EditorState.create({\n      doc: props.value,\n      extensions: [minimalSetup, markdown(), updateFacet, eventHandlers],\n    });\n\n    codeEditor.current = new EditorView({\n      state: editorState,\n      parent: divRef.current ?? undefined,\n    });\n  }, []);\n\n  useEffect(() => {\n    if (window.isUndoing) {\n      const ce = codeEditor.current;\n      if (ce && props.value != null) {\n        ce.update([ce.state.update({ changes: { from: 0, to: ce.state.doc.length, insert: props.value } })]);\n      }\n    }\n  }, [props.value]);\n\n  return (\n    <div className=\"markdown-editor-view\">\n      <div\n        data-testid=\"markdown-editor\"\n        className={`text-sm ${!props.isTransparent ? \"bg-background-default\" : \"\"} appearance-none focus:outline-none focus:shadow-outline`}\n        ref={divRef}\n      ></div>\n    </div>\n  );\n}\n","import type React from \"react\";\nimport type { JSX, ReactNode } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { IconHandle } from \"./icons/iconHandle\";\nimport { StringUtils_dashcase } from \"../utils/string\";\n\ninterface IMenuItemProps {\n  prefix?: ReactNode;\n  name: string;\n  isBorderless?: boolean;\n  value?: string | JSX.Element;\n  expandName?: boolean;\n  expandValue?: boolean;\n  addons?: ReactNode;\n  shouldShowRightArrow?: boolean;\n  // Wraps the handle in a drag gesture (e.g. DraggableList2's render-prop); works on web and native.\n  dragHandle?: (children: ReactNode) => JSX.Element;\n  onClick?: (e: React.MouseEvent) => void;\n}\n\nexport function MenuItemWrapper(props: {\n  name: string;\n  children: ReactNode;\n  isBorderless?: boolean;\n  onClick?: (e: React.MouseEvent) => void;\n}): JSX.Element {\n  const testId = `menu-item-${StringUtils_dashcase(props.name)}`;\n  const inner = <View className={!props.isBorderless ? \"border-b border-border-neutral\" : \"\"}>{props.children}</View>;\n  if (props.onClick) {\n    return (\n      <Pressable\n        testID={testId}\n        data-testid={testId}\n        className=\"w-full\"\n        onPress={(e) => props.onClick?.(e as unknown as React.MouseEvent)}\n      >\n        {inner}\n      </Pressable>\n    );\n  }\n  return (\n    <View testID={testId} data-testid={testId} className=\"w-full\">\n      {inner}\n    </View>\n  );\n}\n\nexport function MenuItem(props: IMenuItemProps): JSX.Element {\n  const valueNode =\n    typeof props.value === \"string\" ? <Text className=\"text-right text-text-link\">{props.value}</Text> : props.value;\n\n  const dragHandle = props.dragHandle\n    ? props.dragHandle(\n        <View className=\"p-2\">\n          <IconHandle />\n        </View>\n      )\n    : null;\n\n  return (\n    <MenuItemWrapper name={props.name} onClick={props.onClick} isBorderless={props.isBorderless}>\n      <View className=\"flex-row items-center\">\n        {dragHandle}\n        {props.prefix != null && <View className=\"flex-row items-center justify-center\">{props.prefix}</View>}\n        <View className=\"flex-row items-center gap-2 flex-1\">\n          <View className={`py-3 ${props.expandValue ? undefined : \"flex-1\"}`}>\n            <View className=\"flex-row items-center\">\n              <Text className=\"text-base text-text-primary\">{props.name}</Text>\n            </View>\n            {props.addons != null && <View className=\"pt-1\">{props.addons}</View>}\n          </View>\n          <View className={`${props.expandName ? \"\" : \"flex-1\"} items-end`}>{valueNode}</View>\n        </View>\n        {props.shouldShowRightArrow && (\n          <View className=\"flex-row items-center py-2 pl-2\">\n            <IconArrowRight />\n          </View>\n        )}\n      </View>\n    </MenuItemWrapper>\n  );\n}\n","import React, { JSX, Dispatch, ReactNode, SetStateAction, useState } from \"react\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { ScrollBarrell } from \"./scrollBarrell\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { lg } from \"../utils/posthog\";\nimport { MathUtils_normalizeNumStr } from \"../utils/math\";\n\ntype IMenuItemType = \"text\" | \"number\" | \"select\" | \"boolean\" | \"desktop-select\" | \"select2\";\n\ninterface IMenuItemEditableValueProps {\n  name: string;\n  prefix?: ReactNode;\n  type: IMenuItemType;\n  value: string | null | undefined;\n  valueUnits?: string;\n  values?: [string, string][];\n  onChange?: (v?: string, e?: React.SyntheticEvent) => void;\n  onInput?: (v: string) => void;\n  pattern?: string;\n  patternMessage?: string;\n  maxLength?: number;\n}\n\ninterface IMenuItemEditableProps extends IMenuItemEditableValueProps {\n  size?: \"sm\" | \"base\";\n  isNameBold?: boolean;\n  hasClear?: boolean;\n  after?: JSX.Element;\n  underName?: JSX.Element;\n  nextLine?: JSX.Element;\n  isNameHtml?: boolean;\n  errorMessage?: string;\n  isBorderless?: boolean;\n}\n\nexport function MenuItemEditable(props: IMenuItemEditableProps): JSX.Element {\n  const [patternError, setPatternError] = useState<boolean>(false);\n  const [isExpanded, setIsExpanded] = useState<boolean>(false);\n  let numberOfVisibleItems = Math.min(props.values?.length || 0, 4);\n  if (numberOfVisibleItems % 2 === 0) {\n    numberOfVisibleItems += 1;\n  }\n  const onChange = (v?: string, e?: React.SyntheticEvent): void => {\n    lg(`menu-item-edit-${StringUtils_dashcase(props.name)}`);\n    if (props.onChange != null) {\n      props.onChange(v, e);\n    }\n  };\n  return (\n    <MenuItemWrapper name={props.name} isBorderless={props.isBorderless}>\n      <label\n        className=\"flex flex-col flex-1 py-1 text-base\"\n        onClick={(e) => {\n          const target = e.target as HTMLElement;\n          if (props.type === \"select\" && !target.classList.contains(\"scroll-barrel-item\")) {\n            setIsExpanded(!isExpanded);\n          }\n        }}\n      >\n        <div className=\"flex items-center flex-1\">\n          {props.prefix}\n          {props.isNameHtml ? (\n            <span\n              data-testid={`menu-item-name-${StringUtils_dashcase(props.name)}`}\n              className={`flex flex-col min-w-0 break-all items-start pr-2 ${props.isNameBold ? \"font-bold\" : \"\"}`}\n              dangerouslySetInnerHTML={{ __html: props.name }}\n            />\n          ) : (\n            <span\n              data-testid={`menu-item-name-${StringUtils_dashcase(props.name)}`}\n              className={`flex flex-col min-w-0 break-all items-start pr-2 ${props.isNameBold ? \"font-bold\" : \"\"}`}\n            >\n              <div className={props.size === \"sm\" ? \"text-sm\" : \"\"}>{props.name}</div>\n              {props.underName}\n            </span>\n          )}\n          <div className=\"flex-1\" style={{ minWidth: \"3rem\" }}>\n            <MenuItemValue\n              name={props.name}\n              maxLength={props.maxLength}\n              type={props.type}\n              value={props.value}\n              pattern={props.pattern}\n              patternMessage={props.patternMessage}\n              values={props.values}\n              setPatternError={setPatternError}\n              onChange={onChange}\n            />\n          </div>\n          {props.value != null && <span className=\"flex items-center text-text-secondary\">{props.valueUnits}</span>}\n          {props.value != null && props.hasClear && (\n            <button\n              data-testid={`menu-item-delete-${StringUtils_dashcase(props.name)}`}\n              onClick={() => onChange(undefined)}\n              style={{ marginRight: \"-0.5rem\" }}\n              className={`p-2 nm-menu-item-delete-${StringUtils_dashcase(props.name)}`}\n            >\n              <IconTrash />\n            </button>\n          )}\n          {props.after != null ? props.after : undefined}\n        </div>\n        {(props.errorMessage || (patternError && props.patternMessage)) && (\n          <div style={{ marginTop: \"-0.5rem\" }} className=\"text-xs text-right text-red-500\">\n            {props.errorMessage || props.patternMessage}\n          </div>\n        )}\n      </label>\n      {props.nextLine}\n      {props.type === \"select\" && (\n        <div className=\"text-base\">\n          <ScrollBarrell\n            itemHeight={28}\n            numberOfVisibleItems={numberOfVisibleItems}\n            isExpanded={isExpanded}\n            values={props.values || []}\n            defaultSelectedValue={props.value}\n            onSelect={(v) => onChange(v)}\n          />\n        </div>\n      )}\n    </MenuItemWrapper>\n  );\n}\n\nexport function MenuItemValue(\n  props: { setPatternError: Dispatch<SetStateAction<boolean>> } & IMenuItemEditableValueProps\n): JSX.Element | null {\n  if (props.type === \"desktop-select\") {\n    return (\n      <select\n        data-testid={`menu-item-value-${StringUtils_dashcase(props.name)}`}\n        className=\"border rounded border-border-neutral bg-background-default\"\n        value={props.value || undefined}\n        onChange={handleChange(props.onChange, props.setPatternError)}\n      >\n        {(props.values || []).map(([key, value]) => (\n          <option key={key} value={key}>\n            {value}\n          </option>\n        ))}\n      </select>\n    );\n  } else if (props.type === \"select\") {\n    const keyValue = (props.values || []).filter(([v]) => v === props.value)[0];\n    return (\n      <div\n        data-testid={`menu-item-value-${StringUtils_dashcase(props.name)}`}\n        className=\"flex-1 py-2 pl-2 text-right text-text-link\"\n        style={{ minHeight: \"2.5rem\" }}\n      >\n        {keyValue && keyValue[1]}\n      </div>\n    );\n  } else if (props.type === \"text\") {\n    return (\n      <input\n        data-testid={`menu-item-value-${StringUtils_dashcase(props.name)}`}\n        key={props.value}\n        type=\"text\"\n        className=\"flex-1 w-full py-2 text-right bg-transparent text-text-link\"\n        defaultValue={props.value || undefined}\n        title={props.patternMessage}\n        maxLength={props.maxLength}\n        onBlur={handleChange(props.onChange, props.setPatternError)}\n        onFocus={(e) => {\n          const target = e.target;\n          if (target instanceof HTMLInputElement) {\n            const value = (target as HTMLInputElement).value;\n            target.setSelectionRange(0, value.length);\n            return true;\n          }\n          return undefined;\n        }}\n        pattern={props.pattern}\n      />\n    );\n  } else if (props.type === \"boolean\") {\n    return (\n      <div className=\"flex items-center flex-1 text-right\">\n        <label className=\"flex items-center justify-end flex-1 p-2\">\n          <input\n            data-testid={`menu-item-value-${StringUtils_dashcase(props.name)}`}\n            style={{ marginRight: \"-0.5rem\" }}\n            key={props.value}\n            type=\"checkbox\"\n            className=\"text-right text-text-link checkbox\"\n            checked={props.value === \"true\"}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>): void => {\n              if (props.onChange != null) {\n                const value = `${(e.target as HTMLInputElement).checked}`;\n                props.onChange(value, e);\n              }\n            }}\n          />\n        </label>\n      </div>\n    );\n  } else if (props.type === \"number\") {\n    return (\n      <span className=\"flex flex-1 text-right\">\n        <input\n          data-testid={`menu-item-value-${StringUtils_dashcase(props.name)}`}\n          key={props.value}\n          onBlur={(e) => {\n            if (e.target instanceof HTMLInputElement) {\n              e.target.value = MathUtils_normalizeNumStr(e.target.value);\n            }\n            handleChange(props.onChange, props.setPatternError)(e);\n          }}\n          type=\"tel\"\n          step=\"0.01\"\n          onFocus={(e) => {\n            const target = e.target;\n            if (target instanceof HTMLInputElement) {\n              const value = (target as HTMLInputElement).value;\n              if (target.type !== \"number\") {\n                target.setSelectionRange(0, value.length);\n              }\n              return true;\n            }\n            return undefined;\n          }}\n          title={props.patternMessage}\n          className=\"items-center flex-1 w-0 min-w-0 p-2 text-right bg-transparent outline-none text-text-secondary\"\n          defaultValue={props.value || undefined}\n          pattern={props.pattern}\n        />\n      </span>\n    );\n  } else {\n    return null;\n  }\n}\n\nfunction handleChange(\n  cb: ((val: string, e: React.SyntheticEvent) => void) | undefined,\n  setPatternError: Dispatch<SetStateAction<boolean>>\n): (e: React.SyntheticEvent) => void {\n  return (e: React.SyntheticEvent): void => {\n    setPatternError(e.target instanceof HTMLInputElement && e.target.validity.patternMismatch);\n    if (cb != null) {\n      const value = (e.target as HTMLInputElement).value;\n      cb(value, e);\n    }\n  };\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IProgram, ISettings } from \"../types\";\n\ninterface IMigrationBannerProps {\n  client: Window[\"fetch\"];\n  program: IProgram;\n  settings: ISettings;\n}\n\nexport function MigrationBanner(_props: IMigrationBannerProps): JSX.Element {\n  return (\n    <View className=\"flex-col items-center px-8 py-4 mx-4 mb-4 bg-background-lighterror rounded-lg\">\n      <View>\n        <Text className=\"text-text-error\">This is an old-style program, that doesn't work anymore!</Text>\n      </View>\n    </View>\n  );\n}\n","import { JSX, ReactNode, RefObject, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconCloseCircleOutline } from \"./icons/iconCloseCircleOutline\";\n\ninterface IProps {\n  name?: string;\n  children: ReactNode;\n  autofocusInputRef?: RefObject<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | null>;\n  preautofocus?: [RefObject<HTMLElement | null>, (el: HTMLElement) => void][];\n  isHidden?: boolean;\n  isFullWidth?: boolean;\n  isFullHeight?: boolean;\n  noPaddings?: boolean;\n  shouldShowClose?: boolean;\n  overflowHidden?: boolean;\n  innerClassName?: string;\n  zIndex?: number;\n  maxWidth?: string;\n  style?: Record<string, string | undefined>;\n  onClose?: () => void;\n}\n\nexport function Modal(props: IProps): JSX.Element {\n  const modalRef = useRef<HTMLElement>(null);\n\n  let className = \"fixed inset-0 flex items-center justify-center bottom-sticked\";\n  if (props.isHidden) {\n    className += \" invisible\";\n  }\n\n  const prevProps = useRef<IProps>(props);\n  useEffect(() => {\n    prevProps.current = props;\n  });\n\n  useEffect(() => {\n    if (!props.isHidden) {\n      document.body.classList.add(\"stop-scrolling-modal\");\n    } else {\n      document.body.classList.remove(\"stop-scrolling-modal\");\n    }\n    return () => {\n      document.body.classList.remove(\"stop-scrolling-modal\");\n    };\n  }, [props.isHidden]);\n\n  if (modalRef.current != null && prevProps.current.isHidden && !props.isHidden) {\n    for (const [ref, callback] of props.preautofocus ?? []) {\n      if (ref.current != null) {\n        callback(ref.current);\n      }\n    }\n    if (props.autofocusInputRef?.current != null) {\n      modalRef.current.classList.remove(\"invisible\");\n      props.autofocusInputRef.current.focus();\n    }\n  }\n\n  const containerRef = typeof window !== \"undefined\" ? window.document.getElementById(\"modal\") : undefined;\n\n  const element = (\n    <section ref={modalRef} className={className} style={{ zIndex: props.zIndex ?? 40 }}>\n      <div\n        data-name=\"overlay\"\n        onClick={props.shouldShowClose ? props.onClose : undefined}\n        className=\"absolute inset-0 z-10 overflow-scroll scrolling-touch opacity-50 bg-background-darkgray\"\n      ></div>\n      <div\n        data-name=\"modal\"\n        data-testid={`modal${props.name ? `-${props.name}` : \"\"}`}\n        className={`relative z-20 flex flex-col ${props.noPaddings ? \"\" : \"py-6\"} bg-background-default rounded-lg shadow-lg text-text-primary`}\n        style={{\n          maxWidth: props.maxWidth ?? \"92%\",\n          maxHeight: \"90%\",\n          width: props.isFullWidth ? \"92%\" : \"auto\",\n          height: props.isFullHeight ? \"90%\" : \"auto\",\n          ...props.style,\n        }}\n      >\n        <div\n          className={`relative h-full ${props.noPaddings ? \"\" : \"px-6\"} ${\n            props.overflowHidden ? \"overflow-hidden\" : \"overflow-auto\"\n          } ${props.innerClassName}`}\n        >\n          {props.children}\n        </div>\n        {props.shouldShowClose && (\n          <button\n            data-testid={`modal-close${props.name ? `-${props.name}` : \"\"}`}\n            onClick={props.onClose}\n            className=\"absolute p-2 nm-modal-close\"\n            style={{ top: \"-3px\", right: \"-3px\" }}\n          >\n            <IconCloseCircleOutline />\n          </button>\n        )}\n      </div>\n    </section>\n  );\n\n  return containerRef ? createPortal(element, containerRef) : element;\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ISettings } from \"../types\";\nimport { lb } from \"lens-shmens\";\nimport { IconCheckCircle } from \"./icons/iconCheckCircle\";\nimport { IconLink } from \"./icons/iconLink\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { updateSettings } from \"../models/state\";\n\ninterface IModalAffiliateContentProps {\n  isAffiliateEnabled: boolean;\n  onClose: () => void;\n  dispatch: IDispatch;\n}\n\ninterface IBulletProps {\n  children: JSX.Element | string;\n}\n\nfunction Bullet(props: IBulletProps): JSX.Element {\n  return (\n    <View className=\"flex-row\">\n      <Text className=\"text-xs text-text-secondary\">* </Text>\n      <Text className=\"flex-1 text-xs text-text-secondary\">{props.children}</Text>\n    </View>\n  );\n}\n\nexport function ModalAffiliateContent(props: IModalAffiliateContentProps): JSX.Element {\n  return (\n    <View className=\"pb-6\">\n      <GroupHeader size=\"large\" name=\"Affiliate Program\" />\n      <View className=\"mb-6\">\n        <Text className=\"mb-3 text-lg font-semibold\">How the Affiliate Program Works</Text>\n\n        <View style={{ gap: 16 }}>\n          <View className=\"flex-row items-start\">\n            <View className=\"items-center justify-center w-scaled-10 h-scaled-10 mr-3 rounded-full bg-color-yellow200\">\n              <IconLink size={18} color={Tailwind_semantic().icon.neutral} />\n            </View>\n            <View className=\"flex-1\">\n              <Text className=\"mb-1 font-medium\">Share Your Programs</Text>\n              <Text className=\"text-sm text-text-secondary\">\n                When users import your published programs, they become affiliated with you.\n              </Text>\n            </View>\n          </View>\n\n          <View className=\"flex-row items-start\">\n            <View className=\"items-center justify-center w-scaled-10 h-scaled-10 mr-3 rounded-full bg-color-green100\">\n              <Text className=\"font-bold text-icon-green\">$</Text>\n            </View>\n            <View className=\"flex-1\">\n              <Text className=\"mb-1 font-medium\">Earn 20% Commission</Text>\n              <Text className=\"text-sm text-text-secondary\">\n                Get 20% of all payments from users who subscribe after importing your programs.\n              </Text>\n            </View>\n          </View>\n\n          <View className=\"flex-row items-start\">\n            <View className=\"items-center justify-center w-scaled-10 h-scaled-10 mr-3 rounded-full bg-color-purple100\">\n              <IconCheckCircle\n                isChecked={true}\n                size={16}\n                color={Tailwind_semantic().icon.purple}\n                checkColor={Tailwind_semantic().background.default}\n              />\n            </View>\n            <View className=\"flex-1\">\n              <Text className=\"mb-1 font-medium\">Lifetime Earnings</Text>\n              <Text className=\"text-sm text-text-secondary\">\n                Continue earning from subscription renewals for as long as users remain subscribed.\n              </Text>\n            </View>\n          </View>\n        </View>\n      </View>\n\n      <View className=\"p-4 mb-6 border rounded-lg border-border-cardyellow bg-background-cardyellow\">\n        <Text className=\"mb-2 text-sm font-semibold\">Important Terms:</Text>\n        <View style={{ gap: 4 }}>\n          <Bullet>Commissions only apply to payments made AFTER users import your program</Bullet>\n          <Bullet>If a user imports multiple programs, only the first creator gets commissions</Bullet>\n          <Bullet>Refunded payments are excluded from commission calculations</Bullet>\n          <Bullet>You can track your earnings in the affiliate dashboard</Bullet>\n          <Bullet>Payouts are processed monthly (minimum $50 balance required)</Bullet>\n        </View>\n      </View>\n\n      <View className=\"mb-6\">\n        <Text className=\"mb-2 text-sm font-semibold\">By enabling the affiliate program, you agree to:</Text>\n        <View style={{ gap: 4 }}>\n          <Bullet>Promote your programs ethically and honestly</Bullet>\n          <Bullet>Not engage in spam or misleading marketing practices</Bullet>\n          <Bullet>Allow Liftosaur to track affiliate relationships and process payments</Bullet>\n          <Bullet>Provide valid payment information for receiving commissions</Bullet>\n        </View>\n      </View>\n\n      <MenuItemEditable\n        type=\"boolean\"\n        name=\"Enable Affiliate Program\"\n        value={props.isAffiliateEnabled ? \"true\" : \"false\"}\n        onChange={() => {\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>().p(\"affiliateEnabled\").record(!props.isAffiliateEnabled),\n            \"Toggle affiliate program\"\n          );\n        }}\n      />\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Button } from \"./button\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Modal } from \"./modal\";\nimport { IHistoryRecord, IPercentage, IProgramState, ISettings, IWeight } from \"../types\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { Weight_build, Weight_is, Weight_isPct, Weight_buildPct } from \"../models/weight\";\nimport { InputWeight } from \"./inputWeight\";\nimport { InputNumber } from \"./inputNumber\";\nimport { MathUtils_round } from \"../utils/math\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport {\n  PlannerProgramExercise_getStateMetadata,\n  PlannerProgramExercise_getState,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { Exercise_getIsUnilateral } from \"../models/exercise\";\n\ninterface IModalAmrapProps {\n  progress: IHistoryRecord;\n  dispatch: IDispatch;\n  isPlayground: boolean;\n  settings: ISettings;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  onDone?: () => void;\n}\n\nexport function ModalAmrap(props: IModalAmrapProps): JSX.Element {\n  const amrapModal = props.progress?.amrapModal;\n  return (\n    <Modal maxWidth=\"480px\" isHidden={!amrapModal} isFullWidth={true} shouldShowClose={true} onClose={props.onDone}>\n      {amrapModal && (\n        <ModalAmrapContent\n          progress={props.progress}\n          dispatch={props.dispatch}\n          isPlayground={props.isPlayground}\n          settings={props.settings}\n          programExercise={props.programExercise}\n          otherStates={props.otherStates}\n          amrapModal={amrapModal}\n          onDone={props.onDone}\n        />\n      )}\n    </Modal>\n  );\n}\n\ninterface IModalAmrapContentProps {\n  progress: IHistoryRecord;\n  dispatch: IDispatch;\n  isPlayground: boolean;\n  settings: ISettings;\n  amrapModal: NonNullable<IHistoryRecord[\"amrapModal\"]>;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  onDone?: () => void;\n}\n\nexport function ModalAmrapContent(props: IModalAmrapContentProps): JSX.Element {\n  const progress = props.progress;\n  const { entryIndex, setIndex } = props.amrapModal;\n  const entry = progress.entries[entryIndex];\n  const isUnilateral = Exercise_getIsUnilateral(entry?.exercise || props.programExercise?.exerciseType, props.settings);\n\n  const initialReps = entry?.sets[setIndex]?.completedReps ?? entry?.sets[setIndex]?.reps;\n  const initialRepsLeft = isUnilateral\n    ? (entry?.sets[setIndex]?.completedRepsLeft ?? entry?.sets[setIndex]?.reps)\n    : undefined;\n  const initialRpe = entry?.sets[setIndex]?.completedRpe ?? entry?.sets[setIndex]?.rpe;\n  const initialWeight = entry?.sets[setIndex]?.weight;\n\n  const isAmrap = !!props.amrapModal.isAmrap;\n  const logRpe = !!props.amrapModal.logRpe;\n  const askWeight = !!props.amrapModal.askWeight;\n  const userVars = !!props.amrapModal.userVars;\n\n  const [repsInputValue, setRepsInputValue] = useState<number | undefined>(initialReps);\n  const [repsLeftInputValue, setRepsLeftInputValue] = useState<number | undefined>(initialRepsLeft);\n  const [weightInputValue, setWeightInputValue] = useState<IWeight | IPercentage | undefined>(initialWeight);\n  const [rpeInputValue, setRpeInputValue] = useState<number | undefined>(initialRpe);\n\n  const stateMetadata = props.programExercise\n    ? PlannerProgramExercise_getStateMetadata(props.programExercise) || {}\n    : {};\n  const stateMetadataKeys = ObjectUtils_keys(stateMetadata).filter((k) => stateMetadata[k]?.userPrompted);\n  const state = props.programExercise ? PlannerProgramExercise_getState(props.programExercise) : {};\n  const initialUserVarInputValues = stateMetadataKeys.reduce<\n    Record<keyof typeof stateMetadata, number | IWeight | IPercentage>\n  >((memo, k) => {\n    memo[k] = state[k];\n    return memo;\n  }, {});\n  const [userVarInputValues, setUserVarInputValues] = useState(initialUserVarInputValues);\n\n  function onDone(\n    amrapValue?: number,\n    amrapLeftValue?: number,\n    rpeValue?: number,\n    weightValue?: IWeight,\n    userVarValues: Record<string, number | IWeight | IPercentage> = {}\n  ): void {\n    props.dispatch({\n      type: \"ChangeAMRAPAction\",\n      amrapValue: amrapValue != null ? MathUtils_round(amrapValue, 1) : undefined,\n      amrapLeftValue: amrapLeftValue != null ? MathUtils_round(amrapLeftValue, 1) : undefined,\n      rpeValue: rpeValue != null ? MathUtils_round(rpeValue, 0.5) : undefined,\n      weightValue,\n      setIndex: setIndex,\n      entryIndex: entryIndex,\n      programExercise: props.programExercise,\n      isPlayground: props.isPlayground,\n      otherStates: props.otherStates,\n      isAmrap: isAmrap,\n      logRpe: logRpe,\n      askWeight: askWeight,\n      userVars: userVarValues,\n    });\n    if (props.onDone != null) {\n      props.onDone();\n    }\n  }\n\n  return (\n    <View className=\"mx-1 my-4\">\n      {isAmrap && (\n        <View>\n          {isUnilateral && (\n            <View className=\"mb-2\">\n              <InputNumber\n                size=\"lg\"\n                label=\"Completed reps (left)\"\n                value={repsLeftInputValue ?? 0}\n                data-testid=\"modal-amrap-left-input\"\n                testID=\"modal-amrap-left-input\"\n                data-name=\"modal-input-left-autofocus\"\n                min={0}\n                step={1}\n                onUpdate={(newValue) => {\n                  setRepsLeftInputValue(newValue);\n                }}\n              />\n            </View>\n          )}\n          <View className=\"mb-2\">\n            <InputNumber\n              size=\"lg\"\n              label={isUnilateral ? \"Completed reps (right)\" : \"Completed reps\"}\n              value={repsInputValue ?? 0}\n              data-testid=\"modal-amrap-input\"\n              testID=\"modal-amrap-input\"\n              data-name=\"modal-input-autofocus\"\n              min={0}\n              step={1}\n              onUpdate={(newValue) => {\n                setRepsInputValue(newValue);\n              }}\n            />\n          </View>\n        </View>\n      )}\n      {askWeight && (\n        <View className=\"mb-2\">\n          <InputWeight\n            size=\"lg\"\n            exerciseType={entry?.exercise || props.programExercise?.exerciseType}\n            label=\"Weight\"\n            units={[\"kg\", \"lb\"]}\n            value={weightInputValue || Weight_build(0, props.settings.units)}\n            data-testid=\"modal-amrap-weight-input\"\n            testID=\"modal-amrap-weight-input\"\n            settings={props.settings}\n            onUpdate={(newValue) => {\n              setWeightInputValue(newValue);\n            }}\n          />\n        </View>\n      )}\n      {logRpe && (\n        <View className=\"mb-2\">\n          <InputNumber\n            size=\"lg\"\n            label=\"Completed RPE\"\n            value={rpeInputValue ?? 0}\n            data-testid=\"modal-rpe-input\"\n            testID=\"modal-rpe-input\"\n            data-name=\"modal-rpe-autofocus\"\n            min={0}\n            max={10}\n            step={0.5}\n            onUpdate={(newValue) => {\n              setRpeInputValue(newValue);\n            }}\n          />\n        </View>\n      )}\n      {props.programExercise && userVars && (\n        <UserPromptedStateVars\n          userVarInputValues={userVarInputValues}\n          onUpdate={(key, value) => {\n            setUserVarInputValues((prev) => {\n              const previousValue = prev[key];\n              const typedValue = Weight_is(previousValue)\n                ? Weight_build(value, previousValue.unit)\n                : Weight_isPct(previousValue)\n                  ? Weight_buildPct(value)\n                  : value;\n              return { ...prev, [key]: typedValue };\n            });\n          }}\n        />\n      )}\n      <View className=\"flex-row justify-between gap-3 mt-6 mb-6\">\n        <Button\n          name=\"modal-amrap-clear\"\n          data-testid=\"modal-amrap-clear\"\n          testID=\"modal-amrap-clear\"\n          kind=\"grayv2\"\n          className=\"flex-1 py-4 text-lg\"\n          onClick={() => {\n            onDone();\n          }}\n        >\n          Cancel\n        </Button>\n        <Button\n          name=\"modal-amrap-submit\"\n          kind=\"purple\"\n          data-testid=\"modal-amrap-submit\"\n          testID=\"modal-amrap-submit\"\n          className=\"ls-modal-set-amrap flex-1 py-4 text-lg\"\n          onClick={() => {\n            const amrapValue = isAmrap ? (repsInputValue ?? 0) : undefined;\n            const amrapLeftValue = isAmrap && isUnilateral ? (repsLeftInputValue ?? 0) : undefined;\n            const rpeValue = logRpe ? rpeInputValue : undefined;\n            const weightOrPctValue = askWeight\n              ? (weightInputValue ?? Weight_build(0, props.settings.units))\n              : undefined;\n            const weightValue =\n              weightOrPctValue != null && Weight_isPct(weightOrPctValue)\n                ? Weight_build(weightOrPctValue.value, props.settings.units)\n                : weightOrPctValue;\n\n            onDone(amrapValue, amrapLeftValue, rpeValue, weightValue, userVarInputValues);\n          }}\n        >\n          Done\n        </Button>\n      </View>\n    </View>\n  );\n}\n\ninterface IUserPromptedStateVarsProps {\n  userVarInputValues: Record<string, number | IWeight | IPercentage>;\n  onUpdate: (key: string, value: number) => void;\n}\n\nexport function UserPromptedStateVars(props: IUserPromptedStateVarsProps): JSX.Element {\n  return (\n    <>\n      <GroupHeader size=\"large\" name=\"Enter new state variables values\" />\n      {ObjectUtils_keys(props.userVarInputValues).map((key, i) => {\n        return (\n          <UserPromptedStateVar\n            key={key}\n            k={key}\n            index={i}\n            value={props.userVarInputValues[key]}\n            onUpdate={(value) => props.onUpdate(key, value)}\n          />\n        );\n      })}\n    </>\n  );\n}\n\ninterface IUserPromptedStateVarProps {\n  k: string;\n  index: number;\n  value: number | IWeight | IPercentage;\n  onUpdate: (value: number) => void;\n}\n\nexport function UserPromptedStateVar(props: IUserPromptedStateVarProps): JSX.Element {\n  const { k: key, value } = props;\n  const num = Weight_is(value) || Weight_isPct(value) ? value.value : value;\n  const label = Weight_is(value) ? `${key}, ${value.unit}` : key;\n  return (\n    <View className={props.index !== 0 ? \"mt-2\" : \"\"}>\n      <InputNumber\n        size=\"lg\"\n        data-testid={`modal-state-vars-user-prompt-input-${key}`}\n        testID={`modal-state-vars-user-prompt-input-${key}`}\n        label={label}\n        value={num}\n        min={Weight_is(value) || Weight_isPct(value) ? 0 : undefined}\n        step={1}\n        onUpdate={props.onUpdate}\n      />\n    </View>\n  );\n}\n","import { JSX, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, NativeScrollEvent, NativeSyntheticEvent, Platform, ScrollView, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\n\nimport { IProgram, ISettings, IStats } from \"../types\";\nimport { NextDayPickerDay } from \"./nextDayPicker\";\nimport { LinkButton } from \"./linkButton\";\nimport { emptyProgramId, Program_evaluate, Program_getListOfDays } from \"../models/program\";\nimport { CollectionUtils_findBy } from \"../utils/collection\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { useProgressiveCount, useProgressiveItems } from \"../utils/useProgressiveItems\";\nimport { INavScreenScrollListener, NavScreenScrollContext } from \"../navigation/NavScreenScrollContext\";\n\ninterface IModalChangeNextDayProps {\n  initialCurrentProgramId?: string;\n  allPrograms: IProgram[];\n  settings: ISettings;\n  stats: IStats;\n  onSelect: (programId: string, day: number) => void;\n  onClose: () => void;\n}\n\ntype IDayEntry = [string, string];\n\nexport function ModalChangeNextDayContent(props: IModalChangeNextDayProps): JSX.Element {\n  const { allPrograms, settings, stats, onSelect, onClose } = props;\n  const [currentProgramId, setCurrentProgramId] = useState(props.initialCurrentProgramId);\n\n  const currentProgram = useMemo(\n    () =>\n      (currentProgramId ? CollectionUtils_findBy(allPrograms, \"id\", currentProgramId) : undefined) ?? allPrograms[0],\n    [currentProgramId, allPrograms]\n  );\n\n  const programsValues = useMemo<[string, string][]>(() => allPrograms.map((p) => [p.id, p.name]), [allPrograms]);\n\n  const evaluatedProgram = useMemo(\n    () => (currentProgram ? Program_evaluate(currentProgram, settings) : undefined),\n    [currentProgram, settings]\n  );\n\n  const days = useMemo<IDayEntry[]>(\n    () => (evaluatedProgram ? Program_getListOfDays(evaluatedProgram) : []),\n    [evaluatedProgram]\n  );\n\n  const visibleDays = useProgressiveItems(days, { initialBatch: 12, batchSize: 8 });\n  const visibleMuscleCount = useProgressiveCount(visibleDays.length, { initialBatch: 4, batchSize: 4 });\n\n  const scrollRef = useRef<ScrollView>(null);\n  const scrollYRef = useRef(0);\n  const contentSizeRef = useRef({ width: 0, height: 0 });\n  const scrollListenersRef = useRef<Set<INavScreenScrollListener>>(new Set());\n  const addScrollListener = useCallback((listener: INavScreenScrollListener) => {\n    scrollListenersRef.current.add(listener);\n    return () => {\n      scrollListenersRef.current.delete(listener);\n    };\n  }, []);\n  const onScroll = useCallback((e: NativeSyntheticEvent<NativeScrollEvent>) => {\n    scrollYRef.current = e.nativeEvent.contentOffset.y;\n    contentSizeRef.current = e.nativeEvent.contentSize;\n    scrollListenersRef.current.forEach((l) => l(e));\n  }, []);\n  const scrollAnimatedY = useRef(new Animated.Value(0)).current;\n  const onAnimatedScroll = useMemo(\n    () =>\n      Animated.event([{ nativeEvent: { contentOffset: { y: scrollAnimatedY } } }], {\n        useNativeDriver: Platform.OS !== \"web\",\n        listener: onScroll,\n      }),\n    [scrollAnimatedY, onScroll]\n  );\n  // No footer slot on this screen, so nothing occludes the bottom of the scroll content and\n  // there's nothing to measure a viewport against.\n  const viewportRef = useRef<View>(null);\n  const scrollCtx = useMemo(\n    () => ({\n      scrollRef,\n      scrollYRef,\n      contentSizeRef,\n      scrollAnimatedY,\n      viewportRef,\n      footerHeight: 0,\n      stickyHeaderHeight: 0,\n      addScrollListener,\n    }),\n    [scrollAnimatedY, addScrollListener]\n  );\n\n  useEffect(() => {\n    scrollYRef.current = 0;\n  }, [currentProgramId]);\n\n  const handleSelect = useCallback(\n    (programId: string, day: number) => {\n      onSelect(programId, day);\n      onClose();\n    },\n    [onSelect, onClose]\n  );\n\n  const handleEmptyProgram = useCallback(() => {\n    onSelect(emptyProgramId, 1);\n    onClose();\n  }, [onSelect, onClose]);\n\n  const handleProgramChange = useCallback((value?: string) => {\n    if (value) {\n      setCurrentProgramId(value);\n    }\n  }, []);\n\n  const highlightedDay = currentProgram?.nextDay;\n\n  const header = (\n    <View>\n      <Text className=\"mb-1 text-lg font-semibold text-center\">Change Next Workout</Text>\n      <View className=\"items-center\">\n        <LinkButton name=\"change-next-day-empty-program\" className=\"mb-2 text-xs\" onPress={handleEmptyProgram}>\n          Go without a program\n        </LinkButton>\n      </View>\n      {allPrograms.length > 1 && (\n        <View className=\"mx-0\">\n          <MenuItemEditable\n            type=\"select\"\n            name=\"Program\"\n            value={currentProgram?.id ?? \"\"}\n            values={programsValues}\n            onChange={handleProgramChange}\n          />\n        </View>\n      )}\n    </View>\n  );\n\n  if (!currentProgram || !evaluatedProgram) {\n    return (\n      <View className=\"flex-1\">\n        {header}\n        <View className=\"mx-4\">\n          <Text>No Programs</Text>\n        </View>\n      </View>\n    );\n  }\n\n  return (\n    <NavScreenScrollContext.Provider value={scrollCtx}>\n      <Animated.ScrollView\n        ref={scrollRef}\n        className=\"flex-1\"\n        keyboardShouldPersistTaps=\"handled\"\n        onScroll={onAnimatedScroll}\n        scrollEventThrottle={16}\n      >\n        {header}\n        {visibleDays.map(([dayId, dayName], index) => (\n          <NextDayPickerDay\n            key={dayId}\n            evaluatedProgram={evaluatedProgram}\n            dayId={dayId}\n            dayName={dayName}\n            dayIndex={index}\n            highlightedDay={highlightedDay}\n            stats={stats}\n            settings={settings}\n            renderMuscles={index < visibleMuscleCount}\n            onSelect={handleSelect}\n          />\n        ))}\n      </Animated.ScrollView>\n    </NavScreenScrollContext.Provider>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_redeemCoupon } from \"../ducks/thunks\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { IEither } from \"../utils/types\";\n\ninterface IModalCouponContentProps {\n  dispatch: IDispatch;\n  onClose: () => void;\n}\n\nexport function ModalCouponContent(props: IModalCouponContentProps): JSX.Element {\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const onSubmit = (): void => {\n    if (isLoading) {\n      return;\n    }\n    if (result?.success) {\n      const value = result.data.trim();\n      if (!value) {\n        inputHandle.current?.touch();\n        return;\n      }\n      setIsLoading(true);\n      props.dispatch(\n        Thunk_redeemCoupon(value, (success) => {\n          if (success) {\n            props.onClose();\n          }\n          setIsLoading(false);\n        })\n      );\n    } else {\n      inputHandle.current?.touch();\n    }\n  };\n\n  return (\n    <View>\n      <Text className=\"pt-4 pb-2 text-lg font-bold\">Redeem Code</Text>\n      <Input\n        identifier=\"modal-coupon-code\"\n        label=\"Code\"\n        labelSize=\"xs\"\n        maxLength={8}\n        autoCapitalize=\"characters\"\n        autoCorrect={false}\n        required={true}\n        requiredMessage=\"Please enter a code\"\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"items-center mt-4\">\n        <Button name=\"redeem-coupon\" kind=\"purple\" disabled={isLoading} onClick={onSubmit}>\n          {isLoading ? <IconSpinner color=\"white\" width={18} height={18} /> : \"Redeem\"}\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Modal } from \"./modal\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { IEither } from \"../utils/types\";\n\ninterface IProps {\n  onSelect: (name: string) => void;\n  onClose: () => void;\n  isLoading?: boolean;\n  isHidden: boolean;\n}\n\nexport function ModalCreateProgramContent(props: Omit<IProps, \"isHidden\">): JSX.Element {\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n\n  return (\n    <View>\n      <Text className=\"pb-2 text-xl font-bold text-center\">Create Program</Text>\n      <Input\n        identifier=\"modal-create-program\"\n        label=\"Program Name\"\n        required={true}\n        requiredMessage=\"Please enter a program name\"\n        placeholder=\"My Awesome Routine\"\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"flex-row justify-center mt-4\" style={{ gap: 12 }}>\n        <Button name=\"modal-create-program-cancel\" kind=\"grayv2\" onClick={props.onClose}>\n          Cancel\n        </Button>\n        <Button\n          name=\"modal-create-program-submit\"\n          kind=\"purple\"\n          disabled={props.isLoading}\n          onClick={() => {\n            if (props.isLoading) {\n              return;\n            }\n            if (result?.success) {\n              props.onSelect(result.data);\n            } else {\n              inputHandle.current?.touch();\n            }\n          }}\n        >\n          {props.isLoading ? <IconSpinner color=\"white\" width={18} height={18} /> : \"Create\"}\n        </Button>\n      </View>\n    </View>\n  );\n}\n\nexport function ModalCreateProgram(props: IProps): JSX.Element {\n  return (\n    <Modal zIndex={70} isHidden={props.isHidden} onClose={props.onClose} shouldShowClose={true}>\n      <ModalCreateProgramContent onSelect={props.onSelect} onClose={props.onClose} isLoading={props.isLoading} />\n    </Modal>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { IDispatch } from \"../ducks/types\";\nimport { DateUtils_formatYYYYMMDD } from \"../utils/date\";\nimport { Input } from \"./input\";\nimport { DatePicker } from \"./datePicker\";\nimport { MathUtils_clamp } from \"../utils/math\";\n\ninterface IModalDateContentProps {\n  dispatch: IDispatch;\n  progressId: number;\n  date: string;\n  time: number;\n  onDone?: () => void;\n}\n\nexport function ModalDateContent(props: IModalDateContentProps): JSX.Element {\n  const initialDate = new Date(Date.parse(props.date));\n  const hours = Math.floor(props.time / 3600000);\n  const hoursStr = hours.toString().padStart(2, \"0\");\n  const minutes = Math.floor((props.time % 3600000) / 60000);\n  const minutesStr = minutes.toString().padStart(2, \"0\");\n\n  const [dateTimestamp, setDateTimestamp] = useState(initialDate.getTime());\n  const [hoursValue, setHoursValue] = useState(hoursStr);\n  const [minutesValue, setMinutesValue] = useState(minutesStr);\n\n  return (\n    <View>\n      <Text className=\"pb-2 font-bold\">Please enter new date</Text>\n      <DatePicker testID=\"modal-date-picker\" value={dateTimestamp} onChange={setDateTimestamp} />\n      <Text className=\"pt-2 font-bold\">Please enter workout length</Text>\n      <Text className=\"pb-2 text-xs text-text-secondary\">(in hh:mm)</Text>\n      <View className=\"flex-row items-center\">\n        <View className=\"flex-1\">\n          <Input\n            type=\"tel\"\n            placeholder=\"00\"\n            value={hoursValue}\n            inputSize=\"sm\"\n            labelSize=\"xs\"\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setHoursValue(e.data);\n              }\n            }}\n          />\n        </View>\n        <View className=\"items-center justify-center\" style={{ width: 16, height: 40 }}>\n          <Text>:</Text>\n        </View>\n        <View className=\"flex-1\">\n          <Input\n            type=\"tel\"\n            placeholder=\"00\"\n            value={minutesValue}\n            inputSize=\"sm\"\n            labelSize=\"xs\"\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setMinutesValue(e.data);\n              }\n            }}\n          />\n        </View>\n      </View>\n      <View className=\"flex-row justify-between mt-4\">\n        <Button\n          name=\"modal-date-cancel\"\n          kind=\"grayv2\"\n          className=\"mr-3\"\n          onClick={() => {\n            props.dispatch({ type: \"ConfirmDate\", id: props.progressId, date: undefined, time: undefined });\n            props.onDone?.();\n          }}\n        >\n          Cancel\n        </Button>\n        <Button\n          name=\"modal-date-submit\"\n          kind=\"purple\"\n          onClick={() => {\n            const newHoursValue = Number(hoursValue);\n            const newMinutesValue = Number(minutesValue);\n            const newTime =\n              isNaN(newHoursValue) || isNaN(newMinutesValue)\n                ? props.time\n                : MathUtils_clamp(newHoursValue, 0, 99) * 3600000 + MathUtils_clamp(newMinutesValue, 0, 60) * 60000;\n            props.dispatch({\n              type: \"ConfirmDate\",\n              id: props.progressId,\n              date: DateUtils_formatYYYYMMDD(new Date(dateTimestamp)),\n              time: newTime,\n            });\n            props.onDone?.();\n          }}\n        >\n          Save\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IHistoryRecord, IProgram, ISettings, IStats } from \"../types\";\nimport { NextDayPicker } from \"./nextDayPicker\";\nimport { LinkButton } from \"./linkButton\";\nimport { IDispatch } from \"../ducks/types\";\nimport { EditProgram_updateProgram } from \"../models/editProgram\";\nimport { Program_addDayFromHistoryRecord } from \"../models/program\";\nimport { CollectionUtils_findBy } from \"../utils/collection\";\nimport { Dialog_alert } from \"../utils/dialog\";\n\ninterface IModalDayFromAdhocContentProps {\n  initialCurrentProgramId?: string;\n  allPrograms: IProgram[];\n  settings: ISettings;\n  stats: IStats;\n  record: IHistoryRecord;\n  dispatch: IDispatch;\n  onCreateProgram: () => void;\n  onClose: () => void;\n}\n\nexport function ModalDayFromAdhocContent(props: IModalDayFromAdhocContentProps): JSX.Element {\n  return (\n    <>\n      <View className=\"justify-center pb-2\">\n        <LinkButton\n          name=\"create-program-from-adhoc\"\n          data-testid=\"create-program-from-adhoc\"\n          testID=\"create-program-from-adhoc\"\n          className=\"text-sm text-center\"\n          onClick={props.onCreateProgram}\n        >\n          Create a new program with this workout\n        </LinkButton>\n      </View>\n      <View className=\"items-center justify-center mx-4 mb-1\">\n        <Text className=\"text-sm\">or select day to add after in the existing program:</Text>\n      </View>\n      <NextDayPicker\n        initialCurrentProgramId={props.initialCurrentProgramId}\n        stats={props.stats}\n        allPrograms={props.allPrograms}\n        settings={props.settings}\n        onSelect={(programId, day) => {\n          const program = CollectionUtils_findBy(props.allPrograms, \"id\", programId);\n          if (program != null) {\n            try {\n              const { program: newProgram, dayData } = Program_addDayFromHistoryRecord(\n                program,\n                day,\n                props.record,\n                props.settings\n              );\n              EditProgram_updateProgram(props.dispatch, newProgram);\n              let position =\n                (newProgram.planner?.weeks.length ?? 0) > 1\n                  ? `${newProgram.planner?.weeks[dayData.week - 1].name}, `\n                  : \"\";\n              position += newProgram.planner?.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1]?.name;\n              Dialog_alert(`Added to program '${newProgram.name}', at ${position}`);\n            } catch (e) {\n              Dialog_alert(`Error adding day to program: ${e instanceof Error ? e.message : e}`);\n            }\n          }\n          props.onClose();\n        }}\n      />\n    </>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Modal } from \"./modal\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { Equipment_getCurrentGym, Equipment_getEquipmentIdForExerciseType } from \"../models/equipment\";\nimport { IExerciseType, IHistoryEntry, ISettings, IStats } from \"../types\";\nimport { ObjectUtils_filter, ObjectUtils_keys } from \"../utils/object\";\nimport { equipmentName, Exercise_eq, Exercise_defaultRounding } from \"../models/exercise\";\nimport {\n  EditEquipment_setEquipmentForExercise,\n  EditEquipment_setDefaultRoundingForExercise,\n} from \"../models/editEquipment\";\nimport { CollectionUtils_compact } from \"../utils/collection\";\nimport { InputNumber } from \"./inputNumber\";\nimport { EquipmentSettingsValues } from \"./equipmentSettings\";\nimport { ILensRecordingPayload, lb } from \"lens-shmens\";\nimport { IState } from \"../models/state\";\nimport { ILensDispatch } from \"../utils/useLensReducer\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { useTrackClick } from \"../utils/clickTracking\";\n\ninterface IModalEquipmentProps {\n  settings: ISettings;\n  stats: IStats;\n  exercise: IExerciseType;\n  entries: IHistoryEntry[];\n  onClose: () => void;\n  dispatch: IDispatch;\n}\n\nexport type IModalEquipmentContentProps = Omit<IModalEquipmentProps, \"onClose\">;\n\nexport function ModalEquipmentContent(props: IModalEquipmentContentProps): JSX.Element {\n  const trackClick = useTrackClick();\n  const availableEquipment = ObjectUtils_filter(Equipment_getCurrentGym(props.settings).equipment, (k, v) => {\n    return !v?.isDeleted;\n  });\n  let currentEquipment = Equipment_getEquipmentIdForExerciseType(props.settings, props.exercise);\n  if (currentEquipment != null && availableEquipment[currentEquipment] == null) {\n    currentEquipment = undefined;\n  }\n  const programExerciseIds = CollectionUtils_compact(\n    props.entries.filter((e) => Exercise_eq(e.exercise, props.exercise)).map((e) => e.programExerciseId)\n  );\n\n  const currentGymId = props.settings.currentGymId ?? props.settings.gyms[0].id;\n  return (\n    <View data-testid=\"modal-equipment\" testID=\"modal-equipment\" className=\"pb-6\">\n      <MenuItemEditable\n        type=\"select\"\n        name=\"Equipment\"\n        value={currentEquipment ?? \"\"}\n        values={[\n          [\"\", \"None\"],\n          ...ObjectUtils_keys(availableEquipment).map<[string, string]>((k) => [\n            k,\n            equipmentName(k, availableEquipment),\n          ]),\n        ]}\n        onChange={(value) => {\n          trackClick(\"equipment-modal-change\");\n          EditEquipment_setEquipmentForExercise(\n            props.exercise,\n            value === \"\" ? undefined : value,\n            programExerciseIds,\n            props.dispatch,\n            props.settings\n          );\n        }}\n      />\n      <View className=\"mt-2\">\n        {currentEquipment == null ? (\n          <InputNumber\n            type=\"number\"\n            label=\"Default Rounding\"\n            min={0}\n            step={0.5}\n            max={100}\n            value={Exercise_defaultRounding(props.exercise, props.settings)}\n            onUpdate={(value) => {\n              EditEquipment_setDefaultRoundingForExercise(props.dispatch, props.exercise, value);\n            }}\n          />\n        ) : (\n          <View>\n            <GroupHeader name=\"Equipment Settings\" topPadding={true} />\n            <EquipmentSettingsValues\n              lensDispatch={buildDispatch(props.dispatch)}\n              dispatch={props.dispatch}\n              lensPrefix={lb<IState>()\n                .p(\"storage\")\n                .p(\"settings\")\n                .p(\"gyms\")\n                .findBy(\"id\", currentGymId)\n                .p(\"equipment\")\n                .get()}\n              allEquipment={availableEquipment}\n              stats={props.stats}\n              settings={props.settings}\n              equipment={currentEquipment}\n              equipmentData={availableEquipment[currentEquipment]!}\n            />\n          </View>\n        )}\n      </View>\n    </View>\n  );\n}\n\nexport function ModalEquipment(props: IModalEquipmentProps): JSX.Element {\n  return (\n    <Modal isHidden={false} onClose={props.onClose} shouldShowClose={true} isFullWidth>\n      <ModalEquipmentContent\n        settings={props.settings}\n        stats={props.stats}\n        exercise={props.exercise}\n        entries={props.entries}\n        dispatch={props.dispatch}\n      />\n    </Modal>\n  );\n}\n\nfunction buildDispatch(originalDispatch: IDispatch): ILensDispatch<IState> {\n  return (lensRecording: ILensRecordingPayload<IState>[] | ILensRecordingPayload<IState>, desc: string) => {\n    originalDispatch({\n      type: \"UpdateState\",\n      lensRecording: Array.isArray(lensRecording) ? lensRecording : [lensRecording],\n      desc,\n    });\n  };\n}\n","import { JSX, Fragment, memo, useMemo } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\n\nimport { equipmentName, Exercise_toKey, Exercise_get, Exercise_fromKey } from \"../models/exercise\";\nimport { StringUtils_capitalize, StringUtils_dashcase } from \"../utils/string\";\nimport { useTrackedState, useTrackedDispatch, untrack } from \"../navigation/TrackedStateContext\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { History_findAllMaxSetsPerId } from \"../models/history\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { DraggableList2 } from \"./draggableList2\";\nimport { IconHandle } from \"./icons/iconHandle\";\nimport {\n  EditGraphs_removeGraph,\n  EditGraphs_reorderGraphs,\n  EditGraphs_addExerciseGraph,\n  EditGraphs_addMuscleGroupGraph,\n  EditGraphs_addStatsWeightGraph,\n  EditGraphs_addStatsPercentageGraph,\n  EditGraphs_addStatsLengthGraph,\n  EditGraphs_addNutritionGraph,\n} from \"../models/editGraphs\";\nimport {\n  graphExerciseSelectedTypes,\n  IExerciseId,\n  ISettings,\n  IStatsKey,\n  IGraphExerciseSelectedType,\n  graphMuscleGroupSelectedTypes,\n  IGraphMuscleGroupSelectedType,\n  nutritionGraphDef,\n} from \"../types\";\nimport { NutritionGraph_name } from \"../models/nutritionGraph\";\nimport { MenuItem } from \"./menuItem\";\nimport { Stats_name } from \"../models/stats\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { updateSettings } from \"../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IconCloseCircle } from \"./icons/iconCloseCircle\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\nimport { Muscle_getAvailableMuscleGroups, Muscle_getMuscleGroupName } from \"../models/muscle\";\n\ninterface IModalGraphsProps {\n  isHidden: boolean;\n  onClose: (value?: IExerciseId) => void;\n}\n\nexport function ModalGraphsContent(props: IModalGraphsProps): JSX.Element {\n  usePerfRenderCount(\"ModalGraphsContent\");\n  const trackedState = useTrackedState();\n  const dispatch = useTrackedDispatch();\n\n  const settings = untrack(trackedState.storage.settings);\n  const stats = untrack(trackedState.storage.stats);\n  const history = untrack(trackedState.storage.history);\n\n  const graphs = settings.graphs.graphs;\n\n  const exerciseTypes = useMemo(() => {\n    const maxSets = History_findAllMaxSetsPerId(history);\n    const extypes = ObjectUtils_keys(maxSets).map(Exercise_fromKey);\n    return extypes.filter((e) => !settings.exercises[e.id] || !settings.exercises[e.id]?.isDeleted);\n  }, [history, settings.exercises]);\n\n  const exercises = useMemo(\n    () =>\n      CollectionUtils_sort(\n        exerciseTypes\n          .filter((et) => !graphs.some((g) => g.type === \"exercise\" && g.id === Exercise_toKey(et)))\n          .map((et) => Exercise_get(et, settings.exercises)),\n        (a, b) => a.name.localeCompare(b.name)\n      ),\n    [exerciseTypes, graphs, settings.exercises]\n  );\n\n  const usedStats = useMemo(\n    () =>\n      graphs.reduce<Set<IStatsKey>>((acc, g) => {\n        if (g.type === \"statsWeight\" || g.type === \"statsLength\" || g.type === \"statsPercentage\") {\n          acc.add(g.id);\n        }\n        return acc;\n      }, new Set()),\n    [graphs]\n  );\n\n  const hasBodyweight = settings.graphs.graphs.some((g) => g.id === \"weight\");\n\n  const statsWeightKeys = useMemo(\n    () => ObjectUtils_keys(stats.weight).filter((k) => !usedStats.has(k) && (stats.weight[k] || []).length > 0),\n    [stats.weight, usedStats]\n  );\n  const statsLengthKeys = useMemo(\n    () => ObjectUtils_keys(stats.length).filter((k) => !usedStats.has(k) && (stats.length[k] || []).length > 0),\n    [stats.length, usedStats]\n  );\n  const statsPercentageKeys = useMemo(\n    () => ObjectUtils_keys(stats.percentage).filter((k) => !usedStats.has(k) && (stats.percentage[k] || []).length > 0),\n    [stats.percentage, usedStats]\n  );\n\n  const availableMuscleGroups = useMemo(\n    () =>\n      [...Muscle_getAvailableMuscleGroups(settings), \"total\"].filter(\n        (m) => !graphs.some((g) => g.type === \"muscleGroup\" && g.id === m)\n      ),\n    [settings, graphs]\n  );\n\n  const nutritionKeys = useMemo(\n    () =>\n      (stats.food?.entries || []).length > 0\n        ? nutritionGraphDef.filter((id) => !graphs.some((g) => g.type === \"nutrition\" && g.id === id))\n        : [],\n    [stats.food?.entries, graphs]\n  );\n\n  const hasAvailableStats = statsLengthKeys.length > 0 || statsWeightKeys.length > 0 || statsPercentageKeys.length > 0;\n\n  return (\n    <View className=\"py-4\">\n      <GroupHeader name=\"Settings\" isExpanded={true}>\n        <MenuItemEditable\n          type=\"select\"\n          name=\"Default exercise graph type\"\n          value={settings.graphsSettings.defaultType || \"weight\"}\n          values={graphExerciseSelectedTypes.map((t) => [t, StringUtils_capitalize(t)])}\n          onChange={(v) => {\n            if (v) {\n              updateSettings(\n                dispatch,\n                lb<ISettings>()\n                  .p(\"graphsSettings\")\n                  .p(\"defaultType\")\n                  .record(v as IGraphExerciseSelectedType),\n                \"Set default graph type\"\n              );\n            }\n          }}\n        />\n        <MenuItemEditable\n          type=\"select\"\n          name=\"Default muscle group graph type\"\n          value={settings.graphsSettings.defaultMuscleGroupType || \"volume\"}\n          values={graphMuscleGroupSelectedTypes.map((t) => [t, StringUtils_capitalize(t)])}\n          onChange={(v) => {\n            if (v) {\n              updateSettings(\n                dispatch,\n                lb<ISettings>()\n                  .p(\"graphsSettings\")\n                  .p(\"defaultMuscleGroupType\")\n                  .record(v as IGraphMuscleGroupSelectedType),\n                \"Set muscle group graph type\"\n              );\n            }\n          }}\n        />\n        <MenuItemEditable\n          type=\"boolean\"\n          name=\"Same range for X axis for all graphs\"\n          value={settings.graphsSettings.isSameXAxis ? \"true\" : \"false\"}\n          onChange={(v) =>\n            updateSettings(\n              dispatch,\n              lb<ISettings>()\n                .p(\"graphsSettings\")\n                .p(\"isSameXAxis\")\n                .record(v === \"true\"),\n              \"Toggle same X axis\"\n            )\n          }\n        />\n        {hasBodyweight && (\n          <MenuItemEditable\n            type=\"boolean\"\n            name=\"Add bodyweight to all graphs\"\n            value={settings.graphsSettings.isWithBodyweight ? \"true\" : \"false\"}\n            onChange={(v) =>\n              updateSettings(\n                dispatch,\n                lb<ISettings>()\n                  .p(\"graphsSettings\")\n                  .p(\"isWithBodyweight\")\n                  .record(v === \"true\"),\n                \"Toggle bodyweight\"\n              )\n            }\n          />\n        )}\n        <MenuItemEditable\n          type=\"boolean\"\n          name=\"Add calculated 1RM to graphs\"\n          value={settings.graphsSettings.isWithOneRm ? \"true\" : \"false\"}\n          onChange={(v) =>\n            updateSettings(\n              dispatch,\n              lb<ISettings>()\n                .p(\"graphsSettings\")\n                .p(\"isWithOneRm\")\n                .record(v === \"true\"),\n              \"Toggle 1RM display\"\n            )\n          }\n        />\n        <MenuItemEditable\n          type=\"boolean\"\n          name=\"Add program lines to graphs\"\n          value={settings.graphsSettings.isWithProgramLines ? \"true\" : \"false\"}\n          onChange={(v) =>\n            updateSettings(\n              dispatch,\n              lb<ISettings>()\n                .p(\"graphsSettings\")\n                .p(\"isWithProgramLines\")\n                .record(v === \"true\"),\n              \"Toggle program lines\"\n            )\n          }\n        />\n      </GroupHeader>\n      <View className=\"relative\" data-testid=\"modal-graphs\" testID=\"modal-graphs\">\n        {graphs.length > 0 && <GroupHeader topPadding={true} name=\"Selected Graphs\" />}\n        <DraggableList2\n          items={graphs}\n          element={(graph, i, handle) => {\n            return (\n              <View\n                data-testid={`item-graph-${graph.type}-${StringUtils_dashcase(graph.id)}`}\n                testID={`item-graph-${graph.type}-${StringUtils_dashcase(graph.id)}`}\n                className=\"w-full px-2 py-1 border-b border-border-neutral bg-background-default\"\n              >\n                <View className=\"flex-row items-center\">\n                  <View style={{ marginLeft: -16 }}>\n                    {handle(\n                      <View className=\"p-2\">\n                        <IconHandle />\n                      </View>\n                    )}\n                  </View>\n                  {graph.type === \"exercise\" ? (\n                    <ExercisePreview exerciseKey={graph.id} settings={settings} />\n                  ) : graph.type === \"muscleGroup\" ? (\n                    <MuscleGroupPreview muscleGroup={graph.id} settings={settings} />\n                  ) : graph.type === \"nutrition\" ? (\n                    <View className=\"flex-1 py-3\">\n                      <Text className=\"text-sm\">{NutritionGraph_name(graph.id)}</Text>\n                    </View>\n                  ) : (\n                    <StatsPreview stats={graph.id} />\n                  )}\n                  <Pressable\n                    data-testid=\"remove-graph\"\n                    testID=\"remove-graph\"\n                    className=\"p-1 nm-remove-graph\"\n                    onPress={() => EditGraphs_removeGraph(dispatch, graph)}\n                  >\n                    <IconCloseCircle />\n                  </Pressable>\n                </View>\n              </View>\n            );\n          }}\n          onDragEnd={(startIndex, endIndex) => {\n            if (startIndex !== endIndex) {\n              EditGraphs_reorderGraphs(dispatch, startIndex, endIndex);\n            }\n          }}\n        />\n        {exercises.length > 0 && (\n          <>\n            <GroupHeader topPadding={true} name=\"Available Exercise Graphs\" />\n            {exercises.map((e) => {\n              return (\n                <Pressable\n                  key={Exercise_toKey(e)}\n                  data-testid={`item-graph-${StringUtils_dashcase(e.name)}`}\n                  testID={`item-graph-${StringUtils_dashcase(e.name)}`}\n                  className=\"flex-row w-full px-2 py-1 border-b border-border-neutral\"\n                  onPress={() => EditGraphs_addExerciseGraph(dispatch, e)}\n                >\n                  <ExercisePreview exerciseKey={Exercise_toKey(e)} settings={settings} />\n                </Pressable>\n              );\n            })}\n          </>\n        )}\n        {availableMuscleGroups.length > 0 && (\n          <>\n            <GroupHeader name=\"Available Muscle Groups Graphs\" topPadding={true} />\n            {availableMuscleGroups.map((muscleGroup) => {\n              return (\n                <Pressable\n                  key={muscleGroup}\n                  data-testid={`item-graph-${muscleGroup}`}\n                  testID={`item-graph-${muscleGroup}`}\n                  className=\"flex-row w-full px-2 py-1 border-b border-border-neutral\"\n                  onPress={() => EditGraphs_addMuscleGroupGraph(dispatch, muscleGroup)}\n                >\n                  <MuscleGroupPreview muscleGroup={muscleGroup} settings={settings} />\n                </Pressable>\n              );\n            })}\n          </>\n        )}\n        {nutritionKeys.length > 0 && <GroupHeader name=\"Available Nutrition Graphs\" topPadding={true} />}\n        {nutritionKeys.map((id) => (\n          <MenuItem\n            key={id}\n            name={NutritionGraph_name(id)}\n            onClick={() => EditGraphs_addNutritionGraph(dispatch, id)}\n          />\n        ))}\n        {hasAvailableStats && <GroupHeader name=\"Available Stats Graphs\" topPadding={true} />}\n        {statsWeightKeys.map((statsKey) => {\n          return (\n            <MenuItem\n              key={statsKey}\n              name={Stats_name(statsKey)}\n              onClick={() => EditGraphs_addStatsWeightGraph(dispatch, statsKey)}\n            />\n          );\n        })}\n        {statsPercentageKeys.map((statsKey) => {\n          return (\n            <MenuItem\n              key={statsKey}\n              name={Stats_name(statsKey)}\n              onClick={() => EditGraphs_addStatsPercentageGraph(dispatch, statsKey)}\n            />\n          );\n        })}\n        {statsLengthKeys.map((statsKey) => {\n          return (\n            <MenuItem\n              key={statsKey}\n              name={Stats_name(statsKey)}\n              onClick={() => EditGraphs_addStatsLengthGraph(dispatch, statsKey)}\n            />\n          );\n        })}\n        {!hasAvailableStats && exercises.length === 0 && graphs.length === 0 && (\n          <Text className=\"mt-3 text-base italic text-text-secondary\">\n            You haven't tracked any workouts or measurements yet.\n          </Text>\n        )}\n      </View>\n    </View>\n  );\n}\n\nconst ExercisePreview = memo(function ExercisePreviewInner(props: {\n  exerciseKey: string;\n  settings: ISettings;\n}): JSX.Element {\n  const e = Exercise_get(Exercise_fromKey(props.exerciseKey), props.settings.exercises);\n  return (\n    <Fragment>\n      <View className=\"pr-4 w-scaled-12 min-h-scaled-8\">\n        <ExerciseImage settings={props.settings} className=\"w-full\" exerciseType={e} size=\"small\" />\n      </View>\n      <View className=\"flex-1 py-2\">\n        <Text className=\"text-text-primary\">{e.name}</Text>\n        <Text className=\"text-xs text-text-secondary\">{equipmentName(e.equipment)}</Text>\n      </View>\n    </Fragment>\n  );\n});\n\nconst StatsPreview = memo(function StatsPreviewInner(props: { stats: IStatsKey }): JSX.Element {\n  return (\n    <View className=\"flex-1 py-3\">\n      <Text className=\"text-sm\">{Stats_name(props.stats)}</Text>\n    </View>\n  );\n});\n\nconst MuscleGroupPreview = memo(function MuscleGroupPreviewInner(props: {\n  muscleGroup: string;\n  settings: ISettings;\n}): JSX.Element {\n  return (\n    <View className=\"flex-1 py-3\">\n      <Text className=\"text-sm\">{Muscle_getMuscleGroupName(props.muscleGroup, props.settings)} Weekly Volume</Text>\n    </View>\n  );\n});\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { IEither } from \"../utils/types\";\n\nexport function ModalImportFromLinkContent(props: { onSubmit: (value?: string) => void }): JSX.Element {\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n\n  return (\n    <View>\n      <Text className=\"mb-2 text-lg font-bold\">Paste link from /program web editor</Text>\n      <Input\n        required={true}\n        requiredMessage=\"Please paste a link\"\n        placeholder=\"https://www.liftosaur.com/...\"\n        autoCapitalize=\"none\"\n        autoCorrect={false}\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"flex-row justify-between mt-4\" style={{ gap: 12 }}>\n        <Button name=\"modal-import-from-link-cancel\" kind=\"grayv2\" onClick={() => props.onSubmit(undefined)}>\n          Cancel\n        </Button>\n        <Button\n          name=\"modal-import-from-link-submit\"\n          kind=\"purple\"\n          onClick={() => {\n            if (result?.success) {\n              props.onSubmit(result.data);\n            } else {\n              inputHandle.current?.touch();\n            }\n          }}\n        >\n          Add\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useCallback } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_importHevyData } from \"../ducks/thunks\";\nimport { ISettings } from \"../types\";\nimport { FileImport_pickFile } from \"../utils/fileImport\";\n\ninterface IModalImportFromOtherAppsContentProps {\n  settings: ISettings;\n  onClose: () => void;\n  dispatch: IDispatch;\n}\n\nexport function ModalImportFromOtherAppsContent(props: IModalImportFromOtherAppsContentProps): JSX.Element {\n  const onUploadHevy = useCallback(async () => {\n    const contents = await FileImport_pickFile(\"csv\");\n    if (contents == null) {\n      return;\n    }\n    props.onClose();\n    // The pushed screen inherits the modal's bounded container if navigation happens before the\n    // modal finishes closing, so delay the dispatch\n    setTimeout(() => props.dispatch(Thunk_importHevyData(contents)), 50);\n  }, [props.dispatch, props.onClose]);\n\n  return (\n    <View>\n      <GroupHeader size=\"large\" name=\"Import history from other apps\" />\n      <MenuItemWrapper name=\"Upload CSV file from Hevy\" onClick={onUploadHevy}>\n        <Text className=\"py-3\">Upload CSV file from Hevy</Text>\n      </MenuItemWrapper>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { IEither } from \"../utils/types\";\n\ninterface IProps {\n  onSelect: (name: string) => void;\n  onClose: () => void;\n}\n\nexport function ModalNewEquipmentContent(props: IProps): JSX.Element {\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n\n  return (\n    <View>\n      <Text className=\"mb-4 text-lg font-bold\">Enter new equipment name</Text>\n      <Input\n        identifier=\"equipment-name\"\n        label=\"Equipment name\"\n        required={true}\n        requiredMessage=\"Please enter a name for the equipment\"\n        type=\"text\"\n        placeholder=\"Tummy Tormentor 3000\"\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"flex-row justify-between gap-3 mt-4\">\n        <Button name=\"add-equipment-cancel\" kind=\"grayv2\" onClick={props.onClose}>\n          Cancel\n        </Button>\n        <Button\n          name=\"add-equipment-submit\"\n          kind=\"purple\"\n          onClick={() => {\n            if (result?.success) {\n              props.onSelect(result.data);\n            } else {\n              inputHandle.current?.touch();\n            }\n          }}\n        >\n          Add\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { IEither } from \"../utils/types\";\nimport { IUnit } from \"../types\";\n\ninterface IProps {\n  units: IUnit;\n  name: string;\n  onSelect: (value: number) => void;\n  onClose: () => void;\n}\n\nexport function ModalNewFixedWeightContent(props: IProps): JSX.Element {\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n\n  return (\n    <View>\n      <Text className=\"mb-4 text-lg font-bold\">{`Enter new ${props.name} fixed weight`}</Text>\n      <Input\n        type=\"number\"\n        required={true}\n        requiredMessage=\"Please enter a weight\"\n        placeholder={`${props.name} weight in ${props.units}`}\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"flex-row justify-between gap-3 mt-4\">\n        <Button name=\"modal-new-fixed-weight-cancel\" kind=\"grayv2\" onClick={props.onClose}>\n          Cancel\n        </Button>\n        <Button\n          name=\"modal-new-fixed-weight-submit\"\n          kind=\"purple\"\n          onClick={() => {\n            if (result?.success) {\n              const numValue = parseFloat(result.data);\n              if (!isNaN(numValue)) {\n                props.onSelect(numValue);\n                return;\n              }\n            }\n            inputHandle.current?.touch();\n          }}\n        >\n          Add\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IProps {\n  onSelect: (name: string) => void;\n  onClose: () => void;\n}\n\nexport function ModalNewGymContent(props: IProps): JSX.Element {\n  const [value, setValue] = useState(\"\");\n\n  return (\n    <View>\n      <Text className=\"mb-2 text-lg font-bold\">New Gym</Text>\n      <Text className=\"mb-4 text-xs text-text-secondary\">\n        You can add a new gym with a set of exercises, and when you switch between gyms, the exercises will use the\n        equipment from the selected gym.\n      </Text>\n      <TextInput\n        autoFocus\n        placeholder=\"Home Gym\"\n        placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n        value={value}\n        onChangeText={setValue}\n        className=\"px-4 py-3 text-base border rounded-lg border-border-neutral bg-background-default text-text-primary\"\n      />\n      <View className=\"flex-row justify-between gap-3 mt-4\">\n        <Button name=\"add-gym-cancel\" kind=\"grayv2\" onClick={props.onClose}>\n          Cancel\n        </Button>\n        <Button\n          name=\"add-gym-submit\"\n          kind=\"purple\"\n          onClick={() => {\n            if (value) {\n              props.onSelect(value);\n            }\n          }}\n        >\n          Add\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { IEither } from \"../utils/types\";\nimport { IUnit } from \"../types\";\n\ninterface IProps {\n  units: IUnit;\n  onSelect: (value: number) => void;\n  onClose: () => void;\n}\n\nexport function ModalPlatesContent(props: IProps): JSX.Element {\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n\n  return (\n    <View>\n      <Text className=\"mb-4 text-lg font-bold\">Enter new plate weight</Text>\n      <Input\n        identifier=\"plate\"\n        type=\"number\"\n        required={true}\n        requiredMessage=\"Please enter a plate weight\"\n        placeholder={`Plate weight in ${props.units}`}\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"flex-row justify-between gap-3 mt-4\">\n        <Button name=\"modal-new-plate-weight-cancel\" kind=\"grayv2\" onClick={props.onClose}>\n          Cancel\n        </Button>\n        <Button\n          name=\"modal-new-plate-weight-submit\"\n          kind=\"purple\"\n          data-testid=\"add-plate\"\n          testID=\"add-plate\"\n          onClick={() => {\n            if (result?.success) {\n              const numValue = parseFloat(result.data);\n              if (!isNaN(numValue)) {\n                props.onSelect(Math.abs(numValue));\n                return;\n              }\n            }\n            inputHandle.current?.touch();\n          }}\n        >\n          Add\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { IProgram, ISettings } from \"../types\";\nimport { Link } from \"./link\";\nimport { IconWatch } from \"./icons/iconWatch\";\nimport { TimeUtils_formatHHMM } from \"../utils/time\";\nimport { Program_evaluate, Program_dayAverageTimeMs } from \"../models/program\";\nimport { SimpleMarkdown } from \"./simpleMarkdown\";\n\ninterface IProps {\n  program: IProgram;\n  hasCustomPrograms: boolean;\n  settings: ISettings;\n  onSelect: () => void;\n  onPreview: () => void;\n  onClose: () => void;\n}\n\nexport function ModalProgramInfoContent(props: IProps): JSX.Element {\n  const evaluatedProgram = Program_evaluate(props.program, props.settings);\n  const time = Program_dayAverageTimeMs(evaluatedProgram, props.settings);\n  const formattedTime = time > 0 ? TimeUtils_formatHHMM(time) : undefined;\n  return (\n    <>\n      <View>\n        <Text className=\"pr-6 text-lg font-bold\">\n          {props.hasCustomPrograms ? \"Clone\" : \"Start\"}{\" \"}\n          <Link className=\"text-lg\" href={props.program.url}>\n            {props.program.name}\n          </Link>\n        </Text>\n      </View>\n      <View>\n        <Text className=\"text-sm text-text-secondary\">by {props.program.author}</Text>\n      </View>\n      {formattedTime && (\n        <View className=\"flex-row items-center pb-1\">\n          <View className=\"pr-1\">\n            <IconWatch />\n          </View>\n          <Text className=\"flex-1 text-sm\" style={{ paddingTop: 2 }}>\n            Average time of a workout: <Text className=\"text-sm font-bold\">{formattedTime}</Text>\n          </Text>\n        </View>\n      )}\n      <SimpleMarkdown value={props.program.description} className=\"mt-4 text-sm\" />\n      <View className=\"flex-row justify-center gap-3 mt-4 mb-2\">\n        <Button\n          name=\"preview-program\"\n          data-testid=\"preview-program\"\n          testID=\"preview-program\"\n          kind=\"grayv2\"\n          onClick={props.onPreview}\n        >\n          Preview\n        </Button>\n        <Button\n          name=\"clone-program\"\n          kind=\"purple\"\n          data-testid=\"clone-program\"\n          testID=\"clone-program\"\n          onClick={props.onSelect}\n        >\n          {props.hasCustomPrograms ? \"Clone\" : \"Start\"}\n        </Button>\n      </View>\n    </>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Modal } from \"./modal\";\nimport { Text } from \"./primitives/text\";\nimport { IProgram, ISettings, IStats } from \"../types\";\nimport { NextDayPicker } from \"./nextDayPicker\";\nimport { View } from \"react-native\";\n\ninterface IModalProgramNextDayProps {\n  initialCurrentProgramId?: string;\n  allPrograms: IProgram[];\n  stats: IStats;\n  settings: ISettings;\n  onSelect: (programId: string, day: number) => void;\n  onClose: () => void;\n}\n\nexport function ModalProgramNextDayContent(props: IModalProgramNextDayProps): JSX.Element {\n  return (\n    <>\n      <View className=\"mb-1 text-center\">\n        <Text className=\"text-lg font-semibold text-center\">Change Next Day</Text>\n      </View>\n      <NextDayPicker\n        stats={props.stats}\n        initialCurrentProgramId={props.initialCurrentProgramId}\n        allPrograms={props.allPrograms}\n        settings={props.settings}\n        onSelect={(programId, day) => {\n          props.onSelect(programId, day);\n          props.onClose();\n        }}\n      />\n    </>\n  );\n}\n\nexport function ModalProgramNextDay(props: IModalProgramNextDayProps): JSX.Element {\n  return (\n    <Modal noPaddings shouldShowClose onClose={props.onClose} isFullWidth>\n      <ModalProgramNextDayContent {...props} />\n    </Modal>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\n\nimport { IDispatch } from \"../ducks/types\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { ISettings, IStatsLength, IStatsPercentage, IStatsWeight } from \"../types\";\nimport {\n  EditStats_toggleWeightStats,\n  EditStats_toggleLengthStats,\n  EditStats_togglePercentageStats,\n} from \"../models/editStats\";\nimport { GroupHeader } from \"./groupHeader\";\n\ninterface IModalStatsProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  isHidden: boolean;\n  onClose: () => void;\n}\n\nexport function ModalStatsContent(props: IModalStatsProps): JSX.Element {\n  const statsEnabled = props.settings.statsEnabled;\n\n  function saveWeight(name: keyof IStatsWeight): (v?: string) => void {\n    return function (v?: string) {\n      EditStats_toggleWeightStats(props.dispatch, name, v === \"true\");\n    };\n  }\n\n  function saveLength(name: keyof IStatsLength): (v?: string) => void {\n    return function (v?: string) {\n      EditStats_toggleLengthStats(props.dispatch, name, v === \"true\");\n    };\n  }\n\n  function savePercentage(name: keyof IStatsPercentage): (v?: string) => void {\n    return function (v?: string) {\n      EditStats_togglePercentageStats(props.dispatch, name, v === \"true\");\n    };\n  }\n\n  return (\n    <View className=\"py-4\">\n      <GroupHeader name=\"Enabled measurement types\" />\n      <View data-testid=\"modal-stats\" testID=\"modal-stats\">\n        <MenuItemEditable\n          onChange={saveWeight(\"weight\")}\n          name=\"Weight\"\n          type=\"boolean\"\n          value={`${statsEnabled.weight.weight}`}\n        />\n        <MenuItemEditable\n          onChange={savePercentage(\"bodyfat\")}\n          name=\"Bodyfat\"\n          type=\"boolean\"\n          value={`${statsEnabled.percentage.bodyfat}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"neck\")}\n          name=\"Neck\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.neck}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"shoulders\")}\n          name=\"Shoulders\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.shoulders}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"bicepLeft\")}\n          name=\"Bicep Left\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.bicepLeft}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"bicepRight\")}\n          name=\"Bicep Right\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.bicepRight}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"forearmLeft\")}\n          name=\"Forearm Left\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.forearmLeft}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"forearmRight\")}\n          name=\"Forearm Right\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.forearmRight}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"chest\")}\n          name=\"Chest\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.chest}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"waist\")}\n          name=\"Waist\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.waist}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"hips\")}\n          name=\"Hips\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.hips}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"thighLeft\")}\n          name=\"Thigh Left\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.thighLeft}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"thighRight\")}\n          name=\"Thigh Right\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.thighRight}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"calfLeft\")}\n          name=\"Calf Left\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.calfLeft}`}\n        />\n        <MenuItemEditable\n          onChange={saveLength(\"calfRight\")}\n          name=\"Calf Right\"\n          type=\"boolean\"\n          value={`${statsEnabled.length.calfRight}`}\n        />\n      </View>\n    </View>\n  );\n}\n","import { JSX, memo, useCallback, useMemo, useRef, forwardRef, useImperativeHandle } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { LegendList, LegendListRef } from \"@legendapp/list\";\nimport { Text } from \"./primitives/text\";\nimport { DateUtils_formatYYYYMMDD, DateUtils_firstDayOfWeekTimestamp } from \"../utils/date\";\nimport { IHistoryRecord } from \"../types\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { IPersonalRecords, History_getNumberOfPersonalRecords } from \"../models/history\";\nimport { CollectionUtils_compact } from \"../utils/collection\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { Progress_isCurrent } from \"../models/progress\";\n\ninterface IMonthCalendarProps {\n  firstDayOfWeeks: number[];\n  selectedFirstDayOfWeekIndex: number;\n  startWeekFromMonday?: boolean;\n  visibleRecords: number;\n  prs: IPersonalRecords;\n  history: IHistoryRecord[];\n  onClick: (historyRecord: IHistoryRecord) => void;\n}\n\nexport interface IMonthCalendarRef {\n  scrollToSelected: () => void;\n}\n\ninterface IMonthData {\n  month: Date;\n  key: string;\n  dayToHistoryRecords: Partial<Record<number, IHistoryRecord[]>>;\n  numberOfWorkouts: number;\n  numberOfPersonalRecords: number;\n}\n\nexport const MonthCalendar = memo(\n  forwardRef<IMonthCalendarRef, IMonthCalendarProps>((props, ref) => {\n    const flatListRef = useRef<LegendListRef>(null);\n\n    const { months, selectedMonthIndex } = useMemo(() => {\n      const start = new Date(Math.max(props.firstDayOfWeeks[0], new Date(2015, 1, 1).getTime()));\n      start.setDate(1);\n      const end = new Date(props.firstDayOfWeeks[props.firstDayOfWeeks.length - 1]);\n      end.setDate(end.getDate() + 6);\n      end.setDate(1);\n\n      const monthToHistoryRecords = props.history.reduce<\n        Partial<Record<string, Partial<Record<number, IHistoryRecord[]>>>>\n      >((acc, record) => {\n        const d = new Date(Date.parse(record.date));\n        d.setDate(1);\n        const monthKey = DateUtils_formatYYYYMMDD(d);\n        acc[monthKey] = acc[monthKey] || {};\n        const day = new Date(Date.parse(record.date)).getDate();\n        acc[monthKey]![day] = acc[monthKey]![day] || [];\n        acc[monthKey]![day]!.push(record);\n        return acc;\n      }, {});\n\n      const result: IMonthData[] = [];\n      const current = new Date(start);\n      while (current <= end) {\n        const key = DateUtils_formatYYYYMMDD(new Date(current));\n        const dayToHistoryRecords = monthToHistoryRecords[key] || {};\n        const historyRecords = CollectionUtils_compact(Object.values(dayToHistoryRecords).flat()).filter(\n          (hr) => !Progress_isCurrent(hr)\n        );\n        result.push({\n          month: new Date(current),\n          key,\n          dayToHistoryRecords,\n          numberOfWorkouts: historyRecords.length,\n          numberOfPersonalRecords: History_getNumberOfPersonalRecords(historyRecords, props.prs),\n        });\n        current.setMonth(current.getMonth() + 1);\n      }\n\n      let selectedIdx = result.length - 1;\n      const selectedFirstDayOfWeekTs = props.firstDayOfWeeks[props.selectedFirstDayOfWeekIndex];\n      if (selectedFirstDayOfWeekTs != null) {\n        const selectedDate = new Date(selectedFirstDayOfWeekTs);\n        const selectedMonthKey = DateUtils_formatYYYYMMDD(\n          new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1)\n        );\n        const idx = result.findIndex((m) => m.key === selectedMonthKey);\n        if (idx >= 0) {\n          selectedIdx = idx;\n        }\n      }\n\n      return { months: result, selectedMonthIndex: selectedIdx };\n    }, [props.firstDayOfWeeks, props.selectedFirstDayOfWeekIndex, props.startWeekFromMonday, props.history, props.prs]);\n\n    useImperativeHandle(\n      ref,\n      () => ({\n        scrollToSelected: () => {\n          if (flatListRef.current && selectedMonthIndex >= 0) {\n            flatListRef.current.scrollToIndex({ index: selectedMonthIndex, animated: true, viewPosition: 0.5 });\n          }\n        },\n      }),\n      [selectedMonthIndex]\n    );\n\n    const today = DateUtils_formatYYYYMMDD(new Date());\n    const selectedFirstDayOfWeek = props.firstDayOfWeeks[props.selectedFirstDayOfWeekIndex];\n\n    const renderMonth = useCallback(\n      ({ item }: { item: IMonthData }) => (\n        <MonthItem\n          item={item}\n          startWeekFromMonday={props.startWeekFromMonday}\n          selectedFirstDayOfWeek={selectedFirstDayOfWeek}\n          today={today}\n          onClick={props.onClick}\n        />\n      ),\n      [props.startWeekFromMonday, props.onClick, selectedFirstDayOfWeek, today]\n    );\n\n    const keyExtractor = useCallback((item: IMonthData) => item.key, []);\n\n    return (\n      <LegendList\n        ref={flatListRef}\n        data={months}\n        renderItem={renderMonth}\n        keyExtractor={keyExtractor}\n        initialScrollIndex={selectedMonthIndex}\n      />\n    );\n  })\n);\n\ninterface IMonthItemProps {\n  item: IMonthData;\n  startWeekFromMonday?: boolean;\n  selectedFirstDayOfWeek: number;\n  today: string;\n  onClick: (historyRecord: IHistoryRecord) => void;\n}\n\nconst MonthItem = memo(function MonthItem(props: IMonthItemProps): JSX.Element {\n  const { item, startWeekFromMonday, selectedFirstDayOfWeek, today, onClick } = props;\n  const { month, dayToHistoryRecords, numberOfWorkouts, numberOfPersonalRecords } = item;\n  const year = month.getFullYear();\n  const monthIndex = month.getMonth();\n  const daysInMonth = new Date(year, monthIndex + 1, 0).getDate();\n  let firstDayOfWeek = month.getDay();\n  if (startWeekFromMonday) {\n    firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n  }\n  const days = Array.from({ length: daysInMonth }, (_, i) => i + 1);\n\n  return (\n    <View className=\"px-3 mb-8\">\n      <Text className=\"text-lg font-semibold\">\n        {month.toLocaleString(\"default\", { month: \"long\", year: \"numeric\" })}\n      </Text>\n      <Text className=\"text-sm\">\n        <Text>\n          {numberOfWorkouts} {StringUtils_pluralize(\"workout\", numberOfWorkouts)}\n        </Text>\n        <Text> {\"\\u00B7\"} </Text>\n        <Text>\n          {\"\\u{1F3C6}\"} {numberOfPersonalRecords} {StringUtils_pluralize(\"PR\", numberOfPersonalRecords)}\n        </Text>\n      </Text>\n      <View className=\"flex-row flex-wrap mt-2\">\n        {Array(firstDayOfWeek)\n          .fill(null)\n          .map((_, i) => (\n            <View key={`empty-${i}`} style={{ width: \"14.285%\" }} className=\"items-center justify-center p-2\">\n              <View className=\"w-scaled-8 h-scaled-8\" />\n            </View>\n          ))}\n        {days.map((day) => {\n          const date = new Date(year, monthIndex, day);\n          const yyyymmdd = DateUtils_formatYYYYMMDD(date);\n          const historyRecord = dayToHistoryRecords[day]?.[0];\n          const isWorkout = !!historyRecord && !Progress_isCurrent(historyRecord);\n          const thisFirstDayOfWeek = DateUtils_firstDayOfWeekTimestamp(date, startWeekFromMonday);\n          const isSelectedWeek = selectedFirstDayOfWeek === thisFirstDayOfWeek;\n\n          return (\n            <Pressable\n              key={yyyymmdd}\n              style={{\n                width: \"14.285%\",\n                backgroundColor: isSelectedWeek ? Tailwind_semantic().background.subtle : \"transparent\",\n              }}\n              className=\"items-center justify-center p-2\"\n              onPress={() => {\n                if (historyRecord != null) {\n                  onClick(historyRecord);\n                }\n              }}\n            >\n              <View\n                className={`w-scaled-8 h-scaled-8 rounded-full items-center justify-center ${\n                  isWorkout ? \"bg-background-error\" : \"\"\n                } ${yyyymmdd === today ? \"border border-button-primarybackground\" : \"\"}`}\n              >\n                <Text\n                  className={`${\n                    isWorkout ? \"text-text-alwayswhite\" : date > new Date() ? \"text-text-disabled\" : \"text-text-primary\"\n                  } ${yyyymmdd === today ? \"font-bold\" : \"\"}`}\n                >\n                  {day}\n                </Text>\n              </View>\n            </Pressable>\n          );\n        })}\n      </View>\n    </View>\n  );\n});\n","import { JSX, useState } from \"react\";\nimport { View, Pressable, ScrollView } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { Text } from \"./primitives/text\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IMultiselectProps {\n  readonly values: Readonly<string[]>;\n  readonly label: string;\n  readonly id: string;\n  readonly initialSelectedValues?: Set<string>;\n  readonly placeholder?: string;\n  \"data-testid\"?: string;\n  testID?: string;\n  onChange: (values: Set<string>) => void;\n}\n\nexport function Multiselect(props: IMultiselectProps): JSX.Element {\n  const [selectedValues, setSelectedValues] = useState(props.initialSelectedValues || new Set<string>());\n  const [showValuesList, setShowValuesList] = useState(false);\n  const [filter, setFilter] = useState(\"\");\n\n  const valuesSet = new Set(props.values);\n  const filteredValues = Array.from(valuesSet).filter(\n    (v) => v.toLowerCase().includes(filter.toLowerCase()) && !selectedValues.has(v)\n  );\n\n  return (\n    <View>\n      {props.label ? (\n        <View>\n          <Text className=\"block text-sm font-bold\">{props.label}</Text>\n        </View>\n      ) : null}\n      <View className=\"relative z-20\">\n        <TextInput\n          data-testid={`multiselect-${props.id}`}\n          testID={`multiselect-${props.id}`}\n          placeholder={props.placeholder}\n          placeholderTextColor={Tailwind_semantic().text.secondarysubtle}\n          value={filter}\n          className=\"px-4 py-2 text-base border rounded-lg bg-background-default border-border-prominent text-text-primary\"\n          onFocus={() => setShowValuesList(true)}\n          onBlur={() => {\n            setTimeout(() => setShowValuesList(false), 150);\n          }}\n          onChangeText={(value) => setFilter(value)}\n        />\n        {showValuesList && filteredValues.length > 0 && (\n          <View\n            className=\"absolute left-0 right-0 border rounded-lg shadow-sm bg-background-default border-border-neutral\"\n            style={{ top: \"100%\" }}\n          >\n            <ScrollView className=\"max-h-scaled-48\" keyboardShouldPersistTaps=\"always\" nestedScrollEnabled={true}>\n              {filteredValues.map((value) => (\n                <Pressable\n                  key={value}\n                  data-testid={`multiselect-option-${StringUtils_dashcase(value)}`}\n                  testID={`multiselect-option-${StringUtils_dashcase(value)}`}\n                  onPress={() => {\n                    const newValues = new Set([...selectedValues, value]);\n                    setSelectedValues(newValues);\n                    setShowValuesList(false);\n                    setFilter(\"\");\n                    props.onChange(newValues);\n                  }}\n                  className=\"px-4 py-2 border-b border-border-neutral\"\n                >\n                  <Text className=\"text-base text-text-primary\">{value}</Text>\n                </Pressable>\n              ))}\n            </ScrollView>\n          </View>\n        )}\n      </View>\n      {selectedValues.size > 0 && (\n        <View className=\"flex-row flex-wrap mt-1\">\n          {Array.from(selectedValues).map((sm) => (\n            <Pressable\n              key={sm}\n              className=\"flex-row items-center px-2 py-1 mb-1 mr-1 rounded-full nm-multiselect bg-background-neutral\"\n              onPress={() => {\n                const set = new Set(selectedValues);\n                set.delete(sm);\n                setSelectedValues(set);\n                props.onChange(set);\n              }}\n            >\n              <Text className=\"text-xs\">{sm}</Text>\n              <Text className=\"ml-1 text-xs\">×</Text>\n            </Pressable>\n          ))}\n        </View>\n      )}\n    </View>\n  );\n}\n","import React, { JSX } from \"react\";\nimport { IScreenMuscle, screenMuscles } from \"../types\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IMuscleImageProps {\n  muscleGroup: IScreenMuscle;\n  size: number;\n}\n\nexport function MuscleGroupImage(props: IMuscleImageProps): JSX.Element | null {\n  if (!(screenMuscles as readonly string[]).includes(props.muscleGroup)) {\n    return null;\n  }\n  const muscleColors = {\n    \"--muscle-fill\": Tailwind_semantic().background.default,\n    \"--muscle-primary\": Tailwind_semantic().icon.blue,\n    \"--muscle-light\": Tailwind_semantic().icon.light,\n  } as React.CSSProperties;\n  const width = props.size;\n  const height = Math.round((props.size / 61) * 48);\n\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 61 48\" width={width} height={height}>\n      <use\n        href={`/images/svgs/musclegroups-combined.svg#${props.muscleGroup.toLowerCase().replace(/ /g, \"\")}`}\n        style={muscleColors}\n      />\n    </svg>\n  );\n}\n","import { JSX, Fragment, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport {\n  Muscle_getAvailableMuscleGroups,\n  Muscle_getHiddenMuscleGroups,\n  Muscle_getMuscleGroupName,\n  Muscle_isBuiltInMuscleGroup,\n  Muscle_getMusclesFromScreenMuscle,\n} from \"../models/muscle\";\nimport { IMuscle, IScreenMuscle, ISettings } from \"../types\";\nimport { CollectionUtils_sort, CollectionUtils_remove } from \"../utils/collection\";\nimport { IconEdit2 } from \"./icons/iconEdit2\";\nimport { IconEyeClosed } from \"./icons/iconEyeClosed\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { LinkButton } from \"./linkButton\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { MuscleGroupImage } from \"./muscleGroupImage\";\nimport { BottomSheetMuscleGroupMusclePicker } from \"./bottomSheetMuscleGroupMusclePicker\";\nimport { BottomSheetOrModal } from \"./bottomSheetOrModal\";\nimport { TextInputModalContent } from \"./textInputModalContent\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { useModal } from \"../navigation/ModalStateContext\";\nimport { getNavigationRef } from \"../navigation/navUtils\";\n\ninterface IProps {\n  settings: ISettings;\n  useInlineModals?: boolean;\n  onCreate: (name: string) => void;\n  onDelete: (muscleGroup: IScreenMuscle) => void;\n  onUpdate?: (muscleGroup: IScreenMuscle, muscles: IMuscle[]) => void;\n  onRestore: (muscleGroup: IScreenMuscle) => void;\n}\n\nexport function MuscleGroupsContent(props: IProps): JSX.Element {\n  const visibleMuscleGroups = Muscle_getAvailableMuscleGroups(props.settings);\n  const hiddenMuscleGroups = Muscle_getHiddenMuscleGroups(props.settings);\n  const [showMusclePicker, setShowMusclePicker] = useState<IScreenMuscle | undefined>(undefined);\n  const [showNewGroupInput, setShowNewGroupInput] = useState(false);\n\n  const openTextInput = useModal(\"textInputModal\", (name) => {\n    const trimmed = name.trim();\n    if (trimmed) {\n      props.onCreate(trimmed);\n    }\n  });\n\n  const newGroupInputData = {\n    title: \"Enter new group name\",\n    inputLabel: \"Name\",\n    placeholder: \"My Group Name\",\n    submitLabel: \"Add\",\n    dataCyPrefix: \"modal-new-muscle-group\",\n  };\n\n  const handleAddMuscleGroup = (): void => {\n    // Outside the app there is no ModalStateProvider, so `openTextInput` dispatches into a noop\n    if (props.useInlineModals) {\n      setShowNewGroupInput(true);\n    } else {\n      openTextInput(newGroupInputData);\n    }\n  };\n\n  return (\n    <View>\n      {visibleMuscleGroups.map((muscleGroup) => {\n        const muscleGroupName = Muscle_getMuscleGroupName(muscleGroup, props.settings);\n        const muscleGroupSlug = StringUtils_dashcase(muscleGroupName);\n        const isBuiltin = Muscle_isBuiltInMuscleGroup(muscleGroup);\n        return (\n          <MenuItemWrapper key={muscleGroup} name={`muscle-group-${muscleGroup}`}>\n            <View className=\"flex-row items-center gap-4\">\n              <View className=\"w-scaled-12\">\n                <MuscleGroupImage muscleGroup={muscleGroup} size={48} />\n              </View>\n              <View className=\"flex-1 py-2\">\n                <Text className=\"text-base font-bold\">{muscleGroupName}</Text>\n                <Text className=\"text-xs text-text-secondary\">\n                  {CollectionUtils_sort(Muscle_getMusclesFromScreenMuscle(muscleGroup, props.settings), (a, b) =>\n                    a.localeCompare(b)\n                  ).join(\", \")}\n                </Text>\n              </View>\n              <View className=\"flex-row\">\n                <Pressable\n                  className=\"p-2\"\n                  testID={`edit-muscle-group-${muscleGroupSlug}`}\n                  data-testid={`edit-muscle-group-${muscleGroupSlug}`}\n                  onPress={() => {\n                    if (props.useInlineModals) {\n                      setShowMusclePicker(muscleGroup);\n                    } else {\n                      getNavigationRef().then(({ navigationRef: ref }) =>\n                        ref.navigate(\"muscleGroupMusclePickerModal\", { muscleGroup })\n                      );\n                    }\n                  }}\n                >\n                  <IconEdit2 />\n                </Pressable>\n                <Pressable\n                  className=\"p-2\"\n                  testID={`delete-muscle-group-${muscleGroupSlug}`}\n                  data-testid={`delete-muscle-group-${muscleGroupSlug}`}\n                  onPress={() => {\n                    props.onDelete(muscleGroup);\n                  }}\n                >\n                  {isBuiltin ? <IconEyeClosed /> : <IconTrash />}\n                </Pressable>\n              </View>\n            </View>\n          </MenuItemWrapper>\n        );\n      })}\n      <View className=\"pb-8\">\n        <LinkButton\n          name=\"add-muscle-group\"\n          data-testid=\"add-muscle-group\"\n          testID=\"add-muscle-group\"\n          className=\"text-sm\"\n          onClick={handleAddMuscleGroup}\n        >\n          Add custom muscle group\n        </LinkButton>\n      </View>\n      {hiddenMuscleGroups.length > 0 && (\n        <View className=\"flex-row flex-wrap pb-6\">\n          <Text className=\"text-xs text-text-secondary\">Unhide muscle groups: </Text>\n          {hiddenMuscleGroups.map((muscleGroup, i) => {\n            const muscleGroupName = Muscle_getMuscleGroupName(muscleGroup, props.settings);\n            const muscleGroupSlug = StringUtils_dashcase(muscleGroupName);\n            return (\n              <Fragment key={muscleGroup}>\n                {i !== 0 ? <Text className=\"text-xs text-text-secondary\">, </Text> : null}\n                <LinkButton\n                  data-testid={`unhide-muscle-group-${muscleGroupSlug}`}\n                  testID={`unhide-muscle-group-${muscleGroupSlug}`}\n                  name=\"unhide-muscle-group\"\n                  className=\"text-xs\"\n                  onClick={() => props.onRestore(muscleGroup)}\n                >\n                  {muscleGroupName}\n                </LinkButton>\n              </Fragment>\n            );\n          })}\n        </View>\n      )}\n      {props.useInlineModals && showMusclePicker && Platform.OS === \"web\" && (\n        <BottomSheetMuscleGroupMusclePicker\n          settings={props.settings}\n          muscleGroup={showMusclePicker}\n          onClose={() => setShowMusclePicker(undefined)}\n          onSelect={(muscle) => {\n            const existingMuscles = Muscle_getMusclesFromScreenMuscle(showMusclePicker, props.settings);\n            const newMuscles = existingMuscles.includes(muscle)\n              ? CollectionUtils_remove(existingMuscles, muscle)\n              : [...existingMuscles, muscle];\n            props.onUpdate?.(showMusclePicker, newMuscles);\n          }}\n        />\n      )}\n      {props.useInlineModals && showNewGroupInput && Platform.OS === \"web\" && (\n        <BottomSheetOrModal\n          shouldShowClose={true}\n          onClose={() => setShowNewGroupInput(false)}\n          isHidden={false}\n          zIndex={70}\n        >\n          <div className=\"px-gutter py-2\">\n            <TextInputModalContent\n              data={newGroupInputData}\n              onClose={() => setShowNewGroupInput(false)}\n              onSubmit={(name) => {\n                setShowNewGroupInput(false);\n                props.onCreate(name);\n              }}\n            />\n          </div>\n        </BottomSheetOrModal>\n      )}\n    </View>\n  );\n}\n","import React, { JSX } from \"react\";\nimport { IMuscle } from \"../types\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IMuscleImageProps {\n  muscle: IMuscle;\n  size: number;\n}\n\nexport function MuscleImage(props: IMuscleImageProps): JSX.Element {\n  const muscleColors = {\n    \"--muscle-fill\": Tailwind_semantic().background.default,\n    \"--muscle-primary\": Tailwind_semantic().icon.blue,\n    \"--muscle-light\": Tailwind_semantic().icon.light,\n  } as React.CSSProperties;\n  const width = props.size;\n  const height = Math.round((props.size / 61) * 48);\n\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 61 48\" width={width} height={height}>\n      <use\n        href={`/images/svgs/muscles-combined.svg#${props.muscle.toLowerCase().replace(/ /g, \"\")}`}\n        style={muscleColors}\n      />\n    </svg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { IScreenMuscle } from \"../../../types\";\nimport { Svg, G, Path } from \"../../primitives/svg\";\n\nexport interface IMuscleStyle {\n  fill?: string;\n  opacity?: number;\n}\n\nexport type IMuscleMapInput = Partial<Record<IScreenMuscle, IMuscleStyle>>;\n\ninterface IProps {\n  muscles?: IMuscleMapInput;\n  contour?: IMuscleStyle;\n  defaultOpacity?: number;\n}\n\nexport function BackMusclesSvg(props: IProps): JSX.Element {\n  function getOpacity(muscle: IScreenMuscle): number {\n    return props.muscles?.[muscle]?.opacity ?? props.defaultOpacity ?? 0.3;\n  }\n\n  function getFill(muscle: IScreenMuscle): string {\n    return props.muscles?.[muscle]?.fill ?? \"#28839F\";\n  }\n\n  return (\n    <Svg viewBox=\"0 0 112 234\" width=\"100%\" style={{ aspectRatio: 112 / 234 }}>\n      <G stroke=\"none\" strokeWidth={1} fillRule=\"evenodd\">\n        <G opacity={getOpacity(\"back\")} fill={getFill(\"back\")} transform=\"translate(28.250948, 26.431691)\">\n          <Path d=\"M35.9680522,9.13730908 C38.8320522,11.1953091 42.9700522,10.4693091 50.9080522,14.4123091 C51.2320522,14.5753091 49.1140522,14.4813091 45.8350522,16.9633091 C43.6450522,18.6223091 42.0270522,21.4113091 41.4740522,23.6993091 C40.2560522,28.7353091 43.2730522,34.5193091 28.1810522,48.6723091 C27.4940522,49.3173091 27.2850522,30.2523091 27.2850522,26.4733091 C27.2850522,16.5813091 31.7200522,16.9003091 31.7200522,14.0713091 C31.7200522,11.4243091 28.1350522,6.20330908 28.1350522,0.791309078 C28.1350522,-0.0556909219 31.0710522,-0.377690922 31.4190522,0.610309078 C32.7860522,4.49030908 33.8330522,7.60430908 35.9680522,9.13730908\" />\n          <Path d=\"M43.0610522,24.1823091 C44.3150522,26.9673091 49.9490522,28.6003091 51.0240522,29.0923091 C48.4690522,30.1203091 41.7640522,34.4473091 40.2560522,35.6883091 C43.0740522,29.9743091 42.0380522,21.9123091 43.0610522,24.1823091\" />\n          <Path d=\"M52.7930522,36.4753091 C49.8070522,39.8143091 39.0880522,38.4473091 40.0650522,37.4703091 C41.0420522,36.4923091 51.1440522,30.0483091 53.1350522,29.8473091 C53.4480522,29.8163091 53.5260522,35.6563091 52.7930522,36.4753091\" />\n          <Path d=\"M28.7539993,49.7363091 C28.7300522,56.4563091 36.8800522,70.0883091 38.2910522,69.7783091 C39.0220522,69.6183091 40.0560522,67.8413091 40.6530522,66.7553091 C44.7920522,59.2263091 46.3330522,60.6353091 46.8570522,57.3813091 C48.2300522,48.8393091 50.4510522,46.2123091 52.8590522,37.8483091 C52.8590522,37.8483091 48.1820522,41.3763091 39.3010522,39.0833091 C38.0780522,38.7683091 36.8480522,41.7863091 33.7820522,44.8523091 C30.5980522,48.0373091 28.7539993,49.7363091 28.7539993,49.7363091\" />\n          <Path d=\"M46.6220522,60.7673091 C46.1770522,64.3603091 45.9710522,66.4213091 45.7710522,72.4233091 C45.7100522,74.2423091 43.0570522,71.3253091 39.9840522,70.8303091 C39.4030522,70.7373091 44.2910522,62.2103091 46.6220522,60.7673091\" />\n          <Path d=\"M17.3940522,9.13730908 C14.5300522,11.1953091 10.3930522,10.4693091 2.45505221,14.4123091 C2.12905221,14.5753091 4.24805221,14.4813091 7.52705221,16.9633091 C9.71705221,18.6223091 11.3360522,21.4113091 11.8890522,23.6993091 C13.1060522,28.7353091 10.0890522,34.5193091 25.1820522,48.6723091 C25.8690522,49.3173091 26.0780522,30.2523091 26.0780522,26.4733091 C26.0780522,16.5813091 21.6430522,16.9003091 21.6430522,14.0713091 C21.6430522,11.4243091 25.2280522,6.20330908 25.2280522,0.791309078 C25.2280522,-0.0556909219 22.2910522,-0.377690922 21.9430522,0.610309078 C20.5770522,4.49030908 19.5290522,7.60430908 17.3940522,9.13730908\" />\n          <Path d=\"M10.3020522,24.1823091 C9.04705221,26.9673091 3.41305221,28.6003091 2.33805221,29.0923091 C4.89305221,30.1203091 11.5990522,34.4473091 13.1060522,35.6883091 C10.2890522,29.9743091 11.3240522,21.9123091 10.3020522,24.1823091\" />\n          <Path d=\"M0.569052212,36.4753091 C3.55605221,39.8143091 14.2750522,38.4473091 13.2980522,37.4703091 C12.3210522,36.4923091 2.21905221,30.0483091 0.228052212,29.8473091 C-0.0849477882,29.8163091 -0.163947788,35.6563091 0.569052212,36.4753091\" />\n          <Path d=\"M24.6090522,49.7363091 C24.6080522,56.4093091 16.4820522,70.0883091 15.0710522,69.7783091 C14.3400522,69.6183091 13.3060522,67.8413091 12.7090522,66.7553091 C8.57005221,59.2263091 7.02905221,60.6353091 6.50605221,57.3813091 C5.13205221,48.8393091 2.91105221,46.2123091 0.503052212,37.8483091 C0.503052212,37.8483091 5.18005221,41.3763091 14.0620522,39.0833091 C15.2850522,38.7683091 16.5150522,41.7863091 19.5800522,44.8523091 C22.7650522,48.0373091 24.6090522,49.7363091 24.6090522,49.7363091\" />\n          <Path d=\"M6.74005221,60.7673091 C7.18605221,64.3603091 7.39205221,66.4213091 7.59105221,72.4233091 C7.65205221,74.2423091 10.3060522,71.3253091 13.3790522,70.8303091 C13.9590522,70.7373091 9.07105221,62.2103091 6.74005221,60.7673091\" />\n          <Path d=\"M25.6370522,50.5203091 C25.6370522,50.5203091 24.9130522,59.4613091 16.7120522,70.0963091 C15.0190522,72.2923091 24.5430522,75.3873091 24.8610522,74.8593091 C25.0160522,74.6013091 25.2550522,69.3553091 25.3620522,63.8543091 C25.4730522,58.0793091 26.0730522,51.3893091 25.6370522,50.5203091\" />\n          <Path d=\"M27.7260522,50.5203091 C27.7260522,50.5203091 28.4500522,59.4613091 36.6500522,70.0963091 C38.3440522,72.2923091 28.8190522,75.3873091 28.5020522,74.8593091 C28.3470522,74.6013091 28.1070522,69.3553091 28.0010522,63.8543091 C27.8900522,58.0793091 27.2910522,51.3893091 27.7260522,50.5203091\" />\n        </G>\n        <G opacity={getOpacity(\"shoulders\")} fill={getFill(\"shoulders\")} transform=\"translate(18.066334, 41.383607)\">\n          <Path d=\"M73.6946662,19.5123927 C74.1236662,20.7313927 70.8456662,16.9743927 66.0286662,14.6253927 C64.9236662,14.0853927 63.7206662,13.6143927 62.4326662,13.2813927 C55.7296662,11.5513927 50.6486662,7.4553927 56.4656662,3.0313927 C59.8166662,0.481392703 62.7956662,-0.305607297 64.2976662,0.101392703 C70.5046662,1.7903927 71.7466662,6.5153927 72.0596662,10.2943927 C72.3586662,13.9153927 72.9196662,17.3093927 73.6946662,19.5123927\" />\n          <Path d=\"M0.0376662226,19.5123927 C-0.391333777,20.7313927 2.88666622,16.9743927 7.70366622,14.6253927 C8.80766622,14.0853927 10.0116662,13.6143927 11.2996662,13.2813927 C18.0016662,11.5513927 23.0826662,7.4553927 17.2666662,3.0313927 C13.9146662,0.481392703 10.9356662,-0.305607297 9.43466622,0.101392703 C3.22666622,1.7903927 1.98466622,6.5153927 1.67266622,10.2943927 C1.37366622,13.9153927 0.811666223,17.3093927 0.0376662226,19.5123927\" />\n        </G>\n        <G opacity={getOpacity(\"glutes\")} fill={getFill(\"glutes\")} transform=\"translate(34.187744, 98.720793)\">\n          <Path d=\"M23.7202557,4.81520662 C20.3782557,7.55720662 21.1492557,10.8362066 21.1562557,15.4562066 C21.1702557,23.8472066 21.8352557,25.2402066 25.3352557,26.9842066 C29.2182557,28.9192066 37.8072557,27.1362066 39.8722557,23.1822066 C42.6572557,17.8482066 41.4352557,7.73320662 39.2792557,5.57720662 C32.8392557,-0.863793377 25.6042557,3.26820662 23.7202557,4.81520662\" />\n          <Path d=\"M39.4502557,2.02720662 C40.3512557,2.92720662 40.0742557,5.57620662 39.7242557,5.22720662 C38.9542557,4.45520662 38.4502557,3.07720662 34.5182557,1.63620662 C31.7932557,0.637206623 29.0422557,1.59720662 27.6532557,2.01920662 C27.5062557,2.06420662 34.8732557,-2.55179338 39.4502557,2.02720662\" />\n          <Path d=\"M17.7692557,4.81520662 C21.1102557,7.55720662 20.3392557,10.8362066 20.3322557,15.4562066 C20.3192557,23.8472066 19.6532557,25.2402066 16.1532557,26.9842066 C12.2702557,28.9192066 3.68225567,27.1362066 1.61625567,23.1822066 C-1.16774433,17.8482066 0.0532556698,7.73320662 2.20925567,5.57720662 C8.64925567,-0.863793377 15.8842557,3.26820662 17.7692557,4.81520662\" />\n          <Path d=\"M2.03925567,2.02720662 C1.13825567,2.92720662 1.41525567,5.57620662 1.76425567,5.22720662 C2.53525567,4.45520662 3.03925567,3.07720662 6.97125567,1.63620662 C9.69625567,0.637206623 12.4462557,1.59720662 13.8352557,2.01920662 C13.9822557,2.06420662 6.61625567,-2.55179338 2.03925567,2.02720662\" />\n        </G>\n        <G opacity={getOpacity(\"triceps\")} fill={getFill(\"triceps\")} transform=\"translate(13.910000, 56.592542)\">\n          <Path d=\"M77.867,6.10045803 C78.74,7.18445803 80.201,14.818458 79.539,21.383458 C79.316,23.600458 82.045,30.354458 82.045,30.354458 C82.045,30.354458 80.98,32.026458 79.799,29.065458 C78.841,26.665458 78.247,22.690458 76.635,23.287458 C74.056,24.240458 78.636,31.390458 77.194,32.832458 C76.535,33.491458 69.434,29.496458 68.907,27.676458 C67.059,23.919458 64.888,21.917458 64.697,18.145458 C67.944,11.412458 69.759,2.13145803 68.983,0.0444580343 C68.767,-0.535541966 76.762,4.72645803 77.867,6.10045803\" />\n          <Path d=\"M4.176,6.10045803 C3.305,7.18445803 1.844,14.818458 2.506,21.383458 C2.729,23.600458 -1.77635684e-15,30.354458 -1.77635684e-15,30.354458 C-1.77635684e-15,30.354458 1.064,32.026458 2.245,29.065458 C3.203,26.665458 3.797,22.690458 5.409,23.287458 C7.988,24.240458 3.408,31.390458 4.851,32.832458 C5.51,33.491458 12.611,29.496458 13.137,27.676458 C14.986,23.919458 17.157,21.917458 17.348,18.145458 C14.1,11.412458 12.286,2.13145803 13.062,0.0444580343 C13.278,-0.535541966 5.282,4.72645803 4.176,6.10045803\" />\n        </G>\n        <G opacity={getOpacity(\"forearms\")} fill={getFill(\"forearms\")} transform=\"translate(8.884225, 87.710000)\">\n          <Path d=\"M87.3597749,1.77635684e-15 C83.5077749,2.421 87.0947749,5.983 91.2647749,21.423 C90.4567749,16.818 90.8587749,14.882 90.2327749,11.01 C89.3387749,5.486 87.9407749,2.17 87.3597749,1.77635684e-15\" />\n          <Path d=\"M82.1847749,2.973 C83.3317749,2.293 84.3667749,1.769 89.8397749,19.553 C90.5397749,21.827 91.3447749,23.224 91.9167749,25.939 C92.1437749,27.018 92.2267749,29.494 91.7307749,32.052 C91.6747749,32.343 91.8737749,26.085 90.6257749,25.984 C89.9917749,25.932 90.4727749,29.365 89.7897749,32.351 C89.7097749,29.215 89.6457749,26.08 88.8577749,26.072 C88.3207749,26.066 88.2717749,29.773 87.5877749,32.114 C87.5877749,32.114 87.8837749,26.159 86.9667749,26.15 C86.3257749,26.143 86.5397749,28.705 85.6297749,31.354 C85.9727749,28.079 85.4967749,25.28 85.4557749,24.609 C85.3597749,23.033 84.9917749,21.411 84.4407749,20.169 C83.1617749,17.284 82.0067749,15.811 80.6617749,11.918 C78.5737749,5.875 81.5697749,3.339 82.1847749,2.973\" />\n          <Path d=\"M4.73577495,1.77635684e-15 C8.58877495,2.421 5.00177495,5.983 0.83177495,21.423 C1.63877495,16.818 1.23677495,14.882 1.86377495,11.01 C2.75777495,5.486 4.15577495,2.17 4.73577495,1.77635684e-15\" />\n          <Path d=\"M9.91077495,2.973 C8.76377495,2.293 7.72977495,1.769 2.25577495,19.553 C1.55577495,21.827 0.75077495,23.224 0.17877495,25.939 C-0.0472250502,27.018 -0.13022505,29.494 0.36477495,32.052 C0.42077495,32.343 0.22177495,26.085 1.46977495,25.984 C2.10477495,25.932 1.62377495,29.365 2.30577495,32.351 C2.38677495,29.215 2.44977495,26.08 3.23777495,26.072 C3.77577495,26.066 3.82377495,29.773 4.50877495,32.114 C4.50877495,32.114 4.21277495,26.159 5.12977495,26.15 C5.76977495,26.143 5.55677495,28.705 6.46677495,31.354 C6.12277495,28.079 6.59877495,25.28 6.63977495,24.609 C6.73577495,23.033 7.10377495,21.411 7.65477495,20.169 C8.93477495,17.284 10.0897749,15.811 11.4347749,11.918 C13.5217749,5.875 10.5267749,3.339 9.91077495,2.973\" />\n        </G>\n        <G opacity={getOpacity(\"calves\")} fill={getFill(\"calves\")}>\n          <Path d=\"M67.3921472,171.386525 C67.5501472,169.093525 68.7271472,166.419525 71.9541472,166.022525 C74.9691472,165.653525 76.4921472,170.109525 76.4921472,170.109525 C76.4921472,170.109525 76.5041472,165.262525 80.5761472,165.011525 C84.1701472,164.790525 84.2251472,167.778525 85.0761472,171.341525 C86.6841472,178.084525 86.1111472,181.780525 86.1111472,193.331525 C86.1111472,198.661525 85.5671472,200.133525 84.4561472,200.133525 C81.1451472,200.133525 78.8531472,191.641525 78.8531472,191.641525 C78.8531472,191.641525 77.2711472,201.834525 74.9691472,200.708525 C73.8791472,200.175525 72.0921472,191.607525 70.5611472,186.674525 C68.6791472,180.613525 67.0841472,175.846525 67.3921472,171.386525\" />\n          <Path d=\"M41.8191472,171.386525 C41.6601472,169.093525 40.4841472,166.419525 37.2561472,166.022525 C34.2411472,165.653525 32.7181472,170.109525 32.7181472,170.109525 C32.7181472,170.109525 32.7061472,165.262525 28.6341472,165.011525 C25.0411472,164.790525 24.9861472,167.778525 24.1351472,171.341525 C22.5261472,178.084525 23.0991472,181.780525 23.0991472,193.331525 C23.0991472,198.661525 23.6441472,200.133525 24.7551472,200.133525 C28.0661472,200.133525 30.3581472,191.641525 30.3581472,191.641525 C30.3581472,191.641525 31.9401472,201.834525 34.2411472,200.708525 C35.3321472,200.175525 37.1181472,191.607525 38.6501472,186.674525 C40.5311472,180.613525 42.1261472,175.846525 41.8191472,171.386525\" />\n        </G>\n        <G opacity={getOpacity(\"hamstrings\")} fill={getFill(\"hamstrings\")} transform=\"translate(24.854000, 126.371014)\">\n          <Path d=\"M0,39.6679856 C1.625,21.7309856 6.213,15.0139856 8.982,8.48798559 C12.615,-0.071014412 13.997,-0.457014412 15.859,0.223985588 C17.654,0.882985588 20.203,1.31098559 23.163,1.31098559 C28.225,1.31098559 25.864,13.9659856 24.646,18.4529856 C22.544,26.1889856 17.624,34.4509856 17.624,42.4709856 C15.286,31.2039856 11.943,36.4709856 12.707,25.6259856 C8.314,35.0709856 5.767,30.5509856 0,39.6679856\" />\n          <Path d=\"M60.156,39.6679856 C58.532,21.7309856 53.944,15.0139856 51.174,8.48798559 C47.542,-0.071014412 46.16,-0.457014412 44.298,0.223985588 C42.502,0.882985588 39.954,1.31098559 36.993,1.31098559 C31.931,1.31098559 34.292,13.9659856 35.511,18.4529856 C37.612,26.1889856 42.533,34.4509856 42.533,42.4709856 C44.871,31.2039856 48.213,36.4709856 47.449,25.6259856 C51.842,35.0709856 54.39,30.5509856 60.156,39.6679856\" />\n        </G>\n        <G opacity={props.contour?.opacity ?? 1} fill={props.contour?.fill ?? \"#28839F\"}>\n          <Path d=\"M108.882,126.739 C108.742,126.835 108.552,126.88 108.364,126.903 C108.268,126.915 108.174,126.922 108.08,126.925 L107.928,126.924 C107.889,126.92 107.855,126.916 107.816,126.905 C107.661,126.866 107.499,126.781 107.348,126.687 C107.197,126.592 107.052,126.486 106.915,126.373 C106.775,126.264 106.644,126.147 106.515,126.033 C106.383,125.923 106.262,125.803 106.14,125.692 C105.898,125.466 105.664,125.25 105.452,125.033 C105.347,124.925 105.246,124.816 105.151,124.708 C105.053,124.602 104.96,124.498 104.873,124.393 C104.7,124.185 104.543,123.986 104.403,123.798 C104.265,123.606 104.146,123.426 104.037,123.261 C103.83,122.927 103.681,122.647 103.591,122.456 C103.584,122.442 103.578,122.427 103.571,122.414 C103.561,122.234 103.548,122.054 103.532,121.874 C103.492,121.44 103.439,121.008 103.375,120.577 C103.311,120.146 103.226,119.718 103.133,119.295 C103.081,119.085 103.032,118.872 102.976,118.663 L102.794,118.038 C102.787,118.014 102.763,118 102.738,118.004 C102.712,118.008 102.694,118.034 102.699,118.061 L102.7,118.063 L102.817,118.698 L102.912,119.335 C102.968,119.76 103.009,120.187 103.042,120.614 C103.103,121.469 103.116,122.325 103.089,123.178 C103.072,123.606 103.049,124.032 103.013,124.457 C102.978,124.878 102.932,125.313 102.867,125.711 C102.771,126.119 102.65,126.544 102.545,126.957 C102.444,127.374 102.333,127.784 102.222,128.187 C102.112,128.591 101.985,128.991 101.868,129.393 C101.806,129.594 101.741,129.814 101.686,130.005 C101.633,130.184 101.561,130.368 101.479,130.55 C101.317,130.917 101.117,131.28 100.898,131.632 C100.679,131.983 100.446,132.33 100.201,132.668 C99.947,133.003 99.667,133.321 99.373,133.62 C99.079,133.92 98.761,134.195 98.415,134.425 C98.068,134.65 97.688,134.831 97.289,134.893 C97.09,134.924 96.889,134.923 96.696,134.884 C96.53,134.854 96.36,134.776 96.239,134.685 C96.509,134.504 96.74,134.293 96.937,134.083 C97.159,133.837 97.344,133.591 97.498,133.352 C97.607,133.246 97.717,133.138 97.824,133.028 C97.975,132.877 98.121,132.72 98.264,132.561 C98.409,132.403 98.547,132.239 98.681,132.071 C98.952,131.738 99.196,131.382 99.418,131.009 C99.636,130.636 99.849,130.258 100.022,129.858 C100.11,129.658 100.191,129.456 100.267,129.251 C100.345,129.047 100.404,128.836 100.462,128.626 C100.577,128.204 100.647,127.768 100.674,127.332 C100.682,127.114 100.685,126.896 100.667,126.679 C100.651,126.463 100.617,126.247 100.568,126.039 C100.563,126.019 100.547,126.003 100.526,126.001 C100.499,125.998 100.475,126.017 100.472,126.044 C100.448,126.256 100.415,126.46 100.377,126.664 C100.336,126.867 100.294,127.067 100.237,127.264 C100.183,127.461 100.125,127.655 100.056,127.846 C99.985,128.037 99.917,128.227 99.837,128.413 C99.76,128.6 99.67,128.782 99.585,128.966 C99.498,129.148 99.405,129.328 99.307,129.507 C99.109,129.86 98.91,130.215 98.685,130.554 L98.011,131.582 L97.322,132.617 C97.088,132.962 96.849,133.307 96.597,133.643 C96.488,133.792 96.374,133.937 96.261,134.085 C96.04,134.249 95.795,134.395 95.524,134.506 C95.307,134.593 95.077,134.651 94.815,134.709 C94.564,134.768 94.303,134.824 94.039,134.87 C93.777,134.921 93.508,134.954 93.243,134.972 C93.11,134.978 92.978,134.979 92.853,134.964 C92.73,134.951 92.61,134.922 92.535,134.872 C92.462,134.823 92.434,134.772 92.445,134.666 C92.458,134.561 92.518,134.44 92.595,134.333 C92.751,134.11 92.968,133.924 93.203,133.751 C93.676,133.392 94.149,133.034 94.614,132.68 C95.079,132.324 95.525,131.941 95.895,131.511 C96.267,131.085 96.591,130.637 96.855,130.188 C97.119,129.735 97.313,129.278 97.46,128.848 C97.602,128.415 97.696,128.009 97.757,127.647 C97.818,127.285 97.841,126.966 97.854,126.704 C97.86,126.441 97.857,126.236 97.851,126.096 C97.843,125.957 97.838,125.882 97.838,125.882 C97.837,125.87 97.829,125.859 97.816,125.855 C97.801,125.851 97.784,125.861 97.78,125.877 L97.78,125.878 C97.78,125.878 97.762,125.95 97.728,126.085 C97.701,126.219 97.648,126.417 97.583,126.664 C97.516,126.911 97.438,127.209 97.326,127.543 C97.218,127.878 97.087,128.25 96.917,128.643 C96.754,129.039 96.55,129.455 96.318,129.884 C96.086,130.313 95.813,130.755 95.491,131.186 C95.167,131.614 94.826,132.06 94.431,132.478 C94.303,132.615 94.166,132.744 94.025,132.871 C93.974,132.907 93.92,132.945 93.858,132.987 C93.673,133.113 93.446,133.26 93.175,133.413 C92.905,133.562 92.593,133.72 92.243,133.855 C91.892,133.989 91.501,134.103 91.083,134.147 C90.667,134.19 90.224,134.159 89.814,134.005 C89.611,133.927 89.416,133.821 89.252,133.681 C89.17,133.612 89.094,133.537 89.034,133.456 C88.977,133.382 88.932,133.293 88.921,133.238 C88.928,133.231 88.934,133.225 88.944,133.217 C88.965,133.199 88.981,133.181 89.005,133.164 C89.091,133.092 89.186,133.012 89.284,132.938 C89.484,132.791 89.681,132.632 89.882,132.473 C90.275,132.149 90.684,131.836 91.058,131.489 C91.245,131.312 91.429,131.138 91.611,130.966 C91.795,130.794 91.984,130.64 92.169,130.467 C92.465,130.073 92.75,129.691 93.021,129.329 C93.287,128.966 93.495,128.591 93.652,128.228 C93.728,128.045 93.799,127.87 93.858,127.699 C93.913,127.527 93.964,127.363 94.004,127.207 C94.082,126.893 94.124,126.613 94.142,126.383 C94.16,126.152 94.155,125.967 94.147,125.843 C94.134,125.721 94.127,125.657 94.127,125.657 C94.125,125.645 94.118,125.634 94.105,125.632 C94.09,125.627 94.073,125.635 94.069,125.652 C94.069,125.652 94.052,125.716 94.019,125.834 C93.985,125.949 93.938,126.118 93.867,126.328 C93.798,126.538 93.708,126.79 93.593,127.073 C93.481,127.357 93.341,127.674 93.18,128.014 C93.018,128.354 92.847,128.726 92.672,129.13 C92.583,129.329 92.492,129.538 92.387,129.743 C92.336,129.848 92.279,129.95 92.221,130.055 C92.162,130.153 92.107,130.286 92.042,130.341 C92.034,130.349 92.025,130.357 92.016,130.365 C91.917,130.425 91.771,130.512 91.584,130.621 C91.21,130.836 90.667,131.138 89.986,131.409 C89.645,131.54 89.267,131.665 88.869,131.722 C88.674,131.75 88.463,131.758 88.303,131.712 C88.265,131.7 88.229,131.686 88.211,131.671 C88.203,131.666 88.198,131.66 88.194,131.656 C88.172,131.544 88.148,131.43 88.125,131.316 C88.076,131.097 88.05,130.885 88.054,130.696 C88.059,130.508 88.114,130.337 88.184,130.226 C88.188,130.218 88.224,130.163 88.222,130.17 C88.23,130.165 88.227,130.164 88.241,130.152 C88.261,130.131 88.296,130.101 88.333,130.072 C88.41,130.009 88.502,129.945 88.596,129.876 C88.787,129.739 88.993,129.6 89.198,129.457 C89.404,129.315 89.608,129.165 89.803,128.997 L89.946,128.867 L90.09,128.731 C90.23,128.601 90.283,128.47 90.337,128.346 C90.387,128.22 90.428,128.098 90.461,127.976 C90.497,127.856 90.529,127.737 90.557,127.618 C90.622,127.383 90.673,127.149 90.739,126.924 C90.864,126.47 91.029,126.04 91.156,125.624 C91.287,125.21 91.361,124.809 91.402,124.437 C91.446,124.065 91.473,123.723 91.486,123.42 C91.488,123.38 91.489,123.342 91.49,123.303 C91.539,123.134 91.59,122.962 91.646,122.78 C91.73,122.505 91.819,122.216 91.911,121.915 C91.958,121.774 92.002,121.576 92.042,121.387 L92.058,121.315 L92.065,121.255 L92.08,121.133 L92.085,121.071 L92.089,121.041 L92.09,121.034 L92.09,120.966 L92.085,120.834 C92.074,120.486 92.043,120.157 92.023,119.826 C91.973,119.168 91.937,118.52 91.937,117.915 C91.936,117.764 91.938,117.616 91.945,117.471 C91.949,117.326 91.955,117.184 91.968,117.048 C91.985,116.773 92.023,116.518 92.063,116.28 C92.085,116.163 92.111,116.051 92.131,115.942 C92.161,115.837 92.19,115.736 92.217,115.642 C92.222,115.62 92.23,115.602 92.236,115.582 C92.269,115.588 92.302,115.575 92.319,115.545 C92.319,115.545 92.342,115.504 92.387,115.426 C92.429,115.343 92.493,115.22 92.555,115.05 C92.685,114.709 92.774,114.152 92.713,113.483 C92.667,112.813 92.517,112.029 92.317,111.147 C92.117,110.265 91.857,109.287 91.559,108.225 C91.409,107.689 91.254,107.153 91.075,106.565 C90.984,106.283 90.891,105.995 90.796,105.703 C90.693,105.409 90.588,105.107 90.477,104.804 C90.032,103.602 89.499,102.377 88.908,101.128 C88.316,99.881 87.672,98.612 87.059,97.303 C86.437,96 85.87,94.648 85.384,93.268 C84.899,91.888 84.484,90.483 84.205,89.076 C84.125,88.726 84.063,88.374 84.009,88.024 C83.98,87.849 83.952,87.675 83.923,87.502 L83.901,87.372 L83.884,87.233 L83.85,86.967 C83.81,86.618 83.755,86.26 83.697,85.904 C83.671,85.725 83.636,85.55 83.604,85.376 C83.571,85.202 83.541,85.026 83.499,84.855 C83.203,83.474 82.726,82.176 82.223,80.989 C81.972,80.397 81.705,79.833 81.48,79.308 C81.426,79.18 81.373,79.051 81.32,78.925 L81.246,78.743 L81.169,78.541 C81.07,78.273 80.96,78.012 80.861,77.758 C80.451,76.754 80.05,75.836 79.715,75.028 C79.375,74.22 79.117,73.516 78.95,72.93 C78.866,72.637 78.813,72.373 78.778,72.137 C78.871,71.889 78.963,71.638 79.057,71.391 C79.428,70.41 79.793,69.443 80.134,68.486 C80.469,67.528 80.781,66.581 81.042,65.643 C81.303,64.705 81.527,63.782 81.685,62.875 C81.837,61.969 81.945,61.086 81.998,60.235 C82.107,58.532 81.989,56.969 81.807,55.605 C81.783,55.434 81.76,55.267 81.736,55.102 C81.707,54.938 81.678,54.778 81.649,54.619 C81.589,54.303 81.542,53.998 81.473,53.709 C81.408,53.419 81.346,53.141 81.286,52.876 C81.221,52.611 81.15,52.362 81.087,52.124 C80.966,51.648 80.829,51.228 80.719,50.863 C80.611,50.497 80.501,50.192 80.414,49.945 C80.24,49.45 80.148,49.186 80.148,49.186 C80.138,49.158 80.108,49.141 80.078,49.149 C80.047,49.157 80.028,49.189 80.037,49.219 C80.037,49.219 80.107,49.491 80.24,49.999 C80.307,50.252 80.389,50.565 80.47,50.934 C80.554,51.303 80.66,51.723 80.747,52.204 C80.947,53.157 81.135,54.325 81.253,55.667 C81.375,57.01 81.4,58.533 81.243,60.175 C81.164,60.996 81.03,61.844 80.854,62.716 C80.666,63.586 80.439,64.477 80.162,65.384 C79.887,66.292 79.56,67.214 79.208,68.151 C78.862,69.093 78.488,70.049 78.107,71.026 C77.343,72.979 76.57,75.021 75.941,77.154 C75.782,77.685 75.642,78.226 75.498,78.766 C75.431,79.038 75.364,79.31 75.296,79.583 L75.271,79.684 L75.258,79.735 L75.25,79.774 L75.245,79.8 L75.209,80.005 C75.187,80.144 75.169,80.298 75.15,80.443 C75.021,81.574 74.981,82.691 74.917,83.813 C74.803,86.051 74.604,88.279 74.336,90.467 C74.068,92.653 73.758,94.803 73.573,96.895 C73.388,98.99 73.204,101.003 73.143,102.955 C73.14,103.208 73.131,103.432 73.15,103.731 L73.158,103.844 C73.158,103.849 73.167,103.903 73.164,103.891 L73.168,103.913 L73.176,103.956 L73.206,104.13 C73.224,104.243 73.251,104.368 73.276,104.488 C73.302,104.609 73.328,104.73 73.353,104.849 C73.381,104.964 73.408,105.078 73.436,105.191 C73.491,105.416 73.546,105.638 73.601,105.86 C73.825,106.74 74.037,107.589 74.264,108.398 C74.488,109.208 74.701,109.983 74.914,110.719 C75.129,111.453 75.333,112.149 75.526,112.804 C75.727,113.457 75.914,114.067 76.088,114.632 C76.268,115.194 76.433,115.711 76.582,116.177 C76.898,117.106 77.146,117.837 77.315,118.334 C77.403,118.581 77.475,118.771 77.523,118.898 C77.572,119.026 77.596,119.091 77.596,119.091 C77.596,119.092 77.598,119.092 77.598,119.092 C77.598,119.093 77.597,119.094 77.598,119.094 L78.015,120.377 L78.414,121.66 L78.795,122.949 L79.157,124.244 C79.283,124.673 79.391,125.108 79.509,125.54 C79.627,125.971 79.739,126.405 79.846,126.841 C80.07,127.707 80.28,128.577 80.489,129.447 L80.787,130.757 C80.891,131.192 80.987,131.628 81.081,132.065 L81.363,133.378 L81.627,134.694 C81.809,135.57 81.972,136.449 82.137,137.328 C82.291,138.209 82.45,139.089 82.59,139.971 L82.81,141.295 L83.01,142.62 C83.158,143.503 83.266,144.389 83.398,145.274 C83.511,146.16 83.637,147.049 83.739,147.933 L84.061,150.61 C84.168,151.502 84.243,152.392 84.336,153.284 C84.435,154.175 84.472,155.071 84.535,155.966 C84.566,156.413 84.579,156.86 84.59,157.307 C84.6,157.756 84.621,158.203 84.621,158.65 C84.613,159.096 84.617,159.546 84.599,159.991 L84.568,160.658 C84.549,160.876 84.538,161.106 84.507,161.31 C84.505,161.324 84.505,161.338 84.505,161.35 L84.505,161.352 C84.574,162.658 84.637,163.964 84.677,165.271 L84.735,167.229 C84.741,167.553 84.75,167.883 84.748,168.202 C84.75,168.497 84.709,168.836 84.713,169.184 C84.713,169.864 84.783,170.531 84.865,171.187 C84.948,171.843 85.045,172.491 85.141,173.136 C85.329,174.425 85.497,175.708 85.597,176.997 C85.701,178.284 85.746,179.575 85.729,180.866 C85.722,181.515 85.697,182.149 85.665,182.81 L85.587,184.77 C85.548,186.079 85.526,187.405 85.536,188.714 C85.544,190.026 85.544,191.337 85.586,192.645 C85.615,193.955 85.655,195.262 85.697,196.571 L85.853,200.495 L86.036,204.414 L86.136,206.374 C86.165,207.02 86.172,207.678 86.188,208.33 C86.2,208.983 86.228,209.641 86.25,210.296 L86.356,212.261 L86.499,214.223 C86.552,214.877 86.625,215.528 86.686,216.18 L86.782,217.158 L86.898,218.133 L87.132,220.085 C87.301,221.383 87.497,222.677 87.683,223.972 C87.688,224.003 87.715,224.025 87.746,224.022 C87.778,224.019 87.801,223.991 87.798,223.959 L87.798,223.958 L87.427,220.053 L87.362,219.236 C87.462,219.331 87.599,219.433 87.768,219.538 C87.987,219.675 88.263,219.806 88.587,219.923 C88.749,219.98 88.924,220.036 89.11,220.08 C89.297,220.122 89.499,220.14 89.712,220.146 C90.143,220.149 90.606,220.112 91.075,220.231 C91.565,220.338 92.145,220.258 92.457,220.507 C92.616,220.624 92.746,220.791 92.869,220.987 C92.996,221.18 93.113,221.399 93.223,221.63 C93.277,221.746 93.328,221.864 93.38,221.984 L93.457,222.166 L93.489,222.244 C93.5,222.274 93.518,222.314 93.52,222.328 C93.577,222.497 93.613,222.746 93.625,222.983 C93.646,223.469 93.592,223.991 93.508,224.499 C93.422,225.008 93.303,225.51 93.167,225.993 C93.029,226.473 92.869,226.932 92.703,227.362 C92.532,227.79 92.354,228.188 92.168,228.545 C91.98,228.898 91.794,229.216 91.604,229.478 C91.417,229.743 91.229,229.956 91.06,230.113 C90.892,230.273 90.739,230.375 90.631,230.437 C90.576,230.469 90.533,230.491 90.504,230.504 C90.5,230.507 90.498,230.508 90.494,230.508 C90.485,230.506 90.475,230.504 90.465,230.505 C90.465,230.505 88.46,230.666 84.95,230.949 C84.073,231.017 83.102,231.091 82.045,231.149 C80.989,231.206 79.843,231.258 78.633,231.214 C78.032,231.186 77.404,231.139 76.813,230.977 C76.521,230.895 76.235,230.776 76.042,230.596 L76.023,230.58 C76.018,230.575 76.016,230.573 76.006,230.561 L75.963,230.516 L75.877,230.424 C75.818,230.362 75.766,230.3 75.713,230.239 C75.608,230.119 75.503,229.989 75.404,229.858 C75.009,229.332 74.678,228.746 74.519,228.105 C74.356,227.465 74.383,226.782 74.536,226.093 C74.847,224.708 75.623,223.331 76.239,221.796 C76.552,221.029 76.842,220.222 77.052,219.371 C77.264,218.52 77.386,217.625 77.395,216.713 C77.396,216.484 77.391,216.256 77.38,216.027 L77.357,215.683 L77.332,215.356 C77.297,214.921 77.262,214.48 77.227,214.039 C77.156,213.156 77.083,212.26 77.011,211.358 C76.938,210.454 76.864,209.54 76.79,208.617 C76.706,207.693 76.633,206.764 76.526,205.811 C76.473,205.336 76.408,204.853 76.322,204.377 L76.258,204.008 L76.187,203.658 C76.143,203.428 76.074,203.175 76.018,202.934 C75.772,201.981 75.457,201.058 75.138,200.137 C74.491,198.3 73.827,196.459 73.23,194.575 C72.929,193.635 72.644,192.688 72.375,191.727 C72.093,190.768 71.811,189.807 71.529,188.843 C70.954,186.921 70.366,184.995 69.846,183.056 C69.344,181.114 68.936,179.158 68.734,177.186 C68.692,176.692 68.63,176.202 68.607,175.707 C68.577,175.214 68.536,174.722 68.524,174.228 C68.503,173.735 68.485,173.244 68.479,172.752 L68.465,172.013 L68.461,171.83 L68.453,171.626 C68.447,171.501 68.444,171.382 68.436,171.252 C68.389,170.706 68.319,170.199 68.216,169.699 C68.119,169.196 67.996,168.706 67.868,168.219 C67.604,167.249 67.295,166.307 66.971,165.382 C66.313,163.533 65.604,161.743 64.895,159.993 C63.467,156.5 62.052,153.158 60.971,149.912 C60.699,149.101 60.443,148.299 60.222,147.501 C59.999,146.705 59.793,145.891 59.588,145.112 C59.178,143.544 58.797,142.02 58.449,140.556 C57.745,137.628 57.151,134.932 56.673,132.533 C56.558,131.932 56.446,131.351 56.338,130.791 C56.238,130.228 56.142,129.686 56.048,129.165 C55.87,128.122 55.707,127.163 55.588,126.294 C55.456,125.425 55.373,124.645 55.291,123.968 C55.226,123.29 55.17,122.712 55.126,122.244 C55.104,121.899 55.088,121.615 55.075,121.391 C55.317,122.167 55.663,122.933 56.153,123.629 C56.42,124.005 56.727,124.361 57.073,124.676 C57.418,124.993 57.803,125.266 58.208,125.5 C59.019,125.966 59.91,126.25 60.796,126.405 C61.684,126.564 62.572,126.592 63.436,126.547 C64.301,126.504 65.146,126.393 65.966,126.25 C66.376,126.177 66.782,126.096 67.181,126.011 L67.478,125.944 L67.639,125.906 L67.783,125.87 C67.979,125.816 68.162,125.777 68.366,125.715 C69.178,125.482 69.932,125.196 70.654,124.822 C71.372,124.451 72.038,123.995 72.6,123.453 C73.167,122.915 73.631,122.299 73.975,121.655 C74.325,121.012 74.559,120.347 74.707,119.702 C75.007,118.407 75.017,117.203 74.941,116.161 C74.868,115.118 74.712,114.223 74.555,113.499 C74.401,112.77 74.248,112.209 74.141,111.828 C74.029,111.447 73.969,111.244 73.969,111.244 C73.969,111.244 73.999,111.454 74.054,111.845 C74.109,112.237 74.183,112.813 74.255,113.544 C74.321,114.275 74.384,115.165 74.363,116.176 C74.331,117.183 74.243,118.325 73.88,119.477 C73.697,120.05 73.453,120.624 73.123,121.165 C72.794,121.707 72.37,122.209 71.861,122.642 C71.352,123.075 70.768,123.452 70.124,123.759 C69.484,124.066 68.769,124.309 68.055,124.489 C66.555,124.837 64.961,125.145 63.377,125.207 C62.98,125.222 62.584,125.221 62.19,125.2 C61.797,125.183 61.405,125.147 61.021,125.083 C60.253,124.958 59.512,124.725 58.854,124.358 C58.197,123.991 57.63,123.488 57.171,122.888 C56.713,122.285 56.374,121.582 56.132,120.842 C55.895,120.099 55.729,119.326 55.633,118.546 C55.582,118.155 55.554,117.762 55.529,117.379 C55.521,117.182 55.511,116.973 55.506,116.785 C55.503,116.587 55.5,116.387 55.497,116.189 C55.465,114.607 55.417,113.08 55.399,111.635 C55.391,110.194 55.386,108.83 55.56,107.608 C55.648,106.999 55.79,106.427 56.006,105.92 C56.221,105.411 56.505,104.966 56.834,104.592 C57.162,104.217 57.525,103.911 57.873,103.645 C58.222,103.378 58.564,103.159 58.873,102.96 C59.496,102.569 60.008,102.297 60.352,102.104 C60.7,101.916 60.885,101.815 60.885,101.815 C60.885,101.815 60.692,101.899 60.33,102.057 C59.97,102.222 59.438,102.458 58.783,102.803 C58.455,102.979 58.096,103.178 57.721,103.43 C57.346,103.679 56.949,103.972 56.574,104.349 C56.2,104.723 55.853,105.188 55.592,105.73 C55.328,106.271 55.144,106.878 55.017,107.513 C54.98,107.697 54.949,107.883 54.92,108.072 C54.892,107.886 54.86,107.703 54.825,107.522 C54.697,106.886 54.513,106.279 54.25,105.739 C53.989,105.197 53.642,104.733 53.267,104.357 C52.893,103.981 52.495,103.688 52.12,103.438 C51.746,103.187 51.385,102.988 51.059,102.812 C50.402,102.467 49.871,102.231 49.512,102.066 C49.149,101.908 48.956,101.823 48.956,101.823 C48.956,101.823 49.141,101.924 49.489,102.112 C49.834,102.305 50.346,102.578 50.969,102.968 C51.277,103.168 51.62,103.385 51.967,103.654 C52.316,103.919 52.679,104.225 53.007,104.6 C53.337,104.974 53.621,105.42 53.835,105.928 C54.051,106.436 54.192,107.008 54.281,107.617 C54.456,108.839 54.451,110.203 54.442,111.644 C54.425,113.089 54.376,114.616 54.344,116.198 C54.342,116.396 54.338,116.594 54.335,116.794 C54.331,116.982 54.32,117.191 54.313,117.387 C54.288,117.77 54.259,118.165 54.208,118.553 C54.112,119.334 53.946,120.108 53.71,120.85 C53.467,121.591 53.128,122.294 52.67,122.897 C52.211,123.497 51.645,123.999 50.987,124.366 C50.33,124.734 49.588,124.967 48.82,125.092 C48.437,125.156 48.045,125.192 47.651,125.209 C47.258,125.23 46.861,125.231 46.464,125.216 C44.88,125.154 43.287,124.845 41.787,124.499 C41.072,124.319 40.357,124.075 39.717,123.768 C39.074,123.46 38.49,123.084 37.98,122.651 C37.471,122.217 37.047,121.716 36.719,121.174 C36.39,120.632 36.145,120.059 35.962,119.486 C35.598,118.334 35.51,117.192 35.479,116.185 C35.457,115.174 35.521,114.284 35.586,113.553 C35.66,112.821 35.732,112.247 35.787,111.854 C35.844,111.463 35.873,111.253 35.873,111.253 C35.873,111.253 35.813,111.456 35.701,111.837 C35.594,112.217 35.44,112.78 35.287,113.508 C35.13,114.233 34.974,115.126 34.901,116.171 C34.824,117.212 34.834,118.416 35.134,119.711 C35.283,120.356 35.517,121.021 35.866,121.664 C36.21,122.308 36.675,122.923 37.241,123.462 C37.804,124.005 38.471,124.46 39.188,124.831 C39.909,125.204 40.664,125.491 41.476,125.722 C41.68,125.786 41.862,125.826 42.059,125.878 L42.203,125.916 L42.364,125.953 L42.661,126.019 C43.061,126.105 43.465,126.185 43.875,126.258 C44.696,126.401 45.54,126.513 46.405,126.555 C47.27,126.601 48.158,126.574 49.046,126.414 C49.932,126.258 50.823,125.974 51.634,125.508 C52.038,125.275 52.423,125.003 52.769,124.686 C53.114,124.37 53.421,124.014 53.688,123.637 C54.178,122.942 54.523,122.175 54.767,121.401 C54.754,121.624 54.736,121.908 54.716,122.251 C54.67,122.719 54.616,123.298 54.551,123.976 C54.469,124.654 54.386,125.432 54.253,126.301 C54.134,127.171 53.973,128.13 53.793,129.173 C53.7,129.694 53.604,130.236 53.503,130.799 C53.396,131.359 53.283,131.94 53.168,132.541 C52.69,134.94 52.096,137.636 51.393,140.564 C51.043,142.028 50.664,143.551 50.253,145.12 C50.048,145.899 49.842,146.713 49.62,147.508 C49.399,148.306 49.141,149.109 48.871,149.92 C47.79,153.166 46.374,156.508 44.947,160.001 C44.237,161.751 43.528,163.54 42.871,165.389 C42.546,166.316 42.236,167.257 41.974,168.227 C41.846,168.714 41.722,169.203 41.626,169.706 C41.521,170.207 41.452,170.715 41.405,171.259 C41.396,171.388 41.394,171.508 41.388,171.633 L41.38,171.838 L41.376,172.022 L41.362,172.759 C41.356,173.252 41.338,173.744 41.317,174.236 C41.305,174.73 41.264,175.221 41.234,175.716 C41.211,176.21 41.149,176.7 41.107,177.194 C40.905,179.165 40.498,181.122 39.996,183.064 C39.476,185.003 38.887,186.928 38.313,188.852 C38.03,189.815 37.748,190.776 37.467,191.735 C37.198,192.696 36.913,193.643 36.611,194.584 C36.015,196.467 35.35,198.307 34.704,200.145 C34.385,201.067 34.07,201.989 33.823,202.942 C33.768,203.183 33.698,203.436 33.655,203.665 L33.583,204.016 L33.52,204.384 C33.434,204.862 33.368,205.343 33.314,205.819 C33.208,206.772 33.136,207.702 33.052,208.626 C32.977,209.548 32.903,210.461 32.831,211.365 C32.758,212.268 32.686,213.163 32.615,214.046 C32.579,214.489 32.544,214.928 32.509,215.364 L32.483,215.691 L32.461,216.035 C32.451,216.263 32.446,216.492 32.447,216.72 C32.455,217.633 32.577,218.528 32.79,219.379 C32.999,220.23 33.289,221.037 33.602,221.804 C34.218,223.34 34.994,224.717 35.306,226.101 C35.458,226.79 35.485,227.472 35.322,228.113 C35.164,228.755 34.833,229.341 34.437,229.866 C34.338,229.997 34.234,230.128 34.128,230.247 C34.075,230.308 34.024,230.37 33.964,230.431 L33.878,230.524 L33.835,230.57 C33.826,230.58 33.824,230.583 33.818,230.588 L33.8,230.604 C33.606,230.784 33.32,230.903 33.028,230.985 C32.437,231.146 31.81,231.194 31.208,231.221 C29.999,231.266 28.853,231.214 27.797,231.157 C26.739,231.098 25.769,231.026 24.891,230.957 C21.382,230.675 19.376,230.512 19.376,230.512 C19.368,230.511 19.361,230.517 19.354,230.519 C19.348,230.517 19.344,230.515 19.338,230.512 C19.308,230.499 19.265,230.477 19.21,230.446 C19.103,230.383 18.95,230.281 18.782,230.121 C18.612,229.964 18.425,229.75 18.238,229.486 C18.047,229.224 17.861,228.906 17.673,228.552 C17.488,228.196 17.309,227.798 17.138,227.37 C16.973,226.94 16.813,226.481 16.674,226.001 C16.539,225.518 16.419,225.016 16.333,224.507 C16.25,223.999 16.195,223.477 16.217,222.991 C16.228,222.754 16.265,222.505 16.321,222.336 C16.323,222.322 16.341,222.282 16.353,222.252 L16.384,222.174 L16.461,221.992 C16.514,221.873 16.564,221.754 16.619,221.637 C16.729,221.407 16.846,221.188 16.973,220.995 C17.096,220.799 17.226,220.632 17.385,220.514 C17.696,220.266 18.276,220.344 18.767,220.24 C19.235,220.121 19.699,220.158 20.129,220.154 C20.342,220.148 20.544,220.13 20.731,220.087 C20.918,220.044 21.092,219.989 21.254,219.93 C21.579,219.814 21.855,219.682 22.074,219.546 C22.242,219.441 22.379,219.339 22.479,219.244 L22.415,220.06 L22.043,223.966 L22.043,223.967 C22.04,223.997 22.062,224.025 22.093,224.03 C22.125,224.034 22.154,224.012 22.159,223.981 C22.344,222.684 22.541,221.39 22.709,220.092 L22.943,218.141 L23.059,217.166 L23.155,216.188 C23.217,215.536 23.289,214.885 23.342,214.231 L23.485,212.269 L23.591,210.304 C23.613,209.649 23.642,208.991 23.654,208.338 C23.669,207.686 23.676,207.028 23.706,206.382 L23.805,204.422 L23.988,200.503 L24.144,196.579 C24.186,195.271 24.227,193.964 24.255,192.653 C24.297,191.344 24.298,190.034 24.306,188.722 C24.314,187.414 24.294,186.087 24.254,184.778 L24.177,182.819 C24.144,182.156 24.119,181.523 24.112,180.874 C24.096,179.582 24.141,178.292 24.244,177.005 C24.345,175.717 24.513,174.434 24.7,173.144 C24.796,172.5 24.894,171.852 24.976,171.195 C25.058,170.54 25.128,169.872 25.127,169.192 C25.132,168.843 25.092,168.506 25.094,168.21 C25.091,167.889 25.1,167.562 25.106,167.237 L25.165,165.279 C25.204,163.971 25.268,162.666 25.336,161.36 L25.336,161.358 C25.336,161.345 25.336,161.332 25.334,161.319 C25.303,161.114 25.293,160.883 25.272,160.666 L25.242,159.999 C25.224,159.553 25.229,159.104 25.22,158.658 C25.221,158.212 25.241,157.763 25.251,157.316 C25.262,156.868 25.275,156.42 25.306,155.972 C25.37,155.079 25.406,154.182 25.505,153.292 C25.599,152.4 25.673,151.509 25.78,150.618 L26.103,147.942 C26.204,147.055 26.331,146.169 26.443,145.282 C26.575,144.397 26.684,143.51 26.832,142.628 L27.031,141.302 L27.251,139.98 C27.391,139.096 27.551,138.217 27.704,137.336 C27.87,136.458 28.033,135.578 28.214,134.701 L28.478,133.385 L28.761,132.074 C28.854,131.635 28.951,131.2 29.055,130.764 L29.353,129.455 C29.561,128.585 29.771,127.715 29.996,126.848 C30.103,126.414 30.214,125.979 30.332,125.548 C30.45,125.116 30.558,124.68 30.684,124.252 L31.046,122.957 L31.427,121.668 L31.826,120.384 L32.244,119.102 L32.244,119.1 C32.244,119.1 32.245,119.099 32.246,119.098 C32.246,119.098 32.271,119.033 32.318,118.906 C32.367,118.779 32.438,118.589 32.526,118.342 C32.695,117.843 32.943,117.114 33.259,116.185 C33.409,115.718 33.574,115.202 33.754,114.639 C33.927,114.074 34.114,113.464 34.315,112.812 C34.508,112.158 34.712,111.462 34.928,110.727 C35.14,109.992 35.353,109.216 35.578,108.406 C35.804,107.596 36.017,106.749 36.24,105.868 C36.294,105.647 36.35,105.424 36.405,105.199 C36.432,105.086 36.46,104.972 36.488,104.857 C36.513,104.738 36.539,104.617 36.565,104.496 C36.591,104.376 36.618,104.251 36.635,104.137 L36.666,103.964 L36.673,103.921 L36.677,103.899 C36.675,103.911 36.684,103.857 36.683,103.852 L36.692,103.738 C36.709,103.44 36.702,103.216 36.698,102.963 C36.638,101.01 36.453,98.999 36.269,96.904 C36.083,94.812 35.773,92.662 35.505,90.473 C35.237,88.287 35.038,86.059 34.925,83.82 C34.86,82.699 34.82,81.583 34.691,80.451 C34.672,80.305 34.654,80.152 34.632,80.012 L34.596,79.807 L34.592,79.782 L34.583,79.744 L34.57,79.692 L34.545,79.591 C34.479,79.318 34.411,79.046 34.344,78.774 C34.199,78.233 34.06,77.693 33.9,77.162 C33.271,75.029 32.499,72.987 31.733,71.035 C31.354,70.057 30.979,69.1 30.633,68.16 C30.282,67.22 29.955,66.299 29.68,65.391 C29.402,64.485 29.175,63.593 28.988,62.723 C28.811,61.852 28.677,61.004 28.598,60.183 C28.441,58.541 28.466,57.018 28.588,55.677 C28.706,54.332 28.895,53.165 29.094,52.213 C29.181,51.732 29.288,51.312 29.372,50.942 C29.452,50.573 29.534,50.26 29.602,50.007 C29.734,49.499 29.805,49.228 29.805,49.228 C29.812,49.199 29.797,49.169 29.768,49.159 C29.737,49.147 29.704,49.164 29.693,49.194 C29.693,49.194 29.601,49.458 29.427,49.953 C29.34,50.2 29.231,50.505 29.122,50.871 C29.012,51.236 28.875,51.656 28.754,52.132 C28.691,52.37 28.621,52.62 28.555,52.884 C28.496,53.149 28.434,53.427 28.369,53.717 C28.299,54.005 28.252,54.311 28.192,54.628 C28.163,54.786 28.135,54.946 28.105,55.11 C28.082,55.275 28.059,55.442 28.034,55.612 C27.852,56.976 27.734,58.54 27.844,60.243 C27.896,61.094 28.004,61.976 28.156,62.884 C28.314,63.79 28.539,64.713 28.799,65.651 C29.06,66.589 29.372,67.536 29.707,68.494 C30.048,69.452 30.414,70.419 30.784,71.399 C30.877,71.645 30.97,71.896 31.063,72.146 C31.028,72.381 30.975,72.646 30.891,72.938 C30.725,73.525 30.466,74.227 30.126,75.036 C29.791,75.843 29.391,76.761 28.98,77.765 C28.881,78.02 28.771,78.281 28.671,78.55 L28.596,78.751 L28.521,78.933 C28.469,79.059 28.416,79.188 28.361,79.316 C28.137,79.841 27.87,80.405 27.618,80.998 C27.116,82.184 26.639,83.482 26.342,84.863 C26.3,85.034 26.27,85.21 26.237,85.383 C26.206,85.558 26.171,85.733 26.145,85.913 C26.087,86.268 26.031,86.626 25.992,86.976 L25.958,87.241 L25.939,87.38 L25.918,87.508 C25.89,87.683 25.861,87.857 25.833,88.032 C25.777,88.383 25.717,88.734 25.637,89.084 C25.357,90.49 24.943,91.896 24.457,93.276 C23.971,94.656 23.404,96.008 22.783,97.312 C22.17,98.62 21.525,99.888 20.933,101.135 C20.342,102.384 19.809,103.61 19.364,104.813 C19.253,105.115 19.148,105.418 19.045,105.712 C18.95,106.003 18.857,106.291 18.766,106.573 C18.587,107.161 18.433,107.697 18.283,108.232 C17.984,109.295 17.725,110.274 17.524,111.156 C17.324,112.037 17.174,112.821 17.128,113.492 C17.067,114.159 17.156,114.717 17.286,115.057 C17.349,115.228 17.413,115.351 17.455,115.434 C17.5,115.512 17.522,115.552 17.522,115.552 C17.536,115.576 17.562,115.587 17.589,115.588 C17.594,115.606 17.601,115.624 17.605,115.642 C17.632,115.736 17.661,115.837 17.69,115.942 C17.709,116.051 17.734,116.164 17.757,116.28 C17.794,116.518 17.831,116.773 17.845,117.049 C17.857,117.184 17.862,117.327 17.865,117.471 C17.871,117.615 17.871,117.764 17.869,117.915 C17.864,118.519 17.822,119.167 17.766,119.825 C17.743,120.156 17.71,120.485 17.698,120.834 L17.693,120.967 L17.692,120.984 L17.693,121.031 L17.694,121.036 L17.694,121.044 L17.698,121.073 L17.704,121.135 L17.718,121.257 L17.726,121.317 L17.741,121.389 C17.782,121.579 17.826,121.776 17.872,121.917 C17.964,122.217 18.053,122.506 18.138,122.78 C18.193,122.963 18.245,123.135 18.292,123.303 C18.294,123.342 18.295,123.38 18.297,123.42 C18.311,123.723 18.337,124.065 18.382,124.437 C18.423,124.809 18.496,125.21 18.626,125.624 C18.755,126.04 18.919,126.47 19.044,126.924 C19.11,127.149 19.161,127.383 19.227,127.618 C19.254,127.737 19.287,127.856 19.323,127.976 C19.355,128.098 19.396,128.22 19.446,128.346 C19.5,128.47 19.553,128.601 19.693,128.731 L19.837,128.867 L19.98,128.997 C20.175,129.165 20.379,129.315 20.585,129.457 C20.79,129.6 20.997,129.739 21.187,129.876 C21.28,129.945 21.372,130.009 21.451,130.072 C21.486,130.101 21.521,130.131 21.542,130.152 C21.557,130.164 21.553,130.165 21.562,130.17 C21.56,130.163 21.595,130.218 21.599,130.226 C21.669,130.337 21.725,130.508 21.73,130.696 C21.733,130.885 21.707,131.097 21.658,131.316 C21.635,131.43 21.611,131.544 21.589,131.656 C21.585,131.66 21.581,131.666 21.572,131.671 C21.554,131.686 21.519,131.7 21.481,131.712 C21.32,131.758 21.109,131.75 20.914,131.722 C20.517,131.665 20.138,131.54 19.797,131.409 C19.117,131.138 18.574,130.836 18.199,130.621 C18.012,130.512 17.867,130.425 17.767,130.365 C17.759,130.357 17.749,130.349 17.741,130.341 C17.676,130.286 17.622,130.153 17.562,130.055 C17.504,129.95 17.448,129.848 17.397,129.743 C17.292,129.538 17.2,129.329 17.111,129.13 C16.937,128.726 16.766,128.354 16.603,128.014 C16.442,127.674 16.302,127.357 16.191,127.073 C16.075,126.79 15.985,126.538 15.917,126.328 C15.844,126.118 15.799,125.949 15.765,125.834 C15.731,125.716 15.714,125.652 15.714,125.652 C15.711,125.64 15.701,125.632 15.689,125.631 C15.673,125.629 15.658,125.64 15.656,125.657 C15.656,125.657 15.649,125.721 15.636,125.843 C15.629,125.967 15.623,126.152 15.641,126.383 C15.659,126.613 15.702,126.893 15.779,127.207 C15.819,127.363 15.87,127.527 15.926,127.699 C15.984,127.87 16.055,128.045 16.131,128.228 C16.288,128.591 16.497,128.966 16.763,129.329 C17.033,129.691 17.319,130.073 17.614,130.467 C17.799,130.64 17.987,130.794 18.171,130.966 C18.354,131.138 18.539,131.312 18.725,131.489 C19.1,131.836 19.508,132.149 19.901,132.473 C20.102,132.632 20.299,132.791 20.499,132.938 C20.597,133.012 20.692,133.092 20.778,133.164 C20.802,133.181 20.819,133.199 20.839,133.217 C20.85,133.225 20.855,133.231 20.862,133.238 C20.852,133.293 20.807,133.382 20.749,133.456 C20.688,133.537 20.613,133.612 20.531,133.681 C20.367,133.821 20.173,133.927 19.969,134.005 C19.56,134.159 19.116,134.19 18.7,134.147 C18.283,134.103 17.892,133.989 17.541,133.855 C17.19,133.72 16.879,133.562 16.607,133.413 C16.338,133.26 16.109,133.113 15.924,132.987 C15.864,132.945 15.81,132.907 15.758,132.871 C15.618,132.744 15.481,132.615 15.353,132.478 C14.958,132.06 14.616,131.614 14.292,131.186 C13.97,130.755 13.697,130.313 13.465,129.884 C13.233,129.455 13.029,129.039 12.866,128.643 C12.697,128.25 12.565,127.878 12.457,127.543 C12.345,127.209 12.268,126.911 12.2,126.664 C12.135,126.417 12.083,126.219 12.056,126.085 C12.021,125.95 12.003,125.878 12.003,125.878 L12.003,125.877 C12,125.865 11.989,125.855 11.976,125.854 C11.96,125.853 11.946,125.866 11.945,125.882 C11.945,125.882 11.94,125.957 11.932,126.096 C11.926,126.236 11.923,126.441 11.929,126.704 C11.942,126.966 11.965,127.285 12.026,127.647 C12.087,128.009 12.181,128.415 12.324,128.848 C12.471,129.278 12.665,129.735 12.928,130.188 C13.192,130.637 13.517,131.085 13.888,131.511 C14.258,131.941 14.704,132.324 15.169,132.68 C15.635,133.034 16.107,133.392 16.58,133.751 C16.815,133.924 17.031,134.11 17.188,134.333 C17.266,134.44 17.325,134.561 17.339,134.666 C17.35,134.772 17.321,134.823 17.249,134.872 C17.174,134.922 17.054,134.951 16.93,134.964 C16.805,134.979 16.673,134.978 16.541,134.972 C16.275,134.954 16.006,134.921 15.744,134.87 C15.48,134.824 15.219,134.768 14.968,134.709 C14.706,134.651 14.477,134.593 14.26,134.506 C13.989,134.395 13.744,134.249 13.522,134.085 C13.409,133.937 13.295,133.792 13.187,133.643 C12.934,133.307 12.696,132.962 12.461,132.617 L11.772,131.582 L11.098,130.554 C10.874,130.215 10.674,129.86 10.476,129.507 C10.378,129.328 10.285,129.148 10.198,128.966 C10.114,128.782 10.023,128.6 9.946,128.413 C9.866,128.227 9.798,128.037 9.727,127.846 C9.658,127.655 9.601,127.461 9.546,127.264 C9.489,127.067 9.447,126.867 9.406,126.664 C9.368,126.46 9.334,126.256 9.312,126.044 C9.309,126.024 9.294,126.006 9.273,126.002 C9.247,125.995 9.221,126.013 9.215,126.039 C9.167,126.247 9.133,126.463 9.117,126.679 C9.099,126.896 9.102,127.114 9.109,127.332 C9.136,127.768 9.206,128.204 9.321,128.626 C9.379,128.836 9.438,129.047 9.517,129.251 C9.592,129.456 9.674,129.658 9.761,129.858 C9.934,130.258 10.147,130.636 10.365,131.009 C10.586,131.382 10.831,131.738 11.103,132.071 C11.236,132.239 11.374,132.403 11.519,132.561 C11.662,132.72 11.809,132.877 11.959,133.028 C12.066,133.138 12.176,133.246 12.286,133.352 C12.44,133.591 12.625,133.837 12.847,134.083 C13.043,134.293 13.274,134.504 13.544,134.685 C13.423,134.776 13.254,134.854 13.087,134.884 C12.895,134.923 12.694,134.924 12.495,134.893 C12.096,134.831 11.715,134.65 11.369,134.425 C11.022,134.195 10.705,133.92 10.41,133.62 C10.117,133.321 9.837,133.003 9.583,132.668 C9.337,132.33 9.104,131.983 8.885,131.632 C8.667,131.28 8.466,130.917 8.305,130.55 C8.222,130.368 8.15,130.184 8.097,130.005 C8.042,129.814 7.978,129.594 7.916,129.393 C7.797,128.991 7.671,128.591 7.562,128.187 C7.451,127.784 7.339,127.374 7.237,126.957 C7.133,126.544 7.013,126.119 6.916,125.711 C6.852,125.313 6.806,124.878 6.771,124.457 C6.734,124.032 6.711,123.606 6.694,123.178 C6.667,122.325 6.681,121.469 6.742,120.614 C6.773,120.187 6.815,119.76 6.872,119.335 L6.967,118.698 L7.083,118.063 L7.084,118.06 C7.088,118.036 7.074,118.011 7.049,118.005 C7.024,117.998 6.997,118.012 6.99,118.038 L6.808,118.663 C6.75,118.872 6.702,119.085 6.651,119.295 C6.558,119.718 6.473,120.146 6.409,120.577 C6.344,121.008 6.291,121.44 6.251,121.874 C6.235,122.054 6.223,122.234 6.211,122.414 C6.206,122.427 6.199,122.442 6.191,122.456 C6.103,122.647 5.953,122.927 5.746,123.261 C5.638,123.426 5.519,123.606 5.38,123.798 C5.239,123.986 5.083,124.185 4.91,124.393 C4.823,124.498 4.73,124.602 4.632,124.708 C4.538,124.816 4.437,124.925 4.332,125.033 C4.12,125.25 3.885,125.466 3.644,125.692 C3.521,125.803 3.4,125.923 3.268,126.033 C3.14,126.147 3.009,126.264 2.868,126.373 C2.731,126.486 2.586,126.592 2.435,126.687 C2.284,126.781 2.123,126.866 1.967,126.905 C1.927,126.916 1.895,126.92 1.855,126.924 L1.704,126.925 C1.608,126.922 1.516,126.915 1.419,126.903 C1.231,126.88 1.041,126.835 0.901,126.739 C0.759,126.646 0.698,126.503 0.717,126.323 C0.738,126.144 0.823,125.956 0.925,125.776 C1.129,125.41 1.448,125.116 1.701,124.692 C1.944,124.3 2.164,123.893 2.379,123.485 C2.594,123.079 2.81,122.668 3.03,122.288 C3.085,122.195 3.144,122.099 3.199,122.022 C3.228,121.981 3.255,121.943 3.28,121.916 L3.339,121.845 C3.357,121.821 3.372,121.806 3.402,121.758 C3.463,121.668 3.487,121.618 3.522,121.556 C3.552,121.499 3.583,121.439 3.608,121.383 C3.664,121.27 3.71,121.159 3.758,121.048 C4.125,120.164 4.427,119.289 4.75,118.439 C4.908,118.014 5.063,117.595 5.228,117.2 C5.309,117.004 5.394,116.807 5.481,116.651 C5.504,116.614 5.525,116.575 5.544,116.549 L5.558,116.526 C5.562,116.521 5.536,116.552 5.55,116.535 L5.557,116.527 L5.569,116.51 L5.595,116.478 L5.608,116.464 C5.618,116.451 5.655,116.415 5.684,116.385 C5.717,116.355 5.75,116.324 5.787,116.293 C6.084,116.045 6.437,115.797 6.778,115.561 C7.122,115.323 7.458,115.081 7.787,114.838 C8.109,114.586 8.426,114.337 8.702,114.031 C8.771,113.952 8.837,113.874 8.898,113.782 L8.91,113.765 L8.916,113.758 L8.944,113.713 L8.96,113.67 C8.967,113.647 8.975,113.624 8.98,113.601 L8.99,113.559 L9.018,113.42 C9.042,113.286 9.064,113.156 9.087,113.026 C9.133,112.854 9.186,112.65 9.246,112.403 C9.431,111.622 9.692,110.473 9.988,109.005 C10.281,107.535 10.606,105.745 10.932,103.683 C11.092,102.652 11.257,101.547 11.415,100.401 C11.577,99.26 11.797,98.066 12.075,96.828 C12.355,95.591 12.667,94.304 13.035,92.981 C13.395,91.657 13.812,90.298 14.226,88.892 C14.641,87.487 15.086,86.046 15.508,84.553 C15.715,83.805 15.918,83.047 16.102,82.27 C16.286,81.49 16.451,80.706 16.564,79.867 C16.597,79.649 16.609,79.475 16.634,79.252 C16.65,79.05 16.667,78.848 16.683,78.645 C16.714,78.242 16.75,77.837 16.775,77.428 C16.833,76.614 16.883,75.794 16.93,74.969 C17.011,73.323 17.094,71.659 17.177,69.981 C17.272,68.309 17.396,66.632 17.625,64.957 C17.85,63.279 18.18,61.62 18.583,59.959 C18.68,59.544 18.78,59.132 18.888,58.714 C18.985,58.295 19.083,57.876 19.16,57.453 C19.321,56.607 19.442,55.759 19.548,54.912 C19.653,54.066 19.736,53.219 19.833,52.377 C19.876,51.956 19.92,51.535 19.963,51.115 C20.007,50.694 20.043,50.275 20.111,49.871 C20.246,49.055 20.467,48.26 20.792,47.513 C20.956,47.141 21.142,46.781 21.354,46.438 C21.561,46.093 21.794,45.765 22.046,45.456 C23.05,44.213 24.367,43.275 25.788,42.691 C26.498,42.4 27.239,42.192 27.973,42.081 C28.168,42.051 28.363,42.02 28.557,41.991 C28.755,41.961 28.953,41.927 29.151,41.884 C29.349,41.844 29.546,41.802 29.741,41.751 C29.937,41.704 30.131,41.65 30.323,41.591 C31.094,41.363 31.811,41.054 32.503,40.772 C33.195,40.486 33.881,40.23 34.561,39.978 C35.924,39.485 37.28,39.076 38.599,38.71 C39.265,38.527 39.921,38.346 40.564,38.171 C41.211,37.99 41.845,37.799 42.463,37.591 C43.081,37.381 43.681,37.154 44.259,36.859 C44.547,36.708 44.831,36.545 45.096,36.326 C45.359,36.114 45.614,35.824 45.745,35.469 C45.779,35.383 45.803,35.295 45.822,35.208 C45.832,35.164 45.839,35.115 45.847,35.07 L45.86,34.954 C45.87,34.802 45.88,34.652 45.89,34.502 C45.894,34.211 45.903,33.922 45.895,33.643 C45.887,33.083 45.863,32.544 45.836,32.021 C45.728,29.932 45.544,28.124 45.398,26.635 C45.295,25.657 45.199,24.822 45.115,24.136 C45.149,24.211 45.185,24.287 45.22,24.36 C45.318,24.555 45.416,24.749 45.511,24.939 C45.612,25.135 45.712,25.317 45.811,25.502 C46.005,25.871 46.21,26.221 46.405,26.562 C46.799,27.242 47.203,27.858 47.561,28.424 C47.919,28.989 48.192,29.53 48.362,30.055 C48.532,30.58 48.639,31.067 48.717,31.494 C48.801,31.919 48.848,32.286 48.896,32.582 C48.974,33.177 49.016,33.495 49.016,33.495 C49.016,33.495 48.996,33.176 48.958,32.576 C48.931,32.277 48.909,31.906 48.853,31.472 C48.807,31.039 48.729,30.54 48.583,29.989 C48.44,29.438 48.182,28.848 47.851,28.254 C47.522,27.658 47.149,27.036 46.793,26.347 C46.616,26.003 46.431,25.648 46.256,25.274 C46.169,25.09 46.075,24.899 45.99,24.712 C45.903,24.517 45.815,24.32 45.726,24.12 C45.384,23.326 45.05,22.481 44.756,21.579 C44.468,20.676 44.221,19.72 44.028,18.719 C43.832,17.72 43.693,16.675 43.625,15.594 C43.556,14.514 43.537,13.4 43.601,12.263 C43.608,11.979 43.633,11.693 43.655,11.407 C43.68,11.12 43.69,10.831 43.726,10.542 C43.756,10.254 43.786,9.963 43.817,9.671 L43.822,9.616 L43.825,9.594 C43.826,9.589 43.827,9.578 43.828,9.577 L43.845,9.467 L43.878,9.245 L43.913,9.023 L43.957,8.821 C43.989,8.686 44.009,8.553 44.051,8.417 L44.167,8.007 C44.261,7.738 44.353,7.469 44.473,7.209 C44.704,6.686 44.993,6.186 45.335,5.72 C46.02,4.786 46.926,4.002 47.943,3.371 C48.963,2.742 50.1,2.27 51.283,1.949 C52.461,1.629 53.709,1.451 54.91,1.448 C56.148,1.452 57.369,1.627 58.556,1.947 C59.739,2.267 60.877,2.737 61.897,3.364 C62.914,3.995 63.821,4.778 64.506,5.713 C65.189,6.645 65.666,7.71 65.888,8.822 L65.933,9.03 L65.964,9.24 C65.983,9.379 66.012,9.523 66.025,9.656 C66.056,9.952 66.087,10.246 66.117,10.539 C66.153,10.835 66.163,11.116 66.188,11.403 C66.21,11.687 66.234,11.97 66.242,12.256 C66.306,13.392 66.287,14.507 66.217,15.587 C66.148,16.667 66.01,17.713 65.813,18.712 C65.621,19.713 65.374,20.668 65.085,21.57 C64.496,23.371 63.761,24.964 63.047,26.339 C62.691,27.028 62.318,27.649 61.99,28.245 C61.658,28.84 61.401,29.43 61.258,29.981 C61.112,30.532 61.034,31.03 60.987,31.464 C60.932,31.898 60.91,32.268 60.883,32.568 C60.846,33.168 60.826,33.487 60.826,33.487 C60.826,33.487 60.868,33.17 60.946,32.574 C60.994,32.279 61.041,31.911 61.125,31.486 C61.203,31.059 61.31,30.573 61.48,30.048 C61.649,29.522 61.923,28.982 62.281,28.417 C62.64,27.85 63.042,27.235 63.438,26.555 C63.833,25.871 64.234,25.145 64.624,24.35 C64.659,24.278 64.692,24.204 64.727,24.132 C64.642,24.816 64.547,25.651 64.443,26.627 C64.297,28.117 64.114,29.924 64.006,32.012 C63.978,32.535 63.955,33.075 63.946,33.635 C63.938,33.915 63.947,34.203 63.951,34.494 C63.961,34.643 63.971,34.794 63.981,34.946 L63.994,35.062 C64.002,35.106 64.01,35.156 64.02,35.199 C64.039,35.286 64.063,35.375 64.096,35.462 C64.227,35.817 64.482,36.106 64.745,36.318 C65.011,36.536 65.294,36.7 65.582,36.85 C66.16,37.145 66.761,37.374 67.379,37.584 C67.996,37.792 68.63,37.982 69.277,38.163 C69.92,38.339 70.576,38.518 71.243,38.702 C72.562,39.068 73.917,39.477 75.28,39.969 C75.96,40.221 76.646,40.478 77.338,40.764 C78.031,41.047 78.747,41.355 79.519,41.583 C79.71,41.642 79.903,41.696 80.1,41.743 C80.295,41.796 80.492,41.837 80.69,41.875 C80.888,41.919 81.086,41.954 81.285,41.982 C81.479,42.012 81.673,42.043 81.868,42.072 C82.602,42.184 83.343,42.391 84.053,42.682 C85.474,43.266 86.791,44.205 87.795,45.448 C88.047,45.758 88.28,46.085 88.487,46.43 C88.699,46.773 88.886,47.134 89.049,47.506 C89.375,48.252 89.595,49.048 89.73,49.862 C89.799,50.267 89.834,50.685 89.878,51.107 C89.921,51.527 89.965,51.948 90.008,52.368 C90.105,53.211 90.188,54.057 90.294,54.904 C90.399,55.75 90.521,56.599 90.681,57.444 C90.758,57.868 90.856,58.287 90.953,58.706 C91.062,59.124 91.161,59.535 91.259,59.951 C91.661,61.612 91.991,63.27 92.216,64.949 C92.445,66.624 92.569,68.302 92.665,69.973 C92.747,71.651 92.83,73.315 92.912,74.962 C92.958,75.786 93.007,76.606 93.066,77.421 C93.092,77.829 93.127,78.233 93.159,78.638 C93.175,78.841 93.191,79.042 93.207,79.243 C93.232,79.467 93.244,79.641 93.277,79.859 C93.391,80.698 93.556,81.481 93.739,82.261 C93.923,83.038 94.126,83.799 94.333,84.545 C94.755,86.037 95.2,87.479 95.616,88.883 C96.03,90.29 96.447,91.649 96.806,92.973 C97.175,94.297 97.486,95.583 97.766,96.82 C98.044,98.058 98.264,99.253 98.426,100.393 C98.584,101.54 98.749,102.645 98.91,103.675 C99.235,105.736 99.56,107.527 99.854,108.995 C100.143,110.434 100.399,111.563 100.583,112.343 C100.612,112.522 100.642,112.703 100.672,112.889 C100.702,113.062 100.733,113.239 100.766,113.42 L100.793,113.559 L100.803,113.601 C100.809,113.624 100.816,113.647 100.824,113.67 L100.84,113.713 L100.868,113.758 L100.874,113.765 L100.885,113.782 C100.946,113.874 101.013,113.952 101.081,114.031 C101.358,114.337 101.674,114.586 101.996,114.838 C102.324,115.081 102.662,115.323 103.005,115.561 C103.346,115.797 103.699,116.045 103.996,116.293 C104.034,116.324 104.066,116.355 104.1,116.385 C104.129,116.415 104.166,116.451 104.175,116.464 L104.188,116.478 L104.214,116.51 L104.227,116.527 L104.233,116.535 C104.247,116.552 104.222,116.521 104.225,116.526 L104.239,116.549 C104.258,116.575 104.28,116.614 104.301,116.651 C104.389,116.807 104.474,117.004 104.556,117.2 C104.72,117.595 104.875,118.014 105.033,118.439 C105.356,119.289 105.659,120.164 106.025,121.048 C106.073,121.159 106.119,121.27 106.175,121.383 C106.2,121.439 106.231,121.499 106.261,121.556 C106.295,121.618 106.32,121.668 106.381,121.758 C106.412,121.806 106.426,121.821 106.445,121.845 L106.503,121.916 C106.528,121.943 106.557,121.981 106.585,122.022 C106.64,122.099 106.698,122.195 106.754,122.288 C106.974,122.668 107.189,123.079 107.404,123.485 C107.619,123.893 107.839,124.3 108.083,124.692 C108.335,125.116 108.654,125.41 108.858,125.776 C108.96,125.956 109.045,126.144 109.067,126.323 C109.085,126.503 109.024,126.646 108.882,126.739 Z M44.566,24.958 C44.409,24.926 44.244,24.863 44.093,24.74 C43.942,24.618 43.795,24.441 43.658,24.213 C43.38,23.756 43.137,23.121 42.819,22.443 C42.66,22.103 42.5,21.744 42.356,21.37 C42.21,20.997 42.069,20.614 41.925,20.228 C41.786,19.845 41.625,19.458 41.487,19.086 C41.353,18.715 41.243,18.343 41.162,17.981 C41.083,17.62 41.039,17.263 41.057,16.936 C41.074,16.608 41.161,16.308 41.329,16.094 C41.494,15.878 41.732,15.754 41.957,15.693 C42.184,15.632 42.397,15.622 42.571,15.626 C42.641,15.628 42.704,15.632 42.761,15.638 C42.762,15.646 42.762,15.655 42.763,15.664 C42.954,17.893 43.47,19.964 44.126,21.795 C44.342,22.38 44.573,22.94 44.813,23.479 C44.84,23.898 44.873,24.402 44.908,24.982 C44.817,24.985 44.698,24.982 44.566,24.958 Z M67.283,15.782 C67.449,15.819 67.644,15.872 67.823,15.957 C68.004,16.043 68.149,16.163 68.247,16.311 C68.343,16.462 68.432,16.669 68.498,16.957 C68.566,17.242 68.577,17.589 68.536,17.949 C68.5,18.309 68.425,18.687 68.339,19.072 C68.24,19.46 68.111,19.854 68,20.248 C67.771,21.035 67.55,21.822 67.301,22.542 C67.053,23.259 66.778,23.918 66.427,24.397 C66.251,24.635 66.055,24.822 65.85,24.934 C65.646,25.048 65.438,25.081 65.269,25.076 C65.129,25.071 65.015,25.048 64.93,25.024 C64.966,24.424 65,23.904 65.028,23.473 C65.268,22.934 65.498,22.374 65.715,21.786 C66.363,19.979 66.873,17.938 67.069,15.741 C67.133,15.752 67.205,15.765 67.283,15.782 Z M109.355,126.293 C109.329,126.044 109.232,125.829 109.125,125.628 C109.013,125.428 108.894,125.235 108.765,125.05 C108.736,125.007 108.695,124.953 108.673,124.917 L108.583,124.776 C108.534,124.682 108.485,124.596 108.438,124.495 C108.249,124.103 108.1,123.676 107.944,123.247 C107.788,122.816 107.644,122.377 107.442,121.931 C107.39,121.819 107.342,121.707 107.271,121.59 C107.238,121.532 107.204,121.473 107.155,121.41 L107.121,121.362 L107.104,121.341 C107.086,121.317 107.119,121.358 107.114,121.35 L107.107,121.342 C107.092,121.319 107.07,121.288 107.073,121.285 C107.071,121.278 107.044,121.222 107.026,121.181 L106.967,121.037 L106.852,120.726 C106.702,120.301 106.565,119.858 106.427,119.418 C106.285,118.974 106.143,118.533 106.003,118.095 C105.853,117.657 105.695,117.223 105.51,116.793 C105.413,116.576 105.315,116.364 105.181,116.137 C105.145,116.079 105.111,116.023 105.064,115.961 L105.03,115.916 L105.01,115.89 L105.003,115.883 L104.99,115.867 L104.962,115.836 L104.919,115.791 C104.854,115.723 104.809,115.686 104.757,115.641 C104.707,115.6 104.657,115.559 104.608,115.524 C104.218,115.234 103.838,115.031 103.47,114.818 C103.102,114.61 102.739,114.423 102.399,114.226 C102.057,114.037 101.73,113.842 101.455,113.634 C101.388,113.583 101.322,113.529 101.269,113.474 L101.264,113.47 C101.264,113.47 101.263,113.468 101.264,113.468 C101.266,113.469 101.267,113.47 101.267,113.47 C101.267,113.473 101.262,113.454 101.259,113.446 L101.227,113.319 C101.186,113.143 101.145,112.971 101.105,112.802 C100.922,111.997 100.758,111.272 100.617,110.649 C100.552,110.13 100.482,109.55 100.406,108.908 C100.228,107.425 100.022,105.625 99.805,103.557 C99.751,103.042 99.696,102.508 99.64,101.96 C99.584,101.406 99.539,100.849 99.466,100.258 C99.328,99.083 99.134,97.855 98.881,96.587 C98.633,95.316 98.318,94.007 97.969,92.663 C97.615,91.318 97.235,89.935 96.807,88.528 C96.384,87.12 95.943,85.678 95.515,84.207 C95.299,83.472 95.087,82.729 94.897,81.977 C94.707,81.23 94.535,80.46 94.421,79.714 C94.39,79.537 94.369,79.309 94.346,79.134 C94.326,78.935 94.306,78.736 94.286,78.536 C94.248,78.137 94.205,77.736 94.172,77.332 C94.1,76.525 94.035,75.712 93.974,74.892 C93.851,73.253 93.748,71.587 93.589,69.903 C93.436,68.221 93.213,66.524 92.9,64.839 C92.587,63.157 92.188,61.474 91.712,59.833 L91.364,58.601 C91.259,58.19 91.153,57.78 91.068,57.366 C91.021,57.16 90.979,56.952 90.943,56.743 C90.905,56.535 90.863,56.327 90.831,56.118 C90.771,55.698 90.701,55.28 90.651,54.858 C90.54,54.017 90.447,53.174 90.364,52.334 C90.325,51.912 90.287,51.491 90.248,51.071 C90.21,50.652 90.172,50.231 90.118,49.805 C90.003,48.958 89.796,48.121 89.481,47.328 C89.329,46.929 89.151,46.54 88.946,46.167 C88.745,45.791 88.514,45.431 88.263,45.089 C87.26,43.712 85.894,42.632 84.386,41.927 C83.629,41.575 82.843,41.312 82.028,41.147 C81.835,41.11 81.643,41.073 81.451,41.036 C81.264,41.003 81.078,40.966 80.896,40.921 C80.712,40.88 80.531,40.836 80.354,40.783 C80.173,40.737 79.996,40.682 79.821,40.622 C79.121,40.389 78.434,40.096 77.732,39.806 C77.033,39.516 76.332,39.236 75.63,38.992 C74.225,38.503 72.84,38.104 71.493,37.747 C70.823,37.581 70.165,37.418 69.519,37.258 C68.877,37.096 68.253,36.927 67.651,36.741 C67.053,36.552 66.468,36.359 65.944,36.115 C65.425,35.872 64.946,35.572 64.792,35.188 C64.77,35.138 64.755,35.087 64.74,35.033 L64.722,34.958 C64.717,34.926 64.708,34.878 64.707,34.86 C64.694,34.724 64.682,34.589 64.669,34.455 C64.656,34.178 64.636,33.907 64.635,33.633 C64.622,33.087 64.625,32.552 64.633,32.034 C64.671,29.961 64.76,28.148 64.839,26.658 C64.866,26.106 64.896,25.6 64.922,25.139 C65.009,25.167 65.122,25.197 65.26,25.211 C65.446,25.229 65.688,25.21 65.93,25.094 C66.174,24.983 66.406,24.786 66.61,24.541 C67.018,24.048 67.338,23.383 67.635,22.668 C67.93,21.95 68.202,21.173 68.473,20.399 C68.61,20.011 68.735,19.627 68.885,19.247 C69.044,18.864 69.174,18.472 69.269,18.076 C69.36,17.679 69.434,17.279 69.431,16.863 C69.431,16.452 69.3,15.999 68.994,15.678 C68.846,15.518 68.668,15.401 68.493,15.328 C68.318,15.25 68.146,15.222 67.993,15.206 C67.684,15.183 67.437,15.24 67.246,15.302 C67.193,15.32 67.146,15.339 67.101,15.357 C67.184,14.338 67.225,13.29 67.193,12.222 C67.192,11.928 67.175,11.633 67.16,11.335 C67.143,11.039 67.133,10.734 67.103,10.444 C67.077,10.15 67.051,9.855 67.024,9.559 C67.01,9.396 66.984,9.246 66.965,9.089 L66.932,8.854 L66.886,8.622 C66.659,7.376 66.138,6.15 65.378,5.079 C64.621,4.004 63.609,3.108 62.488,2.413 C61.365,1.713 60.132,1.199 58.857,0.845 C57.584,0.495 56.25,0.296 54.929,0.287 C53.567,0.298 52.262,0.497 50.98,0.848 C49.706,1.204 48.473,1.719 47.352,2.419 C46.23,3.116 45.22,4.012 44.462,5.087 C44.081,5.622 43.762,6.197 43.509,6.793 C43.379,7.09 43.278,7.395 43.179,7.7 L43.055,8.164 C43.011,8.317 42.986,8.481 42.953,8.639 L42.906,8.877 L42.875,9.099 L42.83,9.432 L42.824,9.475 L42.822,9.504 L42.817,9.56 C42.79,9.86 42.764,10.159 42.737,10.457 C42.707,10.754 42.697,11.052 42.68,11.347 C42.665,11.642 42.647,11.936 42.647,12.23 C42.614,13.344 42.659,14.439 42.75,15.501 C42.699,15.492 42.644,15.483 42.583,15.475 C42.4,15.454 42.172,15.44 41.91,15.485 C41.652,15.533 41.348,15.654 41.114,15.912 C40.878,16.168 40.747,16.529 40.696,16.899 C40.645,17.273 40.663,17.665 40.715,18.059 C40.767,18.454 40.859,18.852 40.971,19.25 C41.082,19.644 41.176,20.036 41.285,20.433 C41.393,20.831 41.5,21.228 41.606,21.619 C41.715,22.01 41.814,22.402 41.928,22.781 C42.155,23.536 42.505,24.225 42.988,24.741 C43.111,24.867 43.24,24.982 43.377,25.081 C43.515,25.177 43.664,25.251 43.81,25.304 C44.104,25.411 44.389,25.4 44.589,25.345 C44.732,25.308 44.84,25.257 44.923,25.21 C44.949,25.655 44.976,26.139 45.003,26.666 C45.081,28.157 45.17,29.969 45.208,32.042 C45.216,32.559 45.22,33.094 45.207,33.64 C45.206,33.915 45.185,34.186 45.172,34.463 C45.16,34.597 45.147,34.731 45.134,34.868 C45.133,34.885 45.124,34.934 45.119,34.966 L45.101,35.042 C45.086,35.095 45.07,35.147 45.049,35.196 C44.896,35.58 44.416,35.88 43.897,36.123 C43.372,36.367 42.788,36.56 42.19,36.749 C41.588,36.934 40.964,37.104 40.323,37.265 C39.677,37.426 39.018,37.589 38.349,37.755 C37.001,38.112 35.617,38.51 34.212,39 C33.51,39.243 32.808,39.524 32.108,39.813 C31.408,40.104 30.72,40.397 30.021,40.631 C29.845,40.69 29.668,40.745 29.488,40.791 C29.311,40.844 29.128,40.888 28.945,40.928 C28.763,40.973 28.578,41.01 28.39,41.044 C28.198,41.081 28.006,41.118 27.813,41.155 C26.999,41.32 26.212,41.583 25.456,41.935 C23.947,42.639 22.582,43.72 21.579,45.096 C21.327,45.439 21.097,45.799 20.896,46.175 C20.69,46.548 20.512,46.937 20.36,47.337 C20.045,48.13 19.839,48.966 19.724,49.812 C19.669,50.239 19.631,50.66 19.594,51.079 C19.555,51.499 19.516,51.92 19.477,52.342 C19.395,53.182 19.301,54.025 19.19,54.866 C19.14,55.288 19.069,55.705 19.01,56.126 C18.978,56.335 18.936,56.543 18.898,56.751 C18.861,56.96 18.821,57.168 18.773,57.374 C18.688,57.789 18.583,58.198 18.478,58.609 L18.13,59.842 C17.654,61.481 17.254,63.165 16.941,64.846 C16.628,66.532 16.406,68.229 16.252,69.912 C16.094,71.594 15.991,73.26 15.868,74.9 C15.806,75.719 15.742,76.533 15.669,77.341 C15.636,77.744 15.594,78.144 15.555,78.545 C15.535,78.744 15.516,78.943 15.496,79.142 C15.473,79.318 15.451,79.545 15.421,79.721 C15.307,80.467 15.134,81.239 14.944,81.987 C14.754,82.737 14.542,83.48 14.326,84.216 C13.898,85.686 13.457,87.128 13.034,88.536 C12.606,89.944 12.226,91.327 11.873,92.671 C11.522,94.015 11.209,95.324 10.96,96.594 C10.708,97.863 10.513,99.091 10.375,100.266 C10.303,100.857 10.256,101.414 10.201,101.967 C10.145,102.516 10.09,103.05 10.036,103.565 C9.818,105.633 9.614,107.433 9.435,108.916 C9.386,109.33 9.34,109.716 9.295,110.079 C9.129,110.812 8.92,111.736 8.678,112.802 C8.639,112.971 8.598,113.143 8.556,113.319 L8.523,113.446 C8.522,113.454 8.517,113.473 8.517,113.47 C8.517,113.47 8.518,113.469 8.52,113.468 L8.52,113.47 L8.515,113.474 C8.461,113.529 8.395,113.583 8.329,113.634 C8.053,113.842 7.726,114.037 7.384,114.226 C7.044,114.423 6.681,114.61 6.313,114.818 C5.945,115.031 5.565,115.234 5.176,115.524 C5.126,115.559 5.076,115.6 5.026,115.641 C4.975,115.686 4.93,115.723 4.864,115.791 L4.821,115.836 L4.794,115.867 L4.779,115.883 L4.773,115.89 L4.752,115.916 L4.719,115.961 C4.672,116.023 4.638,116.079 4.603,116.137 C4.468,116.364 4.37,116.576 4.273,116.793 C4.087,117.223 3.93,117.657 3.781,118.095 C3.641,118.533 3.499,118.974 3.356,119.418 C3.219,119.858 3.081,120.301 2.932,120.726 L2.816,121.037 L2.757,121.181 C2.739,121.222 2.712,121.278 2.711,121.285 C2.714,121.288 2.691,121.319 2.675,121.342 L2.669,121.35 C2.664,121.358 2.697,121.317 2.679,121.341 L2.662,121.362 L2.628,121.41 C2.58,121.473 2.544,121.532 2.513,121.59 C2.441,121.707 2.393,121.819 2.341,121.931 C2.14,122.377 1.996,122.816 1.839,123.247 C1.684,123.676 1.534,124.103 1.345,124.495 C1.298,124.596 1.25,124.682 1.2,124.776 L1.11,124.917 C1.088,124.953 1.048,125.007 1.019,125.05 C0.889,125.235 0.771,125.428 0.658,125.628 C0.551,125.829 0.454,126.044 0.427,126.293 C0.414,126.417 0.423,126.552 0.476,126.679 C0.528,126.804 0.618,126.912 0.719,126.987 C0.922,127.136 1.143,127.209 1.356,127.257 C1.462,127.281 1.572,127.299 1.678,127.312 L1.829,127.334 C1.89,127.339 1.958,127.345 2.017,127.342 C2.495,127.307 2.88,127.14 3.244,126.968 C3.604,126.789 3.922,126.573 4.208,126.342 C4.494,126.112 4.735,125.855 4.954,125.604 C5.063,125.478 5.167,125.354 5.263,125.229 C5.357,125.103 5.445,124.977 5.527,124.853 C5.609,124.729 5.685,124.607 5.755,124.488 C5.821,124.365 5.886,124.248 5.94,124.131 C6.034,123.949 6.104,123.77 6.165,123.603 C6.16,123.898 6.158,124.194 6.168,124.49 C6.182,124.93 6.202,125.357 6.25,125.815 C6.293,126.258 6.329,126.681 6.381,127.118 C6.437,127.549 6.495,127.987 6.586,128.422 C6.672,128.858 6.793,129.286 6.927,129.709 C6.995,129.919 7.061,130.11 7.143,130.329 C7.227,130.559 7.327,130.772 7.436,130.975 C7.655,131.383 7.904,131.761 8.174,132.121 C8.445,132.479 8.74,132.816 9.069,133.124 C9.391,133.431 9.712,133.734 10.063,134.009 C10.411,134.286 10.78,134.54 11.173,134.754 C11.374,134.856 11.575,134.956 11.789,135.034 C12.002,135.11 12.225,135.165 12.453,135.196 C12.681,135.227 12.918,135.221 13.148,135.171 C13.361,135.121 13.56,135.047 13.75,134.898 C13.771,134.893 13.792,134.886 13.821,134.869 C13.825,134.866 13.829,134.86 13.833,134.856 C13.909,134.896 13.986,134.934 14.067,134.969 C14.316,135.077 14.59,135.153 14.846,135.216 C15.111,135.278 15.381,135.333 15.663,135.376 C15.944,135.412 16.234,135.443 16.537,135.433 C16.688,135.427 16.842,135.415 17.001,135.382 C17.158,135.344 17.325,135.296 17.481,135.168 C17.558,135.103 17.628,135.01 17.659,134.903 C17.691,134.796 17.684,134.688 17.66,134.597 C17.61,134.415 17.511,134.28 17.409,134.159 C17.394,134.141 17.376,134.125 17.36,134.107 C17.38,134.118 17.399,134.128 17.419,134.137 C17.776,134.307 18.187,134.46 18.647,134.537 C19.104,134.616 19.619,134.614 20.124,134.452 C20.375,134.372 20.624,134.252 20.849,134.081 C20.961,133.996 21.067,133.896 21.162,133.781 C21.255,133.662 21.345,133.535 21.392,133.341 C21.403,133.292 21.411,133.234 21.406,133.17 C21.404,133.137 21.398,133.1 21.387,133.063 C21.381,133.042 21.369,133.012 21.356,132.988 L21.344,132.967 L21.337,132.956 L21.334,132.951 L21.317,132.925 L21.308,132.913 L21.289,132.887 C21.277,132.871 21.263,132.853 21.252,132.84 C21.228,132.812 21.203,132.781 21.18,132.756 C21.084,132.649 20.984,132.561 20.886,132.472 C20.69,132.292 20.479,132.139 20.269,131.987 C20.213,131.948 20.158,131.913 20.102,131.875 C20.332,131.967 20.577,132.051 20.847,132.109 C21.071,132.152 21.307,132.189 21.586,132.135 C21.656,132.12 21.73,132.098 21.807,132.051 C21.882,132.006 21.964,131.945 22.021,131.815 L22.028,131.796 L22.032,131.786 C22.036,131.774 22.027,131.803 22.041,131.758 L22.042,131.757 L22.058,131.729 L22.095,131.662 L22.181,131.508 C22.293,131.29 22.404,131.043 22.446,130.753 C22.491,130.464 22.473,130.135 22.305,129.815 C22.28,129.768 22.283,129.772 22.248,129.715 C22.218,129.672 22.181,129.62 22.151,129.589 C22.088,129.52 22.029,129.47 21.97,129.422 C21.854,129.331 21.742,129.257 21.628,129.192 C21.402,129.06 21.179,128.948 20.957,128.836 C20.737,128.722 20.516,128.614 20.294,128.514 L20.127,128.44 L19.966,128.366 C19.91,128.346 19.832,128.259 19.769,128.173 C19.512,127.796 19.371,127.317 19.288,126.868 C19.205,126.412 19.206,125.956 19.19,125.529 C19.178,125.1 19.13,124.703 19.062,124.337 C19.017,124.077 18.969,123.833 18.919,123.608 C18.917,123.56 18.916,123.513 18.915,123.465 C18.91,123.334 18.908,123.198 18.896,123.058 C18.881,122.92 18.866,122.776 18.851,122.629 C18.814,122.337 18.762,122.027 18.709,121.723 C18.678,121.559 18.666,121.441 18.643,121.313 L18.635,121.265 L18.633,121.205 L18.628,121.083 L18.626,121.02 L18.625,121.008 L18.625,121.005 L18.635,120.889 C18.667,120.563 18.699,120.233 18.731,119.902 C18.755,119.562 18.776,119.217 18.774,118.877 C18.773,118.706 18.774,118.537 18.762,118.369 C18.753,118.2 18.746,118.035 18.724,117.871 C18.706,117.708 18.69,117.547 18.657,117.389 C18.628,117.233 18.605,117.081 18.562,116.932 C18.492,116.637 18.394,116.362 18.29,116.116 C18.232,115.995 18.178,115.879 18.123,115.771 C18.059,115.666 17.994,115.57 17.936,115.478 C17.881,115.387 17.816,115.305 17.75,115.235 C17.689,115.167 17.633,115.104 17.583,115.048 C17.58,115.028 17.578,115.009 17.576,114.989 C17.537,114.662 17.576,114.191 17.738,113.592 C17.902,112.995 18.162,112.27 18.47,111.435 C18.777,110.601 19.128,109.655 19.495,108.618 C19.675,108.1 19.862,107.562 20.056,107.005 C20.154,106.724 20.253,106.439 20.353,106.15 C20.458,105.869 20.564,105.584 20.672,105.295 C21.112,104.133 21.585,102.894 22.052,101.601 C22.519,100.308 22.98,98.956 23.455,97.585 C23.93,96.214 24.414,94.822 24.897,93.429 C25.38,92.038 25.854,90.64 26.258,89.239 C26.368,88.89 26.454,88.537 26.549,88.186 C26.596,88.011 26.643,87.837 26.689,87.663 L26.725,87.531 L26.761,87.409 L26.836,87.152 C26.933,86.807 27.041,86.479 27.148,86.157 C27.254,85.833 27.379,85.512 27.488,85.195 C27.958,83.93 28.442,82.739 29.009,81.64 C29.295,81.077 29.574,80.53 29.844,80 C29.911,79.859 29.979,79.725 30.041,79.577 C30.072,79.503 30.104,79.43 30.135,79.357 L30.217,79.157 C30.327,78.892 30.425,78.631 30.525,78.372 C30.911,77.323 31.205,76.342 31.414,75.446 C31.545,74.877 31.64,74.341 31.691,73.847 C31.756,74.026 31.821,74.203 31.887,74.382 C32.254,75.39 32.6,76.417 32.92,77.459 C33.088,77.977 33.237,78.504 33.39,79.03 C33.462,79.296 33.534,79.56 33.606,79.826 L33.708,80.216 C33.742,80.348 33.766,80.47 33.796,80.599 C34.012,81.669 34.216,82.775 34.389,83.877 C34.742,86.085 34.936,88.314 35.031,90.513 C35.126,92.713 35.142,94.882 35.242,96.973 C35.333,99.061 35.42,101.094 35.461,102.985 C35.464,103.212 35.466,103.465 35.455,103.639 L35.451,103.702 L35.448,103.722 L35.44,103.765 L35.409,103.94 C35.39,104.058 35.365,104.163 35.342,104.27 C35.246,104.717 35.15,105.156 35.057,105.588 C34.856,106.467 34.663,107.315 34.477,108.131 C34.292,108.948 34.115,109.731 33.947,110.476 C33.782,111.222 33.626,111.93 33.479,112.595 C33.334,113.261 33.201,113.885 33.076,114.462 C32.955,115.039 32.844,115.569 32.744,116.049 C32.359,117.951 32.138,119.045 32.135,119.063 L31.594,120.296 L31.087,121.55 L30.611,122.815 L30.159,124.088 C30.007,124.512 29.875,124.943 29.732,125.371 C29.59,125.798 29.454,126.227 29.322,126.658 C29.051,127.518 28.811,128.386 28.562,129.253 C28.326,130.122 28.085,130.991 27.877,131.868 L27.556,133.181 L27.254,134.499 C27.152,134.938 27.065,135.381 26.974,135.821 L26.705,137.147 C26.542,138.034 26.36,138.917 26.222,139.809 L26.007,141.143 L25.815,142.483 C25.753,142.93 25.701,143.378 25.651,143.827 L25.499,145.171 L25.382,146.519 L25.325,147.193 C25.307,147.425 25.296,147.643 25.283,147.87 L25.127,150.56 C25.073,151.457 25.052,152.36 25.012,153.258 C24.969,154.158 24.947,155.058 24.921,155.958 L24.896,156.632 L24.886,157.307 C24.882,157.757 24.867,158.207 24.871,158.657 C24.876,159.552 24.864,160.43 24.96,161.345 C24.862,162.647 24.764,163.948 24.655,165.25 L24.506,167.209 C24.483,167.538 24.462,167.863 24.446,168.198 C24.428,168.555 24.45,168.871 24.429,169.175 C24.356,170.433 24.052,171.706 23.815,172.995 C23.566,174.284 23.354,175.592 23.217,176.909 C23.076,178.225 23.01,179.551 22.998,180.875 C22.992,181.535 23.006,182.208 23.025,182.853 L23.063,184.815 C23.081,185.47 23.064,186.116 23.066,186.766 C23.067,187.416 23.077,188.064 23.066,188.717 L23.032,192.633 L22.948,200.475 L22.926,204.399 L22.935,208.329 L22.932,210.286 L22.89,212.242 L22.811,214.196 C22.781,214.848 22.738,215.5 22.702,216.151 L22.646,217.13 L22.568,218.106 L22.504,218.927 C22.482,218.931 22.456,218.935 22.426,218.94 C22.3,218.954 22.115,218.974 21.88,219.001 C21.644,219.025 21.358,219.065 21.033,219.128 C20.871,219.16 20.698,219.195 20.518,219.244 C20.338,219.294 20.155,219.37 19.965,219.459 C19.588,219.644 19.176,219.878 18.713,219.952 C18.495,219.992 18.267,219.975 18.015,219.94 C17.768,219.91 17.462,219.871 17.144,219.972 C16.828,220.068 16.558,220.268 16.348,220.483 C16.137,220.704 15.965,220.942 15.811,221.188 C15.733,221.31 15.658,221.433 15.588,221.558 L15.485,221.747 L15.46,221.796 L15.454,221.807 L15.441,221.833 L15.431,221.856 C15.417,221.889 15.404,221.913 15.385,221.964 C15.249,222.311 15.206,222.616 15.184,222.93 C15.144,223.548 15.219,224.133 15.332,224.694 C15.447,225.253 15.605,225.788 15.794,226.29 C15.98,226.793 16.189,227.267 16.419,227.701 C16.645,228.136 16.89,228.531 17.14,228.882 C17.637,229.582 18.175,230.085 18.616,230.343 C18.834,230.475 19.023,230.547 19.154,230.582 C19.22,230.6 19.27,230.612 19.305,230.616 C19.31,230.618 19.312,230.618 19.315,230.619 C19.326,230.633 19.343,230.645 19.363,230.647 C19.363,230.647 21.363,230.871 24.863,231.26 C25.739,231.352 26.71,231.451 27.77,231.538 C28.831,231.621 29.979,231.708 31.222,231.689 C31.843,231.673 32.489,231.643 33.161,231.476 C33.493,231.387 33.845,231.267 34.156,230.999 C34.3,230.866 34.407,230.771 34.538,230.636 C34.667,230.51 34.786,230.383 34.904,230.247 C35.378,229.712 35.793,229.065 36.029,228.312 C36.268,227.561 36.292,226.725 36.147,225.936 C36.006,225.144 35.74,224.387 35.455,223.644 C35.17,222.901 34.859,222.168 34.576,221.422 C34.297,220.675 34.048,219.912 33.879,219.126 C33.711,218.34 33.613,217.535 33.615,216.717 C33.617,216.512 33.625,216.306 33.636,216.101 L33.661,215.793 L33.69,215.466 C33.73,215.03 33.771,214.591 33.812,214.148 C33.895,213.266 33.974,212.37 34.041,211.463 C34.108,210.556 34.178,209.641 34.247,208.716 C34.307,207.793 34.358,206.855 34.437,205.931 C34.521,205.01 34.621,204.076 34.819,203.177 C35.021,202.268 35.283,201.346 35.558,200.421 C36.111,198.567 36.706,196.684 37.222,194.764 C37.488,193.807 37.722,192.834 37.968,191.87 C38.086,191.384 38.206,190.9 38.325,190.415 C38.456,189.933 38.588,189.453 38.719,188.969 C39.256,187.042 39.894,185.134 40.496,183.209 C41.115,181.288 41.643,179.319 41.993,177.319 C42.163,176.319 42.307,175.315 42.394,174.311 C42.442,173.809 42.49,173.307 42.511,172.806 L42.553,172.055 L42.564,171.868 L42.576,171.7 C42.585,171.578 42.592,171.449 42.604,171.332 C42.66,170.892 42.73,170.421 42.837,169.958 C42.937,169.494 43.063,169.031 43.195,168.571 C43.465,167.651 43.785,166.743 44.122,165.843 C44.798,164.047 45.553,162.29 46.279,160.551 C47.735,157.075 49.113,153.669 50.132,150.323 C50.383,149.484 50.619,148.655 50.82,147.826 C51.024,146.997 51.219,146.205 51.402,145.404 C51.771,143.813 52.109,142.276 52.418,140.794 C53.035,137.833 53.536,135.103 53.915,132.675 C54.005,132.065 54.093,131.476 54.177,130.909 C54.254,130.34 54.327,129.791 54.398,129.262 C54.522,128.206 54.634,127.234 54.706,126.354 C54.794,125.475 54.835,124.687 54.881,124.004 C54.899,123.669 54.911,123.359 54.921,123.074 C54.931,123.356 54.942,123.664 54.959,123.995 C55.006,124.679 55.048,125.467 55.135,126.345 C55.208,127.226 55.319,128.198 55.444,129.255 C55.514,129.782 55.588,130.331 55.664,130.901 C55.749,131.469 55.836,132.057 55.926,132.666 C56.305,135.095 56.806,137.824 57.423,140.786 C57.732,142.268 58.071,143.805 58.439,145.396 C58.622,146.197 58.816,146.989 59.021,147.817 C59.222,148.646 59.458,149.476 59.709,150.315 C60.729,153.661 62.106,157.066 63.563,160.544 C64.289,162.282 65.043,164.038 65.72,165.837 C66.057,166.735 66.376,167.643 66.646,168.563 C66.777,169.024 66.904,169.485 67.004,169.949 C67.11,170.412 67.182,170.884 67.237,171.324 C67.25,171.441 67.256,171.569 67.265,171.692 L67.278,171.859 L67.288,172.048 L67.33,172.798 C67.352,173.3 67.399,173.801 67.447,174.302 C67.534,175.307 67.679,176.31 67.848,177.311 C68.199,179.311 68.726,181.28 69.346,183.2 C69.948,185.127 70.585,187.034 71.122,188.963 C71.253,189.444 71.385,189.926 71.516,190.407 C71.636,190.892 71.755,191.378 71.874,191.861 C72.12,192.826 72.354,193.8 72.619,194.757 C73.135,196.675 73.73,198.559 74.284,200.412 C74.559,201.34 74.82,202.26 75.022,203.17 C75.22,204.067 75.32,205.003 75.403,205.923 C75.484,206.847 75.534,207.785 75.595,208.708 C75.664,209.633 75.732,210.549 75.8,211.455 C75.868,212.362 75.947,213.258 76.03,214.14 C76.07,214.583 76.111,215.021 76.15,215.458 L76.181,215.785 L76.205,216.094 C76.217,216.3 76.224,216.504 76.226,216.709 C76.229,217.526 76.129,218.333 75.962,219.118 C75.793,219.904 75.544,220.667 75.265,221.414 C74.982,222.16 74.671,222.892 74.386,223.636 C74.101,224.38 73.835,225.136 73.694,225.928 C73.55,226.717 73.574,227.553 73.812,228.304 C74.049,229.057 74.463,229.704 74.937,230.239 C75.056,230.375 75.175,230.503 75.303,230.629 C75.434,230.762 75.542,230.858 75.686,230.991 C75.996,231.259 76.348,231.38 76.681,231.467 C77.352,231.635 77.999,231.665 78.619,231.681 C79.862,231.699 81.011,231.612 82.071,231.53 C83.131,231.442 84.102,231.344 84.978,231.253 C88.478,230.863 90.479,230.639 90.479,230.639 C90.498,230.637 90.515,230.626 90.525,230.61 C90.529,230.61 90.532,230.61 90.537,230.608 C90.571,230.604 90.622,230.592 90.687,230.574 C90.818,230.539 91.007,230.467 91.226,230.335 C91.666,230.077 92.203,229.574 92.702,228.874 C92.952,228.523 93.197,228.129 93.422,227.692 C93.652,227.258 93.862,226.785 94.048,226.282 C94.236,225.78 94.394,225.246 94.51,224.686 C94.622,224.126 94.698,223.541 94.658,222.923 C94.636,222.608 94.592,222.303 94.457,221.956 C94.437,221.904 94.425,221.882 94.411,221.848 L94.399,221.825 L94.387,221.8 L94.381,221.788 L94.355,221.739 L94.253,221.55 C94.184,221.425 94.107,221.302 94.031,221.179 C93.876,220.935 93.704,220.696 93.494,220.475 C93.283,220.26 93.014,220.06 92.697,219.965 C92.38,219.863 92.073,219.903 91.826,219.933 C91.575,219.967 91.347,219.984 91.128,219.944 C90.666,219.87 90.253,219.636 89.876,219.451 C89.686,219.361 89.503,219.285 89.323,219.236 C89.144,219.187 88.971,219.152 88.809,219.12 C88.483,219.057 88.198,219.018 87.961,218.992 C87.726,218.967 87.542,218.946 87.416,218.932 C87.386,218.927 87.359,218.924 87.337,218.919 L87.273,218.098 L87.196,217.122 L87.14,216.143 C87.104,215.492 87.06,214.841 87.03,214.188 L86.951,212.233 L86.91,210.278 L86.907,208.321 L86.915,204.391 L86.893,200.467 L86.81,192.626 L86.774,188.71 C86.765,188.056 86.774,187.408 86.774,186.758 C86.777,186.108 86.761,185.462 86.778,184.806 L86.816,182.845 C86.836,182.201 86.849,181.527 86.843,180.868 C86.832,179.544 86.766,178.217 86.625,176.901 C86.486,175.584 86.276,174.276 86.026,172.987 C85.79,171.698 85.485,170.425 85.413,169.168 C85.391,168.863 85.414,168.548 85.396,168.19 C85.379,167.855 85.358,167.53 85.335,167.201 L85.187,165.242 C85.077,163.94 84.979,162.639 84.88,161.338 C84.978,160.423 84.965,159.545 84.97,158.649 C84.975,158.199 84.96,157.749 84.955,157.299 L84.944,156.624 L84.92,155.949 C84.894,155.05 84.872,154.15 84.829,153.251 C84.79,152.352 84.767,151.448 84.713,150.551 L84.559,147.861 C84.545,147.635 84.535,147.417 84.517,147.184 L84.458,146.51 L84.343,145.163 L84.19,143.818 C84.141,143.37 84.088,142.923 84.025,142.475 L83.834,141.135 L83.62,139.8 C83.481,138.909 83.3,138.025 83.136,137.138 L82.867,135.813 C82.776,135.373 82.689,134.93 82.587,134.491 L82.285,133.174 L81.964,131.86 C81.756,130.983 81.516,130.114 81.279,129.245 C81.031,128.378 80.791,127.51 80.52,126.65 C80.388,126.219 80.252,125.79 80.109,125.363 C79.966,124.935 79.834,124.506 79.683,124.08 L79.23,122.807 L78.754,121.543 L78.248,120.288 L77.707,119.055 C77.703,119.037 77.482,117.943 77.097,116.04 C76.997,115.562 76.886,115.031 76.766,114.454 C76.641,113.877 76.506,113.254 76.363,112.588 C76.216,111.923 76.06,111.215 75.894,110.468 C75.726,109.723 75.549,108.94 75.364,108.123 C75.179,107.308 74.985,106.459 74.784,105.579 C74.691,105.148 74.596,104.709 74.5,104.262 C74.477,104.155 74.452,104.05 74.433,103.932 L74.401,103.758 L74.394,103.714 L74.39,103.694 L74.387,103.632 C74.375,103.456 74.378,103.204 74.38,102.976 C74.421,101.087 74.508,99.054 74.6,96.966 C74.7,94.874 74.716,92.705 74.811,90.505 C74.906,88.305 75.099,86.077 75.453,83.869 C75.625,82.766 75.829,81.66 76.045,80.591 C76.075,80.463 76.099,80.341 76.133,80.207 L76.235,79.818 C76.308,79.552 76.379,79.288 76.451,79.022 C76.604,78.495 76.753,77.969 76.922,77.451 C77.242,76.409 77.588,75.383 77.955,74.375 C78.02,74.195 78.085,74.018 78.15,73.84 C78.202,74.332 78.296,74.869 78.427,75.437 C78.637,76.336 78.93,77.315 79.316,78.364 C79.417,78.623 79.514,78.884 79.624,79.149 L79.706,79.349 C79.738,79.422 79.769,79.495 79.8,79.568 C79.861,79.717 79.931,79.851 79.998,79.992 C80.268,80.522 80.546,81.069 80.833,81.632 C81.399,82.731 81.883,83.923 82.353,85.187 C82.463,85.505 82.587,85.825 82.693,86.148 C82.8,86.471 82.908,86.8 83.006,87.144 L83.117,87.523 L83.152,87.654 C83.199,87.829 83.245,88.004 83.292,88.178 C83.388,88.529 83.472,88.883 83.583,89.23 C83.988,90.632 84.461,92.03 84.944,93.422 C85.428,94.814 85.911,96.206 86.387,97.576 C86.861,98.947 87.322,100.3 87.79,101.593 C88.257,102.886 88.729,104.126 89.169,105.287 C89.276,105.576 89.383,105.861 89.488,106.141 C89.589,106.431 89.688,106.716 89.785,106.997 C89.979,107.554 90.167,108.092 90.347,108.61 C90.714,109.648 91.064,110.593 91.372,111.427 C91.679,112.261 91.939,112.987 92.103,113.585 C92.265,114.182 92.305,114.653 92.265,114.981 C92.264,114.999 92.262,115.013 92.26,115.03 C92.255,115.034 92.25,115.038 92.246,115.043 C92.194,115.1 92.137,115.164 92.074,115.234 C92.008,115.304 91.942,115.385 91.888,115.476 C91.829,115.569 91.766,115.666 91.699,115.769 C91.644,115.876 91.589,115.992 91.529,116.113 C91.425,116.358 91.324,116.632 91.252,116.926 C91.208,117.074 91.184,117.227 91.153,117.383 C91.119,117.54 91.102,117.701 91.083,117.864 C91.059,118.027 91.05,118.192 91.04,118.361 C91.026,118.53 91.025,118.698 91.023,118.87 C91.019,119.211 91.036,119.554 91.058,119.895 C91.084,120.235 91.118,120.575 91.148,120.887 L91.158,121.003 L91.158,121.018 L91.155,121.081 L91.151,121.203 L91.148,121.263 L91.14,121.311 C91.118,121.44 91.105,121.557 91.075,121.722 C91.021,122.025 90.969,122.336 90.933,122.628 C90.917,122.775 90.902,122.919 90.887,123.057 C90.875,123.197 90.873,123.334 90.868,123.464 C90.868,123.512 90.866,123.56 90.864,123.608 C90.814,123.833 90.767,124.077 90.722,124.337 C90.653,124.703 90.605,125.1 90.593,125.529 C90.577,125.956 90.579,126.412 90.496,126.868 C90.412,127.317 90.271,127.796 90.014,128.173 C89.952,128.259 89.874,128.346 89.817,128.366 L89.656,128.44 L89.489,128.514 C89.268,128.614 89.046,128.722 88.826,128.836 C88.604,128.948 88.382,129.06 88.156,129.192 C88.041,129.257 87.929,129.331 87.813,129.422 C87.754,129.47 87.695,129.52 87.632,129.589 C87.602,129.62 87.566,129.672 87.536,129.715 C87.5,129.772 87.503,129.768 87.478,129.815 C87.311,130.135 87.292,130.464 87.337,130.753 C87.379,131.043 87.49,131.29 87.602,131.508 L87.688,131.662 L87.726,131.729 L87.74,131.757 L87.742,131.758 C87.756,131.803 87.748,131.774 87.751,131.786 L87.755,131.796 L87.763,131.815 C87.818,131.945 87.901,132.006 87.976,132.051 C88.054,132.098 88.127,132.12 88.197,132.135 C88.477,132.189 88.712,132.152 88.937,132.109 C89.207,132.051 89.452,131.967 89.682,131.875 C89.626,131.913 89.57,131.948 89.515,131.987 C89.305,132.139 89.093,132.292 88.897,132.472 C88.799,132.561 88.699,132.649 88.604,132.756 C88.58,132.781 88.555,132.812 88.531,132.84 C88.52,132.853 88.507,132.871 88.495,132.887 L88.476,132.913 L88.466,132.925 L88.449,132.951 L88.445,132.956 L88.439,132.967 L88.427,132.988 C88.415,133.012 88.402,133.042 88.396,133.063 C88.385,133.1 88.378,133.137 88.377,133.17 C88.373,133.234 88.38,133.292 88.392,133.341 C88.438,133.535 88.528,133.662 88.622,133.781 C88.716,133.896 88.821,133.996 88.935,134.081 C89.159,134.252 89.408,134.372 89.659,134.452 C90.165,134.614 90.68,134.616 91.137,134.537 C91.597,134.46 92.007,134.307 92.364,134.137 C92.385,134.128 92.403,134.118 92.423,134.107 C92.408,134.125 92.39,134.141 92.374,134.159 C92.272,134.28 92.173,134.415 92.123,134.597 C92.1,134.688 92.092,134.796 92.125,134.903 C92.155,135.01 92.226,135.103 92.301,135.168 C92.458,135.296 92.625,135.344 92.783,135.382 C92.941,135.415 93.096,135.427 93.247,135.433 C93.549,135.443 93.838,135.412 94.121,135.376 C94.402,135.333 94.673,135.278 94.938,135.216 C95.192,135.153 95.467,135.077 95.716,134.969 C95.797,134.934 95.875,134.896 95.95,134.856 C95.954,134.86 95.958,134.866 95.963,134.869 C95.99,134.886 96.013,134.893 96.033,134.898 C96.223,135.047 96.422,135.121 96.635,135.171 C96.865,135.221 97.102,135.227 97.33,135.196 C97.558,135.165 97.781,135.11 97.995,135.034 C98.208,134.956 98.41,134.856 98.61,134.754 C99.004,134.54 99.372,134.286 99.721,134.009 C100.071,133.734 100.393,133.431 100.715,133.124 C101.042,132.816 101.338,132.479 101.609,132.121 C101.879,131.761 102.129,131.383 102.348,130.975 C102.457,130.772 102.556,130.559 102.641,130.329 C102.723,130.11 102.788,129.919 102.857,129.709 C102.991,129.286 103.111,128.858 103.197,128.422 C103.288,127.987 103.346,127.549 103.402,127.118 C103.454,126.681 103.49,126.258 103.533,125.815 C103.582,125.357 103.602,124.93 103.615,124.49 C103.625,124.194 103.623,123.898 103.619,123.603 C103.679,123.77 103.75,123.949 103.843,124.131 C103.897,124.248 103.963,124.365 104.028,124.488 C104.098,124.607 104.174,124.729 104.256,124.853 C104.338,124.977 104.425,125.103 104.52,125.229 C104.617,125.354 104.721,125.478 104.83,125.604 C105.048,125.855 105.29,126.112 105.575,126.342 C105.861,126.573 106.179,126.789 106.539,126.968 C106.903,127.14 107.288,127.307 107.766,127.342 C107.826,127.345 107.894,127.339 107.955,127.334 L108.105,127.312 C108.212,127.299 108.322,127.281 108.427,127.257 C108.641,127.209 108.861,127.136 109.065,126.987 C109.166,126.912 109.255,126.804 109.308,126.679 C109.36,126.552 109.37,126.417 109.355,126.293 L109.355,126.293 Z\" />\n        </G>\n      </G>\n    </Svg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { IScreenMuscle } from \"../../../types\";\nimport { Svg, G, Path } from \"../../primitives/svg\";\n\ninterface IMuscleStyle {\n  fill?: string;\n  opacity?: number;\n}\n\ninterface IProps {\n  muscles?: Partial<Record<IScreenMuscle, IMuscleStyle>>;\n  contour?: IMuscleStyle;\n  defaultOpacity?: number;\n}\n\nexport function FrontMusclesSvg(props: IProps): JSX.Element {\n  function getOpacity(muscle: IScreenMuscle): number {\n    return props.muscles?.[muscle]?.opacity ?? props.defaultOpacity ?? 0.3;\n  }\n\n  function getFill(muscle: IScreenMuscle): string {\n    return props.muscles?.[muscle]?.fill ?? \"#28839F\";\n  }\n\n  return (\n    <Svg viewBox=\"0 0 112 234\" width=\"100%\" style={{ aspectRatio: 112 / 234 }}>\n      <G stroke=\"none\" strokeWidth={1} fillRule=\"evenodd\">\n        <G opacity={getOpacity(\"back\")} fill={getFill(\"back\")} transform=\"translate(34.085925, 27.046000)\">\n          <Path d=\"M7.10542736e-15,13.633 C3.609,11.679 10.8,11.254 12.442,8.851 C13.261,7.651 12.061,2.66453526e-15 12.061,2.66453526e-15 C12.848,2.602 15.119,5.645 15.552,8.616 C15.958,11.398 17.18,15.367 15.05,14.931 C11.552,14.214 5.882,13.069 7.10542736e-15,13.633\" />\n          <Path d=\"M43.818,13.633 C40.208,11.679 33.016,11.254 31.376,8.851 C30.556,7.651 31.728,2.66453526e-15 31.728,2.66453526e-15 C30.941,2.602 28.697,5.645 28.264,8.616 C27.859,11.398 26.636,15.367 28.767,14.931 C32.264,14.214 37.935,13.069 43.818,13.633\" />\n        </G>\n        <G opacity={getOpacity(\"forearms\")} fill={getFill(\"forearms\")} transform=\"translate(8.383925, 80.657000)\">\n          <Path d=\"M9.23,2.84217094e-14 C10.583,6.484 13.338,7.896 13.295,11.365 C13.216,17.762 3.839,23.972 -5.32907052e-15,36.565 C1.961,28.621 1.896,21.289 3.558,15.539 C5.553,8.636 9.129,3.01 9.23,2.84217094e-14\" />\n          <Path d=\"M17.083,9.949 C17.083,9.949 14.606,14.013 12.914,16.428 C5.908,26.424 1.738,33.427 1.188,36.764 C5.272,35.099 8.381,37.944 8.381,37.944 C8.381,37.944 7.289,36.157 10.529,30.751 C15.308,22.782 16.732,17.956 17.083,9.949\" />\n          <Path d=\"M85.991,2.84217094e-14 C84.638,6.484 81.882,7.896 81.926,11.365 C82.005,17.762 91.382,23.972 95.221,36.565 C93.26,28.621 93.325,21.289 91.663,15.539 C89.667,8.636 86.092,3.01 85.991,2.84217094e-14\" />\n          <Path d=\"M78.138,9.949 C78.138,9.949 80.614,14.013 82.307,16.428 C89.312,26.424 93.483,33.427 94.032,36.764 C89.949,35.099 86.839,37.944 86.839,37.944 C86.839,37.944 87.932,36.157 84.691,30.751 C79.913,22.782 78.489,17.956 78.138,9.949\" />\n        </G>\n        <G opacity={getOpacity(\"chest\")} fill={getFill(\"chest\")} transform=\"translate(30.865769, 41.393920)\">\n          <Path d=\"M6.47315618,0.284079931 C10.1561562,-0.834920069 18.3901562,1.61007993 20.9701562,3.13607993 C23.4571562,4.60707993 24.2761562,11.4370799 24.4691562,17.3890799 C24.6061562,21.6510799 24.7571562,25.9740799 23.8121562,26.9190799 C21.3401562,29.3910799 7.38315618,28.3520799 3.28315618,22.8010799 C-2.66584382,14.7460799 0.115156175,2.21407993 6.47315618,0.284079931\" />\n          <Path d=\"M43.7841562,0.284079931 C40.1011562,-0.834920069 31.8671562,1.61007993 29.2871562,3.13607993 C26.8001562,4.60707993 25.9801562,11.4370799 25.7881562,17.3890799 C25.6501562,21.6510799 25.4991562,25.9740799 26.4441562,26.9190799 C28.9171562,29.3910799 42.8741562,28.3520799 46.9741562,22.8010799 C52.9221562,14.7460799 50.1421562,2.21407993 43.7841562,0.284079931\" />\n        </G>\n        <G opacity={getOpacity(\"abs\")} fill={getFill(\"abs\")} transform=\"translate(32.792925, 65.058000)\">\n          <Path d=\"M6.595,4.788 C6.595,4.788 3.689,12.233 2.824,19.612 C1.167,14.572 -3.55271368e-15,10.961 -3.55271368e-15,10.961 C-3.55271368e-15,10.961 1.524,5.571 1.359,-1.77635684e-15 C2.893,2.642 6.595,4.788 6.595,4.788\" />\n          <Path d=\"M7.294,5.046 C9.2,5.685 10.687,6.03 11.393,7.577 C14.067,13.434 9.61,21.299 12.194,38.07 C13.22,44.727 4.162,38.244 4.162,38.244 C4.162,38.244 3.858,25.938 3.298,20.852 C4.166,15.265 5.082,11.803 7.294,5.046\" />\n          <Path d=\"M22.185,7.296 C21.607,6.691 17.978,6.934 15.739,9.174 C14.327,10.587 13.952,13.184 14.186,13.667 C14.545,14.409 21.622,14.386 22.185,13.797 C22.689,13.268 22.763,7.9 22.185,7.296\" />\n          <Path d=\"M22.185,15.499 C21.607,14.959 14.736,15.032 14.212,15.581 C13.606,16.214 13.15,21.296 13.803,22.114 C14.457,22.933 21.708,22.887 22.185,22.245 C22.587,21.704 22.763,16.039 22.185,15.499\" />\n          <Path d=\"M22.185,24.059 C21.607,23.463 14.233,23.355 13.638,23.976 C13.085,24.555 13.15,29.789 13.422,30.54 C13.669,31.225 21.929,31.54 22.185,30.668 C22.528,29.498 22.763,24.656 22.185,24.059\" />\n          <Path d=\"M13.729,32.647 C14.842,31.948 21.317,31.811 21.994,33.125 C22.671,34.438 22.823,52.282 21.421,52.139 C15.174,51.507 11.914,33.79 13.729,32.647\" />\n          <Path d=\"M39.808,4.788 C39.808,4.788 42.714,12.233 43.579,19.612 C45.236,14.572 46.403,10.961 46.403,10.961 C46.403,10.961 44.879,5.571 45.044,-1.77635684e-15 C43.51,2.642 39.808,4.788 39.808,4.788\" />\n          <Path d=\"M39.108,5.046 C37.202,5.685 35.715,6.03 35.01,7.577 C32.336,13.434 36.793,21.299 34.209,38.07 C33.183,44.727 42.339,38.244 42.339,38.244 C42.339,38.244 42.545,25.938 43.105,20.852 C42.237,15.265 41.321,11.803 39.108,5.046\" />\n          <Path d=\"M24.217,7.296 C24.796,6.691 28.425,6.934 30.663,9.174 C32.076,10.587 32.45,13.184 32.217,13.667 C31.858,14.409 24.781,14.386 24.217,13.797 C23.714,13.268 23.64,7.9 24.217,7.296\" />\n          <Path d=\"M24.217,15.499 C24.796,14.959 31.667,15.032 32.192,15.581 C32.797,16.214 33.253,21.296 32.599,22.114 C31.946,22.933 24.695,22.887 24.217,22.245 C23.816,21.704 23.64,16.039 24.217,15.499\" />\n          <Path d=\"M24.217,24.059 C24.796,23.463 32.17,23.355 32.764,23.976 C33.319,24.555 33.253,29.789 32.981,30.54 C32.733,31.225 24.473,31.54 24.217,30.668 C23.875,29.498 23.64,24.656 24.217,24.059\" />\n          <Path d=\"M32.674,32.647 C31.561,31.948 25.086,31.811 24.409,33.125 C23.732,34.438 23.58,52.282 24.982,52.139 C31.23,51.507 34.49,33.79 32.674,32.647\" />\n        </G>\n        <G opacity={getOpacity(\"quadriceps\")} fill={getFill(\"quadriceps\")} transform=\"translate(26.427837, 108.418000)\">\n          <Path d=\"M24.2250883,14.335 C26.4070883,16.72 29.3570883,16.803 29.3570883,16.803 C29.4510883,16.806 29.0640883,20.723 28.2680883,23.076 C27.1490883,26.391 26.1610883,29.525 25.1670883,32.358 C24.0030883,35.676 22.8510883,38.637 21.7690883,41.832 C25.5700883,25.151 18.9620883,8.579 24.2250883,14.335\" />\n          <Path d=\"M14.2230883,2.165 C16.9620883,11.015 21.6520883,31.713 16.9780883,49.059 C16.4000883,51.2 14.8290883,53.138 13.1110883,52.548 C10.2770883,51.573 10.5320883,49.663 8.33408833,48.581 C6.54508833,47.7 4.85808833,51.07 2.18508833,48.397 C1.48708833,47.698 1.23208833,46.266 0.853088332,44.57 C-1.94791167,32.027 2.88808833,20.877 4.74608833,15.753 C4.74608833,15.753 13.0140883,16.555 14.2230883,2.165\" />\n          <Path d=\"M14.0970883,-2.84217094e-14 L17.2030883,2.547 C17.2030883,2.547 20.7190883,11.588 21.5780883,27.251 C22.0540883,35.923 20.5180883,46.349 17.9030883,52.82 L17.5940883,51.239 C17.5940883,51.239 20.6550883,40.686 19.9760883,28.971 C19.1810883,15.239 16.3840883,4.584 14.0970883,-2.84217094e-14\" />\n          <Path d=\"M34.9070883,14.335 C32.7260883,16.72 29.7750883,16.803 29.7750883,16.803 C29.6820883,16.806 30.0690883,20.723 30.8640883,23.076 C31.9840883,26.391 33.0480883,29.4 34.0420883,32.233 C35.2060883,35.551 36.2820883,38.637 37.3640883,41.832 C33.5630883,25.151 40.1700883,8.579 34.9070883,14.335\" />\n          <Path d=\"M44.9090883,2.165 C42.1700883,11.015 37.4810883,31.713 42.1550883,49.059 C42.7330883,51.2 44.3040883,53.138 46.0210883,52.548 C48.8560883,51.573 48.6020883,49.663 50.7980883,48.581 C52.5870883,47.7 54.2740883,51.07 56.9480883,48.397 C57.6460883,47.698 57.9010883,46.266 58.2800883,44.57 C61.0810883,32.027 56.2450883,20.877 54.3860883,15.753 C54.3860883,15.753 46.1190883,16.555 44.9090883,2.165\" />\n          <Path d=\"M45.0360883,-2.84217094e-14 L41.9300883,2.547 C41.9300883,2.547 38.4150883,11.588 37.5550883,27.251 C37.0790883,35.923 38.6160883,46.349 41.2290883,52.82 L41.5380883,51.239 C41.5380883,51.239 38.4780883,40.686 39.1570883,28.971 C39.9520883,15.239 42.7490883,4.584 45.0360883,-2.84217094e-14\" />\n        </G>\n        <G opacity={getOpacity(\"calves\")} fill={getFill(\"calves\")} transform=\"translate(23.688857, 161.551000)\">\n          <Path d=\"M3.47606888,0 C3.47606888,0 5.91606888,6.208 4.96106888,15.473 C2.65906888,37.804 1.13706888,47.633 1.13706888,47.633 C1.13706888,47.633 0.620068883,32.362 0.186068883,25.883 C-0.545931117,14.966 0.950068883,4.012 3.47606888,0\" />\n          <Path d=\"M18.9650689,2.026 C16.4540689,8.087 21.8770689,10.888 13.3390689,31.805 C11.3770689,30.467 9.90506888,28.245 9.87506888,25.958 C9.84106888,23.399 10.6590689,3.471 18.9650689,2.026\" />\n          <Path d=\"M9.35506888,27.602 C9.35506888,27.602 9.73606888,30.61 13.0950689,32.633 C13.0950689,32.633 10.3280689,41.414 9.20806888,49.429 C7.79506888,40.463 8.20806888,33.523 9.35506888,27.602\" />\n          <Path d=\"M61.1350689,0 C61.1350689,0 58.6940689,6.208 59.6500689,15.473 C61.9520689,37.804 63.4740689,47.633 63.4740689,47.633 C63.4740689,47.633 63.9900689,32.362 64.4250689,25.883 C65.1570689,14.966 63.6610689,4.012 61.1350689,0\" />\n          <Path d=\"M45.6470689,2.026 C48.1570689,8.087 42.7320689,10.888 51.2700689,31.805 C53.2320689,30.467 54.7060689,28.245 54.7360689,25.958 C54.7700689,23.399 53.9510689,3.471 45.6470689,2.026\" />\n          <Path d=\"M55.2560689,27.602 C55.2560689,27.602 54.8740689,30.61 51.5150689,32.633 C51.5150689,32.633 54.2820689,41.414 55.4030689,49.429 C56.8170689,40.463 56.4020689,33.523 55.2560689,27.602\" />\n        </G>\n        <G opacity={getOpacity(\"shoulders\")} fill={getFill(\"shoulders\")} transform=\"translate(19.035867, 42.008707)\">\n          <Path d=\"M6.16,2.44203801 C1.624,5.55603801 2.774,10.145038 1.394,16.694038 C1.066,18.250038 1.77635684e-15,21.930038 1.77635684e-15,21.930038 C1.978,17.532038 11.252,16.983038 11.252,11.419038 C11.252,2.63303801 17.02,0.101038012 17.02,0.101038012 C17.02,0.101038012 10.796,-0.741961988 6.16,2.44203801\" />\n          <Path d=\"M68.147,2.44203801 C72.683,5.55603801 71.534,10.145038 72.913,16.694038 C73.241,18.250038 74.307,21.930038 74.307,21.930038 C72.329,17.532038 63.055,16.983038 63.055,11.419038 C63.055,2.63303801 57.287,0.101038012 57.287,0.101038012 C57.287,0.101038012 63.511,-0.741961988 68.147,2.44203801\" />\n        </G>\n        <G opacity={getOpacity(\"biceps\")} fill={getFill(\"biceps\")} transform=\"translate(17.858633, 56.483745)\">\n          <Path d=\"M12.6202342,-2.66453526e-14 C11.0822342,3.391 7.90123417,3.34 2.86823417,6.87 C-1.19776583,9.721 -0.938765827,24.887 3.63223417,31.136 C11.0182342,23.75 14.8972342,16.753 14.2342342,8.964 C14.0112342,6.335 12.0372342,3.487 12.6202342,-2.66453526e-14\" />\n          <Path d=\"M64.0422342,-2.66453526e-14 C65.5792342,3.391 68.7602342,3.34 73.7932342,6.87 C77.8582342,9.721 77.6012342,24.887 73.0292342,31.136 C65.6432342,23.75 61.7652342,16.753 62.4272342,8.964 C62.6502342,6.335 64.6242342,3.487 64.0422342,-2.66453526e-14\" />\n        </G>\n        <G\n          opacity={props.contour?.opacity ?? 1}\n          fill={props.contour?.fill ?? \"#28839F\"}\n          transform=\"translate(0.000000, 0.243264)\"\n        >\n          <G transform=\"translate(9.165925, 125.793736)\">\n            <Path d=\"M6.994,4.159 C6.896,4.219 6.816,4.295 6.737,4.343 C6.585,4.448 6.49,4.543 6.49,4.543 L6.489,4.544 C6.487,4.547 6.485,4.549 6.486,4.553 C6.487,4.558 6.492,4.562 6.497,4.562 C6.497,4.562 6.627,4.544 6.811,4.479 C6.858,4.464 6.907,4.444 6.955,4.415 C7.004,4.39 7.054,4.36 7.105,4.327 C7.154,4.292 7.208,4.26 7.253,4.214 C7.3,4.172 7.349,4.13 7.397,4.087 C7.496,4.006 7.58,3.908 7.666,3.826 C7.746,3.737 7.819,3.653 7.877,3.576 C7.994,3.426 8.059,3.317 8.059,3.317 C8.062,3.313 8.061,3.307 8.058,3.305 C8.053,3.301 8.048,3.302 8.044,3.306 C8.044,3.306 7.963,3.403 7.826,3.531 C7.759,3.596 7.675,3.666 7.589,3.744 C7.495,3.815 7.405,3.9 7.3,3.967 C7.197,4.035 7.095,4.105 6.994,4.159\" />\n            <Path d=\"M5.652,4.903 C5.611,4.917 5.553,4.939 5.483,4.958 C5.414,4.981 5.33,5.001 5.243,5.025 C5.199,5.038 5.153,5.045 5.107,5.055 C5.06,5.064 5.013,5.076 4.966,5.08 C4.871,5.094 4.776,5.098 4.688,5.103 C4.601,5.117 4.52,5.12 4.449,5.136 C4.378,5.151 4.319,5.153 4.275,5.165 C4.231,5.173 4.204,5.182 4.204,5.182 L4.203,5.182 C4.201,5.182 4.199,5.184 4.198,5.186 C4.195,5.192 4.196,5.198 4.201,5.2 C4.201,5.2 4.223,5.214 4.265,5.233 C4.306,5.25 4.368,5.28 4.445,5.291 C4.521,5.302 4.613,5.317 4.709,5.302 C4.756,5.293 4.806,5.288 4.854,5.274 C4.903,5.259 4.95,5.245 5,5.231 C5.05,5.219 5.096,5.2 5.142,5.183 C5.189,5.165 5.235,5.151 5.278,5.131 C5.365,5.095 5.444,5.058 5.509,5.021 C5.576,4.987 5.628,4.954 5.666,4.932 C5.703,4.909 5.724,4.897 5.724,4.897 C5.728,4.895 5.73,4.89 5.728,4.886 C5.726,4.881 5.721,4.878 5.716,4.879 C5.716,4.879 5.693,4.888 5.652,4.903\" />\n            <Path d=\"M2.84,5.005 C2.528,4.958 2.116,4.928 1.719,4.841 C1.618,4.824 1.521,4.793 1.424,4.771 C1.33,4.738 1.234,4.715 1.145,4.68 C1.058,4.643 0.968,4.618 0.891,4.578 C0.813,4.538 0.733,4.511 0.667,4.471 C0.6,4.434 0.538,4.402 0.481,4.372 C0.427,4.339 0.381,4.31 0.343,4.285 C0.265,4.237 0.219,4.211 0.219,4.211 C0.219,4.211 0.254,4.25 0.319,4.315 C0.384,4.381 0.48,4.473 0.609,4.566 C0.671,4.617 0.747,4.658 0.825,4.706 C0.902,4.757 0.992,4.794 1.082,4.838 C1.173,4.879 1.271,4.914 1.37,4.95 C1.472,4.975 1.574,5.01 1.678,5.03 C2.097,5.119 2.522,5.117 2.832,5.116 C2.987,5.117 3.117,5.116 3.204,5.129 C3.249,5.131 3.284,5.144 3.308,5.148 C3.333,5.153 3.345,5.156 3.345,5.156 C3.345,5.156 3.334,5.15 3.312,5.138 C3.289,5.129 3.261,5.105 3.215,5.093 C3.126,5.062 2.996,5.03 2.84,5.005\" />\n            <Path d=\"M7.198,0.028 C6.976,0.062 6.658,0.113 6.283,0.203 C6.094,0.246 5.892,0.297 5.678,0.355 C5.464,0.409 5.24,0.475 5.01,0.543 C4.78,0.617 4.541,0.689 4.302,0.773 C4.064,0.858 3.82,0.942 3.581,1.035 C3.34,1.127 3.103,1.225 2.869,1.326 C2.635,1.421 2.412,1.535 2.193,1.637 C1.973,1.737 1.771,1.856 1.575,1.958 C1.381,2.064 1.204,2.176 1.037,2.274 C0.87,2.37 0.728,2.479 0.599,2.567 C0.469,2.653 0.361,2.74 0.274,2.81 C0.1,2.951 5.32907052e-15,3.033 5.32907052e-15,3.033 C5.32907052e-15,3.033 0.108,2.963 0.296,2.84 C0.388,2.778 0.501,2.701 0.638,2.626 C0.774,2.551 0.923,2.457 1.092,2.367 C1.262,2.28 1.443,2.178 1.64,2.083 C1.841,1.992 2.046,1.886 2.265,1.79 C2.484,1.694 2.71,1.592 2.943,1.498 C3.174,1.4 3.411,1.305 3.65,1.215 C4.125,1.028 4.609,0.862 5.061,0.704 C5.29,0.633 5.508,0.553 5.718,0.49 C5.927,0.422 6.126,0.361 6.31,0.308 C6.678,0.201 6.987,0.114 7.205,0.064 C7.313,0.043 7.399,0.018 7.459,0.013 C7.518,0.004 7.55,2.22044605e-16 7.55,2.22044605e-16 C7.55,2.22044605e-16 7.518,0.001 7.459,0.002 C7.398,0.001 7.311,0.014 7.198,0.028\" />\n            <Path d=\"M86.641,4.159 C86.54,4.105 86.438,4.035 86.335,3.967 C86.231,3.9 86.139,3.815 86.047,3.744 C85.96,3.666 85.876,3.596 85.809,3.531 C85.671,3.403 85.591,3.306 85.591,3.306 C85.588,3.303 85.582,3.301 85.578,3.304 C85.573,3.307 85.572,3.313 85.575,3.317 C85.575,3.317 85.641,3.426 85.758,3.576 C85.816,3.653 85.889,3.737 85.969,3.826 C86.055,3.908 86.139,4.006 86.238,4.087 C86.286,4.13 86.334,4.172 86.382,4.214 C86.427,4.26 86.481,4.292 86.529,4.327 C86.581,4.36 86.631,4.39 86.68,4.415 C86.728,4.444 86.777,4.464 86.824,4.479 C87.008,4.544 87.137,4.562 87.137,4.562 C87.14,4.562 87.144,4.561 87.146,4.558 C87.15,4.554 87.15,4.548 87.146,4.544 L87.145,4.543 C87.145,4.543 87.05,4.448 86.897,4.343 C86.819,4.295 86.738,4.219 86.641,4.159\" />\n            <Path d=\"M89.361,5.165 C89.316,5.153 89.257,5.151 89.186,5.136 C89.114,5.12 89.034,5.117 88.947,5.103 C88.859,5.098 88.764,5.094 88.669,5.08 C88.621,5.076 88.575,5.064 88.528,5.055 C88.482,5.045 88.435,5.038 88.392,5.025 C88.304,5.001 88.221,4.981 88.152,4.958 C88.082,4.939 88.023,4.917 87.983,4.903 C87.943,4.888 87.919,4.879 87.919,4.879 C87.914,4.878 87.91,4.879 87.907,4.884 C87.905,4.889 87.906,4.894 87.911,4.897 C87.911,4.897 87.932,4.909 87.969,4.932 C88.006,4.954 88.058,4.987 88.125,5.021 C88.191,5.058 88.27,5.095 88.357,5.131 C88.399,5.151 88.446,5.165 88.492,5.183 C88.539,5.2 88.586,5.219 88.635,5.231 C88.684,5.245 88.733,5.259 88.781,5.274 C88.829,5.288 88.879,5.293 88.926,5.302 C89.021,5.317 89.114,5.302 89.19,5.291 C89.266,5.28 89.328,5.25 89.37,5.233 C89.411,5.214 89.434,5.2 89.434,5.2 C89.436,5.2 89.438,5.198 89.438,5.196 C89.44,5.19 89.436,5.184 89.431,5.182 L89.43,5.182 C89.43,5.182 89.404,5.173 89.361,5.165\" />\n            <Path d=\"M93.154,4.372 C93.097,4.402 93.034,4.434 92.967,4.471 C92.902,4.511 92.822,4.538 92.744,4.578 C92.667,4.618 92.576,4.643 92.49,4.68 C92.401,4.715 92.305,4.738 92.211,4.771 C92.113,4.793 92.017,4.824 91.916,4.841 C91.519,4.928 91.107,4.958 90.795,5.005 C90.638,5.03 90.509,5.062 90.42,5.093 C90.374,5.105 90.345,5.129 90.323,5.138 C90.3,5.15 90.29,5.156 90.29,5.156 C90.29,5.156 90.302,5.153 90.326,5.148 C90.35,5.144 90.386,5.131 90.431,5.129 C90.518,5.116 90.649,5.117 90.803,5.116 C91.113,5.117 91.538,5.119 91.956,5.03 C92.061,5.01 92.163,4.975 92.264,4.95 C92.364,4.914 92.462,4.879 92.553,4.838 C92.643,4.794 92.733,4.757 92.81,4.706 C92.887,4.658 92.964,4.617 93.026,4.566 C93.155,4.473 93.252,4.381 93.316,4.315 C93.381,4.25 93.416,4.211 93.416,4.211 C93.416,4.211 93.369,4.237 93.292,4.285 C93.254,4.31 93.207,4.339 93.154,4.372\" />\n            <Path d=\"M93.361,2.81 C93.273,2.74 93.167,2.653 93.036,2.567 C92.906,2.479 92.764,2.37 92.597,2.274 C92.431,2.176 92.254,2.064 92.06,1.958 C91.863,1.856 91.661,1.737 91.442,1.637 C91.223,1.535 91,1.421 90.765,1.326 C90.532,1.225 90.295,1.127 90.054,1.035 C89.815,0.942 89.571,0.858 89.333,0.773 C89.094,0.689 88.855,0.617 88.626,0.543 C88.394,0.475 88.171,0.409 87.956,0.355 C87.743,0.297 87.54,0.246 87.352,0.203 C86.977,0.113 86.659,0.062 86.437,0.028 C86.324,0.014 86.237,0.001 86.176,0.002 C86.116,0.001 86.084,2.22044605e-16 86.084,2.22044605e-16 C86.084,2.22044605e-16 86.116,0.004 86.175,0.013 C86.236,0.018 86.321,0.043 86.43,0.064 C86.648,0.114 86.957,0.201 87.325,0.308 C87.509,0.361 87.708,0.422 87.917,0.49 C88.128,0.553 88.345,0.633 88.574,0.704 C89.027,0.862 89.51,1.028 89.985,1.215 C90.224,1.305 90.461,1.4 90.692,1.498 C90.925,1.592 91.151,1.694 91.369,1.79 C91.589,1.886 91.795,1.992 91.994,2.083 C92.192,2.178 92.373,2.28 92.543,2.367 C92.713,2.457 92.86,2.551 92.997,2.626 C93.134,2.701 93.246,2.778 93.339,2.84 C93.527,2.963 93.635,3.033 93.635,3.033 C93.635,3.033 93.535,2.951 93.361,2.81\" />\n          </G>\n          <Path d=\"M111.934925,129.662736 C111.902925,129.525736 111.851925,129.398736 111.793925,129.277736 C111.673925,129.037736 111.532925,128.817736 111.386925,128.601736 L111.280925,128.446736 C111.246925,128.393736 111.209925,128.338736 111.178925,128.285736 C111.123925,128.180736 111.068925,128.075736 111.015925,127.959736 C110.908925,127.734736 110.816925,127.496736 110.726925,127.257736 C110.545925,126.779736 110.385925,126.285736 110.189925,125.790736 C110.086925,125.543736 109.989925,125.295736 109.826925,125.034736 L109.752925,124.929736 L109.715925,124.878736 C109.720925,124.885736 109.736925,124.905736 109.723925,124.887736 L109.716925,124.877736 L109.703925,124.857736 C109.677925,124.823736 109.688925,124.826736 109.679925,124.813736 L109.651925,124.750736 C109.607925,124.652736 109.563925,124.538736 109.520925,124.423736 C109.349925,123.960736 109.199925,123.467736 109.047925,122.983736 C108.734925,122.010736 108.453925,121.048736 108.020925,120.115736 C107.964925,119.996736 107.905925,119.879736 107.836925,119.757736 C107.802925,119.698736 107.761925,119.635736 107.720925,119.571736 L107.649925,119.473736 L107.628925,119.447736 L107.620925,119.438736 L107.605925,119.421736 L107.574925,119.387736 L107.475925,119.287736 L107.393925,119.213736 C107.339925,119.168736 107.284925,119.125736 107.232925,119.086736 C107.125925,119.006736 107.022925,118.934736 106.917925,118.868736 C106.500925,118.606736 106.100925,118.380736 105.709925,118.168736 C105.318925,117.956736 104.944925,117.748736 104.596925,117.541736 C104.422925,117.438736 104.259925,117.327736 104.109925,117.218736 C104.036925,117.162736 103.965925,117.106736 103.907925,117.048736 L103.895925,117.035736 C103.900925,117.034736 103.901925,117.045736 103.893925,117.012736 L103.861925,116.875736 C103.699925,116.123736 103.567925,115.420736 103.445925,114.801736 C103.327925,114.181736 103.223925,113.641736 103.137925,113.196736 C103.090925,112.947736 103.048925,112.729736 103.012925,112.541736 C103.009925,112.522736 103.007925,112.503736 103.004925,112.483736 C102.814925,111.002736 102.584925,109.205736 102.319925,107.144736 C102.195925,106.114736 102.064925,105.017736 101.925925,103.861736 C101.861925,103.283736 101.794925,102.690736 101.726925,102.084736 C101.659925,101.473736 101.606925,100.858736 101.523925,100.209736 C101.369925,98.912736 101.101925,97.578736 100.750925,96.221736 C100.391925,94.866736 99.9389254,93.492736 99.4239254,92.104736 C98.4139254,89.323736 97.0449254,86.518736 95.9789254,83.571736 C95.7219254,82.838736 95.4939254,82.077736 95.3609254,81.338736 C95.3239254,81.164736 95.2989254,80.957736 95.2719254,80.756736 L95.2639254,80.695736 L95.2569254,80.619736 L95.2419254,80.468736 L95.2129254,80.164736 C95.1759254,79.759736 95.1309254,79.354736 95.0989254,78.945736 C94.9529254,77.313736 94.8529254,75.655736 94.7399254,73.979736 C94.6319254,72.304736 94.5109254,70.609736 94.3329254,68.909736 C94.1499254,67.209736 93.9059254,65.506736 93.5719254,63.822736 C93.4059254,62.979736 93.2229254,62.141736 93.0099254,61.308736 C92.9119254,60.888736 92.7949254,60.479736 92.6799254,60.069736 C92.5649254,59.659736 92.4499254,59.249736 92.3359254,58.840736 C92.1139254,58.025736 91.9309254,57.205736 91.7889254,56.375736 C91.7229254,55.960736 91.6619254,55.544736 91.6039254,55.129736 C91.5519254,54.711736 91.4999254,54.295736 91.4479254,53.879736 C91.3529254,53.047736 91.2749254,52.215736 91.1989254,51.387736 C91.1209254,50.565736 91.0659254,49.716736 90.8649254,48.899736 C90.4889254,47.264736 89.7189254,45.720736 88.6109254,44.490736 C87.5079254,43.253736 86.1069254,42.330736 84.6079254,41.761736 C84.2319254,41.621736 83.8499254,41.500736 83.4639254,41.401736 C83.2659254,41.354736 83.0639254,41.306736 82.8839254,41.273736 C82.6989254,41.238736 82.5149254,41.203736 82.3309254,41.166736 C81.6139254,41.030736 80.9309254,40.837736 80.2689254,40.586736 C79.6059254,40.338736 78.9439254,40.049736 78.2759254,39.780736 C77.6109254,39.509736 76.9469254,39.251736 76.2829254,39.033736 C74.9619254,38.583736 73.6659254,38.216736 72.4199254,37.887736 C71.7979254,37.733736 71.1909254,37.582736 70.5959254,37.436736 C70.0079254,37.288736 69.4349254,37.135736 68.8859254,36.971736 C68.3369254,36.804736 67.8079254,36.631736 67.3169254,36.433736 C66.8309254,36.235736 66.3659254,36.003736 66.0639254,35.711736 C65.9159254,35.564736 65.8199254,35.413736 65.7679254,35.230736 C65.7429254,35.147736 65.7259254,35.035736 65.7149254,34.916736 C65.7029254,34.798736 65.6849254,34.684736 65.6779254,34.567736 C65.6369254,34.098736 65.6309254,33.636736 65.6289254,33.193736 C65.6309254,32.303736 65.6739254,31.481736 65.7129254,30.739736 C65.8019254,29.252736 65.8999254,28.083736 65.9649254,27.286736 C66.0279254,26.488736 66.0609254,26.063736 66.0609254,26.063736 C66.0629254,26.033736 66.0429254,26.006736 66.0129254,26 C65.9819254,25.995736 65.9509254,26.016736 65.9459254,26.047736 C65.9459254,26.047736 65.8729254,26.468736 65.7349254,27.257736 C65.6029254,28.047736 65.4089254,29.206736 65.2249254,30.695736 C65.1329254,31.439736 65.0459254,32.265736 64.9959254,33.174736 C64.9749254,33.630736 64.9549254,34.105736 64.9719254,34.608736 C64.9719254,34.733736 64.9869254,34.861736 64.9949254,34.991736 C65.0029254,35.116736 65.0139254,35.254736 65.0529254,35.414736 C65.1219254,35.721736 65.2969254,36.023736 65.5119254,36.247736 C65.7269254,36.475736 65.9709254,36.646736 66.2179254,36.798736 C66.4679254,36.951736 66.7239254,37.079736 66.9859254,37.198736 C67.5099254,37.436736 68.0559254,37.634736 68.6189254,37.819736 C69.1819254,38.003736 69.7619254,38.174736 70.3569254,38.340736 C70.9479254,38.502736 71.5519254,38.668736 72.1699254,38.837736 C73.3929254,39.176736 74.6589254,39.551736 75.9449254,40.007736 C76.5879254,40.233736 77.2329254,40.480736 77.8889254,40.741736 C78.5449254,40.998736 79.2079254,41.292736 79.9229254,41.544736 C80.6379254,41.795736 81.3969254,41.987736 82.1609254,42.112736 C82.3479254,42.141736 82.5349254,42.171736 82.7239254,42.200736 C82.9169254,42.225736 83.0869254,42.259736 83.2599254,42.291736 C83.6159254,42.365736 83.9699254,42.459736 84.3209254,42.572736 C85.7219254,43.028736 87.0629254,43.820736 88.1499254,44.922736 C89.2329254,46.021736 90.0619254,47.433736 90.4569254,49.000736 C90.5619254,49.389736 90.6389254,49.787736 90.6979254,50.190736 C90.7529254,50.591736 90.7899254,51.010736 90.8339254,51.422736 C90.9219254,52.250736 91.0099254,53.083736 91.0989254,53.919736 C91.2839254,55.588736 91.5049254,57.285736 91.9239254,58.947736 C92.0309254,59.362736 92.1249254,59.770736 92.2239254,60.186736 C92.3219254,60.601736 92.4239254,61.015736 92.5029254,61.430736 C92.6799254,62.255736 92.8269254,63.091736 92.9589254,63.928736 C93.4779254,67.284736 93.5789254,70.679736 93.7259254,74.034736 C93.7939254,75.712736 93.8779254,77.381736 93.9939254,79.032736 C94.0179254,79.445736 94.0559254,79.855736 94.0869254,80.265736 L94.1119254,80.573736 L94.1239254,80.726736 L94.1299254,80.802736 L94.1399254,80.893736 C94.1629254,81.096736 94.1819254,81.293736 94.2229254,81.519736 C94.3649254,82.382736 94.5929254,83.174736 94.8489254,83.953736 C95.3629254,85.508736 95.9859254,86.962736 96.5849254,88.381736 C96.8809254,89.090736 97.1729254,89.790736 97.4619254,90.483736 C97.7479254,91.174736 98.0279254,91.856736 98.2889254,92.534736 C98.8149254,93.887736 99.2689254,95.220736 99.6419254,96.526736 C100.016925,97.829736 100.307925,99.109736 100.487925,100.350736 C100.664925,101.600736 100.836925,102.830736 101.017925,103.983736 C101.192925,105.139736 101.379925,106.232736 101.555925,107.258736 C101.906925,109.311736 102.246925,111.094736 102.539925,112.559736 C102.640925,113.054736 102.733925,113.510736 102.820925,113.932736 C102.873925,114.224736 102.931925,114.541736 102.994925,114.886736 C103.109925,115.510736 103.234925,116.207736 103.391925,116.978736 L103.424925,117.126736 C103.427925,117.142736 103.442925,117.201736 103.460925,117.246736 L103.468925,117.269736 L103.472925,117.278736 L103.500925,117.323736 L103.525925,117.358736 C103.591925,117.455736 103.663925,117.539736 103.737925,117.621736 C103.885925,117.785736 104.049925,117.928736 104.215925,118.070736 C104.547925,118.352736 104.906925,118.608736 105.272925,118.868736 C105.634925,119.129736 106.018925,119.378736 106.369925,119.651736 C106.456925,119.719736 106.543925,119.785736 106.621925,119.852736 C106.661925,119.886736 106.696925,119.919736 106.732925,119.952736 L106.780925,120.000736 C106.790925,120.012736 106.797925,120.020736 106.806925,120.030736 C106.901925,120.144736 106.994925,120.338736 107.087925,120.544736 C107.269925,120.959736 107.439925,121.417736 107.611925,121.879736 C107.784925,122.346736 107.960925,122.819736 108.136925,123.295736 C108.319925,123.775736 108.496925,124.258736 108.712925,124.752736 C108.765925,124.877736 108.825925,125.001736 108.896925,125.134736 C108.918925,125.171736 108.929925,125.194736 108.959925,125.242736 C108.985925,125.284736 109.025925,125.345736 109.041925,125.361736 L109.108925,125.444736 L109.152925,125.494736 C109.276925,125.662736 109.406925,125.883736 109.525925,126.104736 C109.771925,126.547736 110.007925,127.013736 110.258925,127.472736 C110.382925,127.702736 110.515925,127.929736 110.651925,128.157736 C110.718925,128.268736 110.794925,128.383736 110.874925,128.496736 L110.991925,128.650736 L111.113925,128.803736 C111.269925,128.998736 111.416925,129.199736 111.523925,129.411736 C111.629925,129.619736 111.712925,129.851736 111.658925,130.032736 C111.616925,130.209736 111.426925,130.325736 111.213925,130.378736 C111.106925,130.406736 110.992925,130.423736 110.878925,130.434736 C110.821925,130.440736 110.765925,130.441736 110.709925,130.445736 L110.526925,130.445736 C110.347925,130.434736 110.136925,130.354736 109.947925,130.247736 C109.756925,130.141736 109.573925,130.011736 109.399925,129.873736 C109.050925,129.597736 108.734925,129.290736 108.434925,128.984736 C107.846925,128.363736 107.306925,127.754736 106.893925,127.140736 C106.841925,127.063736 106.793925,126.987736 106.747925,126.914736 C106.701925,126.846736 106.646925,126.751736 106.604925,126.683736 C106.506925,126.521736 106.408925,126.363736 106.311925,126.211736 C106.119925,125.903736 105.911925,125.627736 105.710925,125.369736 C105.505925,125.111736 105.300925,124.883736 105.048925,124.686736 C105.016925,124.661736 104.981925,124.639736 104.942925,124.617736 C104.925925,124.607736 104.900925,124.593736 104.875925,124.580736 C104.843925,124.565736 104.849925,124.572736 104.813925,124.556736 C104.748925,124.538736 104.685925,124.522736 104.623925,124.505736 C104.499925,124.472736 104.377925,124.447736 104.257925,124.428736 C104.140925,124.409736 104.007925,124.401736 103.899925,124.428736 C103.798925,124.449736 103.704925,124.469736 103.616925,124.488736 C103.516925,124.504736 103.428925,124.520736 103.346925,124.533736 C103.169925,124.536736 102.951925,124.531736 102.704925,124.503736 C102.531925,124.487736 102.345925,124.457736 102.151925,124.421736 C101.957925,124.382736 101.752925,124.341736 101.546925,124.283736 C101.339925,124.226736 101.129925,124.158736 100.921925,124.080736 C100.712925,124.006736 100.508925,123.910736 100.310925,123.811736 C100.115925,123.705736 99.9279254,123.588736 99.7639254,123.454736 C99.5989254,123.321736 99.4479254,123.184736 99.3119254,123.045736 C99.1689254,122.914736 99.0499254,122.774736 98.9339254,122.641736 C98.8769254,122.574736 98.8289254,122.502736 98.7769254,122.436736 C98.7299254,122.366736 98.6849254,122.297736 98.6409254,122.231736 C98.6039254,122.161736 98.5659254,122.095736 98.5279254,122.031736 C98.4909254,121.965736 98.4679254,121.899736 98.4349254,121.838736 C98.4019254,121.778736 98.3799254,121.718736 98.3589254,121.661736 C98.3349254,121.606736 98.3129254,121.553736 98.2929254,121.506736 C98.2279254,121.315736 98.1789254,121.196736 98.1789254,121.196736 L98.1769254,121.194736 C98.1729254,121.184736 98.1649254,121.175736 98.1529254,121.171736 C98.1319254,121.163736 98.1089254,121.175736 98.1009254,121.196736 C98.1009254,121.196736 98.0599254,121.314736 98.0179254,121.533736 C98.0079254,121.642736 97.9849254,121.779736 97.9939254,121.935736 C97.9969254,122.093736 98.0209254,122.270736 98.0669254,122.464736 C98.0949254,122.559736 98.1279254,122.658736 98.1649254,122.759736 C98.2119254,122.856736 98.2519254,122.961736 98.3119254,123.059736 C98.3719254,123.157736 98.4309254,123.261736 98.5089254,123.352736 C98.5799254,123.451736 98.6659254,123.538736 98.7549254,123.625736 C98.9349254,123.797736 99.1469254,123.941736 99.3699254,124.061736 C99.5919254,124.184736 99.8249254,124.281736 100.056925,124.374736 C100.291925,124.461736 100.526925,124.540736 100.762925,124.596736 C100.997925,124.658736 101.231925,124.698736 101.457925,124.727736 C101.910925,124.789736 102.335925,124.798736 102.697925,124.779736 C103.058925,124.759736 103.358925,124.717736 103.564925,124.658736 C103.665925,124.630736 103.749925,124.599736 103.800925,124.577736 C103.803925,124.576736 103.804925,124.576736 103.806925,124.574736 C103.841925,124.568736 103.874925,124.562736 103.911925,124.554736 C103.920925,124.554736 103.937925,124.546736 103.939925,124.551736 L103.978925,124.563736 C104.006925,124.568736 104.023925,124.580736 104.044925,124.590736 C104.083925,124.610736 104.134925,124.634736 104.180925,124.660736 C104.276925,124.713736 104.376925,124.779736 104.482925,124.842736 C104.535925,124.874736 104.590925,124.909736 104.646925,124.943736 C104.638925,124.942736 104.675925,124.961736 104.672925,124.963736 C104.675925,124.968736 104.678925,124.971736 104.688925,124.981736 C104.705925,124.996736 104.723925,125.016736 104.742925,125.037736 C104.891925,125.201736 105.036925,125.444736 105.184925,125.695736 C105.212925,125.955736 105.246925,126.215736 105.273925,126.475736 C105.299925,126.708736 105.328925,126.940736 105.347925,127.169736 C105.364925,127.395736 105.389925,127.634736 105.373925,127.819736 L105.071925,129.141736 L104.781925,130.527736 C104.691925,130.989736 104.615925,131.452736 104.539925,131.914736 C104.466925,132.377736 104.398925,132.842736 104.339925,133.308736 L104.317925,133.483736 L104.306925,133.571736 L104.296925,133.643736 C104.283925,133.737736 104.260925,133.839736 104.235925,133.943736 C104.185925,134.149736 104.119925,134.362736 104.048925,134.577736 C103.906925,135.004736 103.732925,135.432736 103.560925,135.863736 L103.042925,137.167736 L102.511925,138.477736 C102.332925,138.910736 102.156925,139.346736 101.950925,139.760736 C101.745925,140.168736 101.525925,140.603736 101.106925,140.623736 C100.999925,140.635736 100.892925,140.637736 100.772925,140.636736 C100.690925,140.633736 100.600925,140.603736 100.516925,140.551736 C100.349925,140.447736 100.209925,140.276736 100.104925,140.092736 C100.001925,139.905736 99.9309254,139.700736 99.8969254,139.495736 C99.8649254,139.293736 99.8739254,139.085736 99.9279254,138.920736 C99.9929254,138.737736 100.096925,138.522736 100.185925,138.309736 L100.464925,137.665736 C100.645925,137.235736 100.811925,136.796736 100.968925,136.356736 L100.972925,136.344736 C100.981925,136.321736 100.987925,136.295736 100.990925,136.270736 C101.044925,135.908736 101.159925,135.520736 101.287925,135.137736 C101.354925,134.945736 101.423925,134.753736 101.497925,134.561736 L101.609925,134.274736 L101.725925,133.993736 L101.745925,133.944736 C101.761925,133.905736 101.768925,133.861736 101.761925,133.817736 C101.747925,133.707736 101.736925,133.597736 101.730925,133.485736 C101.726925,133.371736 101.721925,133.257736 101.723925,133.142736 C101.725925,132.910736 101.747925,132.677736 101.771925,132.443736 C101.795925,132.207736 101.837925,131.974736 101.879925,131.739736 C101.924925,131.502736 101.976925,131.272736 102.042925,131.036736 C102.048925,131.016736 102.041925,130.994736 102.022925,130.983736 C102.000925,130.968736 101.969925,130.974736 101.955925,130.996736 L101.954925,130.996736 C101.821925,131.203736 101.708925,131.428736 101.608925,131.655736 C101.506925,131.881736 101.424925,132.117736 101.349925,132.355736 C101.275925,132.593736 101.220925,132.839736 101.175925,133.090736 C101.154925,133.216736 101.136925,133.343736 101.126925,133.472736 C101.119925,133.562736 101.118925,133.653736 101.116925,133.744736 C101.070925,133.822736 101.027925,133.897736 100.984925,133.974736 C100.931925,134.070736 100.879925,134.163736 100.830925,134.261736 C100.731925,134.453736 100.635925,134.648736 100.549925,134.850736 C100.462925,135.051736 100.381925,135.256736 100.311925,135.469736 C100.250925,135.655736 100.199925,135.845736 100.160925,136.046736 C99.7619254,136.836736 99.3279254,137.605736 98.8399254,138.335736 C98.4729254,138.873736 98.0869254,139.399736 97.6509254,139.869736 C97.4329254,140.104736 97.2069254,140.330736 96.9649254,140.518736 C96.8439254,140.611736 96.7169254,140.694736 96.5979254,140.747736 C96.5419254,140.770736 96.4799254,140.792736 96.4479254,140.790736 L96.4429254,140.791736 L96.4159254,140.789736 C96.3979254,140.787736 96.4119254,140.785736 96.4069254,140.785736 C96.3899254,140.779736 96.3699254,140.774736 96.3479254,140.762736 C96.2549254,140.718736 96.1559254,140.617736 96.0639254,140.511736 C95.9719254,140.403736 95.8929254,140.278736 95.8199254,140.148736 C95.6789254,139.884736 95.5739254,139.588736 95.5579254,139.282736 C95.5509254,139.130736 95.5629254,138.974736 95.6079254,138.828736 C95.6499254,138.668736 95.7069254,138.513736 95.7679254,138.364736 C95.8929254,138.064736 96.0469254,137.772736 96.2159254,137.490736 C96.3889254,137.209736 96.5709254,136.935736 96.7509254,136.660736 C96.9319254,136.383736 97.0979254,136.101736 97.2709254,135.821736 L97.7849254,134.981736 L98.0349254,134.557736 L98.2739254,134.127736 L98.2809254,134.114736 C98.3039254,134.072736 98.3169254,134.023736 98.3159254,133.972736 L98.3129254,133.808736 C98.3119254,133.754736 98.3059254,133.699736 98.3079254,133.645736 C98.3099254,133.536736 98.3049254,133.426736 98.3139254,133.318736 C98.3189254,133.209736 98.3219254,133.100736 98.3329254,132.991736 C98.3369254,132.936736 98.3419254,132.881736 98.3499254,132.827736 L98.3699254,132.663736 C98.3849254,132.555736 98.4029254,132.447736 98.4259254,132.339736 C98.4469254,132.231736 98.4719254,132.122736 98.5009254,132.015736 C98.5289254,131.908736 98.5599254,131.799736 98.5969254,131.693736 C98.6339254,131.586736 98.6749254,131.484736 98.7199254,131.373736 C98.7249254,131.362736 98.7219254,131.349736 98.7139254,131.341736 C98.7019254,131.329736 98.6839254,131.329736 98.6729254,131.342736 L98.6699254,131.344736 C98.5919254,131.424736 98.5129254,131.518736 98.4459254,131.614736 C98.3789254,131.711736 98.3109254,131.810736 98.2529254,131.913736 C98.1949254,132.016736 98.1419254,132.123736 98.0929254,132.233736 C98.0459254,132.342736 98.0049254,132.453736 97.9659254,132.567736 C97.9269254,132.680736 97.8929254,132.795736 97.8669254,132.911736 C97.8379254,133.028736 97.8109254,133.145736 97.7939254,133.263736 C97.7609254,133.468736 97.7409254,133.674736 97.7329254,133.879736 L97.5019254,134.243736 L97.2529254,134.672736 C97.0909254,134.961736 96.9369254,135.255736 96.7879254,135.551736 C96.7609254,135.604736 96.7349254,135.659736 96.7089254,135.710736 C96.3669254,136.152736 96.0219254,136.588736 95.6649254,137.013736 C95.3029254,137.440736 94.9319254,137.858736 94.5309254,138.238736 C94.3319254,138.428736 94.1269254,138.612736 93.9099254,138.770736 C93.6939254,138.930736 93.4649254,139.071736 93.2359254,139.153736 C93.0039254,139.237736 92.7909254,139.231736 92.6529254,139.119736 C92.5069254,139.006736 92.4059254,138.781736 92.3579254,138.542736 C92.3339254,138.424736 92.3209254,138.297736 92.3229254,138.184736 C92.3169254,138.096736 92.3719254,137.975736 92.4129254,137.862736 C92.5079254,137.632736 92.6249254,137.394736 92.7539254,137.159736 C92.8769254,136.919736 93.0129254,136.681736 93.1539254,136.444736 C93.2989254,136.207736 93.4359254,135.964736 93.5709254,135.716736 C93.7069254,135.469736 93.8519254,135.226736 94.0169254,134.997736 L94.1409254,134.825736 C94.1829254,134.768736 94.2299254,134.699736 94.2649254,134.644736 C94.3399254,134.536736 94.4299254,134.428736 94.5239254,134.325736 C94.7119254,134.119736 94.9159254,133.923736 95.1149254,133.726736 C95.3129254,133.528736 95.5099254,133.326736 95.6909254,133.115736 C95.7239254,133.077736 95.7459254,133.030736 95.7519254,132.977736 L95.7529254,132.971736 C95.7749254,132.774736 95.7969254,132.574736 95.8379254,132.375736 C95.8589254,132.278736 95.8739254,132.176736 95.8969254,132.077736 L95.9679254,131.779736 C96.0189254,131.580736 96.0739254,131.380736 96.1329254,131.179736 L96.2209254,130.875736 L96.2639254,130.721736 L96.2839254,130.640736 L96.2929254,130.596736 L96.2949254,130.578736 L96.2949254,130.573736 C96.2949254,130.566736 96.2919254,130.553736 96.2819254,130.545736 C96.2609254,130.530736 96.2579254,130.536736 96.2499254,130.536736 C96.2299254,130.544736 96.2299254,130.550736 96.2279254,130.551736 L96.2209254,130.559736 L96.2209254,130.560736 C96.2169254,130.564736 96.2199254,130.571736 96.2199254,130.576736 L96.1999254,130.602736 L96.1519254,130.664736 L96.0549254,130.794736 C95.9929254,130.882736 95.9329254,130.973736 95.8759254,131.065736 C95.7629254,131.250736 95.6619254,131.444736 95.5749254,131.644736 C95.4869254,131.845736 95.4159254,132.052736 95.3569254,132.266736 C95.3099254,132.453736 95.2699254,132.644736 95.2459254,132.839736 C94.9959254,133.144736 94.7769254,133.473736 94.5649254,133.808736 C94.5589254,133.809736 94.5529254,133.807736 94.5489254,133.811736 C94.5489254,133.811736 94.3829254,133.915736 94.0889254,134.090736 C93.7939254,134.262736 93.3709254,134.506736 92.8459254,134.755736 C92.5839254,134.879736 92.2949254,135.001736 91.9849254,135.102736 C91.6809254,135.199736 91.3299254,135.286736 91.0389254,135.244736 C90.9699254,135.234736 90.9099254,135.209736 90.8869254,135.186736 C90.8779254,135.180736 90.8679254,135.161736 90.8729254,135.169736 C90.8689254,135.157736 90.8589254,135.124736 90.8669254,135.136736 L90.8609254,135.060736 C90.8459254,134.866736 90.8599254,134.742736 90.9079254,134.612736 C90.9499254,134.487736 91.0319254,134.347736 91.1149254,134.230736 L91.1559254,134.169736 L91.1759254,134.139736 L91.1869254,134.123736 C91.1769254,134.140736 91.1879254,134.123736 91.1869254,134.125736 L91.2539254,134.045736 C91.3059254,133.983736 91.3709254,133.918736 91.4319254,133.850736 C91.6849254,133.577736 91.9539254,133.295736 92.2209254,133.024736 C92.4909254,132.753736 92.7459254,132.475736 92.9879254,132.194736 C93.0159254,132.160736 93.0699254,132.096736 93.0919254,132.051736 C93.1209254,131.999736 93.1459254,131.952736 93.1639254,131.904736 C93.2049254,131.810736 93.2319254,131.718736 93.2629254,131.631736 C93.3219254,131.455736 93.3769254,131.290736 93.4449254,131.134736 C93.5779254,130.823736 93.7729254,130.550736 93.9499254,130.350736 C94.1729254,130.037736 94.1959254,129.771736 94.2459254,129.537736 C94.2859254,129.304736 94.3069254,129.107736 94.3239254,128.945736 C94.3409254,128.784736 94.3619254,128.660736 94.3799254,128.573736 C94.3969254,128.490736 94.4209254,128.435736 94.4209254,128.436736 C94.4239254,128.427736 94.4249254,128.416736 94.4219254,128.407736 C94.4189254,128.395736 94.4099254,128.387736 94.3989254,128.381736 C94.3929254,128.369736 94.3739254,128.337736 94.3449254,128.285736 C94.3079254,128.217736 94.2589254,128.117736 94.2099254,127.984736 C94.1149254,127.718736 94.0479254,127.314736 94.1009254,126.836736 C94.1499254,126.358736 94.3089254,125.819736 94.5039254,125.236736 C94.5509254,125.088736 94.5999254,124.939736 94.6409254,124.775736 C94.6509254,124.734736 94.6599254,124.692736 94.6679254,124.647736 C94.6749254,124.607736 94.6829254,124.537736 94.6839254,124.503736 C94.6889254,124.417736 94.6939254,124.330736 94.6989254,124.243736 C94.7169254,123.908736 94.7039254,123.580736 94.6959254,123.254736 C94.6739254,122.606736 94.6479254,121.972736 94.6639254,121.387736 C94.6799254,120.803736 94.7379254,120.269736 94.8509254,119.827736 C94.9069254,119.605736 94.9669254,119.401736 95.0479254,119.231736 C95.1159254,119.053736 95.2019254,118.910736 95.2709254,118.785736 C95.2879254,118.758736 95.3049254,118.732736 95.3219254,118.706736 C95.3519254,118.687736 95.3829254,118.667736 95.4149254,118.646736 C95.5239254,118.581736 95.6439254,118.508736 95.7779254,118.433736 C95.9089254,118.354736 96.0609254,118.284736 96.2139254,118.200736 C96.3729254,118.126736 96.5329254,118.039736 96.7089254,117.967736 C96.7969254,117.930736 96.8829254,117.887736 96.9719254,117.850736 C97.0629254,117.815736 97.1539254,117.779736 97.2459254,117.742736 C97.4299254,117.668736 97.6209254,117.605736 97.8109254,117.539736 C98.0039254,117.483736 98.1929254,117.413736 98.3859254,117.369736 C98.4819254,117.345736 98.5779254,117.320736 98.6709254,117.292736 C98.7649254,117.267736 98.8609254,117.253736 98.9529254,117.231736 C99.0459254,117.210736 99.1369254,117.190736 99.2259254,117.169736 C99.3169254,117.154736 99.4049254,117.139736 99.4909254,117.125736 C99.6639254,117.094736 99.8269254,117.060736 99.9809254,117.044736 C100.132925,117.027736 100.274925,117.002736 100.400925,116.985736 C100.525925,116.975736 100.636925,116.961736 100.728925,116.952736 C100.911925,116.930736 101.018925,116.910736 101.018925,116.910736 C101.018925,116.910736 100.916925,116.879736 100.735925,116.836736 C100.644925,116.815736 100.533925,116.787736 100.405925,116.763736 C100.277925,116.743736 100.131925,116.726736 99.9709254,116.711736 C99.8109254,116.692736 99.6369254,116.688736 99.4519254,116.691736 C99.3599254,116.693736 99.2639254,116.694736 99.1669254,116.695736 C99.0699254,116.704736 98.9709254,116.714736 98.8709254,116.724736 C98.6689254,116.741736 98.4629254,116.778736 98.2539254,116.823736 C98.0439254,116.859736 97.8389254,116.932736 97.6299254,116.990736 C97.4269254,117.063736 97.2219254,117.134736 97.0289254,117.225736 C96.8349254,117.314736 96.6469254,117.407736 96.4739254,117.512736 C96.2959254,117.610736 96.1369254,117.727736 95.9849254,117.831736 C95.8379254,117.946736 95.6999254,118.053736 95.5829254,118.165736 C95.4879254,118.246736 95.4089254,118.330736 95.3359254,118.410736 C95.4139254,118.220736 95.4929254,117.989736 95.5509254,117.708736 C95.6179254,117.381736 95.6429254,116.993736 95.6229254,116.565736 C95.5729254,115.709736 95.3169254,114.710736 94.8999254,113.638736 C94.4889254,112.563736 93.9109254,111.405736 93.2269254,110.199736 C92.5509254,109.012736 91.8539254,107.715736 91.1019254,106.347736 C90.3539254,104.978736 89.5659254,103.526736 88.8729254,101.961736 C88.1739254,100.400736 87.6079254,98.715736 87.2409254,96.957736 C87.1449254,96.519736 87.0689254,96.076736 87.0019254,95.629736 C86.9309254,95.184736 86.8759254,94.735736 86.8399254,94.283736 C86.7409254,93.379736 86.7729254,92.491736 86.6899254,91.529736 C86.6109254,90.590736 86.4739254,89.650736 86.2469254,88.735736 C86.0329254,87.817736 85.7279254,86.927736 85.3939254,86.062736 C84.7159254,84.336736 83.8769254,82.731736 83.1259254,81.205736 C82.9409254,80.825736 82.7559254,80.446736 82.5859254,80.078736 C82.4159254,79.700736 82.2469254,79.324736 82.0789254,78.952736 C81.7619254,78.208736 81.4469254,77.477736 81.1779254,76.752736 C80.6199254,75.310736 80.1499254,73.921736 79.7869254,72.616736 C79.4089254,71.315736 79.1309254,70.102736 78.8999254,69.020736 C78.8479254,68.747736 78.7979254,68.485736 78.7499254,68.231736 C78.7019254,67.976736 78.6469254,67.732736 78.6129254,67.495736 C78.5749254,67.257736 78.5389254,67.031736 78.5039254,66.813736 C78.4679254,66.595736 78.4289254,66.388736 78.4059254,66.190736 C78.3509254,65.794736 78.3059254,65.440736 78.2589254,65.131736 C78.2229254,64.822736 78.1929254,64.559736 78.1689254,64.345736 C78.1639254,64.302736 78.1589254,64.262736 78.1539254,64.223736 C78.1749254,64.196736 78.1989254,64.168736 78.2189254,64.142736 C78.7769254,63.416736 79.2119254,62.666736 79.5529254,61.953736 C79.8979254,61.240736 80.1389254,60.556736 80.3149254,59.943736 C80.4949254,59.330736 80.5969254,58.784736 80.6659254,58.334736 C80.7339254,57.884736 80.7539254,57.527736 80.7649254,57.285736 C80.7759254,57.041736 80.7699254,56.912736 80.7699254,56.912736 C80.7699254,56.912736 80.6949254,57.426736 80.4419254,58.285736 C80.3149254,58.713736 80.1349254,59.226736 79.8999254,59.797736 C79.6599254,60.367736 79.3519254,60.991736 78.9699254,61.640736 C78.5829254,62.287736 78.1089254,62.950736 77.5509254,63.598736 C76.9919254,64.245736 76.3249254,64.853736 75.5889254,65.414736 C74.8509254,65.976736 74.0179254,66.456736 73.1419254,66.881736 C72.2649254,67.308736 71.3169254,67.621736 70.3569254,67.881736 L69.6329254,68.064736 C69.3889254,68.121736 69.1429254,68.161736 68.8989254,68.210736 C68.4119254,68.316736 67.9159254,68.369736 67.4279254,68.443736 C67.1839254,68.481736 66.9359254,68.491736 66.6929254,68.517736 C66.4469254,68.540736 66.2039254,68.565736 65.9609254,68.588736 C65.4659254,68.625736 64.9769254,68.662736 64.4969254,68.700736 C63.5389254,68.764736 62.6209254,68.833736 61.7569254,68.836736 C61.3249254,68.839736 60.9079254,68.819736 60.5089254,68.787736 C60.1099254,68.754736 59.7269254,68.703736 59.3719254,68.618736 C58.6649254,68.445736 58.0509254,68.164736 57.6269254,67.762736 C57.1919254,67.370736 56.9489254,66.888736 56.8009254,66.480736 C56.7619254,66.376736 56.7279254,66.278736 56.7059254,66.182736 C56.6819254,66.086736 56.6539254,65.997736 56.6359254,65.913736 C56.6059254,65.744736 56.5719254,65.598736 56.5589254,65.479736 C56.5309254,65.239736 56.5149254,65.111736 56.5149254,65.111736 C56.5149254,65.111736 56.5079254,65.241736 56.4929254,65.483736 C56.4899254,65.725736 56.4819254,66.086736 56.5779254,66.541736 C56.6739254,66.989736 56.8549254,67.561736 57.3069254,68.069736 C57.7389254,68.591736 58.4169254,69.000736 59.1879254,69.256736 C59.9609254,69.514736 60.8269254,69.647736 61.7299254,69.700736 C62.6349254,69.756736 63.5819254,69.755736 64.5509254,69.718736 C65.0329254,69.700736 65.5239254,69.683736 66.0199254,69.664736 C66.5219254,69.636736 67.0389254,69.613736 67.5529254,69.559736 C68.0679254,69.490736 68.5909254,69.451736 69.1069254,69.339736 C69.3649254,69.289736 69.6259254,69.246736 69.8839254,69.190736 L70.6559254,68.998736 C71.6759254,68.708736 72.6869254,68.360736 73.6279254,67.886736 C74.5729254,67.422736 75.4419254,66.845736 76.2189254,66.213736 C76.8389254,65.712736 77.3839254,65.159736 77.8599254,64.588736 C77.8479254,64.753736 77.8359254,64.940736 77.8229254,65.149736 C77.8109254,65.463736 77.8049254,65.825736 77.7959254,66.231736 C77.7869254,67.043736 77.8169254,68.032736 77.9109254,69.162736 C78.0119254,70.293736 78.1899254,71.565736 78.4639254,72.940736 C78.6559254,73.855736 78.8919254,74.817736 79.1829254,75.805736 C79.1219254,75.994736 79.0549254,76.199736 78.9829254,76.422736 C78.5789254,77.673736 78.0019254,79.459736 77.3089254,81.604736 C76.9539254,82.669736 76.5699254,83.824736 76.1629254,85.044736 C76.1119254,85.196736 76.0609254,85.350736 76.0099254,85.504736 C75.9599254,85.664736 75.9079254,85.825736 75.8569254,85.987736 C75.7509254,86.369736 75.7119254,86.702736 75.6669254,87.053736 C75.5899254,87.747736 75.5559254,88.447736 75.5279254,89.158736 C75.4739254,90.578736 75.4369254,92.039736 75.3379254,93.521736 C75.2539254,95.002736 75.1279254,96.506736 74.9909254,98.010736 C74.8579254,99.514736 74.7239254,101.021736 74.6609254,102.505736 C74.5939254,103.992736 74.5369254,105.452736 74.5279254,106.877736 C74.5289254,107.059736 74.5289254,107.239736 74.5299254,107.416736 C74.5339254,107.600736 74.5329254,107.771736 74.5529254,107.987736 L74.5569254,108.029736 L74.5669254,108.088736 L74.5779254,108.153736 L74.5899254,108.217736 L74.6079254,108.297736 L74.6449254,108.457736 L74.6809254,108.592736 C74.7289254,108.771736 74.7809254,108.937736 74.8339254,109.105736 C75.0469254,109.768736 75.2739254,110.397736 75.5039254,111.006736 C75.9639254,112.224736 76.4339254,113.356736 76.8679254,114.402736 C77.3109254,115.444736 77.7199254,116.396736 78.0969254,117.234736 C78.4679254,118.076736 78.8039254,118.803736 79.0799254,119.403736 C79.3559254,120.002736 79.5729254,120.473736 79.7209254,120.793736 C79.8709254,121.114736 79.9419254,121.287736 79.9419254,121.287736 L79.9439254,121.288736 C79.9439254,121.290736 79.9429254,121.290736 79.9429254,121.291736 C80.1949254,122.059736 80.4439254,122.827736 80.6849254,123.591736 C80.9219254,124.361736 81.1609254,125.127736 81.3789254,125.902736 C81.4959254,126.285736 81.6009254,126.673736 81.7099254,127.059736 C81.8189254,127.445736 81.9249254,127.832736 82.0239254,128.221736 C82.2339254,128.996736 82.4269254,129.775736 82.6209254,130.553736 C82.7979254,131.334736 82.9899254,132.113736 83.1579254,132.897736 C83.3369254,133.678736 83.4879254,134.466736 83.6479254,135.251736 C83.7959254,136.039736 83.9589254,136.824736 84.0899254,137.615736 L84.2939254,138.799736 L84.4819254,139.988736 C84.6199254,140.777736 84.7199254,141.572736 84.8429254,142.364736 C84.9599254,143.158736 85.0699254,143.952736 85.1779254,144.747736 L85.4889254,147.135736 C85.5929254,147.935736 85.6949254,148.734736 85.7839254,149.532736 C85.8799254,150.330736 85.9589254,151.130736 86.0399254,151.930736 C86.1179254,152.731736 86.1679254,153.533736 86.2169254,154.335736 C86.2509254,155.137736 86.2779254,155.941736 86.2709254,156.743736 C86.2649254,157.143736 86.2499254,157.542736 86.2229254,157.940736 C86.2079254,158.138736 86.1939254,158.337736 86.1679254,158.532736 C86.1569254,158.630736 86.1439254,158.727736 86.1269254,158.821736 C86.1189254,158.869736 86.1099254,158.916736 86.0999254,158.961736 C86.0909254,159.004736 86.0759254,159.058736 86.0699254,159.078736 L86.0659254,159.088736 C86.0579254,159.114736 86.0539254,159.141736 86.0579254,159.170736 C86.1839254,160.328736 86.3189254,161.487736 86.4229254,162.647736 C86.5259254,163.803736 86.6439254,164.976736 86.6939254,166.114736 L86.6919254,166.307736 L86.6779254,166.525736 C86.6719254,166.670736 86.6669254,166.833736 86.6669254,166.982736 C86.6649254,167.282736 86.6789254,167.579736 86.6939254,167.876736 C86.7289254,168.468736 86.7869254,169.053736 86.8479254,169.636736 L87.2419254,173.110736 C87.3649254,174.264736 87.4779254,175.415736 87.5489254,176.569736 C87.6229254,177.722736 87.6669254,178.875736 87.6629254,180.028736 C87.6649254,180.604736 87.6489254,181.180736 87.6299254,181.756736 C87.6059254,182.328736 87.5719254,182.908736 87.5379254,183.492736 L87.3199254,186.978736 L87.1229254,190.471736 C87.0619254,191.637736 87.0179254,192.803736 86.9689254,193.969736 C86.9239254,195.136736 86.8809254,196.303736 86.8589254,197.471736 C86.8359254,198.640736 86.8109254,199.808736 86.8129254,200.978736 C86.8109254,202.147736 86.8239254,203.318736 86.8549254,204.488736 C86.8709254,205.074736 86.8999254,205.657736 86.9239254,206.244736 L87.0269254,207.992736 C87.1009254,209.157736 87.1639254,210.320736 87.2589254,211.485736 C87.3519254,212.651736 87.4379254,213.815736 87.5459254,214.977736 C87.5469254,214.986736 87.5519254,214.994736 87.5569254,215.000736 C87.5589254,215.031736 87.5629254,215.103736 87.5719254,215.214736 C87.5849254,215.363736 87.5969254,215.577736 87.6739254,215.852736 C87.7049254,215.991736 87.7459254,216.145736 87.7929254,216.312736 C87.8459254,216.471736 87.9059254,216.643736 87.9749254,216.826736 C88.1019254,217.197736 88.3049254,217.582736 88.5159254,218.012736 C88.6289254,218.223736 88.7599254,218.434736 88.8939254,218.654736 C89.0259254,218.874736 89.1699254,219.099736 89.3429254,219.310736 C89.5099254,219.526736 89.6969254,219.738736 89.8859254,219.952736 C90.0869254,220.159736 90.3039254,220.359736 90.5169254,220.565736 C90.6259254,220.667736 90.7299254,220.774736 90.8369254,220.879736 C90.9509254,220.978736 91.0629254,221.079736 91.1749254,221.183736 C91.3979254,221.389736 91.6099254,221.610736 91.8229254,221.833736 C92.2609254,222.265736 92.6769254,222.727736 93.0609254,223.216736 C93.4469254,223.703736 93.8129254,224.202736 94.1849254,224.673736 C94.5519254,225.148736 94.8919254,225.626736 95.1859254,226.099736 C95.4759254,226.574736 95.7309254,227.036736 95.9019254,227.477736 C96.0729254,227.916736 96.1549254,228.330736 96.0979254,228.678736 C96.0439254,229.024736 95.8389254,229.310736 95.5979254,229.541736 C95.3399254,229.755736 95.0769254,229.933736 94.8399254,230.049736 C94.7939254,230.073736 94.7519254,230.094736 94.7099254,230.116736 C94.7579254,230.017736 94.7959254,229.914736 94.8199254,229.813736 C94.8899254,229.506736 94.8829254,229.210736 94.8399254,228.940736 C94.7989254,228.668736 94.7189254,228.418736 94.6319254,228.181736 C94.5389254,227.947736 94.4339254,227.727736 94.3189254,227.524736 C94.0899254,227.118736 93.8329254,226.773736 93.5909254,226.497736 C93.3489254,226.221736 93.1199254,226.016736 92.9489254,225.883736 C92.7789254,225.748736 92.6659254,225.694736 92.6659254,225.694736 C92.6659254,225.694736 92.6799254,225.721736 92.7049254,225.773736 C92.7309254,225.824736 92.7619254,225.901736 92.8059254,225.995736 C92.8899254,226.187736 93.0049254,226.459736 93.1379254,226.782736 C93.2709254,227.104736 93.4229254,227.477736 93.5639254,227.871736 C93.7029254,228.265736 93.8359254,228.688736 93.8899254,229.078736 C93.9139254,229.273736 93.9199254,229.457736 93.8899254,229.602736 C93.8619254,229.750736 93.8099254,229.852736 93.7259254,229.943736 C93.6829254,229.988736 93.6289254,230.030736 93.5659254,230.069736 C93.5389254,230.087736 93.4929254,230.106736 93.4719254,230.119736 C93.4309254,230.137736 93.3899254,230.155736 93.3499254,230.172736 C93.2089254,230.233736 93.0569254,230.272736 92.9129254,230.289736 C92.7699254,230.304736 92.6289254,230.302736 92.4999254,230.284736 C92.4559254,230.278736 92.4159254,230.269736 92.3749254,230.260736 C92.3989254,230.209736 92.4229254,230.157736 92.4409254,230.104736 C92.5489254,229.814736 92.5879254,229.503736 92.5739254,229.199736 C92.5709254,229.129736 92.5589254,229.024736 92.5509254,228.974736 C92.5389254,228.893736 92.5239254,228.810736 92.5039254,228.738736 C92.4639254,228.587736 92.4109254,228.453736 92.3549254,228.327736 C92.2419254,228.075736 92.1129254,227.850736 91.9739254,227.646736 C91.7009254,227.235736 91.4049254,226.896736 91.1359254,226.620736 C90.5969254,226.070736 90.1529254,225.790736 90.1529254,225.790736 C90.1529254,225.790736 90.2019254,225.912736 90.2949254,226.116736 C90.3869254,226.320736 90.5229254,226.606736 90.6889254,226.940736 C90.8539254,227.274736 91.0499254,227.657736 91.2379254,228.061736 C91.3299254,228.264736 91.4219254,228.470736 91.4919254,228.674736 C91.5289254,228.774736 91.5589254,228.874736 91.5769254,228.966736 C91.5899254,229.014736 91.5939254,229.054736 91.6009254,229.096736 C91.6089254,229.170736 91.6099254,229.189736 91.6119254,229.244736 C91.6219254,229.437736 91.5969254,229.631736 91.5489254,229.807736 C91.4989254,229.983736 91.4219254,230.138736 91.3239254,230.258736 C91.2259254,230.378736 91.1069254,230.465736 90.9659254,230.520736 C90.9309254,230.534736 90.8939254,230.545736 90.8569254,230.554736 C90.8509254,230.557736 90.8289254,230.561736 90.8369254,230.561736 L90.7989254,230.567736 L90.7219254,230.578736 C90.6149254,230.599736 90.5419254,230.605736 90.4579254,230.618736 C90.1209254,230.653736 89.8339254,230.627736 89.6409254,230.555736 C89.6359254,230.554736 89.6329254,230.552736 89.6299254,230.550736 C89.6999254,230.361736 89.7319254,230.171736 89.7409254,229.995736 C89.7579254,229.475736 89.6159254,229.035736 89.4429254,228.652736 C89.3479254,228.459736 89.2749254,228.310736 89.1829254,228.141736 C89.0929254,227.979736 89.0079254,227.820736 88.9219254,227.676736 C88.7529254,227.383736 88.5889254,227.121736 88.4419254,226.889736 C88.2969254,226.658736 88.1619254,226.459736 88.0509254,226.297736 C87.8299254,225.970736 87.6909254,225.790736 87.6909254,225.790736 C87.6909254,225.790736 87.7529254,226.009736 87.8769254,226.383736 C87.9979254,226.757736 88.1839254,227.286736 88.4079254,227.914736 C88.4639254,228.070736 88.5219254,228.231736 88.5809254,228.398736 C88.6389254,228.557736 88.7059254,228.753736 88.7569254,228.914736 C88.8529254,229.245736 88.9099254,229.610736 88.8659254,229.926736 C88.8469254,230.083736 88.7959254,230.222736 88.7289254,230.311736 C88.6959254,230.356736 88.6619254,230.391736 88.6209254,230.415736 C88.6189254,230.423736 88.5079254,230.470736 88.4309254,230.497736 C88.0929254,230.622736 87.6989254,230.676736 87.3059254,230.674736 C87.1089254,230.672736 86.9109254,230.657736 86.7199254,230.626736 C86.6249254,230.611736 86.5309254,230.592736 86.4429254,230.567736 C86.4279254,230.563736 86.4139254,230.558736 86.3999254,230.554736 C86.4019254,230.547736 86.4049254,230.540736 86.4069254,230.534736 C86.4879254,230.298736 86.5409254,230.057736 86.5649254,229.823736 C86.6109254,229.351736 86.5599254,228.908736 86.4659254,228.509736 C86.3719254,228.110736 86.2379254,227.753736 86.0939254,227.438736 C85.9509254,227.122736 85.7919254,226.850736 85.6499254,226.612736 C85.5049254,226.375736 85.3629254,226.180736 85.2479254,226.020736 C85.0109254,225.702736 84.8609254,225.535736 84.8609254,225.535736 C84.8609254,225.535736 84.9469254,225.742736 85.0979254,226.104736 C85.1739254,226.284736 85.2559254,226.505736 85.3489254,226.757736 C85.4239254,226.959736 85.4969254,227.187736 85.5659254,227.432736 C85.3859254,227.284736 85.1989254,227.156736 85.0079254,227.051736 C84.4029254,226.725736 83.7809254,226.556736 83.1979254,226.512736 C82.6169254,226.473736 82.0699254,226.539736 81.6259254,226.732736 C81.4039254,226.825736 81.2099254,226.944736 81.0489254,227.077736 C80.8899254,227.211736 80.7699254,227.364736 80.6809254,227.507736 C80.5039254,227.798736 80.4569254,228.060736 80.4349254,228.230736 C80.4259254,228.316736 80.4229254,228.381736 80.4239254,228.426736 C80.4229254,228.470736 80.4229254,228.493736 80.4229254,228.493736 C80.4229254,228.493736 80.4439254,228.404736 80.4979254,228.244736 C80.5569254,228.088736 80.6589254,227.860736 80.8599254,227.641736 C81.0609254,227.423736 81.3669254,227.226736 81.7609254,227.134736 C82.1539254,227.043736 82.6229254,227.030736 83.1159254,227.132736 C83.6069254,227.232736 84.1319254,227.420736 84.5949254,227.734736 C85.0559254,228.038736 85.4659254,228.477736 85.5839254,228.976736 C85.5889254,229.005736 85.5989254,229.040736 85.6019254,229.066736 C85.6049254,229.096736 85.6099254,229.107736 85.6139254,229.158736 L85.6209254,229.221736 L85.6219254,229.264736 L85.6259254,229.378736 C85.6259254,229.527736 85.6229254,229.676736 85.5969254,229.809736 C85.5489254,230.084736 85.4519254,230.299736 85.2799254,230.446736 C85.1089254,230.596736 84.8419254,230.700736 84.5339254,230.759736 C84.2259254,230.819736 83.8839254,230.840736 83.5339254,230.855736 C83.1779254,230.865736 82.8209254,230.873736 82.4659254,230.883736 C82.1249254,230.887736 81.7889254,230.869736 81.4709254,230.821736 C81.3089254,230.796736 81.1529254,230.761736 81.0059254,230.714736 C80.9719254,230.692736 80.9339254,230.665736 80.8909254,230.635736 C80.7289254,230.510736 80.4789254,230.321736 80.2279254,230.021736 C79.9759254,229.725736 79.7379254,229.303736 79.7009254,228.748736 C79.6539254,228.197736 79.7629254,227.539736 79.9059254,226.791736 C80.0509254,226.043736 80.2029254,225.195736 80.2809254,224.253736 C80.3009254,224.018736 80.3139254,223.778736 80.3239254,223.532736 C80.3269254,223.408736 80.3299254,223.284736 80.3329254,223.159736 L80.3269254,222.959736 C80.3199254,222.883736 80.3159254,222.803736 80.3029254,222.729736 C80.2839254,222.581736 80.2429254,222.422736 80.1809254,222.266736 C80.1179254,222.109736 80.0239254,221.953736 79.9169254,221.826736 C79.6979254,221.567736 79.4909254,221.416736 79.3639254,221.255736 C79.2309254,221.098736 79.1389254,220.922736 79.0699254,220.707736 C79.0019254,220.493736 78.9599254,220.248736 78.9359254,219.994736 C78.8839254,219.482736 78.8979254,218.914736 78.9439254,218.347736 C78.9929254,217.795736 79.0999254,217.226736 79.2779254,216.670736 C79.4539254,216.108736 79.7049254,215.567736 79.9659254,214.919736 C80.0289254,214.754736 80.0909254,214.580736 80.1419254,214.391736 C80.1669254,214.297736 80.1889254,214.198736 80.2069254,214.094736 C80.2169254,214.044736 80.2209254,213.991736 80.2289254,213.938736 C80.2329254,213.911736 80.2339254,213.884736 80.2359254,213.857736 L80.2389254,213.817736 C80.2399254,213.793736 80.2409254,213.811736 80.2429254,213.755736 C80.2429254,213.586736 80.2489254,213.427736 80.2359254,213.231736 L80.2209254,212.949736 L80.1989254,212.686736 C80.1349254,211.987736 80.0509254,211.291736 79.9399254,210.586736 C79.8329254,209.882736 79.7129254,209.172736 79.5889254,208.451736 C79.4619254,207.730736 79.3169254,207.003736 79.1759254,206.266736 C79.1049254,205.898736 79.0319254,205.528736 78.9599254,205.155736 C78.9229254,204.969736 78.8859254,204.783736 78.8489254,204.596736 C78.8089254,204.406736 78.7689254,204.215736 78.7289254,204.023736 C78.5459254,203.227736 78.3029254,202.481736 78.0329254,201.725736 C77.4949254,200.221736 76.8399254,198.748736 76.2789254,197.221736 C76.1379254,196.839736 75.9989254,196.455736 75.8769254,196.067736 C75.7549254,195.672736 75.6319254,195.278736 75.5079254,194.881736 C75.3839254,194.483736 75.2589254,194.085736 75.1339254,193.685736 C75.0109254,193.284736 74.8879254,192.882736 74.7649254,192.479736 C74.2649254,190.869736 73.7589254,189.238736 73.2489254,187.594736 C72.9969254,186.773736 72.7439254,185.948736 72.4899254,185.119736 C72.2459254,184.290736 72.0039254,183.457736 71.7759254,182.622736 C71.3169254,180.952736 70.9509254,179.263736 70.7969254,177.555736 C70.6369254,175.846736 70.6559254,174.121736 70.7179254,172.398736 C70.7499254,171.535736 70.7999254,170.674736 70.8519254,169.815736 L70.8619254,169.654736 L70.8689254,169.479736 C70.8749254,169.378736 70.8739254,169.246736 70.8739254,169.125736 C70.8709254,168.887736 70.8589254,168.659736 70.8379254,168.427736 C70.7959254,167.969736 70.7239254,167.521736 70.6359254,167.081736 C70.2709254,165.326736 69.6709254,163.694736 69.0509254,162.109736 C68.4249254,160.525736 67.7579254,158.992736 67.0849254,157.497736 C65.7579254,154.503736 64.4319254,151.646736 63.4069254,148.860736 C62.8819254,147.468736 62.4359254,146.114736 62.0719254,144.755736 C61.9799254,144.418736 61.8779254,144.073736 61.7769254,143.734736 C61.6719254,143.399736 61.5689254,143.067736 61.4599254,142.741736 C61.2469254,142.086736 61.0259254,141.450736 60.8039254,140.829736 C60.3609254,139.590736 59.9149254,138.414736 59.4909254,137.298736 C59.0689254,136.183736 58.6789254,135.124736 58.3269254,134.125736 C57.6209254,132.128736 57.1099254,130.358736 56.7709254,128.877736 C56.6049254,128.137736 56.4859254,127.470736 56.3919254,126.887736 C56.3059254,126.303736 56.2469254,125.804736 56.2049254,125.399736 C56.1909254,125.245736 56.1779254,125.111736 56.1669254,124.985736 L56.3599254,124.978736 C56.4759254,124.974736 56.5879254,124.971736 56.7199254,124.955736 C56.8469254,124.943736 56.9729254,124.929736 57.0989254,124.915736 C57.2259254,124.901736 57.3449254,124.871736 57.4669254,124.851736 C57.9519254,124.764736 58.4239254,124.609736 58.8539254,124.404736 C59.2889254,124.207736 59.6719254,123.939736 60.0009254,123.659736 C60.3329254,123.378736 60.5909254,123.061736 60.8099254,122.765736 C60.9139254,122.612736 61.0079254,122.463736 61.0929254,122.321736 C61.1689254,122.173736 61.2429254,122.035736 61.3069254,121.904736 C61.3659254,121.769736 61.4239254,121.645736 61.4689254,121.528736 C61.5139254,121.410736 61.5499254,121.300736 61.5839254,121.202736 C61.6569254,121.008736 61.6859254,120.845736 61.7179254,120.740736 C61.7439254,120.632736 61.7579254,120.575736 61.7579254,120.575736 C61.7579254,120.575736 61.7229254,120.623736 61.6569254,120.712736 C61.5929254,120.801736 61.5029254,120.935736 61.3799254,121.096736 C61.3179254,121.177736 61.2529254,121.267736 61.1779254,121.363736 C61.0979254,121.454736 61.0199254,121.558736 60.9329254,121.665736 C60.8429254,121.770736 60.7429254,121.877736 60.6409254,121.991736 C60.5319254,122.097736 60.4229254,122.213736 60.3019254,122.326736 C60.1759254,122.431736 60.0579254,122.555736 59.9139254,122.654736 C59.8449254,122.706736 59.7749254,122.760736 59.7039254,122.815736 C59.6289254,122.864736 59.5529254,122.912736 59.4769254,122.963736 C59.1669254,123.154736 58.8299254,123.331736 58.4569254,123.456736 L58.3179254,123.508736 L58.1739254,123.548736 C58.0779254,123.576736 57.9819254,123.606736 57.8839254,123.631736 C57.6829254,123.668736 57.4849254,123.721736 57.2749254,123.744736 C57.1719254,123.757736 57.0669254,123.778736 56.9649254,123.785736 C56.8619254,123.791736 56.7589254,123.800736 56.6569254,123.810736 C56.5589254,123.823736 56.4399254,123.824736 56.3239254,123.826736 L55.9769254,123.834736 L55.6699254,123.826736 C55.5619254,123.824736 55.4529254,123.824736 55.3469254,123.811736 C55.2409254,123.801736 55.1349254,123.793736 55.0279254,123.785736 C54.9219254,123.779736 54.8199254,123.758736 54.7159254,123.744736 C54.5049254,123.721736 54.3079254,123.668736 54.1069254,123.631736 C54.0089254,123.606736 53.9129254,123.576736 53.8159254,123.548736 C53.7189254,123.524736 53.6249254,123.493736 53.5339254,123.456736 C53.1609254,123.330736 52.8229254,123.154736 52.5129254,122.962736 C52.4359254,122.911736 52.3599254,122.863736 52.2849254,122.814736 C52.2149254,122.759736 52.1439254,122.706736 52.0749254,122.653736 C51.9299254,122.554736 51.8139254,122.430736 51.6859254,122.326736 C51.5649254,122.213736 51.4559254,122.097736 51.3459254,121.991736 C51.2449254,121.876736 51.1449254,121.770736 51.0539254,121.665736 C50.9679254,121.558736 50.8889254,121.454736 50.8099254,121.363736 C50.7349254,121.268736 50.6699254,121.178736 50.6089254,121.098736 C50.4869254,120.938736 50.3949254,120.801736 50.3309254,120.712736 C50.2649254,120.623736 50.2309254,120.575736 50.2309254,120.575736 C50.2309254,120.575736 50.2439254,120.632736 50.2709254,120.740736 C50.3019254,120.846736 50.3299254,121.005736 50.4039254,121.200736 C50.4389254,121.297736 50.4749254,121.409736 50.5199254,121.527736 C50.5659254,121.645736 50.6239254,121.767736 50.6829254,121.903736 C50.7469254,122.034736 50.8219254,122.171736 50.8979254,122.320736 C50.9829254,122.462736 51.0779254,122.610736 51.1819254,122.763736 C51.4009254,123.058736 51.6579254,123.376736 51.9899254,123.656736 C52.3189254,123.935736 52.7019254,124.204736 53.1369254,124.401736 C53.5669254,124.607736 54.0389254,124.760736 54.5229254,124.850736 C54.7659254,124.901736 55.0099254,124.933736 55.2569254,124.954736 C55.3799254,124.970736 55.5029254,124.973736 55.6259254,124.977736 L55.8189254,124.985736 C55.8069254,125.110736 55.7949254,125.245736 55.7809254,125.399736 C55.7389254,125.804736 55.6799254,126.303736 55.5939254,126.887736 C55.5009254,127.470736 55.3819254,128.137736 55.2149254,128.877736 C54.8759254,130.358736 54.3649254,132.128736 53.6589254,134.125736 C53.3069254,135.124736 52.9169254,136.183736 52.4949254,137.298736 C52.0709254,138.414736 51.6249254,139.590736 51.1819254,140.829736 C50.9609254,141.450736 50.7389254,142.086736 50.5259254,142.741736 C50.4169254,143.067736 50.3149254,143.399736 50.2089254,143.734736 C50.1079254,144.073736 50.0059254,144.418736 49.9129254,144.755736 C49.5489254,146.114736 49.1039254,147.468736 48.5789254,148.860736 C47.5529254,151.646736 46.2279254,154.503736 44.9009254,157.497736 C44.2279254,158.992736 43.5609254,160.525736 42.9359254,162.109736 C42.3159254,163.694736 41.7159254,165.326736 41.3499254,167.081736 C41.2609254,167.521736 41.1899254,167.969736 41.1479254,168.427736 C41.1269254,168.659736 41.1149254,168.887736 41.1119254,169.125736 C41.1129254,169.246736 41.1109254,169.378736 41.1169254,169.479736 L41.1249254,169.654736 L41.1339254,169.815736 C41.1859254,170.674736 41.2359254,171.535736 41.2679254,172.398736 C41.3289254,174.121736 41.3479254,175.846736 41.1889254,177.555736 C41.0349254,179.263736 40.6689254,180.952736 40.2099254,182.622736 C39.9829254,183.457736 39.7399254,184.290736 39.4949254,185.119736 C39.2419254,185.947736 38.9889254,186.773736 38.7369254,187.594736 C38.2269254,189.238736 37.7199254,190.869736 37.2209254,192.479736 C37.0969254,192.882736 36.9749254,193.284736 36.8519254,193.685736 C36.7269254,194.085736 36.6019254,194.483736 36.4779254,194.881736 C36.3539254,195.278736 36.2319254,195.672736 36.1089254,196.067736 C35.9869254,196.455736 35.8479254,196.839736 35.7069254,197.221736 C35.1469254,198.748736 34.4909254,200.220736 33.9529254,201.725736 C33.6819254,202.481736 33.4409254,203.227736 33.2579254,204.023736 C33.2179254,204.215736 33.1769254,204.406736 33.1359254,204.596736 C33.0999254,204.783736 33.0629254,204.969736 33.0259254,205.155736 C32.9539254,205.528736 32.8809254,205.898736 32.8089254,206.265736 C32.6689254,207.002736 32.5239254,207.730736 32.3979254,208.451736 C32.2739254,209.172736 32.1539254,209.882736 32.0459254,210.586736 C31.9349254,211.290736 31.8509254,211.987736 31.7869254,212.686736 L31.7639254,212.949736 L31.7509254,213.231736 C31.7369254,213.427736 31.7429254,213.586736 31.7429254,213.755736 C31.7449254,213.811736 31.7459254,213.793736 31.7469254,213.817736 L31.7499254,213.857736 C31.7519254,213.884736 31.7529254,213.911736 31.7569254,213.938736 C31.7639254,213.991736 31.7689254,214.044736 31.7799254,214.094736 C31.7969254,214.198736 31.8179254,214.297736 31.8439254,214.391736 C31.8949254,214.580736 31.9569254,214.754736 32.0199254,214.919736 C32.2809254,215.567736 32.5319254,216.108736 32.7079254,216.670736 C32.8859254,217.226736 32.9939254,217.794736 33.0429254,218.347736 C33.0879254,218.914736 33.1019254,219.482736 33.0499254,219.993736 C33.0259254,220.248736 32.9839254,220.493736 32.9159254,220.707736 C32.8469254,220.922736 32.7549254,221.098736 32.6229254,221.255736 C32.4949254,221.416736 32.2879254,221.567736 32.0689254,221.825736 C31.9629254,221.953736 31.8679254,222.109736 31.8049254,222.266736 C31.7429254,222.422736 31.7019254,222.581736 31.6829254,222.729736 C31.6699254,222.803736 31.6669254,222.883736 31.6589254,222.959736 L31.6529254,223.159736 C31.6559254,223.284736 31.6589254,223.408736 31.6619254,223.532736 C31.6719254,223.778736 31.6849254,224.018736 31.7049254,224.253736 C31.7829254,225.195736 31.9339254,226.043736 32.0799254,226.791736 C32.1779254,227.308736 32.2599254,227.782736 32.2859254,228.207736 C32.2859254,228.232736 32.2869254,228.256736 32.2879254,228.281736 C32.2889254,228.405736 32.2899254,228.534736 32.2889254,228.662736 C32.2879254,228.691736 32.2869254,228.720736 32.2849254,228.748736 C32.2479254,229.303736 32.0099254,229.725736 31.7579254,230.021736 C31.5059254,230.321736 31.2579254,230.510736 31.0949254,230.635736 C31.0579254,230.660736 31.0279254,230.682736 30.9989254,230.702736 C30.8409254,230.754736 30.6739254,230.794736 30.4979254,230.821736 C30.1799254,230.869736 29.8449254,230.887736 29.5029254,230.883736 C29.1479254,230.873736 28.7919254,230.865736 28.4349254,230.855736 C28.0849254,230.840736 27.7429254,230.819736 27.4349254,230.759736 C27.1269254,230.700736 26.8609254,230.596736 26.6899254,230.446736 C26.5169254,230.299736 26.4199254,230.084736 26.3719254,229.809736 C26.3459254,229.676736 26.3429254,229.527736 26.3429254,229.378736 L26.3469254,229.264736 L26.3489254,229.221736 L26.3559254,229.158736 C26.3589254,229.107736 26.3649254,229.096736 26.3679254,229.066736 C26.3709254,229.040736 26.3799254,229.005736 26.3849254,228.976736 C26.5039254,228.477736 26.9129254,228.038736 27.3739254,227.734736 C27.8379254,227.420736 28.3629254,227.232736 28.8529254,227.132736 C29.3469254,227.030736 29.8159254,227.043736 30.2089254,227.134736 C30.6029254,227.226736 30.9079254,227.423736 31.1099254,227.641736 C31.3099254,227.860736 31.4129254,228.088736 31.4709254,228.244736 C31.5259254,228.404736 31.5469254,228.493736 31.5469254,228.493736 C31.5469254,228.493736 31.5469254,228.470736 31.5459254,228.426736 C31.5469254,228.381736 31.5429254,228.316736 31.5339254,228.230736 C31.5119254,228.060736 31.4659254,227.798736 31.2879254,227.507736 C31.1989254,227.364736 31.0799254,227.211736 30.9199254,227.077736 C30.7599254,226.944736 30.5659254,226.825736 30.3429254,226.732736 C29.8999254,226.539736 29.3529254,226.473736 28.7709254,226.512736 C28.1889254,226.556736 27.5669254,226.725736 26.9629254,227.051736 C26.7699254,227.156736 26.5829254,227.284736 26.4039254,227.432736 C26.4729254,227.187736 26.5469254,226.959736 26.6209254,226.757736 C26.7139254,226.505736 26.7959254,226.284736 26.8709254,226.104736 C27.0219254,225.742736 27.1089254,225.535736 27.1089254,225.535736 C27.1089254,225.535736 26.9589254,225.702736 26.7209254,226.020736 C26.6069254,226.180736 26.4639254,226.375736 26.3199254,226.612736 C26.1779254,226.850736 26.0189254,227.122736 25.8749254,227.438736 C25.7309254,227.753736 25.5969254,228.110736 25.5029254,228.509736 C25.4099254,228.908736 25.3579254,229.351736 25.4049254,229.823736 C25.4279254,230.057736 25.4809254,230.298736 25.5629254,230.534736 C25.5649254,230.540736 25.5679254,230.547736 25.5699254,230.554736 C25.5549254,230.558736 25.5419254,230.563736 25.5269254,230.567736 C25.4389254,230.592736 25.3439254,230.611736 25.2489254,230.626736 C25.0579254,230.657736 24.8599254,230.672736 24.6639254,230.674736 C24.2699254,230.676736 23.8769254,230.622736 23.5389254,230.497736 C23.4609254,230.470736 23.3499254,230.423736 23.3479254,230.415736 C23.3079254,230.391736 23.2729254,230.356736 23.2399254,230.311736 C23.1739254,230.222736 23.1229254,230.083736 23.1029254,229.926736 C23.0589254,229.610736 23.1169254,229.245736 23.2129254,228.914736 C23.2639254,228.753736 23.3299254,228.557736 23.3879254,228.398736 C23.4479254,228.231736 23.5059254,228.070736 23.5609254,227.914736 C23.7849254,227.286736 23.9709254,226.757736 24.0929254,226.383736 C24.2169254,226.009736 24.2789254,225.790736 24.2789254,225.790736 C24.2789254,225.790736 24.1399254,225.970736 23.9189254,226.297736 C23.8069254,226.459736 23.6729254,226.658736 23.5279254,226.889736 C23.3809254,227.121736 23.2169254,227.383736 23.0479254,227.676736 C22.9619254,227.820736 22.8769254,227.979736 22.7869254,228.141736 C22.6949254,228.310736 22.6209254,228.459736 22.5269254,228.652736 C22.3539254,229.035736 22.2119254,229.475736 22.2279254,229.995736 C22.2379254,230.171736 22.2699254,230.361736 22.3399254,230.550736 C22.3359254,230.552736 22.3329254,230.554736 22.3279254,230.555736 C22.1349254,230.627736 21.8479254,230.653736 21.5109254,230.618736 C21.4269254,230.605736 21.3539254,230.599736 21.2469254,230.578736 L21.1709254,230.567736 L21.1329254,230.561736 C21.1399254,230.561736 21.1179254,230.557736 21.1129254,230.554736 C21.0749254,230.545736 21.0389254,230.534736 21.0039254,230.520736 C20.8629254,230.465736 20.7439254,230.378736 20.6459254,230.258736 C20.5479254,230.138736 20.4699254,229.983736 20.4209254,229.807736 C20.3729254,229.631736 20.3469254,229.437736 20.3579254,229.244736 C20.3599254,229.189736 20.3599254,229.170736 20.3689254,229.096736 C20.3749254,229.054736 20.3799254,229.014736 20.3919254,228.966736 C20.4109254,228.874736 20.4409254,228.774736 20.4769254,228.674736 C20.5479254,228.470736 20.6389254,228.264736 20.7309254,228.061736 C20.9189254,227.657736 21.1149254,227.274736 21.2799254,226.940736 C21.4459254,226.606736 21.5819254,226.320736 21.6739254,226.116736 C21.7669254,225.912736 21.8169254,225.790736 21.8169254,225.790736 C21.8169254,225.790736 21.3719254,226.070736 20.8339254,226.620736 C20.5649254,226.896736 20.2689254,227.235736 19.9949254,227.646736 C19.8569254,227.850736 19.7269254,228.075736 19.6139254,228.327736 C19.5589254,228.453736 19.5059254,228.587736 19.4659254,228.738736 C19.4449254,228.810736 19.4309254,228.893736 19.4179254,228.974736 C19.4099254,229.024736 19.3989254,229.129736 19.3959254,229.199736 C19.3819254,229.503736 19.4209254,229.814736 19.5279254,230.104736 C19.5469254,230.157736 19.5709254,230.209736 19.5949254,230.260736 C19.5539254,230.269736 19.5139254,230.278736 19.4699254,230.284736 C19.3409254,230.302736 19.1999254,230.304736 19.0559254,230.289736 C18.9129254,230.272736 18.7599254,230.233736 18.6189254,230.172736 C18.5789254,230.155736 18.5379254,230.137736 18.4969254,230.119736 C18.4759254,230.106736 18.4309254,230.087736 18.4039254,230.069736 C18.3409254,230.030736 18.2869254,229.988736 18.2429254,229.943736 C18.1599254,229.852736 18.1069254,229.750736 18.0809254,229.602736 C18.0489254,229.457736 18.0559254,229.273736 18.0789254,229.078736 C18.1339254,228.688736 18.2669254,228.265736 18.4059254,227.871736 C18.5469254,227.477736 18.6979254,227.104736 18.8309254,226.782736 C18.9649254,226.459736 19.0789254,226.187736 19.1639254,225.995736 C19.2069254,225.901736 19.2379254,225.824736 19.2639254,225.773736 C19.2899254,225.721736 19.3029254,225.694736 19.3029254,225.694736 C19.3029254,225.694736 19.1899254,225.748736 19.0199254,225.883736 C18.8499254,226.016736 18.6199254,226.221736 18.3789254,226.497736 C18.1359254,226.773736 17.8799254,227.118736 17.6509254,227.524736 C17.5349254,227.727736 17.4299254,227.947736 17.3379254,228.181736 C17.2499254,228.418736 17.1699254,228.668736 17.1299254,228.940736 C17.0859254,229.210736 17.0799254,229.506736 17.1499254,229.813736 C17.1729254,229.910736 17.2089254,230.009736 17.2539254,230.106736 C17.2189254,230.086736 17.1839254,230.069736 17.1459254,230.049736 C16.9089254,229.933736 16.6459254,229.755736 16.3879254,229.541736 C16.1469254,229.310736 15.9419254,229.024736 15.8879254,228.678736 C15.8309254,228.330736 15.9129254,227.916736 16.0839254,227.477736 C16.2549254,227.036736 16.5099254,226.574736 16.7999254,226.099736 C17.0929254,225.626736 17.4329254,225.148736 17.8009254,224.673736 C18.1739254,224.202736 18.5389254,223.703736 18.9249254,223.216736 C19.3089254,222.727736 19.7249254,222.265736 20.1619254,221.833736 C20.3759254,221.610736 20.5879254,221.389736 20.8109254,221.183736 C20.9229254,221.079736 21.0339254,220.978736 21.1489254,220.879736 C21.2569254,220.774736 21.3599254,220.667736 21.4679254,220.565736 C21.6819254,220.359736 21.8999254,220.159736 22.0989254,219.952736 C22.2889254,219.738736 22.4749254,219.526736 22.6419254,219.310736 C22.8169254,219.099736 22.9599254,218.874736 23.0919254,218.654736 C23.2249254,218.434736 23.3569254,218.223736 23.4689254,218.012736 C23.6809254,217.582736 23.8839254,217.197736 24.0109254,216.826736 C24.0799254,216.643736 24.1389254,216.471736 24.1929254,216.312736 C24.2389254,216.145736 24.2809254,215.991736 24.3119254,215.852736 C24.3879254,215.577736 24.4009254,215.363736 24.4139254,215.214736 C24.4239254,215.099736 24.4269254,215.026736 24.4279254,214.999736 C24.4329254,214.992736 24.4399254,214.986736 24.4409254,214.977736 C24.5479254,213.815736 24.6349254,212.651736 24.7259254,211.485736 C24.8219254,210.320736 24.8849254,209.157736 24.9599254,207.992736 L25.0619254,206.244736 C25.0859254,205.657736 25.1149254,205.074736 25.1309254,204.488736 C25.1619254,203.318736 25.1749254,202.147736 25.1739254,200.978736 C25.1749254,199.808736 25.1499254,198.640736 25.1269254,197.471736 C25.1049254,196.303736 25.0629254,195.136736 25.0159254,193.969736 C24.9679254,192.803736 24.9239254,191.637736 24.8629254,190.471736 L24.6659254,186.978736 L24.4479254,183.492736 C24.4139254,182.908736 24.3799254,182.328736 24.3559254,181.756736 C24.3369254,181.180736 24.3209254,180.604736 24.3229254,180.028736 C24.3199254,178.875736 24.3639254,177.722736 24.4369254,176.569736 C24.5079254,175.415736 24.6219254,174.264736 24.7439254,173.110736 L25.1369254,169.636736 C25.1989254,169.053736 25.2569254,168.468736 25.2919254,167.876736 C25.3069254,167.579736 25.3209254,167.282736 25.3189254,166.981736 C25.3199254,166.833736 25.3149254,166.670736 25.3079254,166.525736 L25.2949254,166.306736 L25.2919254,166.114736 C25.3409254,164.976736 25.4599254,163.803736 25.5629254,162.647736 C25.6669254,161.487736 25.8019254,160.328736 25.9279254,159.170736 C25.9309254,159.143736 25.9279254,159.115736 25.9199254,159.087736 L25.9169254,159.078736 C25.9099254,159.058736 25.8939254,159.004736 25.8859254,158.961736 C25.8759254,158.916736 25.8669254,158.869736 25.8599254,158.821736 C25.8429254,158.727736 25.8289254,158.630736 25.8179254,158.532736 C25.7929254,158.337736 25.7779254,158.138736 25.7619254,157.940736 C25.7359254,157.542736 25.7209254,157.143736 25.7159254,156.743736 C25.7079254,155.941736 25.7359254,155.137736 25.7689254,154.335736 C25.8179254,153.533736 25.8669254,152.731736 25.9459254,151.930736 C26.0269254,151.130736 26.1059254,150.330736 26.2019254,149.532736 C26.2909254,148.734736 26.3929254,147.935736 26.4969254,147.135736 L26.8089254,144.747736 C26.9159254,143.952736 27.0259254,143.158736 27.1429254,142.364736 C27.2649254,141.572736 27.3659254,140.777736 27.5039254,139.988736 L27.6919254,138.799736 L27.8959254,137.615736 C28.0269254,136.824736 28.1899254,136.039736 28.3389254,135.251736 C28.4979254,134.466736 28.6489254,133.678736 28.8279254,132.897736 C28.9949254,132.113736 29.1879254,131.334736 29.3649254,130.553736 C29.5579254,129.775736 29.7519254,128.996736 29.9619254,128.221736 C30.0609254,127.832736 30.1659254,127.445736 30.2759254,127.059736 C30.3849254,126.673736 30.4899254,126.285736 30.6069254,125.902736 C30.8249254,125.127736 31.0639254,124.361736 31.3009254,123.591736 C31.5429254,122.827736 31.7909254,122.059736 32.0429254,121.291736 C32.0429254,121.290736 32.0429254,121.290736 32.0429254,121.288736 C32.0429254,121.288736 32.0439254,121.288736 32.0439254,121.287736 C32.0439254,121.287736 32.1149254,121.114736 32.2639254,120.793736 C32.4129254,120.473736 32.6299254,120.002736 32.9059254,119.403736 C33.1819254,118.803736 33.5189254,118.076736 33.8889254,117.234736 C34.2659254,116.396736 34.6749254,115.444736 35.1169254,114.402736 C35.5509254,113.356736 36.0219254,112.224736 36.4819254,111.006736 C36.7119254,110.397736 36.9399254,109.768736 37.1529254,109.105736 C37.2049254,108.937736 37.2569254,108.771736 37.3039254,108.592736 L37.3409254,108.457736 L37.3789254,108.297736 L37.3969254,108.217736 L37.4079254,108.153736 L37.4189254,108.088736 L37.4289254,108.029736 L37.4319254,107.987736 C37.4529254,107.771736 37.4519254,107.600736 37.4559254,107.416736 C37.4569254,107.239736 37.4569254,107.059736 37.4579254,106.877736 C37.4489254,105.452736 37.3919254,103.992736 37.3249254,102.505736 C37.2619254,101.021736 37.1279254,99.514736 36.9949254,98.010736 C36.8579254,96.506736 36.7319254,95.002736 36.6479254,93.521736 C36.5499254,92.039736 36.5119254,90.578736 36.4589254,89.158736 C36.4289254,88.447736 36.3959254,87.747736 36.3189254,87.053736 C36.2739254,86.702736 36.2349254,86.369736 36.1299254,85.987736 C36.0779254,85.825736 36.0269254,85.664736 35.9759254,85.504736 C35.9249254,85.350736 35.8739254,85.196736 35.8229254,85.044736 C35.4159254,83.824736 35.0309254,82.669736 34.6759254,81.604736 C33.9839254,79.459736 33.4069254,77.673736 33.0029254,76.422736 C32.9269254,76.187736 32.8569254,75.971736 32.7929254,75.775736 C33.0799254,74.795736 33.3129254,73.845736 33.5029254,72.940736 C33.7769254,71.565736 33.9549254,70.293736 34.0559254,69.162736 C34.1499254,68.032736 34.1789254,67.043736 34.1709254,66.231736 C34.1609254,65.825736 34.1559254,65.463736 34.1439254,65.149736 C34.1309254,64.928736 34.1169254,64.734736 34.1039254,64.562736 C34.5859254,65.142736 35.1379254,65.704736 35.7659254,66.213736 C36.5439254,66.845736 37.4129254,67.422736 38.3579254,67.886736 C39.2989254,68.360736 40.3089254,68.708736 41.3289254,68.998736 L42.1019254,69.190736 C42.3599254,69.246736 42.6209254,69.289736 42.8799254,69.339736 C43.3959254,69.451736 43.9189254,69.490736 44.4329254,69.559736 C44.9469254,69.613736 45.4639254,69.636736 45.9659254,69.664736 C46.4629254,69.683736 46.9529254,69.700736 47.4349254,69.718736 C48.4039254,69.755736 49.3519254,69.756736 50.2559254,69.700736 C51.1589254,69.647736 52.0249254,69.514736 52.7979254,69.256736 C53.5689254,69.000736 54.2469254,68.591736 54.6779254,68.069736 C55.1309254,67.561736 55.3129254,66.989736 55.4079254,66.541736 C55.5039254,66.086736 55.4959254,65.725736 55.4929254,65.483736 C55.4789254,65.241736 55.4709254,65.111736 55.4709254,65.111736 C55.4709254,65.111736 55.4559254,65.239736 55.4259254,65.479736 C55.4139254,65.598736 55.3799254,65.744736 55.3499254,65.913736 C55.3319254,65.997736 55.3029254,66.086736 55.2789254,66.182736 C55.2589254,66.278736 55.2239254,66.376736 55.1859254,66.480736 C55.0369254,66.888736 54.7949254,67.370736 54.3589254,67.762736 C53.9349254,68.164736 53.3219254,68.445736 52.6139254,68.618736 C52.2589254,68.703736 51.8769254,68.754736 51.4769254,68.787736 C51.0779254,68.819736 50.6609254,68.839736 50.2289254,68.836736 C49.3649254,68.833736 48.4469254,68.764736 47.4889254,68.700736 C47.0089254,68.662736 46.5199254,68.625736 46.0249254,68.588736 C45.7819254,68.565736 45.5389254,68.540736 45.2939254,68.517736 C45.0489254,68.491736 44.8019254,68.481736 44.5579254,68.443736 C44.0699254,68.369736 43.5739254,68.316736 43.0869254,68.210736 C42.8429254,68.161736 42.5959254,68.121736 42.3539254,68.064736 L41.6289254,67.881736 C40.6689254,67.621736 39.7199254,67.308736 38.8439254,66.881736 C37.9679254,66.456736 37.1349254,65.977736 36.3969254,65.415736 C35.6599254,64.853736 34.9939254,64.245736 34.4339254,63.598736 C33.8759254,62.950736 33.4029254,62.287736 33.0159254,61.640736 C32.6339254,60.991736 32.3259254,60.367736 32.0869254,59.797736 C31.8509254,59.226736 31.6719254,58.713736 31.5449254,58.285736 C31.2909254,57.426736 31.2159254,56.912736 31.2159254,56.912736 C31.2159254,56.912736 31.2099254,57.041736 31.2199254,57.285736 C31.2319254,57.527736 31.2519254,57.884736 31.3199254,58.334736 C31.3879254,58.784736 31.4909254,59.330736 31.6709254,59.943736 C31.8469254,60.556736 32.0879254,61.240736 32.4329254,61.953736 C32.7739254,62.666736 33.2089254,63.416736 33.7669254,64.142736 C33.7819254,64.162736 33.7989254,64.182736 33.8149254,64.203736 C33.8099254,64.246736 33.8039254,64.294736 33.7969254,64.345736 C33.7729254,64.559736 33.7429254,64.822736 33.7079254,65.131736 C33.6609254,65.440736 33.6149254,65.794736 33.5609254,66.190736 C33.5379254,66.388736 33.4989254,66.595736 33.4629254,66.813736 C33.4279254,67.031736 33.3919254,67.257736 33.3539254,67.495736 C33.3199254,67.732736 33.2639254,67.976736 33.2169254,68.231736 C33.1689254,68.485736 33.1189254,68.747736 33.0669254,69.020736 C32.8359254,70.102736 32.5579254,71.315736 32.1799254,72.616736 C31.8169254,73.921736 31.3469254,75.310736 30.7889254,76.752736 C30.5199254,77.477736 30.2039254,78.208736 29.8879254,78.952736 C29.7199254,79.324736 29.5509254,79.700736 29.3809254,80.078736 C29.2109254,80.446736 29.0259254,80.825736 28.8419254,81.205736 C28.0899254,82.731736 27.2509254,84.336736 26.5719254,86.062736 C26.2389254,86.927736 25.9339254,87.817736 25.7189254,88.735736 C25.4929254,89.650736 25.3559254,90.590736 25.2759254,91.529736 C25.1939254,92.491736 25.2249254,93.379736 25.1279254,94.283736 C25.0909254,94.735736 25.0359254,95.184736 24.9639254,95.629736 C24.8979254,96.076736 24.8219254,96.519736 24.7259254,96.957736 C24.3589254,98.715736 23.7929254,100.400736 23.0939254,101.961736 C22.4009254,103.526736 21.6129254,104.978736 20.8649254,106.347736 C20.1129254,107.715736 19.4159254,109.012736 18.7399254,110.199736 C18.0559254,111.405736 17.4769254,112.563736 17.0669254,113.638736 C16.6499254,114.710736 16.3939254,115.709736 16.3439254,116.565736 C16.3239254,116.993736 16.3489254,117.381736 16.4159254,117.708736 C16.4729254,117.989736 16.5519254,118.220736 16.6309254,118.410736 C16.5569254,118.330736 16.4789254,118.246736 16.3829254,118.165736 C16.2659254,118.053736 16.1289254,117.946736 15.9819254,117.831736 C15.8289254,117.727736 15.6709254,117.610736 15.4929254,117.512736 C15.3199254,117.407736 15.1319254,117.314736 14.9379254,117.225736 C14.7449254,117.134736 14.5399254,117.063736 14.3369254,116.990736 C14.1279254,116.932736 13.9239254,116.859736 13.7129254,116.823736 C13.5049254,116.778736 13.2989254,116.741736 13.0959254,116.724736 C12.9949254,116.714736 12.8969254,116.704736 12.7999254,116.695736 C12.7029254,116.694736 12.6079254,116.693736 12.5149254,116.691736 C12.3299254,116.688736 12.1559254,116.692736 11.9949254,116.711736 C11.8349254,116.726736 11.6889254,116.743736 11.5609254,116.763736 C11.4319254,116.787736 11.3219254,116.815736 11.2309254,116.836736 C11.0499254,116.879736 10.9479254,116.910736 10.9479254,116.910736 C10.9479254,116.910736 11.0549254,116.930736 11.2379254,116.952736 C11.3299254,116.961736 11.4409254,116.975736 11.5659254,116.985736 C11.6929254,117.002736 11.8329254,117.027736 11.9869254,117.044736 C12.1399254,117.060736 12.3029254,117.094736 12.4759254,117.125736 C12.5619254,117.139736 12.6499254,117.154736 12.7409254,117.169736 C12.8299254,117.190736 12.9209254,117.210736 13.0139254,117.231736 C13.1059254,117.253736 13.2009254,117.267736 13.2959254,117.292736 C13.3889254,117.320736 13.4839254,117.345736 13.5809254,117.369736 C13.7739254,117.413736 13.9629254,117.483736 14.1559254,117.539736 C14.3449254,117.605736 14.5369254,117.668736 14.7199254,117.742736 C14.8129254,117.779736 14.9039254,117.815736 14.9939254,117.850736 C15.0839254,117.887736 15.1699254,117.930736 15.2579254,117.967736 C15.4329254,118.039736 15.5939254,118.126736 15.7529254,118.200736 C15.9059254,118.284736 16.0569254,118.354736 16.1879254,118.433736 C16.3229254,118.508736 16.4419254,118.581736 16.5509254,118.646736 C16.5709254,118.659736 16.5889254,118.670736 16.6069254,118.682736 C16.6299254,118.720736 16.6529254,118.760736 16.6769254,118.804736 C16.7389254,118.932736 16.8189254,119.077736 16.8779254,119.257736 C16.9469254,119.430736 17.0019254,119.631736 17.0499254,119.851736 C17.0969254,120.071736 17.1359254,120.311736 17.1599254,120.570736 C17.1859254,120.827736 17.2009254,121.104736 17.2069254,121.392736 C17.2199254,121.970736 17.1979254,122.598736 17.1889254,123.246736 C17.1859254,123.571736 17.1839254,123.899736 17.2089254,124.237736 C17.2149254,124.326736 17.2289254,124.401736 17.2339254,124.504736 C17.2349254,124.536736 17.2429254,124.615736 17.2509254,124.654736 C17.2599254,124.700736 17.2689254,124.743736 17.2799254,124.785736 C17.3219254,124.952736 17.3729254,125.100736 17.4209254,125.247736 C17.5189254,125.540736 17.6139254,125.816736 17.6859254,126.081736 C17.7589254,126.347736 17.8149254,126.601736 17.8429254,126.838736 C17.9019254,127.312736 17.8409254,127.713736 17.7509254,127.981736 C17.7029254,128.114736 17.6569254,128.216736 17.6209254,128.284736 C17.5929254,128.335736 17.5739254,128.368736 17.5679254,128.381736 C17.5469254,128.391736 17.5369254,128.414736 17.5459254,128.436736 C17.5459254,128.435736 17.5699254,128.490736 17.5869254,128.573736 C17.6059254,128.660736 17.6249254,128.784736 17.6429254,128.945736 C17.6599254,129.107736 17.6799254,129.304736 17.7209254,129.537736 C17.7709254,129.771736 17.7939254,130.037736 18.0169254,130.350736 C18.1939254,130.550736 18.3889254,130.823736 18.5219254,131.134736 C18.5889254,131.290736 18.6449254,131.455736 18.7039254,131.631736 C18.7339254,131.718736 18.7609254,131.810736 18.8029254,131.904736 C18.8209254,131.952736 18.8449254,131.999736 18.8739254,132.051736 C18.8979254,132.096736 18.9509254,132.160736 18.9789254,132.194736 C19.2209254,132.475736 19.4759254,132.753736 19.7459254,133.024736 C20.0129254,133.295736 20.2809254,133.577736 20.5349254,133.850736 C20.5959254,133.918736 20.6609254,133.983736 20.7129254,134.045736 L20.7789254,134.125736 C20.7789254,134.123736 20.7899254,134.140736 20.7809254,134.123736 L20.7909254,134.139736 L20.8109254,134.169736 L20.8519254,134.230736 C20.9349254,134.347736 21.0169254,134.487736 21.0589254,134.612736 C21.1069254,134.742736 21.1199254,134.866736 21.1059254,135.060736 L21.0999254,135.136736 C21.1079254,135.124736 21.0979254,135.157736 21.0929254,135.169736 C21.0989254,135.161736 21.0899254,135.180736 21.0799254,135.186736 C21.0559254,135.209736 20.9959254,135.234736 20.9269254,135.244736 C20.6359254,135.286736 20.2849254,135.199736 19.9819254,135.102736 C19.6719254,135.001736 19.3829254,134.879736 19.1209254,134.755736 C18.5959254,134.506736 18.1729254,134.262736 17.8789254,134.090736 C17.5839254,133.915736 17.4179254,133.811736 17.4179254,133.811736 C17.4129254,133.807736 17.4069254,133.808736 17.4019254,133.807736 C17.1899254,133.473736 16.9699254,133.144736 16.7209254,132.839736 C16.6969254,132.644736 16.6569254,132.453736 16.6099254,132.266736 C16.5509254,132.052736 16.4789254,131.845736 16.3919254,131.644736 C16.3049254,131.444736 16.2039254,131.250736 16.0909254,131.065736 C16.0329254,130.973736 15.9739254,130.882736 15.9109254,130.794736 L15.8159254,130.664736 L15.7659254,130.602736 L15.7519254,130.581736 C15.7529254,130.575736 15.7509254,130.567736 15.7459254,130.560736 L15.7449254,130.559736 L15.7389254,130.551736 C15.7369254,130.550736 15.7369254,130.544736 15.7169254,130.536736 C15.7079254,130.536736 15.7049254,130.530736 15.6839254,130.545736 C15.6759254,130.553736 15.6719254,130.566736 15.6719254,130.573736 L15.6719254,130.578736 L15.6739254,130.596736 L15.6829254,130.640736 L15.7019254,130.721736 L15.7459254,130.875736 L15.8349254,131.179736 C15.8929254,131.380736 15.9479254,131.580736 15.9979254,131.779736 L16.0699254,132.077736 C16.0929254,132.176736 16.1079254,132.278736 16.1289254,132.375736 C16.1699254,132.574736 16.1919254,132.774736 16.2149254,132.971736 L16.2149254,132.975736 C16.2209254,133.026736 16.2399254,133.075736 16.2759254,133.115736 C16.4569254,133.326736 16.6539254,133.528736 16.8509254,133.726736 C17.0509254,133.923736 17.2559254,134.119736 17.4429254,134.325736 C17.5359254,134.428736 17.6269254,134.536736 17.7019254,134.644736 C17.7369254,134.699736 17.7839254,134.768736 17.8259254,134.825736 L17.9499254,134.997736 C18.1149254,135.226736 18.2599254,135.469736 18.3959254,135.716736 C18.5309254,135.964736 18.6689254,136.207736 18.8119254,136.444736 C18.9539254,136.681736 19.0909254,136.919736 19.2129254,137.159736 C19.3409254,137.394736 19.4579254,137.632736 19.5539254,137.862736 C19.5949254,137.975736 19.6499254,138.096736 19.6429254,138.184736 C19.6459254,138.297736 19.6329254,138.424736 19.6079254,138.542736 C19.5599254,138.781736 19.4589254,139.006736 19.3139254,139.119736 C19.1749254,139.231736 18.9629254,139.237736 18.7309254,139.153736 C18.5019254,139.071736 18.2729254,138.930736 18.0569254,138.770736 C17.8399254,138.612736 17.6349254,138.428736 17.4349254,138.238736 C17.0349254,137.858736 16.6629254,137.440736 16.3009254,137.013736 C15.9439254,136.588736 15.5989254,136.152736 15.2579254,135.710736 C15.2319254,135.659736 15.2059254,135.604736 15.1789254,135.551736 C15.0299254,135.255736 14.8749254,134.961736 14.7139254,134.672736 L14.4649254,134.243736 L14.2339254,133.879736 C14.2249254,133.674736 14.2049254,133.468736 14.1729254,133.263736 C14.1559254,133.145736 14.1289254,133.028736 14.0999254,132.911736 C14.0729254,132.795736 14.0389254,132.680736 14.0019254,132.567736 C13.9619254,132.453736 13.9199254,132.342736 13.8729254,132.233736 C13.8239254,132.123736 13.7709254,132.016736 13.7139254,131.913736 C13.6559254,131.810736 13.5889254,131.711736 13.5199254,131.614736 C13.4529254,131.518736 13.3749254,131.424736 13.2969254,131.344736 L13.2939254,131.341736 C13.2859254,131.333736 13.2739254,131.330736 13.2619254,131.334736 C13.2469254,131.341736 13.2399254,131.358736 13.2459254,131.373736 C13.2919254,131.484736 13.3319254,131.586736 13.3699254,131.693736 C13.4069254,131.799736 13.4379254,131.908736 13.4649254,132.015736 C13.4949254,132.122736 13.5189254,132.231736 13.5409254,132.339736 C13.5639254,132.447736 13.5809254,132.555736 13.5969254,132.663736 L13.6169254,132.827736 C13.6239254,132.881736 13.6309254,132.936736 13.6339254,132.991736 C13.6449254,133.100736 13.6489254,133.209736 13.6529254,133.318736 C13.6619254,133.426736 13.6569254,133.536736 13.6589254,133.645736 C13.6599254,133.699736 13.6549254,133.754736 13.6529254,133.808736 L13.6509254,133.972736 C13.6499254,134.019736 13.6609254,134.070736 13.6869254,134.116736 L13.6929254,134.127736 L13.9309254,134.557736 L14.1809254,134.981736 L14.6959254,135.821736 C14.8689254,136.101736 15.0349254,136.383736 15.2159254,136.660736 C15.3949254,136.935736 15.5769254,137.209736 15.7509254,137.490736 C15.9209254,137.772736 16.0739254,138.064736 16.1989254,138.364736 C16.2599254,138.513736 16.3169254,138.668736 16.3589254,138.828736 C16.4039254,138.974736 16.4159254,139.130736 16.4079254,139.282736 C16.3929254,139.588736 16.2879254,139.884736 16.1469254,140.148736 C16.0739254,140.278736 15.9939254,140.403736 15.9029254,140.511736 C15.8099254,140.617736 15.7119254,140.718736 15.6189254,140.762736 C15.5959254,140.774736 15.5759254,140.779736 15.5599254,140.785736 C15.5539254,140.785736 15.5679254,140.787736 15.5509254,140.789736 L15.5239254,140.791736 L15.5189254,140.790736 C15.4869254,140.792736 15.4239254,140.770736 15.3679254,140.747736 C15.2489254,140.694736 15.1219254,140.611736 15.0019254,140.518736 C14.7599254,140.330736 14.5329254,140.104736 14.3149254,139.869736 C13.8799254,139.399736 13.4939254,138.873736 13.1269254,138.335736 C12.6379254,137.605736 12.2049254,136.836736 11.8059254,136.046736 C11.7659254,135.845736 11.7159254,135.655736 11.6549254,135.469736 C11.5849254,135.256736 11.5039254,135.051736 11.4159254,134.850736 C11.3309254,134.648736 11.2349254,134.453736 11.1359254,134.261736 C11.0869254,134.163736 11.0339254,134.070736 10.9819254,133.974736 C10.9389254,133.897736 10.8949254,133.822736 10.8489254,133.744736 C10.8479254,133.653736 10.8469254,133.562736 10.8399254,133.472736 C10.8289254,133.343736 10.8109254,133.216736 10.7899254,133.090736 C10.7459254,132.839736 10.6909254,132.593736 10.6159254,132.355736 C10.5409254,132.117736 10.4599254,131.881736 10.3579254,131.655736 C10.2589254,131.428736 10.1449254,131.203736 10.0109254,130.996736 C9.99992542,130.979736 9.97792542,130.971736 9.95692542,130.977736 C9.93092542,130.984736 9.91592542,131.010736 9.92292542,131.036736 C9.98992542,131.272736 10.0419254,131.502736 10.0869254,131.739736 C10.1289254,131.974736 10.1709254,132.207736 10.1939254,132.443736 C10.2189254,132.677736 10.2409254,132.910736 10.2419254,133.142736 C10.2449254,133.257736 10.2389254,133.371736 10.2349254,133.485736 C10.2299254,133.597736 10.2189254,133.707736 10.2039254,133.817736 C10.1979254,133.858736 10.2029254,133.903736 10.2199254,133.945736 L10.2399254,133.993736 L10.3569254,134.274736 L10.4689254,134.561736 C10.5429254,134.753736 10.6119254,134.945736 10.6779254,135.137736 C10.8069254,135.520736 10.9219254,135.908736 10.9749254,136.270736 C10.9789254,136.294736 10.9849254,136.321736 10.9939254,136.346736 L10.9979254,136.356736 C11.1539254,136.796736 11.3209254,137.235736 11.5019254,137.665736 L11.7809254,138.309736 C11.8699254,138.522736 11.9729254,138.737736 12.0389254,138.920736 C12.0929254,139.085736 12.1009254,139.293736 12.0699254,139.495736 C12.0349254,139.700736 11.9649254,139.905736 11.8619254,140.092736 C11.7569254,140.276736 11.6169254,140.447736 11.4489254,140.551736 C11.3659254,140.603736 11.2759254,140.633736 11.1939254,140.636736 C11.0739254,140.637736 10.9659254,140.635736 10.8599254,140.623736 C10.4409254,140.603736 10.2199254,140.168736 10.0149254,139.760736 C9.80992542,139.346736 9.63292542,138.910736 9.45492542,138.477736 L8.92392542,137.167736 L8.40592542,135.863736 C8.23392542,135.432736 8.05892542,135.004736 7.91792542,134.577736 C7.84592542,134.362736 7.78092542,134.149736 7.73092542,133.943736 C7.70492542,133.839736 7.68292542,133.737736 7.67092542,133.643736 L7.65992542,133.571736 L7.64892542,133.483736 L7.62692542,133.308736 C7.56792542,132.842736 7.49992542,132.377736 7.42692542,131.914736 C7.35092542,131.452736 7.27592542,130.989736 7.18392542,130.527736 L6.89392542,129.141736 L6.59292542,127.819736 C6.57692542,127.634736 6.60092542,127.395736 6.61892542,127.169736 C6.63792542,126.940736 6.66592542,126.708736 6.69292542,126.475736 C6.71992542,126.215736 6.75392542,125.955736 6.78092542,125.695736 C6.92992542,125.444736 7.07392542,125.201736 7.22392542,125.037736 C7.24292542,125.016736 7.26092542,124.996736 7.27792542,124.981736 C7.28792542,124.971736 7.29092542,124.968736 7.29392542,124.963736 C7.29092542,124.961736 7.32792542,124.942736 7.31992542,124.943736 C7.37592542,124.909736 7.42992542,124.874736 7.48392542,124.842736 C7.59092542,124.779736 7.68992542,124.713736 7.78592542,124.660736 C7.83192542,124.634736 7.88392542,124.610736 7.92192542,124.590736 C7.94292542,124.580736 7.95992542,124.568736 7.98792542,124.563736 L8.02592542,124.551736 C8.02792542,124.546736 8.04592542,124.554736 8.05492542,124.554736 C8.09292542,124.562736 8.12492542,124.568736 8.15992542,124.574736 C8.16192542,124.576736 8.16292542,124.576736 8.16492542,124.577736 C8.21692542,124.599736 8.30092542,124.630736 8.40292542,124.658736 C8.60792542,124.717736 8.90692542,124.759736 9.26892542,124.779736 C9.63092542,124.798736 10.0559254,124.789736 10.5089254,124.727736 C10.7349254,124.698736 10.9689254,124.658736 11.2039254,124.596736 C11.4399254,124.540736 11.6749254,124.461736 11.9089254,124.374736 C12.1409254,124.281736 12.3749254,124.184736 12.5969254,124.061736 C12.8209254,123.941736 13.0319254,123.797736 13.2129254,123.625736 C13.3009254,123.538736 13.3869254,123.451736 13.4579254,123.352736 C13.5349254,123.261736 13.5949254,123.157736 13.6539254,123.059736 C13.7139254,122.961736 13.7549254,122.856736 13.8019254,122.759736 C13.8399254,122.658736 13.8709254,122.559736 13.8999254,122.464736 C13.9459254,122.270736 13.9699254,122.093736 13.9729254,121.935736 C13.9819254,121.779736 13.9589254,121.642736 13.9489254,121.533736 C13.9069254,121.314736 13.8659254,121.196736 13.8659254,121.196736 C13.8619254,121.186736 13.8539254,121.177736 13.8429254,121.172736 C13.8219254,121.163736 13.7979254,121.173736 13.7889254,121.194736 L13.7879254,121.196736 C13.7879254,121.196736 13.7389254,121.315736 13.6739254,121.506736 C13.6539254,121.553736 13.6319254,121.606736 13.6079254,121.661736 C13.5869254,121.718736 13.5649254,121.778736 13.5319254,121.838736 C13.4979254,121.899736 13.4759254,121.965736 13.4399254,122.031736 C13.4009254,122.095736 13.3629254,122.161736 13.3249254,122.231736 C13.2819254,122.297736 13.2369254,122.366736 13.1899254,122.436736 C13.1369254,122.502736 13.0899254,122.574736 13.0319254,122.641736 C12.9169254,122.774736 12.7979254,122.914736 12.6549254,123.045736 C12.5189254,123.184736 12.3679254,123.321736 12.2029254,123.454736 C12.0389254,123.588736 11.8499254,123.705736 11.6559254,123.811736 C11.4579254,123.910736 11.2549254,124.006736 11.0449254,124.080736 C10.8369254,124.158736 10.6269254,124.226736 10.4199254,124.283736 C10.2129254,124.341736 10.0089254,124.382736 9.81492542,124.421736 C9.61992542,124.457736 9.43492542,124.487736 9.26192542,124.503736 C9.01492542,124.531736 8.79792542,124.536736 8.61892542,124.533736 C8.53692542,124.520736 8.44892542,124.504736 8.34992542,124.488736 C8.26092542,124.469736 8.16792542,124.449736 8.06692542,124.428736 C7.95792542,124.401736 7.82492542,124.409736 7.70892542,124.428736 C7.58892542,124.447736 7.46692542,124.472736 7.34292542,124.505736 C7.28092542,124.522736 7.21792542,124.538736 7.15292542,124.556736 C7.11592542,124.572736 7.12192542,124.565736 7.09092542,124.580736 C7.06592542,124.593736 7.04092542,124.607736 7.02392542,124.617736 C6.98492542,124.639736 6.94992542,124.661736 6.91792542,124.686736 C6.66492542,124.883736 6.46192542,125.111736 6.25592542,125.369736 C6.05492542,125.627736 5.84692542,125.903736 5.65492542,126.211736 C5.55692542,126.363736 5.45992542,126.521736 5.36292542,126.683736 C5.31992542,126.751736 5.26492542,126.846736 5.21792542,126.914736 C5.17292542,126.987736 5.12492542,127.063736 5.07192542,127.140736 C4.65992542,127.754736 4.11992542,128.363736 3.53092542,128.984736 C3.23192542,129.290736 2.91492542,129.597736 2.56692542,129.873736 C2.39292542,130.011736 2.20992542,130.141736 2.01792542,130.247736 C1.82992542,130.354736 1.61892542,130.434736 1.43992542,130.445736 L1.25692542,130.445736 C1.20092542,130.441736 1.14492542,130.440736 1.08792542,130.434736 C0.972925423,130.423736 0.859925423,130.406736 0.752925423,130.378736 C0.538925423,130.325736 0.349925423,130.209736 0.307925423,130.032736 C0.253925423,129.851736 0.336925423,129.619736 0.442925423,129.411736 C0.550925423,129.199736 0.696925423,128.998736 0.852925423,128.803736 L0.974925423,128.650736 L1.09192542,128.496736 C1.17192542,128.383736 1.24792542,128.268736 1.31492542,128.157736 C1.44992542,127.929736 1.58392542,127.702736 1.70792542,127.472736 C1.95892542,127.013736 2.19492542,126.547736 2.44092542,126.104736 C2.55892542,125.883736 2.68992542,125.662736 2.81392542,125.494736 L2.85792542,125.444736 L2.92592542,125.361736 C2.94092542,125.345736 2.98092542,125.284736 3.00692542,125.242736 C3.03692542,125.194736 3.04692542,125.171736 3.06892542,125.134736 C3.13992542,125.001736 3.20092542,124.877736 3.25392542,124.752736 C3.46892542,124.258736 3.64792542,123.775736 3.82892542,123.295736 C4.00592542,122.819736 4.18092542,122.346736 4.35392542,121.879736 C4.52692542,121.417736 4.69692542,120.959736 4.87892542,120.544736 C4.97092542,120.338736 5.06492542,120.144736 5.15992542,120.030736 C5.16892542,120.020736 5.17592542,120.012736 5.18592542,120.000736 L5.23392542,119.952736 C5.26892542,119.919736 5.30492542,119.886736 5.34492542,119.852736 C5.42292542,119.785736 5.50992542,119.719736 5.59692542,119.651736 C5.94792542,119.378736 6.33192542,119.129736 6.69492542,118.868736 C7.05892542,118.608736 7.41892542,118.352736 7.75092542,118.070736 C7.91692542,117.928736 8.08092542,117.785736 8.22892542,117.621736 C8.30292542,117.539736 8.37492542,117.455736 8.44092542,117.358736 L8.46592542,117.323736 L8.49392542,117.278736 L8.49692542,117.269736 L8.50592542,117.246736 C8.52392542,117.201736 8.53892542,117.142736 8.54192542,117.126736 L8.57392542,116.978736 C8.73192542,116.207736 8.85692542,115.510736 8.97192542,114.886736 C9.03492542,114.541736 9.09192542,114.223736 9.14492542,113.932736 C9.23292542,113.510736 9.32592542,113.054736 9.42592542,112.559736 C9.71992542,111.094736 10.0599254,109.311736 10.4109254,107.258736 C10.5869254,106.232736 10.7749254,105.139736 10.9489254,103.983736 C11.1299254,102.830736 11.3019254,101.600736 11.4789254,100.350736 C11.6589254,99.109736 11.9499254,97.829736 12.3239254,96.526736 C12.6969254,95.220736 13.1519254,93.887736 13.6779254,92.534736 C13.9389254,91.856736 14.2189254,91.174736 14.5049254,90.483736 C14.7939254,89.790736 15.0859254,89.090736 15.3819254,88.381736 C15.9799254,86.962736 16.6039254,85.508736 17.1169254,83.953736 C17.3739254,83.174736 17.6009254,82.382736 17.7429254,81.519736 C17.7839254,81.293736 17.8039254,81.096736 17.8269254,80.893736 L17.8369254,80.802736 L17.8429254,80.726736 L17.8549254,80.573736 L17.8799254,80.265736 C17.9099254,79.855736 17.9479254,79.445736 17.9729254,79.032736 C18.0889254,77.381736 18.1729254,75.712736 18.2399254,74.034736 C18.3879254,70.679736 18.4889254,67.284736 19.0079254,63.928736 C19.1389254,63.091736 19.2869254,62.255736 19.4639254,61.430736 C19.5429254,61.015736 19.6439254,60.601736 19.7429254,60.186736 C19.8419254,59.770736 19.9349254,59.362736 20.0429254,58.947736 C20.4619254,57.285736 20.6829254,55.588736 20.8669254,53.919736 C20.9559254,53.083736 21.0449254,52.250736 21.1339254,51.422736 C21.1769254,51.010736 21.2139254,50.591736 21.2689254,50.190736 C21.3269254,49.787736 21.4059254,49.389736 21.5099254,49.000736 C21.9039254,47.433736 22.7329254,46.021736 23.8179254,44.922736 C24.9039254,43.820736 26.2439254,43.028736 27.6449254,42.572736 C27.9969254,42.459736 28.3509254,42.365736 28.7069254,42.291736 C28.8809254,42.259736 29.0499254,42.225736 29.2429254,42.200736 C29.4309254,42.171736 29.6189254,42.141736 29.8059254,42.112736 C30.5699254,41.987736 31.3279254,41.795736 32.0439254,41.544736 C32.7599254,41.292736 33.4219254,40.998736 34.0769254,40.741736 C34.7339254,40.480736 35.3789254,40.233736 36.0219254,40.007736 C37.3069254,39.551736 38.5729254,39.176736 39.7969254,38.837736 C40.4139254,38.668736 41.0179254,38.502736 41.6099254,38.340736 C42.2039254,38.174736 42.7839254,38.003736 43.3469254,37.819736 C43.9099254,37.634736 44.4569254,37.436736 44.9809254,37.198736 C45.2419254,37.079736 45.4999254,36.951736 45.7489254,36.798736 C45.9959254,36.646736 46.2389254,36.475736 46.4549254,36.247736 C46.6699254,36.023736 46.8449254,35.721736 46.9139254,35.414736 C46.9529254,35.254736 46.9639254,35.116736 46.9719254,34.991736 C46.9799254,34.861736 46.9939254,34.733736 46.9949254,34.608736 C47.0109254,34.105736 46.9919254,33.630736 46.9699254,33.174736 C46.9209254,32.265736 46.8339254,31.439736 46.7409254,30.695736 C46.5569254,29.206736 46.3639254,28.047736 46.2319254,27.257736 C46.0939254,26.468736 46.0209254,26.047736 46.0209254,26.047736 C46.0159254,26.019736 45.9889254,25.997736 45.9589254,26 C45.9269254,26.003736 45.9039254,26.031736 45.9059254,26.063736 C45.9059254,26.063736 45.9399254,26.488736 46.0029254,27.286736 C46.0659254,28.083736 46.1649254,29.252736 46.2539254,30.739736 C46.2929254,31.481736 46.3359254,32.303736 46.3389254,33.193736 C46.3359254,33.636736 46.3299254,34.098736 46.2889254,34.567736 C46.2809254,34.684736 46.2629254,34.798736 46.2519254,34.916736 C46.2409254,35.035736 46.2239254,35.147736 46.1989254,35.230736 C46.1469254,35.413736 46.0509254,35.564736 45.9029254,35.711736 C45.6009254,36.003736 45.1359254,36.235736 44.6509254,36.433736 C44.1589254,36.631736 43.6299254,36.804736 43.0809254,36.971736 C42.5309254,37.135736 41.9599254,37.288736 41.3699254,37.436736 C40.7759254,37.582736 40.1679254,37.733736 39.5479254,37.887736 C38.3009254,38.216736 37.0049254,38.583736 35.6829254,39.033736 C35.0199254,39.251736 34.3559254,39.509736 33.6899254,39.780736 C33.0229254,40.049736 32.3599254,40.338736 31.6979254,40.586736 C31.0349254,40.837736 30.3529254,41.030736 29.6349254,41.166736 C29.4509254,41.203736 29.2669254,41.238736 29.0829254,41.273736 C28.9019254,41.306736 28.7009254,41.354736 28.5029254,41.401736 C28.1159254,41.500736 27.7349254,41.621736 27.3599254,41.761736 C25.8609254,42.330736 24.4579254,43.253736 23.3559254,44.490736 C22.2469254,45.720736 21.4779254,47.264736 21.1019254,48.899736 C20.9009254,49.716736 20.8449254,50.565736 20.7669254,51.387736 C20.6919254,52.215736 20.6139254,53.047736 20.5179254,53.879736 C20.4659254,54.295736 20.4149254,54.711736 20.3629254,55.129736 C20.3039254,55.544736 20.2429254,55.960736 20.1779254,56.375736 C20.0359254,57.205736 19.8519254,58.025736 19.6319254,58.840736 C19.5159254,59.249736 19.4009254,59.659736 19.2869254,60.069736 C19.1719254,60.479736 19.0549254,60.888736 18.9569254,61.308736 C18.7429254,62.141736 18.5609254,62.979736 18.3949254,63.822736 C18.0599254,65.506736 17.8169254,67.209736 17.6349254,68.909736 C17.4559254,70.609736 17.3349254,72.304736 17.2259254,73.979736 C17.1139254,75.655736 17.0139254,77.313736 16.8679254,78.945736 C16.8359254,79.354736 16.7909254,79.759736 16.7539254,80.164736 L16.7239254,80.468736 L16.7099254,80.619736 L16.7019254,80.695736 L16.6949254,80.756736 C16.6679254,80.957736 16.6429254,81.164736 16.6069254,81.338736 C16.4719254,82.077736 16.2449254,82.838736 15.9879254,83.571736 C14.9229254,86.518736 13.5529254,89.323736 12.5429254,92.104736 C12.0279254,93.492736 11.5739254,94.866736 11.2159254,96.221736 C10.8639254,97.578736 10.5969254,98.912736 10.4429254,100.209736 C10.3609254,100.858736 10.3069254,101.473736 10.2399254,102.084736 C10.1719254,102.690736 10.1049254,103.283736 10.0399254,103.861736 C9.90092542,105.017736 9.76992542,106.114736 9.64692542,107.144736 C9.38192542,109.205736 9.15092542,111.002736 8.96192542,112.483736 C8.95892542,112.503736 8.95692542,112.522736 8.95392542,112.541736 C8.91792542,112.729736 8.87692542,112.947736 8.82892542,113.196736 C8.74292542,113.641736 8.63892542,114.181736 8.51992542,114.801736 C8.39892542,115.420736 8.26592542,116.123736 8.10392542,116.875736 L8.07192542,117.012736 C8.06492542,117.045736 8.06592542,117.034736 8.07092542,117.035736 L8.05892542,117.048736 C8.00092542,117.106736 7.92992542,117.162736 7.85592542,117.218736 C7.70592542,117.327736 7.54392542,117.438736 7.36992542,117.541736 C7.02192542,117.748736 6.64792542,117.956736 6.25792542,118.168736 C5.86492542,118.380736 5.46592542,118.606736 5.04892542,118.868736 C4.94392542,118.934736 4.84092542,119.006736 4.73392542,119.086736 C4.68092542,119.125736 4.62692542,119.168736 4.57292542,119.213736 L4.48992542,119.287736 L4.39192542,119.387736 L4.36092542,119.421736 L4.34492542,119.438736 L4.33792542,119.447736 L4.31692542,119.473736 L4.24592542,119.571736 C4.20392542,119.635736 4.16292542,119.698736 4.13092542,119.757736 C4.05992542,119.879736 4.00192542,119.996736 3.94492542,120.115736 C3.51192542,121.048736 3.23092542,122.010736 2.91892542,122.983736 C2.76692542,123.467736 2.61592542,123.960736 2.44592542,124.423736 C2.40292542,124.538736 2.35992542,124.652736 2.31492542,124.750736 L2.28592542,124.813736 C2.27792542,124.826736 2.28892542,124.823736 2.26292542,124.857736 L2.24892542,124.877736 L2.24192542,124.887736 C2.22492542,124.910736 2.25892542,124.869736 2.25192542,124.877736 L2.21392542,124.929736 L2.13992542,125.034736 C1.97592542,125.295736 1.87992542,125.543736 1.77592542,125.790736 C1.58092542,126.285736 1.42092542,126.779736 1.23892542,127.257736 C1.14992542,127.496736 1.05792542,127.734736 0.950925423,127.959736 C0.897925423,128.075736 0.842925423,128.180736 0.787925423,128.285736 C0.756925423,128.338736 0.719925423,128.393736 0.685925423,128.446736 L0.578925423,128.601736 C0.432925423,128.817736 0.291925423,129.037736 0.172925423,129.277736 C0.114925423,129.398736 0.0639254228,129.525736 0.0319254228,129.662736 C0,129.799736 -0.0160745772,129.952736 0.0229254228,130.106736 C0.0589254228,130.261736 0.160925423,130.400736 0.276925423,130.493736 C0.394925423,130.586736 0.523925423,130.646736 0.650925423,130.696736 C0.779925423,130.742736 0.907925423,130.773736 1.03592542,130.797736 C1.09992542,130.810736 1.16592542,130.819736 1.23092542,130.828736 L1.41292542,130.854736 C1.72192542,130.881736 1.98092542,130.801736 2.22692542,130.718736 C2.47192542,130.630736 2.69792542,130.519736 2.91392542,130.399736 C3.34592542,130.159736 3.73492542,129.878736 4.08592542,129.576736 C4.79492542,128.977736 5.33892542,128.280736 5.76892542,127.586736 C5.82192542,127.500736 5.87492542,127.412736 5.92592542,127.322736 C5.97792542,127.227736 6.01092542,127.156736 6.05992542,127.061736 C6.07492542,127.030736 6.08992542,127.001736 6.10492542,126.971736 C6.09492542,127.004736 6.08492542,127.037736 6.07492542,127.073736 C6.01292542,127.310736 5.95592542,127.534736 5.93292542,127.820736 C5.92592542,127.903736 5.93792542,128.006736 5.94192542,128.053736 L5.95692542,128.228736 L5.99192542,128.578736 L6.06392542,129.278736 L6.22892542,130.671736 L6.40592542,132.067736 C6.46992542,132.532736 6.53992542,132.996736 6.61792542,133.459736 L6.64892542,133.633736 L6.66292542,133.719736 L6.68392542,133.820736 C6.71092542,133.957736 6.74592542,134.081736 6.78292542,134.204736 C6.85792542,134.451736 6.94492542,134.681736 7.04092542,134.907736 C7.22792542,135.358736 7.43492542,135.787736 7.65592542,136.209736 C7.87192542,136.632736 8.11992542,137.037736 8.35392542,137.445736 L9.04292542,138.673736 L9.72292542,139.916736 C9.84392542,140.122736 9.96492542,140.330736 10.1289254,140.528736 C10.2129254,140.624736 10.3119254,140.721736 10.4349254,140.790736 C10.5579254,140.860736 10.6949254,140.894736 10.8219254,140.911736 C10.9479254,140.929736 11.0759254,140.932736 11.1899254,140.934736 C11.3429254,140.936736 11.4839254,140.890736 11.6039254,140.826736 C11.8449254,140.697736 12.0269254,140.506736 12.1809254,140.302736 C12.3359254,140.096736 12.4579254,139.867736 12.5409254,139.617736 C12.6249254,139.366736 12.6719254,139.094736 12.6349254,138.797736 C12.5899254,138.526736 12.5319254,138.299736 12.4699254,138.068736 C12.4539254,138.009736 12.4379254,137.951736 12.4209254,137.891736 C12.5399254,138.114736 12.6609254,138.332736 12.7899254,138.549736 C13.1309254,139.124736 13.5159254,139.674736 13.9559254,140.190736 C14.1759254,140.448736 14.4179254,140.691736 14.6929254,140.913736 C14.8309254,141.024736 14.9779254,141.127736 15.1579254,141.213736 C15.2539254,141.252736 15.3479254,141.294736 15.4819254,141.304736 L15.5059254,141.306736 L15.5419254,141.306736 L15.5729254,141.305736 C15.5959254,141.305736 15.6509254,141.297736 15.6859254,141.289736 C15.7489254,141.274736 15.8059254,141.250736 15.8569254,141.224736 C16.0569254,141.114736 16.1929254,140.971736 16.3009254,140.817736 C16.4099254,140.662736 16.4939254,140.499736 16.5559254,140.328736 C16.6789254,139.990736 16.7239254,139.625736 16.6859254,139.272736 C16.6659254,139.095736 16.6249254,138.922736 16.5569254,138.757736 C16.4889254,138.607736 16.4329254,138.452736 16.3619254,138.298736 C16.2349254,137.989736 16.1009254,137.688736 15.9819254,137.375736 C15.8599254,137.067736 15.7399254,136.754736 15.6089254,136.450736 C15.5739254,136.367736 15.5349254,136.286736 15.4969254,136.206736 C15.6989254,136.526736 15.9049254,136.842736 16.1239254,137.151736 C16.4499254,137.613736 16.7989254,138.061736 17.1839254,138.485736 C17.3789254,138.695736 17.5819254,138.899736 17.8069254,139.086736 C18.0309254,139.275736 18.2759254,139.452736 18.5719254,139.574736 C18.7179254,139.633736 18.8849254,139.678736 19.0659254,139.680736 C19.2459254,139.681736 19.4439254,139.627736 19.5999254,139.517736 C19.9129254,139.290736 20.0449254,138.960736 20.1209254,138.659736 C20.1579254,138.502736 20.1809254,138.349736 20.1839254,138.181736 C20.1809254,137.987736 20.1539254,137.834736 20.1129254,137.680736 C20.0329254,137.374736 19.8939254,137.108736 19.7459254,136.855736 C19.5909254,136.606736 19.4219254,136.372736 19.2459254,136.145736 C19.0709254,135.919736 18.8769254,135.707736 18.6739254,135.507736 C18.4719254,135.305736 18.2709254,135.106736 18.0939254,134.887736 C18.0509254,134.832736 18.0079254,134.779736 17.9679254,134.722736 C17.9259254,134.666736 17.8989254,134.616736 17.8629254,134.549736 C17.7899254,134.416736 17.7119254,134.300736 17.6349254,134.179736 C17.5939254,134.114736 17.5529254,134.047736 17.5109254,133.982736 C17.5829254,134.036736 17.6799254,134.111736 17.8029254,134.203736 C18.0799254,134.408736 18.4799254,134.696736 18.9949254,134.995736 C19.2529254,135.145736 19.5399254,135.296736 19.8609254,135.431736 C20.0219254,135.496736 20.1929254,135.557736 20.3759254,135.604736 C20.5599254,135.648736 20.7539254,135.687736 20.9799254,135.668736 C21.0909254,135.657736 21.2179254,135.633736 21.3449254,135.545736 C21.4099254,135.497736 21.4639254,135.451736 21.5129254,135.349736 C21.5399254,135.289736 21.5279254,135.312736 21.5519254,135.251736 L21.5829254,135.193736 C21.6779254,135.026736 21.7599254,134.763736 21.7439254,134.509736 C21.7249254,134.253736 21.6559254,134.027736 21.5419254,133.809736 L21.5069254,133.744736 L21.4889254,133.712736 L21.4799254,133.696736 L21.4599254,133.664736 C21.4199254,133.605736 21.3839254,133.556736 21.3469254,133.513736 C21.2729254,133.426736 21.2039254,133.348736 21.1299254,133.275736 C20.8359254,132.987736 20.5279254,132.738736 20.2209254,132.494736 C19.9179254,132.249736 19.5979254,132.032736 19.2789254,131.839736 C19.1629254,131.791736 19.0439254,131.658736 18.9539254,131.514736 C18.8639254,131.369736 18.7959254,131.210736 18.7469254,131.051736 C18.6419254,130.734736 18.6519254,130.393736 18.5469254,130.077736 C18.5319254,129.972736 18.5059254,129.842736 18.4719254,129.721736 C18.4369254,129.599736 18.3959254,129.479736 18.3549254,129.365736 C18.2719254,129.137736 18.1729254,128.936736 18.0629254,128.779736 C17.9549254,128.621736 17.8409254,128.508736 17.7479254,128.450736 C17.7049254,128.421736 17.6609254,128.399736 17.6369254,128.392736 C17.6119254,128.383736 17.5999254,128.379736 17.5999254,128.379736 L17.5969254,128.379736 C17.5889254,128.376736 17.5789254,128.377736 17.5699254,128.380736 C17.5789254,128.368736 17.6019254,128.339736 17.6369254,128.294736 C17.6849254,128.233736 17.7479254,128.139736 17.8159254,128.009736 C17.8819254,127.878736 17.9489254,127.712736 17.9979254,127.512736 C18.0449254,127.312736 18.0739254,127.078736 18.0739254,126.826736 C18.0759254,126.572736 18.0549254,126.297736 18.0079254,126.012736 C17.9629254,125.728736 17.8979254,125.432736 17.8279254,125.134736 C17.7959254,124.985736 17.7609254,124.834736 17.7399254,124.692736 C17.7349254,124.656736 17.7299254,124.620736 17.7279254,124.587736 C17.7259254,124.549736 17.7239254,124.546736 17.7249254,124.498736 C17.7279254,124.443736 17.7579254,124.358736 17.7759254,124.285736 C17.8579254,123.983736 17.9419254,123.660736 18.0079254,123.334736 C18.1399254,122.681736 18.2049254,121.998736 18.1609254,121.348736 C18.1389254,121.024736 18.0909254,120.707736 18.0139254,120.412736 C17.9369254,120.118736 17.8349254,119.842736 17.7079254,119.604736 C17.5209254,119.233736 17.2779254,118.961736 17.0609254,118.776736 C17.0379254,118.678736 17.0099254,118.556736 16.9839254,118.409736 C16.9029254,117.998736 16.8659254,117.398736 17.0429254,116.661736 C17.2109254,115.924736 17.5729254,115.053736 18.0669254,114.083736 C18.5679254,113.114736 19.1929254,112.048736 19.9099254,110.884736 C20.6299254,109.698736 21.3749254,108.380736 22.0219254,106.919736 C22.6739254,105.460736 23.2429254,103.870736 23.7599254,102.212736 C24.2719254,100.551736 24.7689254,98.833736 25.1949254,97.063736 C25.2989254,96.619736 25.4049254,96.175736 25.4969254,95.725736 C25.5459254,95.500736 25.5899254,95.275736 25.6309254,95.048736 C25.6779254,94.823736 25.7209254,94.596736 25.7599254,94.368736 C25.8019254,94.140736 25.8379254,93.911736 25.8729254,93.681736 C25.9119254,93.453736 25.9439254,93.222736 25.9759254,92.992736 L26.0719254,92.311736 C26.1099254,92.087736 26.1429254,91.874736 26.1879254,91.653736 C26.5329254,89.891736 27.1369254,88.208736 27.8589254,86.604736 C28.5809254,84.995736 29.4629254,83.480736 30.2839254,81.944736 C30.4909254,81.559736 30.6869254,81.175736 30.8769254,80.776736 C30.9679254,80.584736 31.0569254,80.394736 31.1469254,80.204736 C31.2339254,80.007736 31.3209254,79.811736 31.4069254,79.616736 C31.7419254,78.837736 32.0429254,78.068736 32.3039254,77.307736 C32.3849254,77.072736 32.4619254,76.838736 32.5369254,76.606736 C32.5879254,76.915736 32.6509254,77.252736 32.7219254,77.618736 C32.7599254,77.814736 32.7999254,78.018736 32.8409254,78.229736 C32.8869254,78.440736 32.9349254,78.659736 32.9839254,78.883736 C33.1809254,79.785736 33.4259254,80.797736 33.7339254,81.891736 C34.0469254,82.983736 34.4029254,84.163736 34.8649254,85.384736 C34.9829254,85.683736 35.1029254,85.987736 35.2239254,86.293736 C35.3199254,86.545736 35.3999254,86.875736 35.4699254,87.194736 C35.6119254,87.841736 35.7339254,88.524736 35.8449254,89.217736 C36.0629254,90.609736 36.2249254,92.061736 36.2969254,93.540736 C36.3809254,95.020736 36.3919254,96.527736 36.3689254,98.034736 C36.3489254,99.540736 36.3059254,101.047736 36.3079254,102.528736 C36.3019254,104.007736 36.2939254,105.467736 36.2599254,106.864736 C36.2529254,107.037736 36.2469254,107.209736 36.2409254,107.381736 C36.2329254,107.547736 36.2219254,107.725736 36.2079254,107.855736 L36.2069254,107.866736 L36.2039254,107.881736 L36.1929254,107.945736 L36.1799254,108.008736 L36.1679254,108.053736 L36.1439254,108.145736 L36.1109254,108.258736 C36.0689254,108.411736 36.0159254,108.570736 35.9669254,108.727736 C35.7629254,109.358736 35.5449254,109.983736 35.3349254,110.590736 C34.9129254,111.812736 34.5149254,112.967736 34.1469254,114.033736 C33.7869254,115.103736 33.4539254,116.085736 33.1749254,116.961736 C32.8889254,117.835736 32.6559254,118.603736 32.4679254,119.238736 C32.2799254,119.872736 32.1429254,120.375736 32.0559254,120.721736 C31.9719254,121.057736 31.9349254,121.242736 31.9339254,121.252736 L31.4359254,122.352736 L30.9639254,123.469736 C30.6579254,124.217736 30.3659254,124.971736 30.0849254,125.730736 C29.9429254,126.108736 29.8139254,126.492736 29.6799254,126.873736 C29.5459254,127.255736 29.4159254,127.638736 29.2919254,128.023736 C29.0369254,128.791736 28.8109254,129.568736 28.5779254,130.344736 C28.3589254,131.122736 28.1369254,131.902736 27.9469254,132.690736 C27.7429254,133.472736 27.5659254,134.262736 27.3809254,135.051736 L27.1339254,136.241736 C27.0499254,136.636736 26.9709254,137.034736 26.8989254,137.432736 L26.6749254,138.625736 C26.6079254,139.025736 26.5389254,139.423736 26.4779254,139.824736 C26.3449254,140.622736 26.2429254,141.425736 26.1309254,142.227736 C26.0389254,143.032736 25.9469254,143.834736 25.8689254,144.640736 L25.7699254,145.850736 C25.7359254,146.251736 25.7039254,146.658736 25.6839254,147.059736 C25.6359254,147.864736 25.5909254,148.668736 25.5529254,149.478736 C25.5099254,150.285736 25.4839254,151.092736 25.4549254,151.899736 C25.4459254,152.303736 25.4289254,152.706736 25.4139254,153.110736 L25.3849254,154.322736 C25.3689254,155.129736 25.3479254,155.936736 25.3669254,156.747736 C25.3709254,157.151736 25.3809254,157.557736 25.4049254,157.963736 C25.4179254,158.167736 25.4309254,158.369736 25.4549254,158.575736 C25.4659254,158.677736 25.4789254,158.780736 25.4959254,158.883736 C25.5039254,158.935736 25.5139254,158.988736 25.5249254,159.040736 C25.5339254,159.080736 25.5409254,159.116736 25.5529254,159.160736 L25.0929254,162.593736 C24.9399254,163.754736 24.7749254,164.897736 24.6719254,166.086736 L24.6649254,166.331736 L24.6679254,166.549736 C24.6679254,166.695736 24.6649254,166.824736 24.6579254,166.967736 C24.6469254,167.249736 24.6189254,167.534736 24.5909254,167.819736 C24.5289254,168.388736 24.4449254,168.960736 24.3559254,169.534736 C24.1739254,170.680736 23.9799254,171.832736 23.8129254,172.993736 C23.6419254,174.152736 23.5079254,175.319736 23.4009254,176.491736 C23.3029254,177.663736 23.2379254,178.840736 23.2189254,180.020736 C23.2069254,180.609736 23.2119254,181.199736 23.2209254,181.788736 C23.2349254,182.382736 23.2589254,182.967736 23.2809254,183.547736 C23.3289254,184.715736 23.3759254,185.882736 23.4369254,187.046736 L23.6239254,190.537736 L23.8259254,194.026736 L24.0129254,197.512736 C24.0739254,198.675736 24.1249254,199.837736 24.1719254,200.999736 C24.2239254,202.160736 24.2549254,203.322736 24.2789254,204.484736 C24.2929254,205.063736 24.2949254,205.646736 24.3019254,206.223736 L24.2989254,207.973736 L24.3099254,211.472736 C24.3119254,212.636736 24.3079254,213.802736 24.3249254,214.970736 L24.3249254,214.972736 C24.3249254,214.974736 24.3269254,214.975736 24.3269254,214.977736 C24.3119254,215.004736 24.2779254,215.067736 24.2269254,215.162736 C24.1599254,215.294736 24.0669254,215.496736 23.9259254,215.720736 C23.8549254,215.833736 23.7859254,215.961736 23.7099254,216.098736 C23.6199254,216.235736 23.5259254,216.382736 23.4299254,216.540736 C23.2479254,216.863736 22.9989254,217.205736 22.7629254,217.596736 C22.6399254,217.787736 22.4999254,217.980736 22.3659254,218.186736 C22.2299254,218.392736 22.0969254,218.608736 21.9479254,218.824736 C21.8019254,219.041736 21.6669254,219.276736 21.5289254,219.516736 C21.3799254,219.751736 21.2289254,219.992736 21.0749254,220.236736 C20.9979254,220.360736 20.9159254,220.481736 20.8349254,220.604736 C20.7479254,220.722736 20.6549254,220.836736 20.5599254,220.952736 C20.3709254,221.182736 20.1719254,221.409736 19.9589254,221.625736 C19.5199254,222.050736 19.0359254,222.448736 18.5489254,222.846736 C18.0639254,223.248736 17.5779254,223.659736 17.1529254,224.118736 C16.7239254,224.574736 16.3189254,225.046736 15.9649254,225.543736 C15.6089254,226.039736 15.3099254,226.570736 15.1269254,227.140736 C14.9439254,227.704736 14.8829254,228.332736 15.0559254,228.897736 C15.1119254,229.033736 15.1639254,229.168736 15.2349254,229.286736 C15.2729254,229.344736 15.3109254,229.401736 15.3489254,229.457736 C15.3859254,229.513736 15.4239254,229.567736 15.4719254,229.611736 C15.5629254,229.700736 15.6429254,229.799736 15.7409254,229.865736 C15.8369254,229.932736 15.9289254,229.997736 16.0199254,230.056736 C16.2099254,230.149736 16.3829254,230.247736 16.5539254,230.290736 C16.6379254,230.317736 16.7179254,230.343736 16.7939254,230.368736 C16.8699254,230.393736 16.9469254,230.399736 17.0169254,230.414736 C17.1579254,230.438736 17.2799254,230.469736 17.3899254,230.476736 C17.4329254,230.479736 17.4709254,230.482736 17.5079254,230.485736 C17.5569254,230.535736 17.6079254,230.583736 17.6629254,230.624736 C17.7869254,230.723736 17.9219254,230.794736 18.0519254,230.843736 C18.1199254,230.869736 18.1749254,230.885736 18.2519254,230.908736 L18.3279254,230.922736 L18.4239254,230.938736 C18.6759254,230.975736 18.9109254,230.958736 19.1189254,230.906736 C19.3259254,230.853736 19.4999254,230.764736 19.6339254,230.669736 C19.6839254,230.635736 19.7269254,230.599736 19.7679254,230.564736 C19.8469254,230.676736 19.9369254,230.783736 20.0409254,230.875736 C20.2759254,231.084736 20.5769254,231.211736 20.8559254,231.241736 C20.9259254,231.248736 20.9939254,231.251736 21.0599254,231.249736 L21.1179254,231.248736 L21.1569254,231.244736 L21.2329254,231.236736 C21.3279254,231.225736 21.4489254,231.203736 21.5519254,231.185736 C21.7569254,231.136736 21.9399254,231.071736 22.0919254,230.989736 C22.2339254,230.912736 22.3429254,230.820736 22.4239254,230.734736 C22.4379254,230.760736 22.4489254,230.787736 22.4649254,230.815736 C22.5499254,230.949736 22.6629254,231.078736 22.8009254,231.179736 C22.9729254,231.303736 23.0709254,231.329736 23.1949254,231.387736 C23.6779254,231.576736 24.1839254,231.645736 24.6799254,231.631736 C24.9289254,231.628736 25.1769254,231.599736 25.4229254,231.547736 C25.5459254,231.522736 25.6679254,231.493736 25.7909254,231.452736 C25.8509254,231.434736 25.9129254,231.410736 25.9739254,231.385736 C26.0319254,231.364736 26.1019254,231.331736 26.1719254,231.297736 C26.1819254,231.291736 26.1909254,231.286736 26.1999254,231.283736 C26.5339254,231.525736 26.9109254,231.637736 27.2549254,231.702736 C27.6549254,231.775736 28.0389254,231.793736 28.4109254,231.798736 L28.9619254,231.798736 L29.5099254,231.791736 C29.8889254,231.780736 30.2719254,231.750736 30.6559254,231.670736 C31.0369254,231.588736 31.4259254,231.462736 31.7749254,231.238736 C32.1229254,231.017736 32.4179254,230.697736 32.5979254,230.344736 C32.6909254,230.168736 32.7599254,229.988736 32.8109254,229.809736 C32.8359254,229.721736 32.8589254,229.622736 32.8769254,229.535736 L32.8989254,229.407736 C32.9059254,229.350736 32.9139254,229.288736 32.9129254,229.245736 C32.9199254,228.877736 32.8869254,228.568736 32.8609254,228.250736 C32.8009254,227.624736 32.7339254,227.039736 32.6589254,226.500736 C32.6409254,226.366736 32.6229254,226.234736 32.6049254,226.104736 C32.5419254,225.512736 32.4819254,224.883736 32.4719254,224.214736 C32.4679254,223.991736 32.4699254,223.761736 32.4759254,223.528736 C32.4809254,223.412736 32.4859254,223.294736 32.4899254,223.176736 L32.5039254,223.007736 C32.5119254,222.960736 32.5149254,222.916736 32.5259254,222.869736 C32.5659254,222.672736 32.6279254,222.533736 32.7469254,222.404736 C32.8639254,222.270736 33.0909254,222.116736 33.3149254,221.875736 C33.5399254,221.637736 33.7179254,221.332736 33.8299254,221.031736 C33.9429254,220.726736 34.0079254,220.419736 34.0519254,220.115736 C34.1339254,219.502736 34.1339254,218.901736 34.1059254,218.278736 C34.0689254,217.640736 33.9679254,216.994736 33.7839254,216.349736 C33.6109254,215.705736 33.3249254,215.077736 33.1079254,214.506736 C33.0549254,214.365736 33.0099254,214.227736 32.9759254,214.096736 C32.9599254,214.031736 32.9469254,213.967736 32.9379254,213.906736 C32.9319254,213.875736 32.9299254,213.846736 32.9269254,213.816736 C32.9239254,213.800736 32.9239254,213.786736 32.9229254,213.772736 L32.9219254,213.750736 C32.9219254,213.750736 32.9219254,213.743736 32.9219254,213.738736 C32.9229254,213.576736 32.9209254,213.403736 32.9349254,213.266736 L32.9499254,213.041736 L32.9749254,212.795736 C33.0399254,212.139736 33.1469254,211.459736 33.2449254,210.767736 C33.3459254,210.074736 33.4599254,209.368736 33.5789254,208.651736 C33.6929254,207.932736 33.8089254,207.202736 33.9269254,206.461736 C33.9869254,206.091736 34.0479254,205.718736 34.1019254,205.340736 C34.1289254,205.151736 34.1559254,204.960736 34.1839254,204.770736 C34.2139254,204.584736 34.2429254,204.398736 34.2719254,204.211736 C34.4009254,203.498736 34.5889254,202.744736 34.8029254,202.000736 C35.2369254,200.505736 35.7809254,198.986736 36.2709254,197.412736 C36.7559254,195.825736 37.1329254,194.213736 37.6289254,192.602736 C38.0989254,190.985736 38.6199254,189.363736 39.1589254,187.730736 C39.4339254,186.916736 39.7119254,186.098736 39.9889254,185.279736 C40.2739254,184.459736 40.5569254,183.637736 40.8259254,182.805736 C41.3639254,181.144736 41.8409254,179.429736 42.0989254,177.666736 C42.3659254,175.905736 42.4269254,174.126736 42.4209254,172.372736 C42.4119254,171.495736 42.3929254,170.621736 42.3579254,169.752736 L42.3519254,169.590736 L42.3479254,169.440736 C42.3439254,169.325736 42.3489254,169.241736 42.3499254,169.146736 C42.3569254,168.952736 42.3709254,168.749736 42.3929254,168.551736 C42.4369254,168.150736 42.5089254,167.747736 42.5979254,167.347736 C42.9639254,165.739736 43.5729254,164.163736 44.2099254,162.625736 C44.8539254,161.087736 45.5499254,159.581736 46.2149254,158.086736 C47.5709254,155.108736 48.8399254,152.183736 49.8469254,149.317736 C50.0939254,148.599736 50.3229254,147.884736 50.5319254,147.174736 C50.7429254,146.469736 50.9259254,145.746736 51.0929254,145.068736 C51.4319254,143.716736 51.8159254,142.420736 52.2129254,141.178736 C53.0149254,138.699736 53.8029254,136.421736 54.4129254,134.369736 C54.7159254,133.342736 54.9749254,132.373736 55.1889254,131.470736 C55.4029254,130.567736 55.5589254,129.727736 55.6819254,128.967736 C55.8609254,127.821736 55.9529254,126.853736 55.9929254,126.092736 C56.0329254,126.853736 56.1249254,127.821736 56.3039254,128.967736 C56.4259254,129.727736 56.5829254,130.567736 56.7969254,131.470736 C57.0099254,132.373736 57.2699254,133.342736 57.5719254,134.369736 C58.1829254,136.421736 58.9709254,138.699736 59.7719254,141.178736 C60.1709254,142.420736 60.5539254,143.716736 60.8929254,145.068736 C61.0599254,145.746736 61.2419254,146.469736 61.4539254,147.174736 C61.6619254,147.884736 61.8909254,148.599736 62.1379254,149.317736 C63.1459254,152.183736 64.4149254,155.108736 65.7709254,158.087736 C66.4359254,159.581736 67.1309254,161.087736 67.7759254,162.625736 C68.4129254,164.163736 69.0219254,165.739736 69.3869254,167.347736 C69.4769254,167.747736 69.5479254,168.150736 69.5929254,168.551736 C69.6149254,168.749736 69.6299254,168.952736 69.6349254,169.146736 C69.6359254,169.241736 69.6419254,169.325736 69.6369254,169.440736 L69.6339254,169.590736 L69.6279254,169.752736 C69.5929254,170.621736 69.5739254,171.495736 69.5659254,172.372736 C69.5589254,174.126736 69.6199254,175.905736 69.8859254,177.666736 C70.1449254,179.429736 70.6219254,181.144736 71.1589254,182.805736 C71.4289254,183.637736 71.7119254,184.459736 71.9959254,185.279736 C72.2749254,186.098736 72.5509254,186.916736 72.8269254,187.730736 C73.3659254,189.363736 73.8859254,190.985736 74.3569254,192.602736 C74.8529254,194.213736 75.2299254,195.825736 75.7149254,197.412736 C76.2049254,198.986736 76.7499254,200.505736 77.1829254,202.000736 C77.3969254,202.744736 77.5849254,203.498736 77.7139254,204.211736 C77.7429254,204.398736 77.7729254,204.584736 77.8019254,204.770736 C77.8299254,204.960736 77.8569254,205.151736 77.8839254,205.340736 C77.9379254,205.718736 77.9999254,206.091736 78.0589254,206.462736 C78.1759254,207.202736 78.2929254,207.932736 78.4069254,208.651736 C78.5259254,209.368736 78.6399254,210.074736 78.7409254,210.767736 C78.8389254,211.459736 78.9469254,212.139736 79.0109254,212.795736 L79.0359254,213.041736 L79.0509254,213.266736 C79.0649254,213.403736 79.0629254,213.576736 79.0649254,213.738736 C79.0639254,213.743736 79.0639254,213.750736 79.0639254,213.750736 L79.0619254,213.772736 C79.0619254,213.786736 79.0619254,213.800736 79.0599254,213.816736 C79.0549254,213.846736 79.0539254,213.875736 79.0489254,213.906736 C79.0379254,213.967736 79.0259254,214.031736 79.0099254,214.096736 C78.9759254,214.227736 78.9299254,214.365736 78.8779254,214.506736 C78.6609254,215.077736 78.3749254,215.706736 78.2019254,216.349736 C78.0179254,216.994736 77.9169254,217.640736 77.8799254,218.278736 C77.8519254,218.901736 77.8529254,219.502736 77.9329254,220.115736 C77.9779254,220.419736 78.0429254,220.726736 78.1559254,221.031736 C78.2679254,221.332736 78.4459254,221.637736 78.6709254,221.875736 C78.8949254,222.116736 79.1219254,222.270736 79.2389254,222.404736 C79.3579254,222.533736 79.4189254,222.672736 79.4599254,222.869736 C79.4709254,222.916736 79.4729254,222.960736 79.4819254,223.007736 L79.4949254,223.176736 C79.4999254,223.294736 79.5049254,223.412736 79.5099254,223.528736 C79.5149254,223.761736 79.5169254,223.991736 79.5129254,224.214736 C79.5059254,224.741736 79.4669254,225.239736 79.4199254,225.717736 C79.3829254,225.965736 79.3469254,226.226736 79.3109254,226.500736 C79.2349254,227.039736 79.1679254,227.624736 79.1079254,228.250736 C79.0829254,228.568736 79.0489254,228.877736 79.0559254,229.245736 C79.0559254,229.288736 79.0639254,229.350736 79.0699254,229.407736 L79.0929254,229.535736 C79.1109254,229.622736 79.1339254,229.721736 79.1589254,229.809736 C79.2099254,229.988736 79.2789254,230.168736 79.3709254,230.344736 C79.5519254,230.697736 79.8459254,231.017736 80.1949254,231.238736 C80.5439254,231.462736 80.9329254,231.588736 81.3139254,231.670736 C81.6969254,231.750736 82.0809254,231.780736 82.4589254,231.791736 L83.0079254,231.798736 L83.5579254,231.798736 C83.9299254,231.793736 84.3139254,231.775736 84.7149254,231.702736 C85.0579254,231.637736 85.4359254,231.525736 85.7699254,231.283736 C85.7789254,231.286736 85.7879254,231.291736 85.7979254,231.297736 C85.8679254,231.331736 85.9379254,231.364736 85.9949254,231.385736 C86.0569254,231.410736 86.1179254,231.434736 86.1789254,231.452736 C86.3019254,231.493736 86.4239254,231.522736 86.5469254,231.547736 C86.7929254,231.599736 87.0399254,231.628736 87.2889254,231.631736 C87.7849254,231.645736 88.2909254,231.576736 88.7749254,231.387736 C88.8979254,231.329736 88.9959254,231.303736 89.1689254,231.179736 C89.3069254,231.078736 89.4189254,230.949736 89.5049254,230.815736 C89.5209254,230.787736 89.5319254,230.760736 89.5459254,230.734736 C89.6259254,230.820736 89.7359254,230.912736 89.8779254,230.989736 C90.0299254,231.071736 90.2119254,231.136736 90.4169254,231.185736 C90.5199254,231.203736 90.6409254,231.225736 90.7359254,231.236736 L90.8129254,231.244736 L90.8509254,231.248736 L90.9089254,231.249736 C90.9749254,231.251736 91.0439254,231.248736 91.1139254,231.241736 C91.3929254,231.211736 91.6929254,231.084736 91.9279254,230.875736 C92.0319254,230.783736 92.1229254,230.676736 92.2019254,230.564736 C92.2419254,230.599736 92.2849254,230.635736 92.3359254,230.669736 C92.4699254,230.764736 92.6429254,230.853736 92.8499254,230.906736 C93.0579254,230.958736 93.2939254,230.975736 93.5449254,230.938736 L93.6419254,230.922736 L93.7169254,230.908736 C93.7949254,230.885736 93.8489254,230.869736 93.9179254,230.843736 C94.0479254,230.794736 94.1819254,230.723736 94.3069254,230.624736 C94.3619254,230.583736 94.4119254,230.536736 94.4599254,230.486736 C94.5019254,230.483736 94.5469254,230.480736 94.5959254,230.476736 C94.7059254,230.469736 94.8279254,230.438736 94.9689254,230.414736 C95.0389254,230.399736 95.1149254,230.393736 95.1909254,230.368736 C95.2679254,230.343736 95.3479254,230.317736 95.4309254,230.290736 C95.6029254,230.247736 95.7759254,230.149736 95.9659254,230.056736 C96.0559254,229.997736 96.1489254,229.932736 96.2449254,229.865736 C96.3419254,229.799736 96.4229254,229.700736 96.5139254,229.611736 C96.5619254,229.567736 96.5989254,229.513736 96.6369254,229.457736 C96.6749254,229.401736 96.7129254,229.344736 96.7519254,229.286736 C96.8219254,229.167736 96.8749254,229.033736 96.9299254,228.897736 C97.1029254,228.332736 97.0419254,227.704736 96.8579254,227.140736 C96.6749254,226.570736 96.3779254,226.039736 96.0209254,225.543736 C95.6669254,225.046736 95.2609254,224.574736 94.8329254,224.118736 C94.4079254,223.659736 93.9229254,223.248736 93.4379254,222.846736 C92.9499254,222.448736 92.4659254,222.050736 92.0279254,221.625736 C91.8149254,221.409736 91.6139254,221.182736 91.4249254,220.952736 C91.3319254,220.836736 91.2379254,220.722736 91.1509254,220.604736 C91.0699254,220.481736 90.9869254,220.360736 90.9109254,220.236736 C90.7569254,219.992736 90.6059254,219.751736 90.4579254,219.516736 C90.3189254,219.276736 90.1829254,219.041736 90.0369254,218.824736 C89.8879254,218.608736 89.7559254,218.392736 89.6199254,218.186736 C89.4859254,217.980736 89.3449254,217.787736 89.2219254,217.596736 C88.9869254,217.205736 88.7379254,216.863736 88.5559254,216.540736 C88.4599254,216.382736 88.3649254,216.235736 88.2759254,216.098736 C88.1999254,215.961736 88.1309254,215.833736 88.0609254,215.720736 C87.9189254,215.496736 87.8259254,215.294736 87.7579254,215.162736 C87.7079254,215.066736 87.6739254,215.004736 87.6589254,214.977736 C87.6589254,214.975736 87.6609254,214.973736 87.6609254,214.973736 L87.6609254,214.970736 C87.6769254,213.802736 87.6739254,212.636736 87.6759254,211.472736 L87.6869254,207.973736 L87.6839254,206.223736 C87.6909254,205.646736 87.6929254,205.063736 87.7069254,204.484736 C87.7319254,203.322736 87.7619254,202.160736 87.8139254,200.999736 C87.8609254,199.837736 87.9109254,198.675736 87.9719254,197.512736 L88.1589254,194.026736 L88.3609254,190.537736 L88.5489254,187.046736 C88.6099254,185.882736 88.6569254,184.715736 88.7059254,183.547736 C88.7279254,182.967736 88.7509254,182.382736 88.7649254,181.788736 C88.7739254,181.199736 88.7789254,180.609736 88.7669254,180.020736 C88.7479254,178.840736 88.6829254,177.663736 88.5839254,176.491736 C88.4779254,175.319736 88.3439254,174.152736 88.1729254,172.993736 C88.0069254,171.832736 87.8119254,170.680736 87.6299254,169.534736 C87.5409254,168.960736 87.4569254,168.388736 87.3959254,167.819736 C87.3669254,167.534736 87.3399254,167.249736 87.3279254,166.967736 C87.3209254,166.824736 87.3179254,166.695736 87.3179254,166.549736 L87.3209254,166.331736 L87.3139254,166.086736 C87.2119254,164.897736 87.0459254,163.754736 86.8929254,162.593736 L86.4319254,159.160736 C86.4449254,159.116736 86.4519254,159.080736 86.4609254,159.040736 C86.4719254,158.988736 86.4829254,158.935736 86.4889254,158.883736 C86.5069254,158.780736 86.5199254,158.677736 86.5299254,158.575736 C86.5549254,158.369736 86.5679254,158.167736 86.5819254,157.963736 C86.6049254,157.557736 86.6149254,157.151736 86.6189254,156.747736 C86.6369254,155.936736 86.6169254,155.129736 86.6009254,154.322736 L86.5719254,153.110736 C86.5569254,152.706736 86.5399254,152.303736 86.5309254,151.899736 C86.5029254,151.092736 86.4759254,150.285736 86.4329254,149.478736 C86.3949254,148.668736 86.3499254,147.864736 86.3019254,147.059736 C86.2819254,146.658736 86.2509254,146.251736 86.2159254,145.850736 L86.1169254,144.640736 C86.0389254,143.834736 85.9469254,143.032736 85.8549254,142.227736 C85.7429254,141.425736 85.6409254,140.622736 85.5079254,139.824736 C85.4469254,139.423736 85.3789254,139.025736 85.3099254,138.625736 L85.0869254,137.432736 C85.0149254,137.034736 84.9359254,136.636736 84.8519254,136.241736 L84.6049254,135.051736 C84.4199254,134.262736 84.2429254,133.472736 84.0389254,132.690736 C83.8479254,131.902736 83.6279254,131.122736 83.4079254,130.344736 C83.1739254,129.568736 82.9489254,128.791736 82.6939254,128.023736 C82.5699254,127.638736 82.4399254,127.255736 82.3049254,126.873736 C82.1719254,126.492736 82.0429254,126.108736 81.9009254,125.730736 C81.6199254,124.971736 81.3279254,124.217736 81.0229254,123.469736 L80.5489254,122.352736 L80.0519254,121.252736 C80.0509254,121.242736 80.0129254,121.057736 79.9299254,120.721736 C79.8429254,120.375736 79.7059254,119.872736 79.5179254,119.238736 C79.3299254,118.604736 79.0969254,117.835736 78.8109254,116.961736 C78.5319254,116.085736 78.1989254,115.103736 77.8389254,114.033736 C77.4709254,112.967736 77.0729254,111.812736 76.6509254,110.590736 C76.4419254,109.983736 76.2219254,109.358736 76.0199254,108.727736 C75.9699254,108.570736 75.9169254,108.411736 75.8749254,108.258736 L75.8409254,108.145736 L75.8179254,108.053736 L75.8049254,108.008736 L75.7929254,107.945736 L75.7809254,107.881736 L75.7789254,107.866736 L75.7779254,107.855736 C75.7639254,107.725736 75.7529254,107.547736 75.7449254,107.381736 C75.7389254,107.209736 75.7329254,107.037736 75.7259254,106.864736 C75.6919254,105.467736 75.6829254,104.007736 75.6779254,102.528736 C75.6799254,101.047736 75.6359254,99.540736 75.6169254,98.034736 C75.5929254,96.527736 75.6039254,95.020736 75.6899254,93.540736 C75.7609254,92.061736 75.9219254,90.609736 76.1409254,89.217736 C76.2529254,88.524736 76.3729254,87.841736 76.5159254,87.194736 C76.5859254,86.875736 76.6669254,86.545736 76.7619254,86.293736 C76.8829254,85.987736 77.0029254,85.683736 77.1209254,85.384736 C77.5829254,84.163736 77.9389254,82.983736 78.2519254,81.891736 C78.5589254,80.797736 78.8039254,79.785736 79.0019254,78.883736 C79.0509254,78.659736 79.0989254,78.440736 79.1449254,78.229736 C79.1859254,78.018736 79.2249254,77.814736 79.2639254,77.618736 C79.3319254,77.268736 79.3929254,76.945736 79.4419254,76.646736 C79.5129254,76.866736 79.5859254,77.085736 79.6629254,77.307736 C79.9239254,78.068736 80.2249254,78.837736 80.5589254,79.616736 C80.6459254,79.811736 80.7329254,80.007736 80.8199254,80.204736 C80.9089254,80.394736 80.9999254,80.584736 81.0909254,80.776736 C81.2789254,81.175736 81.4759254,81.559736 81.6829254,81.944736 C82.5039254,83.480736 83.3849254,84.995736 84.1079254,86.604736 C84.8299254,88.208736 85.4329254,89.891736 85.7789254,91.653736 C85.8239254,91.874736 85.8569254,92.087736 85.8949254,92.311736 L85.9909254,92.992736 C86.0229254,93.222736 86.0539254,93.453736 86.0939254,93.681736 C86.1289254,93.911736 86.1639254,94.140736 86.2069254,94.368736 C86.2459254,94.596736 86.2889254,94.823736 86.3359254,95.048736 C86.3769254,95.275736 86.4219254,95.500736 86.4689254,95.725736 C86.5619254,96.175736 86.6679254,96.619736 86.7719254,97.063736 C87.1969254,98.833736 87.6949254,100.551736 88.2059254,102.212736 C88.7229254,103.870736 89.2929254,105.460736 89.9449254,106.919736 C90.5919254,108.380736 91.3369254,109.698736 92.0569254,110.884736 C92.7739254,112.048736 93.3999254,113.114736 93.8999254,114.083736 C94.3929254,115.053736 94.7569254,115.924736 94.9239254,116.661736 C95.1009254,117.398736 95.0639254,117.998736 94.9829254,118.409736 C94.9499254,118.592736 94.9159254,118.737736 94.8889254,118.842736 C94.8319254,118.897736 94.7749254,118.955736 94.7169254,119.023736 C94.5809254,119.188736 94.4399254,119.389736 94.3239254,119.628736 C94.2059254,119.866736 94.1099254,120.137736 94.0369254,120.428736 C93.9659254,120.720736 93.9219254,121.032736 93.9009254,121.353736 C93.8609254,121.995736 93.9209254,122.672736 94.0409254,123.326736 C94.1009254,123.652736 94.1749254,123.974736 94.2499254,124.281736 C94.2649254,124.354736 94.2889254,124.439736 94.2909254,124.500736 C94.2919254,124.545736 94.2899254,124.555736 94.2859254,124.594736 C94.2839254,124.628736 94.2789254,124.664736 94.2729254,124.701736 C94.2509254,124.846736 94.2149254,124.996736 94.1799254,125.146736 C94.1089254,125.444736 94.0399254,125.738736 93.9909254,126.020736 C93.9409254,126.302736 93.9169254,126.575736 93.9159254,126.827736 C93.9129254,127.078736 93.9389254,127.310736 93.9839254,127.509736 C94.0289254,127.709736 94.0939254,127.875736 94.1569254,128.006736 C94.2229254,128.136736 94.2849254,128.231736 94.3309254,128.293736 C94.3659254,128.340736 94.3889254,128.369736 94.3979254,128.381736 C94.3889254,128.378736 94.3799254,128.375736 94.3699254,128.379736 L94.3669254,128.379736 C94.3669254,128.379736 94.3549254,128.383736 94.3289254,128.392736 C94.3059254,128.399736 94.2619254,128.421736 94.2179254,128.450736 C94.1249254,128.508736 94.0119254,128.621736 93.9039254,128.779736 C93.7949254,128.936736 93.6949254,129.137736 93.6119254,129.365736 C93.5699254,129.479736 93.5289254,129.599736 93.4949254,129.721736 C93.4609254,129.842736 93.4349254,129.972736 93.4199254,130.077736 C93.3139254,130.393736 93.3249254,130.734736 93.2199254,131.051736 C93.1709254,131.210736 93.1029254,131.369736 93.0129254,131.514736 C92.9229254,131.658736 92.8039254,131.791736 92.6879254,131.839736 C92.3689254,132.032736 92.0489254,132.249736 91.7449254,132.494736 C91.4389254,132.738736 91.1309254,132.987736 90.8369254,133.275736 C90.7629254,133.348736 90.6939254,133.426736 90.6199254,133.513736 C90.5829254,133.556736 90.5469254,133.605736 90.5069254,133.664736 L90.4869254,133.696736 L90.4779254,133.712736 L90.4599254,133.744736 L90.4239254,133.809736 C90.3099254,134.027736 90.2419254,134.253736 90.2229254,134.509736 C90.2069254,134.763736 90.2889254,135.026736 90.3829254,135.193736 L90.4149254,135.251736 C90.4389254,135.312736 90.4259254,135.289736 90.4539254,135.349736 C90.5029254,135.451736 90.5569254,135.497736 90.6219254,135.545736 C90.7489254,135.633736 90.8749254,135.657736 90.9869254,135.668736 C91.2129254,135.687736 91.4069254,135.648736 91.5909254,135.604736 C91.7739254,135.557736 91.9449254,135.496736 92.1059254,135.431736 C92.4269254,135.296736 92.7139254,135.145736 92.9719254,134.995736 C93.4869254,134.696736 93.8869254,134.408736 94.1639254,134.203736 C94.2859254,134.111736 94.3839254,134.036736 94.4559254,133.982736 C94.4139254,134.047736 94.3729254,134.114736 94.3309254,134.179736 C94.2549254,134.300736 94.1759254,134.416736 94.1039254,134.549736 C94.0679254,134.616736 94.0409254,134.666736 93.9999254,134.722736 C93.9599254,134.779736 93.9159254,134.832736 93.8719254,134.887736 C93.6959254,135.106736 93.4939254,135.305736 93.2929254,135.507736 C93.0899254,135.707736 92.8949254,135.919736 92.7199254,136.145736 C92.5449254,136.372736 92.3749254,136.606736 92.2199254,136.855736 C92.0729254,137.108736 91.9339254,137.374736 91.8539254,137.680736 C91.8129254,137.834736 91.7859254,137.987736 91.7829254,138.181736 C91.7859254,138.349736 91.8089254,138.502736 91.8449254,138.659736 C91.9219254,138.960736 92.0529254,139.290736 92.3669254,139.517736 C92.5229254,139.627736 92.7199254,139.681736 92.9019254,139.680736 C93.0829254,139.678736 93.2479254,139.633736 93.3949254,139.574736 C93.6919254,139.452736 93.9349254,139.275736 94.1599254,139.086736 C94.3849254,138.899736 94.5879254,138.695736 94.7829254,138.485736 C95.1679254,138.061736 95.5169254,137.613736 95.8419254,137.151736 C96.0619254,136.842736 96.2679254,136.526736 96.4689254,136.206736 C96.4319254,136.286736 96.3929254,136.367736 96.3579254,136.450736 C96.2259254,136.754736 96.1069254,137.067736 95.9849254,137.375736 C95.8649254,137.688736 95.7319254,137.989736 95.6049254,138.298736 C95.5339254,138.452736 95.4779254,138.607736 95.4099254,138.757736 C95.3419254,138.922736 95.3009254,139.095736 95.2809254,139.272736 C95.2419254,139.625736 95.2869254,139.990736 95.4109254,140.328736 C95.4729254,140.499736 95.5569254,140.662736 95.6649254,140.817736 C95.7739254,140.971736 95.9089254,141.114736 96.1099254,141.224736 C96.1609254,141.250736 96.2179254,141.274736 96.2809254,141.289736 C96.3159254,141.297736 96.3709254,141.305736 96.3939254,141.305736 L96.4249254,141.306736 L96.4609254,141.306736 L96.4849254,141.304736 C96.6179254,141.294736 96.7129254,141.252736 96.8079254,141.213736 C96.9879254,141.127736 97.1359254,141.024736 97.2749254,140.913736 C97.5489254,140.691736 97.7899254,140.448736 98.0099254,140.190736 C98.4509254,139.674736 98.8349254,139.124736 99.1759254,138.549736 C99.3049254,138.332736 99.4269254,138.114736 99.5449254,137.891736 C99.5289254,137.951736 99.5129254,138.009736 99.4969254,138.068736 C99.4349254,138.299736 99.3769254,138.526736 99.3319254,138.797736 C99.2949254,139.094736 99.3419254,139.366736 99.4249254,139.617736 C99.5089254,139.867736 99.6309254,140.096736 99.7859254,140.302736 C99.9399254,140.506736 100.120925,140.697736 100.362925,140.826736 C100.482925,140.890736 100.622925,140.936736 100.776925,140.934736 C100.890925,140.932736 101.017925,140.929736 101.144925,140.911736 C101.271925,140.894736 101.408925,140.860736 101.531925,140.790736 C101.654925,140.721736 101.752925,140.624736 101.836925,140.528736 C102.001925,140.330736 102.121925,140.122736 102.242925,139.916736 L102.923925,138.673736 L103.612925,137.445736 C103.846925,137.037736 104.094925,136.632736 104.310925,136.209736 C104.530925,135.787736 104.737925,135.358736 104.925925,134.907736 C105.020925,134.681736 105.109925,134.451736 105.182925,134.204736 C105.219925,134.081736 105.255925,133.957736 105.282925,133.820736 L105.302925,133.719736 L105.318925,133.633736 L105.348925,133.459736 C105.425925,132.996736 105.495925,132.532736 105.560925,132.067736 L105.737925,130.671736 L105.902925,129.278736 L105.974925,128.578736 L106.008925,128.228736 L106.024925,128.053736 C106.028925,128.006736 106.039925,127.903736 106.033925,127.820736 C106.009925,127.534736 105.952925,127.310736 105.891925,127.073736 C105.881925,127.037736 105.870925,127.004736 105.860925,126.971736 C105.876925,127.001736 105.891925,127.030736 105.906925,127.061736 C105.955925,127.156736 105.988925,127.227736 106.040925,127.322736 C106.091925,127.412736 106.144925,127.500736 106.197925,127.586736 C106.627925,128.280736 107.171925,128.977736 107.880925,129.576736 C108.231925,129.878736 108.620925,130.159736 109.051925,130.399736 C109.268925,130.519736 109.494925,130.630736 109.738925,130.718736 C109.986925,130.801736 110.244925,130.881736 110.553925,130.854736 L110.735925,130.828736 C110.800925,130.819736 110.866925,130.810736 110.930925,130.797736 C111.058925,130.773736 111.187925,130.742736 111.315925,130.696736 C111.442925,130.646736 111.570925,130.586736 111.689925,130.493736 C111.805925,130.400736 111.906925,130.261736 111.942925,130.106736 C111.982925,129.952736 111.966348,129.799736 111.934925,129.662736 L111.934925,129.662736 Z\" />\n          <G transform=\"translate(42.033108, 0.756736)\">\n            <Path d=\"M0.473817743,19.907 C0.859817743,21.397 1.46581774,22.837 2.18381774,23.75 C2.36181774,23.978 2.54681774,24.171 2.73181774,24.317 C2.91581774,24.464 3.10081774,24.563 3.26181774,24.615 C3.42281774,24.665 3.55581774,24.672 3.64481774,24.665 C3.68981774,24.662 3.72381774,24.657 3.74681774,24.654 C3.76881774,24.649 3.78081774,24.647 3.78081774,24.647 C3.78081774,24.647 3.76881774,24.648 3.74581774,24.651 C3.72281774,24.654 3.68881774,24.655 3.64481774,24.655 C3.55781774,24.654 3.42681774,24.636 3.27581774,24.574 C2.97081774,24.453 2.61381774,24.129 2.30781774,23.66 C1.68681774,22.723 1.21081774,21.273 0.955817743,19.803 C0.827817743,19.068 0.753817743,18.324 0.735817743,17.63 C0.717817743,16.941 0.747817743,16.287 0.884817743,15.817 C0.915817743,15.698 0.959817743,15.6 1.00081774,15.515 C1.04481774,15.436 1.09081774,15.377 1.12881774,15.346 C1.20481774,15.288 1.23081774,15.3 1.30981774,15.311 C1.38281774,15.325 1.45981774,15.365 1.50681774,15.394 C1.52981774,15.409 1.54681774,15.42 1.55581774,15.428 C1.56181774,15.432 1.56481774,15.435 1.56481774,15.435 C1.57981774,15.447 1.59681774,15.46 1.61281774,15.47 C1.83681774,15.615 2.13581774,15.553 2.28181774,15.328 C2.42781774,15.105 2.36381774,14.806 2.13981774,14.659 L2.13081774,14.654 C2.13081774,14.654 2.11481774,14.643 2.08281774,14.621 C2.05281774,14.603 2.01281774,14.58 1.95681774,14.552 C1.84681774,14.5 1.68481774,14.422 1.42781774,14.393 C1.29981774,14.379 1.14381774,14.382 0.974817743,14.432 C0.806817743,14.481 0.638817743,14.585 0.513817743,14.717 C0.386817743,14.848 0.298817743,14.999 0.228817743,15.152 C0.166817743,15.305 0.115817743,15.463 0.085817743,15.623 C-0.042182257,16.261 -0.00718225699,16.95 0.062817743,17.676 C0.140817743,18.401 0.279817743,19.161 0.473817743,19.907\" />\n            <Path d=\"M26.3468177,15.435 C26.3468177,15.435 26.3498177,15.432 26.3548177,15.428 C26.3638177,15.42 26.3818177,15.409 26.4048177,15.394 C26.4508177,15.365 26.5288177,15.325 26.6018177,15.311 C26.6798177,15.3 26.7068177,15.288 26.7818177,15.346 C26.8198177,15.377 26.8668177,15.436 26.9108177,15.515 C26.9518177,15.6 26.9968177,15.698 27.0268177,15.817 C27.1638177,16.287 27.1938177,16.941 27.1758177,17.63 C27.1578177,18.324 27.0838177,19.068 26.9558177,19.803 C26.7008177,21.273 26.2238177,22.723 25.6028177,23.66 C25.2978177,24.129 24.9408177,24.453 24.6358177,24.574 C24.4838177,24.636 24.3538177,24.654 24.2658177,24.655 C24.2218177,24.655 24.1878177,24.654 24.1648177,24.651 C24.1428177,24.648 24.1308177,24.647 24.1308177,24.647 C24.1308177,24.647 24.1418177,24.649 24.1648177,24.654 C24.1868177,24.657 24.2208177,24.662 24.2658177,24.665 C24.3548177,24.672 24.4888177,24.665 24.6498177,24.615 C24.8108177,24.563 24.9948177,24.464 25.1798177,24.317 C25.3638177,24.171 25.5498177,23.978 25.7278177,23.75 C26.4458177,22.837 27.0518177,21.397 27.4378177,19.907 C27.6308177,19.161 27.7698177,18.401 27.8488177,17.676 C27.9188177,16.95 27.9528177,16.261 27.8258177,15.623 C27.7958177,15.463 27.7438177,15.305 27.6818177,15.152 C27.6128177,14.999 27.5238177,14.848 27.3978177,14.717 C27.2728177,14.585 27.1038177,14.481 26.9358177,14.432 C26.7678177,14.382 26.6108177,14.379 26.4838177,14.393 C26.2268177,14.422 26.0648177,14.5 25.9548177,14.552 C25.8998177,14.58 25.8588177,14.603 25.8288177,14.621 C25.7968177,14.643 25.7808177,14.654 25.7808177,14.654 L25.7688177,14.66 C25.7538177,14.671 25.7388177,14.683 25.7238177,14.695 C25.5188177,14.867 25.4928177,15.172 25.6648177,15.376 C25.8368177,15.58 26.1428177,15.608 26.3468177,15.435\" />\n            <Path d=\"M2.35181774,18.113 C2.37581774,18.685 2.42981774,19.133 2.45881774,19.438 C2.49781774,19.741 2.51781774,19.904 2.51781774,19.904 C2.51781774,19.904 2.51181774,19.74 2.50081774,19.435 C2.49581774,19.129 2.49081774,18.68 2.50481774,18.111 C2.52081774,17.541 2.55781774,16.85 2.63381774,16.063 C2.71281774,15.276 2.83181774,14.39 3.02781774,13.441 C3.12681774,12.968 3.24681774,12.479 3.39981774,11.984 C3.55281774,11.49 3.73481774,10.987 3.97781774,10.51 C4.09981774,10.272 4.23781774,10.041 4.39981774,9.835 C4.55781774,9.626 4.74481774,9.443 4.94981774,9.327 C5.05181774,9.27 5.15781774,9.228 5.26481774,9.207 C5.32081774,9.189 5.35881774,9.2 5.40481774,9.19 C5.41781774,9.189 5.42381774,9.183 5.44281774,9.186 L5.49881774,9.192 L5.61081774,9.202 L5.63881774,9.205 L5.63981774,9.205 L5.68781774,9.217 L5.78981774,9.241 C5.85681774,9.258 5.92481774,9.271 5.99381774,9.294 C6.12981774,9.335 6.26781774,9.378 6.40681774,9.431 C6.96181774,9.632 7.53881774,9.888 8.14081774,10.108 C8.74281774,10.33 9.36981774,10.526 10.0128177,10.665 C10.6568177,10.806 11.3108177,10.922 11.9728177,10.981 C12.3018177,11.023 12.6388177,11.032 12.9728177,11.057 C13.3048177,11.073 13.6268177,11.074 13.9548177,11.084 C15.2968177,11.076 16.6228177,10.956 17.9118177,10.665 C18.5558177,10.526 19.1828177,10.328 19.7838177,10.107 C20.3868177,9.887 20.9628177,9.631 21.5178177,9.43 L21.7258177,9.357 L21.9218177,9.296 C21.9838177,9.275 22.0608177,9.258 22.1348177,9.24 L22.2448177,9.215 L22.2998177,9.202 C22.2908177,9.204 22.3218177,9.201 22.3308177,9.2 C22.5548177,9.164 22.7708177,9.209 22.9768177,9.326 C23.1818177,9.442 23.3678177,9.625 23.5258177,9.834 C23.6878177,10.04 23.8268177,10.272 23.9478177,10.51 C24.1918177,10.987 24.3728177,11.49 24.5258177,11.983 C24.6798177,12.478 24.7998177,12.967 24.8988177,13.441 C25.2868177,15.341 25.3868177,16.973 25.4198177,18.111 C25.4348177,18.681 25.4298177,19.129 25.4248177,19.435 C25.4138177,19.74 25.4078177,19.904 25.4078177,19.904 C25.4078177,19.904 25.4278177,19.741 25.4658177,19.438 C25.4948177,19.133 25.5488177,18.685 25.5728177,18.113 C25.5998177,17.54 25.6178177,16.842 25.5858177,16.042 C25.5548177,15.242 25.4908177,14.34 25.3328177,13.362 C25.1698177,12.385 24.9548177,11.323 24.4628177,10.256 C24.3398177,9.99 24.1938177,9.726 24.0088177,9.472 C23.8278177,9.218 23.6048177,8.97 23.3018177,8.783 C23.0058177,8.594 22.6098177,8.49 22.2378177,8.548 C22.2098177,8.551 22.2018177,8.549 22.1568177,8.558 L22.1018177,8.57 L21.9908177,8.593 C21.9168177,8.609 21.8458177,8.622 21.7628177,8.647 L21.5218177,8.715 L21.2958177,8.789 C20.6958177,8.994 20.1288177,9.233 19.5428177,9.432 C18.9588177,9.632 18.3628177,9.807 17.7498177,9.939 C16.5298177,10.207 15.2378177,10.313 13.9708177,10.313 C13.6458177,10.305 13.3138177,10.307 12.9948177,10.291 C12.6788177,10.27 12.3638177,10.264 12.0468177,10.226 C11.4118177,10.174 10.7878177,10.067 10.1758177,9.938 C9.56281774,9.806 8.96681774,9.63 8.38181774,9.431 C7.79681774,9.232 7.22881774,8.993 6.62981774,8.788 C6.48181774,8.737 6.32781774,8.691 6.17181774,8.649 C6.09681774,8.624 6.01581774,8.609 5.93581774,8.593 L5.81581774,8.567 L5.75681774,8.555 C5.75681774,8.555 5.72481774,8.549 5.71281774,8.548 L5.69881774,8.547 L5.67081774,8.545 L5.55981774,8.535 C5.52281774,8.532 5.48681774,8.528 5.42881774,8.533 C5.32781774,8.543 5.21281774,8.543 5.12581774,8.571 C4.94181774,8.614 4.77281774,8.69 4.62281774,8.781 C4.31981774,8.969 4.09681774,9.217 3.91481774,9.471 C3.73081774,9.725 3.58481774,9.99 3.46081774,10.256 C2.96981774,11.323 2.75381774,12.385 2.59181774,13.362 C2.43381774,14.339 2.36881774,15.242 2.33881774,16.042 C2.30781774,16.842 2.32481774,17.54 2.35181774,18.113\" />\n            <Path d=\"M13.9438177,0.772 C10.4998177,0.778 3.74481774,2.406 2.87581774,8.531 C1.54181774,17.94 3.50181774,24.036 6.02681774,29.223 C7.54181774,32.335 9.70081774,35.239 13.7848177,35.401 L14.1408177,35.401 C18.2218177,35.235 20.3788177,32.334 21.8928177,29.223 C24.4178177,24.036 26.3768177,17.94 25.0438177,8.531 C24.1748177,2.406 17.4198177,0.779 13.9698177,0.773 C13.9598177,0.773 13.9498177,0.773 13.9438177,0.772 Z M14.1488177,36.172 L13.7698177,36.172 C9.26481774,35.993 7.14581774,32.889 5.52581774,29.561 C2.94681774,24.263 0.748817743,18.036 2.11181774,8.422 C2.93081774,2.649 8.81981774,0.01 13.9458177,0.001 C13.9518177,0 13.9578177,0 13.9628177,0 C19.0978177,0.009 24.9888177,2.648 25.8078177,8.422 C27.1708177,18.036 24.9728177,24.263 22.3938177,29.561 C20.7728177,32.889 18.6548177,35.993 14.1648177,36.172 C14.1598177,36.172 14.1548177,36.172 14.1488177,36.172 L14.1488177,36.172 Z\" />\n          </G>\n        </G>\n      </G>\n    </Svg>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport {\n  Exercise_fromKey,\n  Exercise_toKey,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n  Exercise_get,\n} from \"../../models/exercise\";\nimport { IPoints, Muscle_getScreenMusclesFromMuscle, Muscle_getMuscleGroupName } from \"../../models/muscle\";\nimport { IScreenMuscle, ISettings } from \"../../types\";\nimport { CollectionUtils_sort, CollectionUtils_flat } from \"../../utils/collection\";\nimport { ObjectUtils_keys } from \"../../utils/object\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { Tabs2 } from \"../tabs2\";\nimport { BackMusclesSvg, IMuscleStyle } from \"./images/backMusclesSvg\";\nimport { FrontMusclesSvg } from \"./images/frontMusclesSvg\";\nimport { MenuItem } from \"../menuItem\";\n\nexport interface IMusclesViewProps {\n  title: string;\n  points: IPoints;\n  settings: ISettings;\n  hideListOfExercises?: boolean;\n}\n\nexport function MusclesView(props: IMusclesViewProps): JSX.Element {\n  return (\n    <Tabs2\n      tabs={[\n        [\n          \"Strength\",\n          <MusclesTypeView\n            type=\"strength\"\n            points={props.points}\n            settings={props.settings}\n            hideListOfExercises={props.hideListOfExercises}\n          />,\n        ],\n        [\n          \"Hypertrophy\",\n          <MusclesTypeView\n            type=\"hypertrophy\"\n            points={props.points}\n            settings={props.settings}\n            hideListOfExercises={props.hideListOfExercises}\n          />,\n        ],\n      ]}\n    />\n  );\n}\n\ninterface IMusclesTypeViewProps {\n  type: \"strength\" | \"hypertrophy\";\n  points: IPoints;\n  settings: ISettings;\n  hideListOfExercises?: boolean;\n}\n\nexport function MusclesTypeView(props: IMusclesTypeViewProps): JSX.Element {\n  const type = props.type;\n  const muscleData = ObjectUtils_keys(props.points.screenMusclePoints[type]).reduce<\n    Partial<Record<IScreenMuscle, IMuscleStyle>>\n  >((memo, key) => {\n    const value = props.points.screenMusclePoints[type][key];\n    memo[key] = { opacity: value, fill: \"#28839F\" };\n    return memo;\n  }, {});\n  const exercises = ObjectUtils_keys(props.points.exercisePoints[type]).map((k) => Exercise_fromKey(k));\n  return (\n    <View>\n      <View className=\"flex-row p-4\">\n        <View className=\"relative flex-1\">\n          <BackMusclesSvg muscles={muscleData} contour={{ fill: \"#28839F\" }} />\n        </View>\n        <View className=\"relative flex-1\">\n          <FrontMusclesSvg muscles={muscleData} contour={{ fill: \"#28839F\" }} />\n        </View>\n      </View>\n      <View className=\"px-4\">\n        <GroupHeader name=\"Muscles used, relatively to each other\" />\n        {CollectionUtils_sort(\n          ObjectUtils_keys(muscleData),\n          (a, b) => (muscleData[b]?.opacity || 0) - (muscleData[a]?.opacity || 0)\n        )\n          .filter((m) => m)\n          .map((muscleName) => {\n            const value = muscleName ? (muscleData[muscleName]?.opacity ?? 0) * 100 : undefined;\n            let color = \"text-text-secondary\";\n            if (value != null && value > 60) {\n              color = \"text-greenv2-600\";\n            } else if (value != null && value < 20) {\n              color = \"text-text-error\";\n            }\n            return (\n              <MenuItem\n                key={muscleName}\n                name={Muscle_getMuscleGroupName(muscleName, props.settings)}\n                value={<Text className={color}>{(value || 0).toFixed(0)}%</Text>}\n              />\n            );\n          })}\n        {!props.hideListOfExercises && (\n          <View>\n            <GroupHeader name={`List Of Exercises (${type})`} topPadding={true} />\n            <View className=\"py-4\">\n              {exercises\n                .filter((e) => props.points.exercisePoints[type][Exercise_toKey(e)] != null)\n                .map((e) => {\n                  const exerciseKey = Exercise_toKey(e);\n                  const targetScreenMuscles = Array.from(\n                    new Set(\n                      CollectionUtils_flat(\n                        Exercise_targetMuscles(e, props.settings).map((t) =>\n                          Muscle_getScreenMusclesFromMuscle(t, props.settings)\n                        )\n                      )\n                    )\n                  );\n                  const synergistScreenMuscles = Array.from(\n                    new Set(\n                      CollectionUtils_flat(\n                        Exercise_synergistMuscles(e, props.settings).map((t) =>\n                          Muscle_getScreenMusclesFromMuscle(t, props.settings)\n                        )\n                      )\n                    )\n                  );\n                  const targetScreenMusclesWithPercentage: [string, number][] = targetScreenMuscles.map((m) => [\n                    Muscle_getMuscleGroupName(m, props.settings),\n                    (props.points.exercisePoints[type][Exercise_toKey(e)]?.[m] || 0) * 100,\n                  ]);\n                  targetScreenMusclesWithPercentage.sort((a, b) => b[1] - a[1]);\n                  const synergistScreenMusclesWithPercentage: [string, number][] = synergistScreenMuscles.map((m) => [\n                    Muscle_getMuscleGroupName(m, props.settings),\n                    (props.points.exercisePoints[type][Exercise_toKey(e)]?.[m] || 0) * 100,\n                  ]);\n                  synergistScreenMusclesWithPercentage.sort((a, b) => b[1] - a[1]);\n                  return (\n                    <View key={exerciseKey} className=\"pb-2\">\n                      <Text className=\"text-base font-bold\">{Exercise_get(e, props.settings.exercises).name}</Text>\n                      <View className=\"flex-row\">\n                        <View data-testid=\"target-muscles-list\" testID=\"target-muscles-list\" className=\"flex-1\">\n                          <Text className=\"text-sm text-text-secondary\">Target</Text>\n                          {targetScreenMusclesWithPercentage.map(([m, val]) => (\n                            <Text key={m}>\n                              {m}: {val.toFixed(1)}%\n                            </Text>\n                          ))}\n                        </View>\n                        <View data-testid=\"synergist-muscles-list\" testID=\"synergist-muscles-list\" className=\"flex-1\">\n                          <Text className=\"text-sm text-text-secondary\">Synergist</Text>\n                          {synergistScreenMusclesWithPercentage.map(([m, val]) => (\n                            <Text key={m}>\n                              {m}: {val.toFixed(1)}%\n                            </Text>\n                          ))}\n                        </View>\n                      </View>\n                    </View>\n                  );\n                })}\n            </View>\n          </View>\n        )}\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { IPoints } from \"../../models/muscle\";\nimport { ISettings } from \"../../types\";\nimport { MusclesView } from \"./musclesView\";\nimport { useNavOptions } from \"../../navigation/useNavOptions\";\nimport { INavCommon } from \"../../models/state\";\nimport type { IHelpKey } from \"../help/helpRegistry\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  title: string;\n  helpKey: IHelpKey;\n  points: IPoints;\n  settings: ISettings;\n  navCommon: INavCommon;\n}\n\nexport function ScreenMuscles(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Muscles Map\", navSubtitle: props.title, navHelpKey: props.helpKey });\n\n  return <MusclesView title={props.title} points={props.points} settings={props.settings} />;\n}\n","import type { JSX } from \"react\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { Muscle_normalizePoints, Muscle_getPointsForDay } from \"../../models/muscle\";\nimport { ScreenMuscles } from \"./screenMuscles\";\nimport { ISettings, IProgram } from \"../../types\";\nimport { INavCommon } from \"../../models/state\";\nimport { Program_evaluate, Program_getProgramDay } from \"../../models/program\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  program: IProgram;\n  day: number;\n  navCommon: INavCommon;\n}\n\nexport function ScreenMusclesDay(props: IProps): JSX.Element {\n  const evaluatedProgram = Program_evaluate(props.program, props.settings);\n  const programDay = Program_getProgramDay(evaluatedProgram, props.day);\n  if (!programDay) {\n    return <></>;\n  }\n  const points = Muscle_normalizePoints(\n    Muscle_getPointsForDay(evaluatedProgram, programDay, props.navCommon.stats, props.settings)\n  );\n  return (\n    <ScreenMuscles\n      navCommon={props.navCommon}\n      dispatch={props.dispatch}\n      settings={props.settings}\n      points={points}\n      title={programDay.name}\n      helpKey=\"musclesDay\"\n    />\n  );\n}\n","import type { JSX } from \"react\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { Muscle_normalizePoints, Muscle_getPointsForProgram } from \"../../models/muscle\";\nimport { ScreenMuscles } from \"./screenMuscles\";\nimport { ISettings, IProgram } from \"../../types\";\nimport { INavCommon } from \"../../models/state\";\nimport { Program_evaluate } from \"../../models/program\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  program: IProgram;\n  navCommon: INavCommon;\n}\n\nexport function ScreenMusclesProgram(props: IProps): JSX.Element {\n  const evaluatedProgram = Program_evaluate(props.program, props.settings);\n  const points = Muscle_normalizePoints(\n    Muscle_getPointsForProgram(evaluatedProgram, props.navCommon.stats, props.settings)\n  );\n  return (\n    <ScreenMuscles\n      dispatch={props.dispatch}\n      settings={props.settings}\n      points={points}\n      navCommon={props.navCommon}\n      title={props.program.name}\n      helpKey=\"muscles\"\n    />\n  );\n}\n","import { JSX, memo, ReactNode, useCallback, useMemo, useRef } from \"react\";\nimport { View, Pressable, Platform, LayoutChangeEvent, StyleSheet } from \"react-native\";\nimport ReactNativeHapticFeedback from \"react-native-haptic-feedback\";\nimport { Text } from \"./primitives/text\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { IconKeyboardClose } from \"./icons/iconKeyboardClose\";\nimport { IconBackspace } from \"./icons/iconBackspace\";\nimport { IconCalculator } from \"./icons/iconCalculator\";\nimport { KeyboardRestTimer } from \"./restTimer\";\nimport { IPercentageUnit, IUnit } from \"../types\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport {\n  useCustomKeyboardActiveId,\n  useMeasuredKeyboardHeightRef,\n  useSetCustomKeyboardHeight,\n} from \"../navigation/CustomKeyboardContext\";\n\nexport interface INativeCustomKeyboardProps {\n  onInput: (value: string) => void;\n  onBlur: () => void;\n  onPlus: () => void;\n  onMinus: () => void;\n  allowDot?: boolean;\n  allowNegative?: boolean;\n  isNegative: boolean;\n  withDot: boolean;\n  keyboardAddon?: ReactNode;\n  enableCalculator?: boolean;\n  onShowCalculator?: () => void;\n  enableUnits?: (IUnit | IPercentageUnit)[];\n  onChangeUnits?: (unit: IUnit | IPercentageUnit) => void;\n  selectedUnit?: IUnit | IPercentageUnit;\n  applySafeAreaBottom?: boolean;\n  noShadow?: boolean;\n}\n\nconst KEY_ROWS = [\n  [\"1\", \"2\", \"3\"],\n  [\"4\", \"5\", \"6\"],\n  [\"7\", \"8\", \"9\"],\n];\n\nconst keyboardShadowStyle = Platform.select({\n  ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: -2 }, shadowOpacity: 0.08, shadowRadius: 4 },\n  android: { elevation: 4 },\n  default: {},\n});\n\nconst HAPTIC_OPTIONS = { enableVibrateFallback: false, ignoreAndroidSystemSettings: false };\n\nexport const NativeCustomKeyboard = memo(function NativeCustomKeyboard(props: INativeCustomKeyboardProps): JSX.Element {\n  const insets = useSafeAreaInsets();\n  const applySafeAreaBottom = props.applySafeAreaBottom !== false;\n  const bottomPadding = applySafeAreaBottom ? insets.bottom : 0;\n  const setKeyboardHeight = useSetCustomKeyboardHeight();\n  const measuredHeightRef = useMeasuredKeyboardHeightRef();\n  const activeId = useCustomKeyboardActiveId();\n  const activeIdRef = useRef(activeId);\n  activeIdRef.current = activeId;\n  const colors = Tailwind_semantic();\n  const keyboardTopBorderStyle = {\n    borderTopWidth: StyleSheet.hairlineWidth,\n    borderTopColor: colors.border.neutral,\n  };\n  const cardPressedStyle = ({ pressed }: { pressed: boolean }): { backgroundColor?: string } => ({\n    backgroundColor: pressed ? colors.background.cardpurpleselected : undefined,\n  });\n\n  const lastRow = useMemo(\n    () => [props.allowNegative ? \"-\" : \"\", \"0\", props.allowDot ? \".\" : \"\"],\n    [props.allowDot, props.allowNegative]\n  );\n\n  const handleBackspace = useCallback(() => props.onInput(\"⌫\"), [props.onInput]);\n\n  const onLayout = useCallback(\n    (e: LayoutChangeEvent) => {\n      const h = e.nativeEvent.layout.height;\n      if (h > 0) {\n        measuredHeightRef.current = h;\n        if (activeIdRef.current != null) {\n          setKeyboardHeight(h);\n        }\n      }\n    },\n    [setKeyboardHeight, measuredHeightRef]\n  );\n\n  return (\n    <View\n      onLayout={onLayout}\n      className=\"bg-background-default\"\n      style={[{ paddingBottom: bottomPadding }, props.noShadow ? keyboardTopBorderStyle : keyboardShadowStyle]}\n    >\n      {(props.keyboardAddon || props.enableCalculator) && (\n        <View className=\"flex-row items-center gap-2 px-4 bg-background-subtle\">\n          <View className=\"flex-1\">{props.keyboardAddon}</View>\n          {props.enableCalculator && (\n            <Pressable\n              testID=\"keyboard-rm-calculator\"\n              data-testid=\"keyboard-rm-calculator\"\n              onPress={props.onShowCalculator}\n              className=\"flex-row items-center justify-center w-scaled-24 px-2 py-1 my-2 border rounded border-border-cardpurple bg-background-cardpurple\"\n              style={cardPressedStyle}\n            >\n              <Text className=\"mr-2\">RM</Text>\n              <IconCalculator size={14} />\n            </Pressable>\n          )}\n        </View>\n      )}\n\n      <View className=\"flex-row gap-4 p-4\">\n        <View className=\"flex-1 gap-2\">\n          {KEY_ROWS.map((row, rowIndex) => (\n            <View key={rowIndex} className=\"flex-row gap-2\">\n              {row.map((key) => (\n                <KeyButton key={key} label={key} onPress={props.onInput} />\n              ))}\n            </View>\n          ))}\n          <View className=\"flex-row gap-2\">\n            {lastRow.map((key, i) =>\n              key ? (\n                <KeyButton key={key} label={key} onPress={props.onInput} />\n              ) : (\n                <View key={`empty-${i}`} className=\"flex-1\" />\n              )\n            )}\n          </View>\n        </View>\n\n        <View className=\"w-scaled-24 mt-2\">\n          <KeyboardRestTimer />\n          <Pressable\n            testID=\"keyboard-close\"\n            data-testid=\"keyboard-close\"\n            onPress={props.onBlur}\n            className=\"items-center justify-center w-full pt-2 pb-1 mb-4 border rounded border-border-cardpurple bg-background-cardpurple\"\n            style={cardPressedStyle}\n          >\n            <IconKeyboardClose />\n          </Pressable>\n\n          <View className=\"flex-row gap-1\">\n            <Pressable\n              testID=\"keyboard-minus\"\n              data-testid=\"keyboard-minus\"\n              onPress={props.onMinus}\n              className=\"items-center justify-center flex-1 p-2 border rounded rounded-r-none border-border-cardpurple bg-background-cardpurple\"\n              style={cardPressedStyle}\n            >\n              <Text className=\"text-icon-neutral\">-</Text>\n            </Pressable>\n            <Pressable\n              testID=\"keyboard-plus\"\n              data-testid=\"keyboard-plus\"\n              onPress={props.onPlus}\n              className=\"items-center justify-center flex-1 p-2 border rounded rounded-l-none border-border-cardpurple bg-background-cardpurple\"\n              style={cardPressedStyle}\n            >\n              <Text className=\"text-icon-neutral\">+</Text>\n            </Pressable>\n          </View>\n\n          {props.enableUnits && props.selectedUnit ? (\n            <View className=\"flex-row items-center h-scaled-10 gap-2 mt-4\">\n              {props.enableUnits.map((unit) => (\n                <UnitButton\n                  key={unit}\n                  unit={unit}\n                  selected={unit === props.selectedUnit}\n                  onPress={props.onChangeUnits}\n                />\n              ))}\n            </View>\n          ) : (\n            <View className=\"h-scaled-10 mt-4\" />\n          )}\n\n          <Pressable\n            testID=\"keyboard-backspace\"\n            data-testid=\"keyboard-backspace\"\n            onPress={handleBackspace}\n            className=\"items-center justify-center w-full h-scaled-10 mt-4 border rounded border-border-cardpurple bg-background-cardpurple\"\n            style={cardPressedStyle}\n          >\n            <IconBackspace />\n          </Pressable>\n        </View>\n      </View>\n    </View>\n  );\n});\n\nconst KeyButton = memo(function KeyButton(props: { label: string; onPress: (label: string) => void }): JSX.Element {\n  const onPress = useCallback(() => props.onPress(props.label), [props.onPress, props.label]);\n  const colors = Tailwind_semantic();\n  const keyButtonStyle = ({ pressed }: { pressed: boolean }): { backgroundColor: string } => ({\n    backgroundColor: pressed ? colors.background.neutral : colors.background.default,\n  });\n  return (\n    <Pressable\n      testID={`keyboard-button-${props.label}`}\n      data-testid={`keyboard-button-${props.label}`}\n      onPress={onPress}\n      className=\"items-center flex-1 p-2 rounded\"\n      style={keyButtonStyle}\n    >\n      <Text className=\"text-2xl text-text-primary\">{props.label}</Text>\n    </Pressable>\n  );\n});\n\ninterface IUnitButtonProps {\n  unit: IUnit | IPercentageUnit;\n  selected: boolean;\n  onPress?: (unit: IUnit | IPercentageUnit) => void;\n}\n\nconst UnitButton = memo(function UnitButton(props: IUnitButtonProps): JSX.Element {\n  const onPress = useCallback(() => {\n    ReactNativeHapticFeedback.trigger(\"impactLight\", HAPTIC_OPTIONS);\n    props.onPress?.(props.unit);\n  }, [props.onPress, props.unit]);\n  const colors = Tailwind_semantic();\n  const pressedStyle = ({ pressed }: { pressed: boolean }): { backgroundColor?: string } => ({\n    backgroundColor: pressed && !props.selected ? colors.background.cardpurpleselected : undefined,\n  });\n  return (\n    <Pressable\n      testID={`keyboard-unit-${props.unit}`}\n      data-testid={`keyboard-unit-${props.unit}`}\n      onPress={onPress}\n      className={`flex-1 aspect-square border rounded items-center justify-center ${\n        props.selected\n          ? \"border-border-prominent bg-background-cardpurpleselected\"\n          : \"border-border-cardpurple bg-background-cardpurple\"\n      }`}\n      style={pressedStyle}\n    >\n      <Text className=\"text-icon-neutral\">{props.unit}</Text>\n    </Pressable>\n  );\n});\n","import { JSX, ReactNode, useRef, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Thunk_pullScreen } from \"../ducks/thunks\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IconBack } from \"./icons/iconBack\";\nimport { IconHelp } from \"./icons/iconHelp\";\nimport { INavCommon, IState, updateState } from \"../models/state\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { IconClose } from \"./icons/iconClose\";\nimport { lb } from \"lens-shmens\";\nimport { ObjectUtils_filter, ObjectUtils_values } from \"../utils/object\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { Tour_start } from \"./tour/tourConfigs\";\nimport { Tailwind_semantic, Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { ITourId } from \"../models/state\";\nimport type { IHelpKey } from \"./help/helpRegistry\";\n\ninterface INavbarCenterProps {\n  title: ReactNode;\n  subtitle?: ReactNode;\n  onTitleClick?: () => void;\n}\n\ninterface INavbarProps extends INavbarCenterProps {\n  dispatch: IDispatch;\n  rightButtons?: JSX.Element[];\n  onBack?: () => boolean;\n  navCommon: INavCommon;\n  helpTourId?: ITourId;\n  helpKey?: IHelpKey;\n  isStatic?: boolean;\n  showBack?: boolean;\n}\n\nexport const NavbarView = (props: INavbarProps): JSX.Element => {\n  const trackClick = useTrackClick();\n  const [showDebug, setShowDebug] = useState(0);\n  const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const { loading } = props.navCommon;\n  const showBackButton = props.showBack ?? false;\n\n  const loadingItems = loading.items;\n  const loadingKeys = Object.keys(loadingItems).filter((k) => loadingItems[k]?.endTime == null);\n  const errors = ObjectUtils_filter(loading.items, (k, v) => v?.error != null);\n  const error = ObjectUtils_values(errors)[0]?.error;\n\n  const isLoading = Object.keys(loadingKeys).length > 0;\n  const numberOfLeftButtons = (showBackButton ? 1 : 0) + (isLoading ? 1 : 0);\n  const numberOfRightButtons = (props.rightButtons?.length ?? 0) + (props.helpKey || props.helpTourId ? 1 : 0);\n  const numberOfButtons = Math.max(numberOfLeftButtons, numberOfRightButtons);\n  const [rightRailWidth, setRightRailWidth] = useState(0);\n  const railMinWidth = Math.max(numberOfButtons * 40, rightRailWidth);\n\n  return (\n    <>\n      <View testID=\"navbar\" className=\"z-30 w-full flex-row items-center justify-center px-2 bg-background-default\">\n        <View className=\"flex-row items-center justify-start\" style={{ minWidth: railMinWidth }}>\n          {showBackButton ? (\n            <Pressable\n              testID=\"navbar-back\"\n              className=\"p-2\"\n              onPress={() => {\n                if (!props.onBack || props.onBack()) {\n                  props.dispatch(Thunk_pullScreen());\n                }\n              }}\n            >\n              <IconBack color={Tailwind_semantic().icon.neutral} />\n            </Pressable>\n          ) : null}\n          {isLoading ? (\n            <View className=\"pl-2\">\n              <IconSpinner width={20} height={20} color={Tailwind_semantic().icon.neutral} />\n            </View>\n          ) : null}\n        </View>\n        <NavbarCenterView\n          {...props}\n          onTitleClick={\n            props.onTitleClick ||\n            (() => {\n              if (timerRef.current != null) {\n                clearTimeout(timerRef.current);\n                timerRef.current = undefined;\n              }\n              const newCount = showDebug + 1;\n              setShowDebug(newCount);\n              if (newCount > 4) {\n                setShowDebug(0);\n                navigateToModal(\"debugModal\");\n              }\n              timerRef.current = setTimeout(() => {\n                if (newCount <= 3) {\n                  setShowDebug(0);\n                }\n              }, 1000);\n            })\n          }\n        />\n        <View\n          className=\"flex-row items-center justify-end\"\n          style={{ minWidth: railMinWidth }}\n          onLayout={(e) => setRightRailWidth(Math.round(e.nativeEvent.layout.width))}\n        >\n          {props.rightButtons}\n          {(props.helpTourId || props.helpKey) && (\n            <Pressable\n              className=\"p-2\"\n              onPress={() => {\n                trackClick(props.helpTourId ? `navbar-tour-${props.helpTourId}` : `navbar-help-${props.helpKey}`);\n                if (props.helpTourId) {\n                  Tour_start(props.dispatch, props.helpTourId);\n                } else if (props.helpKey) {\n                  navigateToModal(\"helpModal\", { helpKey: props.helpKey });\n                }\n              }}\n            >\n              <IconHelp color={Tailwind_semantic().icon.neutral} />\n            </Pressable>\n          )}\n        </View>\n        {error && (\n          <View\n            className=\"absolute left-0 flex-row justify-center w-full\"\n            style={{ bottom: -16 }}\n            pointerEvents=\"box-none\"\n          >\n            <View className=\"flex-row items-center pl-4 rounded-full bg-background-error border-text-error\">\n              <Text className=\"text-sm font-bold text-text-alwayswhite\">{error}</Text>\n              <Pressable\n                className=\"px-3\"\n                onPress={() =>\n                  updateState(\n                    props.dispatch,\n                    [\n                      lb<IState>()\n                        .p(\"loading\")\n                        .recordModify((l) => {\n                          return { ...l, items: ObjectUtils_filter(l.items, (k, v) => v?.error == null) };\n                        }),\n                    ],\n                    \"Clear error messages\"\n                  )\n                }\n              >\n                <IconClose size={16} color={Tailwind_colors().white} />\n              </Pressable>\n            </View>\n          </View>\n        )}\n      </View>\n    </>\n  );\n};\n\nexport function NavbarCenterView(props: INavbarCenterProps): JSX.Element {\n  if (props.subtitle != null) {\n    return (\n      <Pressable className=\"flex-1 items-center\" onPress={props.onTitleClick}>\n        <Text className=\"pt-2 text-sm font-semibold text-center text-text-primary\">{props.title}</Text>\n        <View className=\"pb-2\">\n          {typeof props.subtitle === \"string\" ? (\n            <Text className=\"text-sm font-semibold text-center text-icon-yellow\">{props.subtitle}</Text>\n          ) : (\n            props.subtitle\n          )}\n        </View>\n      </Pressable>\n    );\n  } else {\n    return (\n      <Pressable className=\"flex-1 py-2\" onPress={props.onTitleClick}>\n        <Text className=\"py-2 text-lg font-semibold text-center text-text-primary\">{props.title}</Text>\n      </Pressable>\n    );\n  }\n}\n","import { JSX, memo, useCallback, useMemo, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { useProgressiveCount, useProgressiveItems } from \"../utils/useProgressiveItems\";\nimport { Text } from \"./primitives/text\";\nimport { Exercise_find, Exercise_toKey } from \"../models/exercise\";\nimport { Muscle_normalizeUnifiedPoints, Muscle_getUnifiedPointsForDay } from \"../models/muscle\";\nimport {\n  Program_evaluate,\n  Program_getListOfDays,\n  Program_getProgramDay,\n  Program_getProgramDayUsedExercises,\n} from \"../models/program\";\nimport { IProgram, ISettings, IScreenMuscle, IStats } from \"../types\";\nimport type { IEvaluatedProgram } from \"../models/program\";\nimport { CollectionUtils_findBy, CollectionUtils_compact, CollectionUtils_uniqByExpr } from \"../utils/collection\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { IMuscleStyle, BackMusclesSvg } from \"./muscles/images/backMusclesSvg\";\nimport { FrontMusclesSvg } from \"./muscles/images/frontMusclesSvg\";\n\nconst MUSCLE_CONTOUR = { fill: \"#28839F\" };\nconst MUSCLE_COLUMN_STYLE = { width: 48 };\nconst MUSCLE_SVG_ASPECT = { aspectRatio: 112 / 234 };\n\ninterface IMusclesColumnProps {\n  evaluatedProgram: IEvaluatedProgram;\n  day: ReturnType<typeof Program_getProgramDay>;\n  stats: IStats;\n  settings: ISettings;\n}\n\nfunction MusclesColumn({ evaluatedProgram, day, stats, settings }: IMusclesColumnProps): JSX.Element | null {\n  const muscleData = useMemo(() => {\n    if (!day) {\n      return {};\n    }\n    const points = Muscle_normalizeUnifiedPoints(Muscle_getUnifiedPointsForDay(evaluatedProgram, day, stats, settings));\n    return ObjectUtils_keys(points.screenMusclePoints).reduce<Partial<Record<IScreenMuscle, IMuscleStyle>>>(\n      (acc, key) => {\n        const value = points.screenMusclePoints[key];\n        acc[key] = { opacity: value, fill: \"#28839F\" };\n        return acc;\n      },\n      {}\n    );\n  }, [day, evaluatedProgram, stats, settings]);\n  if (!day) {\n    return null;\n  }\n  return (\n    <>\n      <View className=\"relative flex-1\">\n        <BackMusclesSvg muscles={muscleData} contour={MUSCLE_CONTOUR} />\n      </View>\n      <View className=\"relative flex-1\">\n        <FrontMusclesSvg muscles={muscleData} contour={MUSCLE_CONTOUR} />\n      </View>\n    </>\n  );\n}\n\ninterface INextDayPickerDayProps {\n  evaluatedProgram: IEvaluatedProgram;\n  dayId: string;\n  dayName: string;\n  dayIndex: number;\n  highlightedDay?: number;\n  stats: IStats;\n  settings: ISettings;\n  renderMuscles?: boolean;\n  onSelect: (programId: string, day: number) => void;\n}\n\nfunction NextDayPickerDayImpl(props: INextDayPickerDayProps): JSX.Element | null {\n  const { evaluatedProgram, dayIndex, settings, stats, onSelect, renderMuscles = true } = props;\n  const day = useMemo(() => Program_getProgramDay(evaluatedProgram, dayIndex + 1), [evaluatedProgram, dayIndex]);\n  const exerciseTypes = useMemo(() => {\n    if (!day) {\n      return [];\n    }\n    const found = CollectionUtils_compact(\n      Program_getProgramDayUsedExercises(day).map((exercise) =>\n        Exercise_find(exercise.exerciseType, settings.exercises)\n      )\n    );\n    return CollectionUtils_uniqByExpr(found, (e) => Exercise_toKey(e));\n  }, [day, settings.exercises]);\n  const handlePress = useCallback(() => {\n    onSelect(evaluatedProgram.id, dayIndex + 1);\n  }, [onSelect, evaluatedProgram.id, dayIndex]);\n  if (!day) {\n    return null;\n  }\n  return (\n    <View>\n      <MenuItemWrapper name={`next-day-picker-${dayIndex + 1}`} onClick={handlePress}>\n        <View\n          className={`flex-row px-2 py-2 ${dayIndex + 1 === props.highlightedDay ? \"bg-background-purpledark\" : \"\"}`}\n        >\n          <View className=\"flex-1\">\n            <Text>{props.dayName}</Text>\n            <View className=\"flex-row flex-wrap\">\n              {exerciseTypes.map((e) => (\n                <ExerciseImage\n                  key={Exercise_toKey(e)}\n                  settings={settings}\n                  exerciseType={e}\n                  size=\"small\"\n                  className=\"w-scaled-6 mr-1\"\n                />\n              ))}\n            </View>\n          </View>\n          <View className=\"flex-row items-center\" style={MUSCLE_COLUMN_STYLE}>\n            {renderMuscles ? (\n              <MusclesColumn evaluatedProgram={evaluatedProgram} day={day} stats={stats} settings={settings} />\n            ) : (\n              <>\n                <View className=\"flex-1\" style={MUSCLE_SVG_ASPECT} />\n                <View className=\"flex-1\" style={MUSCLE_SVG_ASPECT} />\n              </>\n            )}\n          </View>\n          <View className=\"flex-row items-center py-2 pl-2\">\n            <IconArrowRight color=\"#a0aec0\" />\n          </View>\n        </View>\n      </MenuItemWrapper>\n    </View>\n  );\n}\n\nexport const NextDayPickerDay = memo(NextDayPickerDayImpl);\n\ninterface INextDayPickerProps {\n  initialCurrentProgramId?: string;\n  allPrograms: IProgram[];\n  stats: IStats;\n  settings: ISettings;\n  onSelect: (programId: string, day: number) => void;\n}\n\nexport function NextDayPicker(props: INextDayPickerProps): JSX.Element {\n  const { allPrograms, settings } = props;\n  const [currentProgramId, setCurrentProgramId] = useState(props.initialCurrentProgramId);\n  const programsValues = useMemo<[string, string][]>(() => allPrograms.map((p) => [p.id, p.name]), [allPrograms]);\n  const currentProgram = useMemo(\n    () =>\n      (currentProgramId ? CollectionUtils_findBy(allPrograms, \"id\", currentProgramId) : undefined) ?? allPrograms[0],\n    [currentProgramId, allPrograms]\n  );\n  const evaluatedProgram = useMemo(\n    () => (currentProgram ? Program_evaluate(currentProgram, settings) : undefined),\n    [currentProgram, settings]\n  );\n  const days = useMemo<[string, string][]>(\n    () => (evaluatedProgram ? Program_getListOfDays(evaluatedProgram) : []),\n    [evaluatedProgram]\n  );\n  const visibleDays = useProgressiveItems(days, { initialBatch: 12, batchSize: 8 });\n  const visibleMuscleCount = useProgressiveCount(visibleDays.length, { initialBatch: 4, batchSize: 4 });\n  const handleProgramChange = useCallback((value?: string) => {\n    if (value) {\n      setCurrentProgramId(value);\n    }\n  }, []);\n\n  if (!currentProgram || !evaluatedProgram) {\n    return (\n      <View className=\"mx-4\">\n        <Text>No Programs</Text>\n      </View>\n    );\n  }\n\n  return (\n    <View>\n      <View className=\"mx-0\">\n        {allPrograms.length > 1 && (\n          <MenuItemEditable\n            type=\"select\"\n            name=\"Program\"\n            value={evaluatedProgram.id}\n            values={programsValues}\n            onChange={handleProgramChange}\n          />\n        )}\n        {visibleDays.map(([dayId, dayName], dayIndex) => (\n          <NextDayPickerDay\n            key={dayId}\n            evaluatedProgram={evaluatedProgram}\n            dayId={dayId}\n            dayName={dayName}\n            dayIndex={dayIndex}\n            highlightedDay={currentProgram.nextDay}\n            stats={props.stats}\n            settings={props.settings}\n            renderMuscles={dayIndex < visibleMuscleCount}\n            onSelect={props.onSelect}\n          />\n        ))}\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { INotification, IState, updateState } from \"../models/state\";\nimport { IconClose } from \"./icons/iconClose\";\n\ninterface IProps {\n  notification?: INotification;\n  dispatch: IDispatch;\n}\n\nexport function Notification(props: IProps): JSX.Element | null {\n  const { notification, dispatch } = props;\n  if (notification == null) {\n    return null;\n  }\n  return (\n    <div\n      className=\"absolute top-0 left-0 z-20 w-full p-4\"\n      style={{ minHeight: \"40px\" }}\n      onClick={() => {\n        updateState(dispatch, [lb<IState>().p(\"notification\").record(undefined)], \"Dismiss notification\");\n      }}\n    >\n      <div\n        className={`relative shadow-lg px-4 py-2 pr-10 rounded ${\n          notification.type === \"error\" ? \"bg-red-300\" : \"bg-green-200\"\n        }`}\n      >\n        <button className=\"box-content absolute top-0 right-0 p-3 nm-notification-close\">\n          <IconClose size={16} />\n        </button>\n        <span className=\"text-sm\">{notification.content}</span>\n      </div>\n    </div>\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState, updateState } from \"../models/state\";\nimport { IconClose2 } from \"./icons/iconClose2\";\nimport { IconHelp } from \"./icons/iconHelp\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\n\ninterface IProps {\n  dispatch?: IDispatch;\n  id: string;\n  helps: string[];\n  className?: string;\n  children: ReactNode;\n}\n\nexport function Nux(props: IProps): JSX.Element | null {\n  if (props.helps.indexOf(props.id) !== -1) {\n    return null;\n  }\n  const { dispatch } = props;\n  return (\n    <View\n      className={`${props.className ?? \"\"} flex-row py-2 pl-2 bg-background-default border border-border-cardpurple rounded-2xl`}\n    >\n      <View className=\"flex-row items-start flex-1\">\n        <View className=\"mr-2\">\n          <IconHelp color={Tailwind_colors().purple[500]} size={16} />\n        </View>\n        <View className=\"flex-1\">{props.children}</View>\n      </View>\n      {dispatch && (\n        <View>\n          <Pressable\n            className=\"px-2 nm-nux-close\"\n            hitSlop={12}\n            onPress={() => {\n              updateState(\n                dispatch,\n                [\n                  lb<IState>()\n                    .p(\"storage\")\n                    .p(\"helps\")\n                    .recordModify((helps) => [...helps, props.id]),\n                ],\n                \"Dismiss help tip\"\n              );\n            }}\n          >\n            <IconClose2 size={12} />\n          </Pressable>\n        </View>\n      )}\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Exercise_fromKey, Exercise_get } from \"../models/exercise\";\nimport { Weight_display, Weight_build, Weight_getOneRepMax } from \"../models/weight\";\nimport { History_getNumberOfPersonalRecords } from \"../models/history\";\nimport { ISettings, ISet, IHistoryRecord } from \"../types\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { IPersonalRecords } from \"../models/history\";\nimport { Reps_avgUnilateralCompletedReps } from \"../models/set\";\n\ninterface IPersonalRecordsProps {\n  historyRecords: IHistoryRecord[];\n  prs: IPersonalRecords;\n  settings: ISettings;\n}\n\ninterface IPersonalRecordItems {\n  maxWeight: Partial<Record<string, { set: ISet; prev?: ISet }[]>>;\n  max1RM: Partial<Record<string, { set: ISet; prev?: ISet }[]>>;\n}\n\nexport function PersonalRecords(props: IPersonalRecordsProps): JSX.Element {\n  if (History_getNumberOfPersonalRecords(props.historyRecords, props.prs) === 0) {\n    return (\n      <View className=\"items-center px-4 pt-8 pb-4\">\n        <Text>No new personal records this time</Text>\n      </View>\n    );\n  }\n\n  const items = props.historyRecords.reduce<IPersonalRecordItems>(\n    (memo, hr) => {\n      const prs = props.prs[hr.id];\n      if (!prs) {\n        return memo;\n      }\n      for (const key of ObjectUtils_keys(prs)) {\n        const maxWeight = prs[key]?.maxWeightSet;\n        if (maxWeight) {\n          memo.maxWeight[key] = memo.maxWeight[key] || [];\n          memo.maxWeight[key].push({ set: maxWeight, prev: prs[key]?.prevMaxWeightSet });\n        }\n        const max1RM = prs[key]?.max1RMSet;\n        if (max1RM) {\n          memo.max1RM[key] = memo.max1RM[key] || [];\n          memo.max1RM[key].push({ set: max1RM, prev: prs[key]?.prevMax1RMSet });\n        }\n      }\n      return memo;\n    },\n    { maxWeight: {}, max1RM: {} }\n  );\n\n  return (\n    <View>\n      <Text className=\"pb-1 text-sm font-bold text-yellow-600\">{\"\\u{1F3C6}\"} Personal Records</Text>\n      {ObjectUtils_keys(items.maxWeight).length > 0 && (\n        <>\n          <Text className=\"my-1 text-xs text-text-secondary\">Max Weight</Text>\n          <View className=\"pb-2\">\n            {ObjectUtils_keys(items.maxWeight).map((exerciseKey) => {\n              const exerciseType = Exercise_fromKey(exerciseKey);\n              const exercise = Exercise_get(exerciseType, props.settings.exercises);\n              return (items.maxWeight[exerciseKey] || []).map((item, i) => {\n                return (\n                  <View key={`${exerciseKey}_${i}`} className=\"mb-1\">\n                    <Text>\n                      <Text className=\"text-sm font-bold\">{exercise.name}</Text>\n                      <Text className=\"text-sm\">: </Text>\n                      <Text className=\"text-sm font-bold text-text-success\">\n                        {Weight_display(\n                          item.set.completedWeight ?? item.set.weight ?? Weight_build(0, props.settings.units)\n                        )}\n                      </Text>\n                      <Text className=\"text-sm\">\n                        , {item.set.completedReps || 0} {StringUtils_pluralize(\"rep\", item.set.completedReps || 0)}\n                      </Text>\n                    </Text>\n                    {item.prev != null && (\n                      <Text className=\"text-xs italic text-text-secondarysubtle\">\n                        (was {item.prev.completedReps || 0} {\"\\u00D7\"}{\" \"}\n                        {Weight_display(\n                          item.prev.completedWeight ?? item.prev.weight ?? Weight_build(0, props.settings.units)\n                        )}\n                        )\n                      </Text>\n                    )}\n                  </View>\n                );\n              });\n            })}\n          </View>\n        </>\n      )}\n      {ObjectUtils_keys(items.max1RM).length > 0 && (\n        <>\n          <Text className=\"my-1 text-xs text-text-secondary\">Max Estimated One Rep Max</Text>\n          <View className=\"pb-2\">\n            {ObjectUtils_keys(items.max1RM).map((exerciseKey) => {\n              const exerciseType = Exercise_fromKey(exerciseKey);\n              const exercise = Exercise_get(exerciseType, props.settings.exercises);\n              return (items.max1RM[exerciseKey] || []).map((item, i) => {\n                const estimated1RM = Weight_getOneRepMax(\n                  item.set.completedWeight ?? item.set.weight ?? Weight_build(0, props.settings.units),\n                  Reps_avgUnilateralCompletedReps(item.set) || 0,\n                  item.set.completedRpe ?? item.set.rpe\n                );\n                const previous1RM = item.prev\n                  ? Weight_getOneRepMax(\n                      item.prev.completedWeight ?? item.prev.weight ?? Weight_build(0, props.settings.units),\n                      Reps_avgUnilateralCompletedReps(item.prev) || 0,\n                      item.prev.completedRpe ?? item.prev.rpe\n                    )\n                  : undefined;\n                const setRpe = item.set.completedRpe ?? item.set.rpe;\n                const prevRpe = item.prev?.completedRpe ?? item.prev?.rpe;\n                return (\n                  <View key={`${exerciseKey}_${i}`} className=\"mb-1\">\n                    <Text>\n                      <Text className=\"text-sm font-bold\">{exercise.name}</Text>\n                      <Text className=\"text-sm\">: </Text>\n                      <Text className=\"text-sm font-bold text-text-success\">{Weight_display(estimated1RM)}</Text>\n                      <Text className=\"text-sm\">\n                        {\" \"}\n                        ({Reps_avgUnilateralCompletedReps(item.set) || 0} {\"\\u00D7\"}{\" \"}\n                        {Weight_display(\n                          item.set.completedWeight ?? item.set.weight ?? Weight_build(0, props.settings.units)\n                        )}\n                        {setRpe ? ` @${setRpe}` : \"\"})\n                      </Text>\n                    </Text>\n                    {item.prev != null && previous1RM && (\n                      <Text className=\"text-xs italic text-text-secondarysubtle\">\n                        (was <Text className=\"text-xs font-bold\">{Weight_display(previous1RM)}</Text>,{\" \"}\n                        {Reps_avgUnilateralCompletedReps(item.prev) || 0} {\"\\u00D7\"}{\" \"}\n                        {Weight_display(\n                          item.prev.completedWeight ?? item.prev.weight ?? Weight_build(0, props.settings.units)\n                        )}\n                        {prevRpe ? ` @${prevRpe}` : \"\"})\n                      </Text>\n                    )}\n                  </View>\n                );\n              });\n            })}\n          </View>\n        </>\n      )}\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { useMemo } from \"react\";\nimport { IWeight } from \"../types\";\nimport { Svg, Rect } from \"./primitives/svg\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { useRemScale } from \"../utils/useRem\";\nimport { PlatesBarLayout_build } from \"../utils/platesBarLayout\";\n\ninterface IProps {\n  plates: IWeight[];\n  height?: number;\n}\n\nexport function PlatesBar(props: IProps): JSX.Element {\n  const remScale = useRemScale();\n  const layout = useMemo(() => PlatesBarLayout_build(props.plates), [props.plates]);\n  const scale = props.height != null ? props.height / layout.height : remScale;\n  const colors = Tailwind_semantic();\n  return (\n    <Svg\n      width={Math.round(layout.width * scale)}\n      height={Math.round(layout.height * scale)}\n      viewBox={`0 0 ${layout.width} ${layout.height}`}\n      fill=\"none\"\n    >\n      <Rect {...layout.shaft} fill={colors.plate.bar} />\n      <Rect {...layout.collar} rx={1} fill={colors.plate.bar} />\n      <Rect {...layout.sleeve} fill={colors.plate.bar} />\n      {layout.plates.map((plate, i) => (\n        <Rect\n          key={i}\n          x={plate.x}\n          y={plate.y}\n          width={plate.width}\n          height={plate.height}\n          rx={1}\n          fill={colors.plate[plate.color]}\n          stroke={plate.color === \"white\" ? colors.plate.whiteoutline : undefined}\n          strokeWidth={plate.color === \"white\" ? 1 : undefined}\n        />\n      ))}\n    </Svg>\n  );\n}\n","import { JSX, memo, ReactNode, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { View } from \"react-native\";\nimport { IHistoryRecord, IProgram, ISettings, IStats } from \"../../types\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { buildCardsReducer, ICardsAction } from \"../../ducks/reducer\";\nimport {\n  IEvaluatedProgram,\n  Program_runAllFinishDayScripts,\n  Program_nextHistoryRecord,\n  Program_evaluate,\n  Program_getProgramDay,\n  Program_getProgramDayUsedExercises,\n} from \"../../models/program\";\nimport { ProgramPreviewPlaygroundDay } from \"./programPreviewPlaygroundDay\";\nimport { ILensDispatch, useLensReducer } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { Progress_applyProgramDay, Progress_runInitialUpdateScripts } from \"../../models/progress\";\nimport { ProgramPreviewPlaygroundInnerRenderer } from \"./programPreviewPlaygroundInner\";\nimport type { IScrollableTabsProps } from \"../scrollableTabs\";\nimport {\n  IProgramPreviewPlaygroundDaySetupWithProgress,\n  IProgramPreviewPlaygroundState,\n} from \"./programPreviewPlaygroundSetup\";\nimport deepmerge from \"deepmerge\";\nimport { SimpleMarkdown } from \"../simpleMarkdown\";\nimport { usePerfRenderCount } from \"../../utils/usePerfRenderCount\";\nimport { ObjectUtils_filter } from \"../../utils/object\";\nimport { ProgramToPlanner } from \"../../models/programToPlanner\";\nimport { WebWorkoutModals } from \"./webWorkoutModals\";\nimport { useAppState } from \"../../navigation/StateContext\";\nimport { IState, updateState } from \"../../models/state\";\nimport { useProgressiveItems } from \"../../utils/useProgressiveItems\";\n\nfunction buildDayDispatch(\n  playgroundDispatch: ILensDispatch<IProgramPreviewPlaygroundState>,\n  weekIndex: number,\n  dayIndex: number,\n  progress: IHistoryRecord,\n  settings: ISettings,\n  stats: IStats\n): IDispatch {\n  return (async (action: unknown) => {\n    const newProgress = buildCardsReducer([], settings, stats, undefined)(progress, action as ICardsAction);\n    onProgressChange(playgroundDispatch, weekIndex, dayIndex, newProgress);\n  }) as IDispatch;\n}\n\ninterface IProgramPreviewPlaygroundProps {\n  program: IProgram;\n  settings: ISettings;\n  isPlayground: boolean;\n  scrollableTabsProps?: Partial<IScrollableTabsProps>;\n  stats: IStats;\n  hasNavbar?: boolean;\n  showAllWeeks?: boolean;\n  onEngage?: () => void;\n  scrollTabZIndex?: number;\n  useNavModals?: boolean;\n  headerContent?: ReactNode;\n  externalWeekIndex?: number;\n  hideWeekTabBar?: boolean;\n  onContentScroll?: (e: import(\"react-native\").NativeSyntheticEvent<import(\"react-native\").NativeScrollEvent>) => void;\n}\n\nfunction onProgressChange(\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>,\n  weekIndex: number,\n  dayIndex: number,\n  newProgress: IHistoryRecord\n): void {\n  dispatch(\n    lb<IProgramPreviewPlaygroundState>()\n      .p(\"progresses\")\n      .pi(weekIndex)\n      .p(\"days\")\n      .pi(dayIndex)\n      .p(\"progress\")\n      .record(newProgress),\n    \"Update progress\"\n  );\n}\n\nexport function playgroundOnProgramChange(\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>,\n  newEvaluatedProgram: IEvaluatedProgram,\n  stats: IStats,\n  state: IProgramPreviewPlaygroundState\n): void {\n  const newPlanner = new ProgramToPlanner(newEvaluatedProgram, state.settings).convertToPlanner();\n  const newProgram = { ...state.program, planner: newPlanner };\n  dispatch(\n    [\n      lb<IProgramPreviewPlaygroundState>()\n        .p(\"progresses\")\n        .recordModify((progresses) => {\n          return progresses.map((wk) => {\n            return {\n              ...wk,\n              days: wk.days.map((day: IProgramPreviewPlaygroundDaySetupWithProgress) => {\n                let newProgress = Progress_applyProgramDay(day.progress, newEvaluatedProgram, day.day, state.settings);\n                newProgress = Progress_runInitialUpdateScripts(\n                  newProgress,\n                  undefined,\n                  day.day,\n                  newEvaluatedProgram,\n                  state.settings,\n                  stats\n                );\n                return {\n                  ...day,\n                  progress: newProgress,\n                };\n              }),\n            };\n          });\n        }),\n      lb<IProgramPreviewPlaygroundState>().p(\"program\").record(newProgram),\n    ],\n    \"Update program\"\n  );\n}\n\nexport function playgroundOnSettingsChange(\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>,\n  newSettings: ISettings,\n  stats: IStats,\n  evaluatedProgram: IEvaluatedProgram\n): void {\n  dispatch(\n    [\n      lb<IProgramPreviewPlaygroundState>()\n        .p(\"progresses\")\n        .recordModify((progresses) => {\n          return progresses.map((wk) => {\n            return {\n              ...wk,\n              days: wk.days.map((day: IProgramPreviewPlaygroundDaySetupWithProgress) => {\n                let newProgress = Progress_applyProgramDay(day.progress, evaluatedProgram, day.day, newSettings);\n                newProgress = Progress_runInitialUpdateScripts(\n                  newProgress,\n                  undefined,\n                  day.day,\n                  evaluatedProgram,\n                  newSettings,\n                  stats\n                );\n                return {\n                  ...day,\n                  progress: newProgress,\n                };\n              }),\n            };\n          });\n        }),\n      lb<IProgramPreviewPlaygroundState>().p(\"settings\").record(newSettings),\n    ],\n    \"Update settings\"\n  );\n}\n\nfunction onFinish(\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>,\n  props: IProgramPreviewPlaygroundProps,\n  state: IProgramPreviewPlaygroundState,\n  d: IProgramPreviewPlaygroundDaySetupWithProgress\n): void {\n  const { program: newProgram, exerciseData } = Program_runAllFinishDayScripts(\n    state.program,\n    d.progress,\n    props.stats,\n    state.settings\n  );\n  const newSettings = {\n    ...state.settings,\n    exerciseData: deepmerge(state.settings.exerciseData, exerciseData),\n  };\n  dispatch(\n    [\n      lb<IProgramPreviewPlaygroundState>()\n        .p(\"progresses\")\n        .recordModify((progresses) => {\n          return progresses.map((wk) => {\n            return {\n              ...wk,\n              days: wk.days.map((day: IProgramPreviewPlaygroundDaySetupWithProgress) => {\n                const newProgress = Program_nextHistoryRecord(newProgram, newSettings, props.stats, day.day);\n                return {\n                  ...day,\n                  progress: newProgress,\n                };\n              }),\n            };\n          });\n        }),\n      lb<IProgramPreviewPlaygroundState>().p(\"program\").record(newProgram),\n      lb<IProgramPreviewPlaygroundState>().p(\"settings\").record(newSettings),\n    ],\n    \"Finish day\"\n  );\n}\n\nfunction buildInitialState(props: IProgramPreviewPlaygroundProps): IProgramPreviewPlaygroundState {\n  const initialEvaluatedProgram = Program_evaluate(props.program, props.settings);\n  let dayNumber = 0;\n  return {\n    program: props.program,\n    settings: props.settings,\n    isPlayground: props.isPlayground,\n    progresses: (initialEvaluatedProgram.weeks || []).map((week) => {\n      return {\n        name: week.name,\n        days: week.days.map(() => {\n          dayNumber += 1;\n          const progress = Program_nextHistoryRecord(props.program, props.settings, props.stats, dayNumber);\n          const programDay = Program_getProgramDay(initialEvaluatedProgram, dayNumber);\n          const dayExercises = programDay ? Program_getProgramDayUsedExercises(programDay) : [];\n          const exerciseTags = new Set(dayExercises.map((e) => e.tags).flat());\n          const states = ObjectUtils_filter(initialEvaluatedProgram.states, (key) => {\n            return exerciseTags.has(key);\n          });\n          return { day: dayNumber, states, progress };\n        }),\n      };\n    }),\n  };\n}\n\n// --- Inner rendering shared by both local and nav variants ---\n\ninterface IProgramPreviewPlaygroundInnerProps {\n  props: IProgramPreviewPlaygroundProps;\n  state: IProgramPreviewPlaygroundState;\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>;\n  evaluatedProgram: IEvaluatedProgram;\n}\n\ninterface IPlaygroundWeekContentProps {\n  week: { name: string; days: IProgramPreviewPlaygroundDaySetupWithProgress[] };\n  weekIndex: number;\n  state: IProgramPreviewPlaygroundState;\n  props: IProgramPreviewPlaygroundProps;\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>;\n  evaluatedProgram: IEvaluatedProgram;\n  handleProgressChange: (wIndex: number, dayIndex: number, newProgress: IHistoryRecord) => void;\n  handleFinish: (wIndex: number, dayIndex: number) => void;\n}\n\nfunction PlaygroundWeekContent(p: IPlaygroundWeekContentProps): JSX.Element {\n  const { week, weekIndex, state, props, dispatch, evaluatedProgram, handleProgressChange, handleFinish } = p;\n  const programWeekDescription = evaluatedProgram.weeks[weekIndex]?.description;\n  const visibleDays = useProgressiveItems(week.days, {\n    initialBatch: 1,\n    batchSize: 1,\n    debugLabel: `Playground/week-${weekIndex}`,\n  });\n  return (\n    <View>\n      {programWeekDescription && (\n        <View className=\"mx-4\">\n          <SimpleMarkdown value={programWeekDescription} className=\"text-sm\" />\n        </View>\n      )}\n      <View className=\"flex-row flex-wrap justify-center mt-4\" style={{ gap: 24 }}>\n        {visibleDays.map((d: IProgramPreviewPlaygroundDaySetupWithProgress, i) => {\n          return (\n            <View key={i} style={{ maxWidth: 384, minWidth: 288 }} className=\"flex-1\">\n              <ProgramPreviewPlaygroundDay\n                weekName={state.progresses.length > 1 ? week.name : undefined}\n                day={d.day}\n                weekIndex={weekIndex}\n                dayIndex={i}\n                program={evaluatedProgram}\n                progress={d.progress}\n                settings={state.settings}\n                isPlayground={state.isPlayground}\n                stats={props.stats}\n                onProgressChange={handleProgressChange}\n                onFinish={handleFinish}\n              />\n              {!props.useNavModals && (\n                <WebWorkoutModals\n                  progress={d.progress}\n                  dispatch={buildDayDispatch(dispatch, weekIndex, i, d.progress, props.settings, props.stats)}\n                  settings={state.settings}\n                  program={evaluatedProgram}\n                  day={d.day}\n                  onProgramChange={(newEvaluatedProgram) =>\n                    playgroundOnProgramChange(dispatch, newEvaluatedProgram, props.stats, state)\n                  }\n                  onSettingsChange={(newSettings) =>\n                    playgroundOnSettingsChange(dispatch, newSettings, props.stats, evaluatedProgram)\n                  }\n                />\n              )}\n            </View>\n          );\n        })}\n      </View>\n    </View>\n  );\n}\n\nfunction ProgramPreviewPlaygroundInner(p: IProgramPreviewPlaygroundInnerProps): JSX.Element {\n  const { props, state, dispatch, evaluatedProgram } = p;\n\n  const stateRef = useRef(state);\n  stateRef.current = state;\n  const propsRef = useRef(props);\n  propsRef.current = props;\n\n  const handleProgressChange = useCallback(\n    (weekIndex: number, dayIndex: number, newProgress: IHistoryRecord) => {\n      onProgressChange(dispatch, weekIndex, dayIndex, newProgress);\n    },\n    [dispatch]\n  );\n\n  const handleFinish = useCallback(\n    (weekIndex: number, dayIndex: number) => {\n      const s = stateRef.current;\n      const pp = propsRef.current;\n      const d = s.progresses[weekIndex].days[dayIndex];\n      onFinish(dispatch, pp, s, d);\n    },\n    [dispatch]\n  );\n\n  if (props.showAllWeeks && !props.isPlayground) {\n    return (\n      <ProgramPreviewAllWeeks\n        {...props}\n        state={state}\n        dispatch={dispatch}\n        evaluatedProgram={evaluatedProgram}\n        handleProgressChange={handleProgressChange}\n        handleFinish={handleFinish}\n      />\n    );\n  }\n\n  return (\n    <ProgramPreviewPlaygroundInnerRenderer\n      headerContent={props.headerContent}\n      weekNames={state.progresses.map((w) => w.name)}\n      singleWeek={state.progresses.length <= 1}\n      renderWeekContent={(weekIndex) => (\n        <PlaygroundWeekContent\n          week={state.progresses[weekIndex]}\n          weekIndex={weekIndex}\n          state={state}\n          props={props}\n          dispatch={dispatch}\n          evaluatedProgram={evaluatedProgram}\n          handleProgressChange={handleProgressChange}\n          handleFinish={handleFinish}\n        />\n      )}\n      scrollableTabsProps={props.scrollableTabsProps}\n      hasNavbar={props.hasNavbar}\n      scrollTabZIndex={props.scrollTabZIndex}\n      externalWeekIndex={props.externalWeekIndex}\n      hideWeekTabBar={props.hideWeekTabBar}\n    />\n  );\n}\n\n// --- Local variant (standalone web pages) ---\n\nfunction ProgramPreviewPlaygroundLocal(props: IProgramPreviewPlaygroundProps): JSX.Element {\n  const initialState = useMemo(() => buildInitialState(props), [props.program, props.settings]);\n  const [state, dispatch] = useLensReducer(initialState, {}, [\n    () => {\n      if (props.onEngage) {\n        props.onEngage();\n      }\n    },\n  ]);\n  const evaluatedProgram = useMemo(() => {\n    return Program_evaluate(state.program, state.settings);\n  }, [state.program, state.settings]);\n\n  return (\n    <ProgramPreviewPlaygroundInner\n      props={props}\n      state={state}\n      dispatch={dispatch}\n      evaluatedProgram={evaluatedProgram}\n    />\n  );\n}\n\n// --- Nav variant (app, uses global state.playgroundState) ---\n\nfunction buildGlobalPlaygroundDispatch(globalDispatch: IDispatch): ILensDispatch<IProgramPreviewPlaygroundState> {\n  return (lensRecordings, desc) => {\n    const recordings = Array.isArray(lensRecordings) ? lensRecordings : [lensRecordings];\n    updateState(\n      globalDispatch,\n      recordings.map((lr) =>\n        lb<IState>()\n          .pi(\"playgroundState\")\n          .recordModify((s) => lr.fn(s))\n      ),\n      desc\n    );\n  };\n}\n\nfunction ProgramPreviewPlaygroundNav(props: IProgramPreviewPlaygroundProps): JSX.Element {\n  const { state: globalState, dispatch: globalDispatch } = useAppState();\n  const initialState = useMemo(() => buildInitialState(props), [props.program, props.settings]);\n\n  useEffect(() => {\n    updateState(\n      globalDispatch,\n      [lb<IState>().p(\"playgroundState\").record(initialState)],\n      \"Initialize playground state\"\n    );\n    return () => {\n      updateState(globalDispatch, [lb<IState>().p(\"playgroundState\").record(undefined)], \"Cleanup playground state\");\n    };\n  }, [initialState]);\n\n  const state = globalState.playgroundState ?? initialState;\n  const dispatch = useMemo(() => buildGlobalPlaygroundDispatch(globalDispatch), [globalDispatch]);\n\n  const evaluatedProgram = useMemo(() => {\n    return Program_evaluate(state.program, state.settings);\n  }, [state.program, state.settings]);\n\n  return (\n    <ProgramPreviewPlaygroundInner\n      props={props}\n      state={state}\n      dispatch={dispatch}\n      evaluatedProgram={evaluatedProgram}\n    />\n  );\n}\n\n// --- Entry point ---\n\nexport const ProgramPreviewPlayground = memo((props: IProgramPreviewPlaygroundProps): JSX.Element => {\n  usePerfRenderCount(\"ProgramPreviewPlayground\");\n  if (props.useNavModals) {\n    return <ProgramPreviewPlaygroundNav {...props} />;\n  }\n  return <ProgramPreviewPlaygroundLocal {...props} />;\n});\n\n// --- All Weeks layout ---\n\ninterface IProgramPreviewAllWeeksProps extends IProgramPreviewPlaygroundProps {\n  evaluatedProgram: IEvaluatedProgram;\n  state: IProgramPreviewPlaygroundState;\n  dispatch: ILensDispatch<IProgramPreviewPlaygroundState>;\n  handleProgressChange: (weekIndex: number, dayIndex: number, newProgress: IHistoryRecord) => void;\n  handleFinish: (weekIndex: number, dayIndex: number) => void;\n}\n\nfunction buildAllWeeksCss(numWeeks: number): string {\n  const minCol = 20;\n  const gap = 1;\n  const rules: string[] = [];\n\n  rules.push(\n    `.preview-all-weeks-scroll { overflow-x: auto; container-type: inline-size; container-name: preview-weeks; scroll-snap-type: x mandatory; }`,\n    `.preview-all-weeks-grid { display: grid; gap: ${gap}rem; align-items: start; ` +\n      `grid-template-columns: repeat(${numWeeks}, minmax(${minCol}rem, 24rem)); }`\n  );\n\n  for (let n = 1; n < numWeeks; n++) {\n    const breakpoint = n === 1 ? 0 : n * minCol + (n - 1) * gap;\n    rules.push(\n      `@container preview-weeks (min-width: ${breakpoint}rem) {` +\n        ` .preview-all-weeks-grid {` +\n        ` grid-template-columns: repeat(${numWeeks}, calc((100cqi - ${n - 1}rem) / ${n})); } }`\n    );\n  }\n\n  const allFitBreakpoint = numWeeks * minCol + (numWeeks - 1) * gap;\n  rules.push(\n    `@container preview-weeks (min-width: ${allFitBreakpoint}rem) {` +\n      ` .preview-all-weeks-grid {` +\n      ` grid-template-columns: repeat(${numWeeks}, minmax(${minCol}rem, 24rem)); justify-content: center; } }`\n  );\n\n  return rules.join(\"\\n\");\n}\n\nfunction ProgramPreviewAllWeeks(props: IProgramPreviewAllWeeksProps): JSX.Element {\n  const { state, dispatch, evaluatedProgram, handleProgressChange, handleFinish } = props;\n  const numWeeks = state.progresses.length;\n  const cssRules = useMemo(() => buildAllWeeksCss(numWeeks), [numWeeks]);\n\n  return (\n    <div>\n      <style dangerouslySetInnerHTML={{ __html: cssRules }} />\n      <div className=\"preview-all-weeks-scroll\">\n        <div className=\"preview-all-weeks-grid\">\n          {state.progresses.map((week, weekIndex) => {\n            const programWeekDescription = evaluatedProgram.weeks[weekIndex]?.description;\n            return (\n              <div key={weekIndex} style={{ gridColumn: weekIndex + 1, gridRow: 1, scrollSnapAlign: \"start\" }}>\n                <h3 className=\"mb-1 text-lg font-bold\">{week.name}</h3>\n                {programWeekDescription && (\n                  <div className=\"text-sm\">\n                    <SimpleMarkdown value={programWeekDescription} />\n                  </div>\n                )}\n              </div>\n            );\n          })}\n          {state.progresses.map((week, weekIndex) =>\n            week.days.map((d: IProgramPreviewPlaygroundDaySetupWithProgress, i: number) => (\n              <div key={d.day} style={{ gridColumn: weekIndex + 1, gridRow: i + 2 }}>\n                <ProgramPreviewPlaygroundDay\n                  weekName={numWeeks > 1 ? week.name : undefined}\n                  day={d.day}\n                  weekIndex={weekIndex}\n                  dayIndex={i}\n                  program={evaluatedProgram}\n                  progress={d.progress}\n                  settings={props.settings}\n                  isPlayground={props.isPlayground}\n                  stats={props.stats}\n                  onProgressChange={handleProgressChange}\n                  onFinish={handleFinish}\n                />\n                {!props.useNavModals && (\n                  <WebWorkoutModals\n                    progress={d.progress}\n                    dispatch={buildDayDispatch(dispatch, weekIndex, i, d.progress, props.settings, props.stats)}\n                    settings={state.settings}\n                    program={evaluatedProgram}\n                    day={d.day}\n                    onProgramChange={(newEvaluatedProgram) =>\n                      playgroundOnProgramChange(dispatch, newEvaluatedProgram, props.stats, state)\n                    }\n                    onSettingsChange={(newSettings) =>\n                      playgroundOnSettingsChange(dispatch, newSettings, props.stats, evaluatedProgram)\n                    }\n                  />\n                )}\n              </div>\n            ))\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import { JSX, memo, useCallback, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { buildCardsReducer, ICardsAction } from \"../../ducks/reducer\";\nimport { IHistoryRecord, ISettings, IStats } from \"../../types\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { ProgramPreviewPlaygroundExercise } from \"./programPreviewPlaygroundExercise\";\nimport { lb } from \"lens-shmens\";\nimport { Button } from \"../button\";\nimport { IEvaluatedProgram, Program_getProgramDay, Program_getProgramDayUsedExercises } from \"../../models/program\";\nimport { StringUtils_dashcase } from \"../../utils/string\";\nimport { SimpleMarkdown } from \"../simpleMarkdown\";\nimport { Scroller } from \"../scroller\";\nimport { WorkoutExerciseThumbnail } from \"../workoutExerciseThumbnail\";\nimport { updateProgress } from \"../../models/state\";\nimport { Progress_getColorToSupersetGroup } from \"../../models/progress\";\n\ninterface IProgramPreviewPlaygroundDayProps {\n  program: IEvaluatedProgram;\n  weekName?: string;\n  day: number;\n  weekIndex: number;\n  dayIndex: number;\n  isPlayground: boolean;\n  settings: ISettings;\n  progress: IHistoryRecord;\n  onProgressChange: (weekIndex: number, dayIndex: number, newProgress: IHistoryRecord) => void;\n  stats: IStats;\n  onFinish: (weekIndex: number, dayIndex: number) => void;\n}\n\nexport const ProgramPreviewPlaygroundDay = memo((props: IProgramPreviewPlaygroundDayProps): JSX.Element => {\n  const { weekIndex, dayIndex, onProgressChange, onFinish } = props;\n  const dispatch: IDispatch = useCallback(\n    async (action) => {\n      const newProgress = buildCardsReducer(\n        [],\n        props.settings,\n        props.stats,\n        undefined\n      )(props.progress, action as ICardsAction);\n      onProgressChange(weekIndex, dayIndex, newProgress);\n    },\n    [props.settings, props.progress, onProgressChange, weekIndex, dayIndex]\n  );\n  const handleFinish = useCallback(() => onFinish(weekIndex, dayIndex), [onFinish, weekIndex, dayIndex]);\n\n  const programDay = Program_getProgramDay(props.program, props.day)!;\n  const index = props.progress.currentEntryIndex ?? 0;\n  const entry = props.progress.entries[index];\n  const dayExercises = programDay ? Program_getProgramDayUsedExercises(programDay) : [];\n  const programExercises = props.isPlayground\n    ? dayExercises.filter((e) => e.key === entry.programExerciseId)\n    : dayExercises;\n\n  return (\n    <View\n      data-testid={`preview-day-${StringUtils_dashcase(programDay.name)}`}\n      testID={`preview-day-${StringUtils_dashcase(programDay.name)}`}\n    >\n      <Text className=\"mx-4 mb-1 text-lg font-bold\" data-testid=\"preview-day-name\" testID=\"preview-day-name\">\n        {props.weekName ? `${props.weekName} - ` : \"\"}\n        {programDay.name}\n      </Text>\n      {programDay.description && (\n        <View className=\"mx-4\">\n          <SimpleMarkdown value={programDay.description} className=\"text-sm\" />\n        </View>\n      )}\n      {props.isPlayground && (\n        <View className=\"mb-2\">\n          <PreviewListOfExercises\n            isPlayground={props.isPlayground}\n            progress={props.progress}\n            settings={props.settings}\n            dispatch={dispatch}\n          />\n        </View>\n      )}\n      {(programExercises ?? []).map((programExercise, i) => {\n        const anEntry = props.progress.entries.find((e) => e.programExerciseId === programExercise.key);\n        if (!anEntry) {\n          return null;\n        }\n        return (\n          <ProgramPreviewPlaygroundExercise\n            key={programExercise.key}\n            entry={anEntry}\n            dayIndex={props.day}\n            progress={props.progress}\n            isPlayground={props.isPlayground}\n            programExercise={programExercise}\n            program={props.program}\n            index={props.isPlayground ? index : i}\n            settings={props.settings}\n            stats={props.stats}\n            dispatch={dispatch}\n          />\n        );\n      })}\n      {props.isPlayground && (\n        <View className=\"items-center\">\n          <Button\n            name=\"finish-day-details-playground\"\n            kind=\"purple\"\n            onClick={handleFinish}\n            data-testid=\"finish-day-details-playground\"\n            testID=\"finish-day-details-playground\"\n          >\n            Finish this day\n          </Button>\n        </View>\n      )}\n    </View>\n  );\n});\n\ninterface IPreviewListOfExercisesProps {\n  isPlayground: boolean;\n  progress: IHistoryRecord;\n  settings: ISettings;\n  dispatch: IDispatch;\n}\n\nfunction PreviewListOfExercises(props: IPreviewListOfExercisesProps): JSX.Element {\n  const colorToSupersetGroup = useMemo(() => Progress_getColorToSupersetGroup(props.progress), [props.progress]);\n  const dispatch = props.dispatch;\n  const onSelect = useCallback(\n    (entryIndex: number) => {\n      updateProgress(dispatch, [lb<IHistoryRecord>().p(\"currentEntryIndex\").record(entryIndex)], \"click-exercise-tab\");\n    },\n    [dispatch]\n  );\n  const currentIdx = props.progress.currentEntryIndex ?? 0;\n  const currentSuperset = props.progress.entries[currentIdx]?.superset;\n  return (\n    <Scroller>\n      <View className=\"flex-row items-center gap-1 px-4\">\n        {props.progress.entries.map((entry, entryIndex) => (\n          <WorkoutExerciseThumbnail\n            colorToSupersetGroup={colorToSupersetGroup}\n            onSelect={onSelect}\n            shouldShowProgress={props.isPlayground}\n            isCurrent={entryIndex === currentIdx}\n            currentSuperset={currentSuperset}\n            key={entryIndex}\n            settings={props.settings}\n            entry={entry}\n            entryIndex={entryIndex}\n          />\n        ))}\n      </View>\n    </Scroller>\n  );\n}\n","import { JSX, memo } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { ExerciseImage } from \"../exerciseImage\";\nimport { SimpleMarkdown } from \"../simpleMarkdown\";\nimport {\n  equipmentName,\n  Exercise_get,\n  Exercise_getNotes,\n  Exercise_nameWithEquipment,\n  Exercise_fullName,\n} from \"../../models/exercise\";\nimport { IHistoryEntry, IHistoryRecord, IProgramState, ISettings, IStats } from \"../../types\";\nimport { ComparerUtils_noFns } from \"../../utils/comparer\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { Reps_isFinished, Reps_isCompleted } from \"../../models/set\";\nimport { IconCheckCircle } from \"../icons/iconCheckCircle\";\nimport { IconEditSquare } from \"../icons/iconEditSquare\";\nimport { lb } from \"lens-shmens\";\nimport { IEvaluatedProgram, Program_getDayData } from \"../../models/program\";\nimport { HistoryRecordSetsView } from \"../historyRecordSets\";\nimport { StringUtils_dashcase } from \"../../utils/string\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { PlannerProgramExercise_currentDescription } from \"../../pages/planner/models/plannerProgramExercise\";\nimport { WorkoutExerciseAllSets } from \"../workoutExerciseAllSets\";\nimport { WorkoutExerciseUtils_getBgColor50 } from \"../../utils/workoutExerciseUtils\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Equipment_getEquipmentNameForExerciseType } from \"../../models/equipment\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { Progress_getNextSupersetEntry } from \"../../models/progress\";\n\ninterface IProps {\n  entry: IHistoryEntry;\n  programExercise: IPlannerProgramExercise;\n  program: IEvaluatedProgram;\n  stats: IStats;\n  settings: ISettings;\n  progress: IHistoryRecord;\n  dayIndex: number;\n  isPlayground: boolean;\n  index: number;\n  staticState?: IProgramState;\n  dispatch: IDispatch;\n}\n\nfunction getColor(entry: IHistoryEntry): string {\n  if (entry.sets.length === 0) {\n    return \"purple\";\n  }\n  if (Reps_isFinished(entry.sets)) {\n    if (Reps_isCompleted(entry.sets)) {\n      return \"green\";\n    } else {\n      return \"red\";\n    }\n  } else {\n    return \"purple\";\n  }\n}\n\nfunction getBgColor100(entry: IHistoryEntry): string {\n  const color = getColor(entry);\n  if (color === \"green\") {\n    return \"bg-greenv2-100\";\n  } else if (color === \"red\") {\n    return \"bg-redv2-100\";\n  } else {\n    return \"bg-background-cardpurple\";\n  }\n}\n\nexport const ProgramPreviewPlaygroundExercise = memo((props: IProps): JSX.Element => {\n  return props.isPlayground ? (\n    <ProgramPreviewPlayground\n      stats={props.stats}\n      entry={props.entry}\n      programExercise={props.programExercise}\n      program={props.program}\n      settings={props.settings}\n      progress={props.progress}\n      dayIndex={props.dayIndex}\n      index={props.index}\n      staticState={props.staticState}\n      dispatch={props.dispatch}\n    />\n  ) : (\n    <ProgramPreviewHistoryRecordSets\n      entry={props.entry}\n      programExercise={props.programExercise}\n      settings={props.settings}\n      index={props.index}\n      dispatch={props.dispatch}\n    />\n  );\n}, ComparerUtils_noFns);\n\ninterface IProgramPreviewHistoryRecordSetsProps {\n  entry: IHistoryEntry;\n  programExercise: IPlannerProgramExercise;\n  settings: ISettings;\n  index: number;\n  dispatch: IDispatch;\n}\n\nfunction ProgramPreviewHistoryRecordSets(props: IProgramPreviewHistoryRecordSetsProps): JSX.Element {\n  const exercise = Exercise_get(props.entry.exercise, props.settings.exercises);\n  const equipment = exercise.equipment;\n  const programExercise = props.programExercise;\n  const description = PlannerProgramExercise_currentDescription(programExercise);\n\n  return (\n    <View\n      className={`py-2 px-2 mx-4 mb-3 rounded-lg ${getBgColor100(props.entry)} relative`}\n      data-testid={StringUtils_dashcase(exercise.name)}\n      testID={StringUtils_dashcase(exercise.name)}\n    >\n      <View className=\"flex-row items-center gap-2\">\n        <PlaygroundExerciseTopBar\n          dispatch={props.dispatch}\n          index={props.index}\n          entry={props.entry}\n          programExercise={props.programExercise}\n          isPlayground={false}\n        />\n        <View className=\"w-scaled-10\">\n          <View className=\"p-1 rounded-lg bg-background-image\">\n            <ExerciseImage settings={props.settings} className=\"w-full\" exerciseType={exercise} size=\"small\" />\n          </View>\n        </View>\n        <View className=\"flex-1 ml-auto\" style={{ minWidth: 64 }}>\n          <View className=\"flex-row items-center\">\n            <Text className=\"flex-1 mr-1 text-sm font-bold\">{exercise.name}</Text>\n          </View>\n          {equipment && <Text className=\"text-sm text-text-secondary\">{equipmentName(equipment)}</Text>}\n        </View>\n        <View className=\"mt-1 ml-1\">\n          <HistoryRecordSetsView sets={props.entry.sets} units={props.settings.units} isNext={true} />\n        </View>\n      </View>\n      {description && (\n        <View className=\"mt-1\">\n          <SimpleMarkdown value={description} className=\"text-sm\" />\n        </View>\n      )}\n    </View>\n  );\n}\n\ninterface IProgramPreviewPlaygroundProps {\n  entry: IHistoryEntry;\n  programExercise: IPlannerProgramExercise;\n  program: IEvaluatedProgram;\n  settings: ISettings;\n  stats: IStats;\n  progress: IHistoryRecord;\n  dayIndex: number;\n  index: number;\n  staticState?: IProgramState;\n  dispatch: IDispatch;\n}\n\nfunction ProgramPreviewPlayground(props: IProgramPreviewPlaygroundProps): JSX.Element {\n  const exercise = Exercise_get(props.entry.exercise, props.settings.exercises);\n  const programExercise = props.programExercise;\n  const dayData = Program_getDayData(props.program, props.dayIndex);\n  const description = PlannerProgramExercise_currentDescription(programExercise);\n  const currentEquipmentName = Equipment_getEquipmentNameForExerciseType(props.settings, exercise);\n  const exerciseNotes = Exercise_getNotes(props.entry.exercise, props.settings);\n  const supersetEntry = Progress_getNextSupersetEntry(props.progress.entries, props.entry);\n  const supersetExercise = supersetEntry ? Exercise_get(supersetEntry.exercise, props.settings.exercises) : undefined;\n\n  return (\n    <View\n      className={`pt-2 pb-2 mb-6 rounded-lg ${WorkoutExerciseUtils_getBgColor50(props.entry.sets, false)} relative`}\n      data-testid={`entry-${StringUtils_dashcase(exercise.name)}`}\n      testID={`entry-${StringUtils_dashcase(exercise.name)}`}\n    >\n      <View>\n        <PlaygroundExerciseTopBar\n          dispatch={props.dispatch}\n          index={props.index}\n          entry={props.entry}\n          programExercise={props.programExercise}\n          isPlayground={true}\n          xOffset={20}\n        />\n        <View className=\"flex-row items-center mx-4\">\n          <View className=\"w-scaled-10 mr-1\">\n            <View className=\"p-1 rounded-lg bg-background-image\">\n              <ExerciseImage settings={props.settings} className=\"w-full\" exerciseType={exercise} size=\"small\" />\n            </View>\n          </View>\n          <View className=\"flex-1 ml-auto\" style={{ minWidth: 64 }}>\n            <View className=\"flex-row items-center\">\n              <Text className=\"flex-1 mr-1 font-bold\">{Exercise_nameWithEquipment(exercise, props.settings)}</Text>\n            </View>\n            <Text data-testid=\"exercise-equipment\" testID=\"exercise-equipment\" className=\"text-xs text-text-secondary\">\n              Equipment: <Text className=\"text-xs font-bold text-text-secondary\">{currentEquipmentName || \"None\"}</Text>\n            </Text>\n            {supersetExercise && (\n              <Text data-testid=\"exercise-superset\" testID=\"exercise-superset\" className=\"text-xs text-text-secondary\">\n                Supersets with:{\" \"}\n                <Text className=\"text-xs font-bold text-text-secondary\">\n                  {Exercise_fullName(supersetExercise, props.settings)}\n                </Text>\n              </Text>\n            )}\n          </View>\n        </View>\n        {exerciseNotes && (\n          <View className=\"mt-1\">\n            {exerciseNotes && description && <GroupHeader name=\"Exercise Notes\" />}\n            <SimpleMarkdown value={exerciseNotes} className=\"text-sm\" />\n          </View>\n        )}\n        {description && (\n          <View className=\"mt-1\">\n            {exerciseNotes && description && <GroupHeader name=\"Program Exercise Description\" />}\n            <SimpleMarkdown value={description} className=\"text-sm\" />\n          </View>\n        )}\n        <View className=\"mt-1\">\n          <WorkoutExerciseAllSets\n            isPlayground={true}\n            day={dayData.day}\n            isCurrentProgress={true}\n            program={props.program}\n            programExercise={props.programExercise}\n            stats={props.stats}\n            entry={props.entry}\n            entryIndex={props.index}\n            otherStates={props.program.states}\n            userPromptedStateVars={props.progress.userPromptedStateVars?.[props.programExercise.key]}\n            exerciseType={props.entry.exercise}\n            lbSets={lb<IHistoryRecord>().p(\"entries\").i(props.index).p(\"sets\")}\n            lbWarmupSets={lb<IHistoryRecord>().p(\"entries\").i(props.index).p(\"warmupSets\")}\n            settings={props.settings}\n            dispatch={props.dispatch}\n            subscription={undefined}\n          />\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IPlaygroundExerciseTopBarProps {\n  dispatch: IDispatch;\n  index: number;\n  entry: IHistoryEntry;\n  programExercise: IPlannerProgramExercise;\n  isPlayground: boolean;\n  xOffset?: number;\n}\n\nfunction PlaygroundExerciseTopBar(props: IPlaygroundExerciseTopBarProps): JSX.Element {\n  return (\n    <View\n      className=\"absolute z-0 px-2 py-1 rounded-full bg-background-neutral\"\n      style={{ right: -12 + (props.xOffset ?? 0), top: -18 }}\n    >\n      <View className=\"flex-row items-center gap-2\">\n        <Pressable\n          data-testid=\"program-preview-edit-exercise\"\n          testID=\"program-preview-edit-exercise\"\n          onPress={() => {\n            props.dispatch({\n              type: \"UpdateProgress\",\n              lensRecordings: [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"editModal\").record(undefined)],\n              desc: \"clear-edit-modal\",\n            });\n            setTimeout(() => {\n              props.dispatch({\n                type: \"UpdateProgress\",\n                lensRecordings: [\n                  lb<IHistoryRecord>()\n                    .pi(\"ui\", {})\n                    .p(\"editModal\")\n                    .record({ programExerciseId: props.programExercise.key, entryIndex: props.index }),\n                ],\n                desc: \"open-edit-exercise-modal\",\n              });\n            }, 0);\n          }}\n        >\n          <IconEditSquare color={Tailwind_semantic().icon.neutralsubtle} />\n        </Pressable>\n        {props.isPlayground && (\n          <Pressable\n            data-testid=\"program-preview-complete-exercise\"\n            testID=\"program-preview-complete-exercise\"\n            onPress={() => {\n              props.dispatch({\n                type: \"UpdateProgress\",\n                lensRecordings: [\n                  lb<IHistoryRecord>()\n                    .pi(\"entries\")\n                    .i(props.index)\n                    .p(\"sets\")\n                    .recordModify((sets) =>\n                      sets.map((s) => {\n                        const newSet = { ...s, completedReps: s.reps, completedWeight: s.weight };\n                        return newSet.completedReps != null && newSet.completedWeight != null\n                          ? { ...newSet, isCompleted: true }\n                          : s;\n                      })\n                    ),\n                  lb<IHistoryRecord>()\n                    .pi(\"entries\")\n                    .i(props.index)\n                    .p(\"warmupSets\")\n                    .recordModify((sets) =>\n                      sets.map((s) => {\n                        const newSet = { ...s, completedReps: s.reps, completedWeight: s.weight };\n                        return newSet.completedReps != null && newSet.completedWeight != null\n                          ? { ...newSet, isCompleted: true }\n                          : s;\n                      })\n                    ),\n                ],\n                desc: \"complete-all-sets\",\n              });\n            }}\n          >\n            <IconCheckCircle isChecked={true} color={Reps_isCompleted(props.entry.sets) ? \"#38A169\" : \"#BAC4CD\"} />\n          </Pressable>\n        )}\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { Button } from \"../button\";\nimport { MenuItemEditable } from \"../menuItemEditable\";\nimport { Modal } from \"../modal\";\nimport { Weight_is, Weight_isPct } from \"../../models/weight\";\nimport { IProgramStateMetadata, ISettings, IExerciseDataValue, IProgramState } from \"../../types\";\nimport { ObjectUtils_keys } from \"../../utils/object\";\nimport { ExerciseRM } from \"../exerciseRm\";\nimport { Exercise_get } from \"../../models/exercise\";\nimport { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport {\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_getStateMetadata,\n} from \"../../pages/planner/models/plannerProgramExercise\";\n\ninterface IProgramPreviewPlaygroundExerciseEditModalProps {\n  programExercise: IPlannerProgramExercise;\n  hideVariables?: boolean;\n  onClose: () => void;\n  onEditStateVariable: (stateKey: string, newValue: string) => void;\n  onEditVariable: (variableKey: keyof IExerciseDataValue, newValue: number) => void;\n  settings: ISettings;\n}\n\nexport function ProgramPreviewPlaygroundExerciseEditContent(\n  props: IProgramPreviewPlaygroundExerciseEditModalProps\n): JSX.Element | null {\n  const programExercise = props.programExercise;\n  const state = PlannerProgramExercise_getState(props.programExercise);\n  const stateMetadata = PlannerProgramExercise_getStateMetadata(props.programExercise);\n  const hasStateVariables = ObjectUtils_keys(state).length > 0;\n  const pendingStateVarsRef = useRef<Record<string, string>>({});\n  const [pendingRm, setPendingRm] = useState<string | undefined>(undefined);\n  if (!programExercise.exerciseType) {\n    return null;\n  }\n  const exercise = Exercise_get(programExercise.exerciseType, props.settings.exercises);\n  return (\n    <View style={{ minWidth: 240 }}>\n      {!props.hideVariables && (\n        <ExerciseRM\n          name=\"1 Rep Max\"\n          rmKey=\"rm1\"\n          exercise={exercise}\n          settings={props.settings}\n          displayValue={pendingRm}\n          onEditVariable={(v) => {\n            setPendingRm(String(v));\n          }}\n          onInput={(v) => {\n            setPendingRm(v);\n          }}\n        />\n      )}\n      {(hasStateVariables || props.hideVariables) && (\n        <>\n          <Text className=\"mb-2 text-lg font-bold text-center\">Edit state variables</Text>\n          {hasStateVariables ? (\n            <ProgramStateVariables\n              settings={props.settings}\n              state={state}\n              stateMetadata={stateMetadata}\n              onEditStateVariable={props.onEditStateVariable}\n              pendingRef={pendingStateVarsRef}\n            />\n          ) : (\n            <View className=\"px-4 py-2\">\n              <Text className=\"text-sm italic text-center text-text-secondary\">No state variables</Text>\n            </View>\n          )}\n        </>\n      )}\n      <View className=\"items-center mt-4\">\n        <Button\n          name=\"details-workout-playground-save-statvars\"\n          kind=\"purple\"\n          onClick={() => {\n            if (pendingRm != null) {\n              const num = parseFloat(pendingRm);\n              if (!isNaN(num)) {\n                props.onEditVariable(\"rm1\", num);\n              }\n            }\n            for (const [key, value] of Object.entries(pendingStateVarsRef.current)) {\n              props.onEditStateVariable(key, value);\n            }\n            props.onClose();\n          }}\n          data-testid=\"modal-edit-mode-save-statvars\"\n          testID=\"modal-edit-mode-save-statvars\"\n        >\n          Done\n        </Button>\n      </View>\n    </View>\n  );\n}\n\nexport function ProgramPreviewPlaygroundExerciseEditModal(\n  props: IProgramPreviewPlaygroundExerciseEditModalProps\n): JSX.Element | null {\n  return (\n    <Modal shouldShowClose={true} onClose={props.onClose}>\n      <ProgramPreviewPlaygroundExerciseEditContent {...props} />\n    </Modal>\n  );\n}\n\ninterface IStateProps {\n  state: IProgramState;\n  stateMetadata?: IProgramStateMetadata;\n  onEditStateVariable: (stateKey: string, newValue: string) => void;\n  settings: ISettings;\n  pendingRef?: React.RefObject<Record<string, string>>;\n}\n\nfunction ProgramStateVariables(props: IStateProps): JSX.Element {\n  return (\n    <View className=\"px-4 py-2 bg-background-cardpurple rounded-2xl\">\n      {ObjectUtils_keys(props.state).map((stateKey, i) => {\n        const value = props.state[stateKey];\n        const displayValue = Weight_is(value) || Weight_isPct(value) ? value.value : value;\n\n        return (\n          <MenuItemEditable\n            key={stateKey}\n            name={stateKey}\n            isBorderless={i === Object.keys(props.state).length - 1}\n            nextLine={\n              props.stateMetadata?.[stateKey]?.userPrompted ? (\n                <View style={{ marginTop: -12 }} className=\"mb-1\">\n                  <Text className=\"text-xs text-text-secondary\">User Prompted</Text>\n                </View>\n              ) : undefined\n            }\n            isNameBold={true}\n            type=\"number\"\n            value={displayValue.toString()}\n            valueUnits={Weight_is(value) || Weight_isPct(value) ? value.unit : undefined}\n            hasClear={false}\n            onChange={(v) => {\n              if (props.pendingRef && v != null) {\n                props.pendingRef.current[stateKey] = v;\n              }\n            }}\n            onInput={(v) => {\n              if (props.pendingRef) {\n                props.pendingRef.current[stateKey] = v;\n              }\n            }}\n          />\n        );\n      })}\n    </View>\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { IScrollableTabsProps, ScrollableTabs } from \"../scrollableTabs\";\n\nexport interface IProgramPreviewPlaygroundInnerRendererProps {\n  headerContent?: ReactNode;\n  weekNames: string[];\n  singleWeek: boolean;\n  renderWeekContent: (weekIndex: number) => JSX.Element;\n  scrollableTabsProps?: Partial<IScrollableTabsProps>;\n  hasNavbar?: boolean;\n  scrollTabZIndex?: number;\n  externalWeekIndex?: number;\n  hideWeekTabBar?: boolean;\n}\n\nexport function ProgramPreviewPlaygroundInnerRenderer(props: IProgramPreviewPlaygroundInnerRendererProps): JSX.Element {\n  if (props.hideWeekTabBar) {\n    return props.renderWeekContent(props.externalWeekIndex ?? 0);\n  }\n  return (\n    <ScrollableTabs\n      headerContent={props.headerContent}\n      offsetY={props.scrollableTabsProps?.offsetY ?? (props.hasNavbar ? \"3rem\" : undefined)}\n      zIndex={props.scrollTabZIndex}\n      shouldNotExpand={true}\n      color=\"purple\"\n      type={props.scrollableTabsProps?.type}\n      topPadding={props.scrollableTabsProps?.topPadding}\n      className={props.scrollableTabsProps?.className}\n      nonSticky={props.scrollableTabsProps?.nonSticky}\n      tabs={props.weekNames.map((name, weekIndex) => ({\n        label: name,\n        children: () => props.renderWeekContent(weekIndex),\n      }))}\n    />\n  );\n}\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { IProgram, ISettings, IStats } from \"../../types\";\nimport { Program_evaluate } from \"../../models/program\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { Markdown } from \"../markdown\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { IPlannerState, IPlannerUi } from \"../../pages/planner/models/types\";\nimport { ProgramPreviewTabDay } from \"./programPreviewTabDay\";\nimport { useProgressiveItems } from \"../../utils/useProgressiveItems\";\nimport { usePerfRenderCount } from \"../../utils/usePerfRenderCount\";\nimport { IProgramPreviewWeek } from \"./programPreviewWeeks\";\n\ninterface IProgramPreviewWeekContentProps {\n  week: IProgramPreviewWeek;\n  weekIndex: number;\n  program: IProgram;\n  programId: string;\n  settings: ISettings;\n  ui: IPlannerUi;\n  stats: IStats;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  totalWeeks: number;\n}\n\nexport const ProgramPreviewWeekContent = memo(function ProgramPreviewWeekContent(\n  props: IProgramPreviewWeekContentProps\n): JSX.Element {\n  usePerfRenderCount(\"ProgramPreviewWeekContent\");\n  const evaluatedProgram = Program_evaluate(props.program, props.settings);\n  const { week, totalWeeks } = props;\n  const visibleDays = useProgressiveItems(week.days, {\n    initialBatch: 1,\n    batchSize: 1,\n    debugLabel: `Preview/week-${props.weekIndex}`,\n    resetKey: props.weekIndex,\n  });\n  return (\n    <View>\n      {week.description && (\n        <View className=\"mx-4\">\n          <Markdown className=\"text-sm\" value={week.description} />\n        </View>\n      )}\n      <View className=\"flex-row flex-wrap justify-center mt-4\" style={{ gap: 24 }}>\n        {visibleDays.map((d, i) => (\n          <View key={i} style={{ maxWidth: 384, minWidth: 288 }} className=\"flex-1\">\n            <ProgramPreviewTabDay\n              stats={props.stats}\n              dispatch={props.dispatch}\n              program={evaluatedProgram}\n              programId={props.programId}\n              weekName={totalWeeks > 1 ? week.name : undefined}\n              day={d.day}\n              settings={props.settings}\n              progress={d.progress}\n              ui={props.ui}\n              plannerDispatch={props.plannerDispatch}\n            />\n          </View>\n        ))}\n      </View>\n    </View>\n  );\n});\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport { IHistoryRecord, ISettings, IStats } from \"../../types\";\nimport { IEvaluatedProgram, Program_getProgramDay, Program_getProgramDayUsedExercises } from \"../../models/program\";\nimport { StringUtils_dashcase } from \"../../utils/string\";\nimport { Markdown } from \"../markdown\";\nimport { ProgramPreviewTabExercise } from \"./programPreviewTabExercise\";\nimport { IPlannerState, IPlannerUi } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { useProgressiveItems } from \"../../utils/useProgressiveItems\";\n\ninterface IProgramPreviewTabDayProps {\n  program: IEvaluatedProgram;\n  programId: string;\n  stats: IStats;\n  weekName?: string;\n  day: number;\n  settings: ISettings;\n  progress: IHistoryRecord;\n  ui: IPlannerUi;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\nexport const ProgramPreviewTabDay = memo((props: IProgramPreviewTabDayProps): JSX.Element => {\n  const programDay = Program_getProgramDay(props.program, props.day)!;\n  const index = props.progress.currentEntryIndex ?? 0;\n  const programExercises = programDay ? Program_getProgramDayUsedExercises(programDay) : [];\n  const visibleExercises = useProgressiveItems(programExercises, {\n    initialBatch: 3,\n    batchSize: 10,\n    debugLabel: `Preview/day-${props.day}-exercises`,\n    resetKey: props.day,\n  });\n\n  return (\n    <View\n      data-testid={`preview-day-${StringUtils_dashcase(programDay.name)}`}\n      testID={`preview-day-${StringUtils_dashcase(programDay.name)}`}\n    >\n      <Text className=\"mx-4 mb-1 text-lg font-bold\" data-testid=\"preview-day-name\" testID=\"preview-day-name\">\n        {props.weekName ? `${props.weekName} - ` : \"\"}\n        {programDay.name}\n      </Text>\n      {programDay.description && (\n        <View className=\"mx-4\">\n          <Markdown className=\"text-sm\" value={programDay.description} />\n        </View>\n      )}\n      {visibleExercises.map((programExercise) => {\n        const anEntry = props.progress.entries.find((e) => e.programExerciseId === programExercise.key);\n        if (!anEntry) {\n          return null;\n        }\n        return (\n          <ProgramPreviewTabExercise\n            key={programExercise.key}\n            stats={props.stats}\n            ui={props.ui}\n            entries={props.progress.entries}\n            program={props.program}\n            programId={props.programId}\n            day={props.day}\n            entry={anEntry}\n            programExercise={programExercise}\n            settings={props.settings}\n            index={index}\n            dispatch={props.dispatch}\n            plannerDispatch={props.plannerDispatch}\n          />\n        );\n      })}\n    </View>\n  );\n});\n","import { JSX, memo, useMemo } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../primitives/text\";\nimport {\n  Exercise_get,\n  Exercise_getNotes,\n  Exercise_onerm,\n  Exercise_nameWithEquipment,\n  Exercise_fullName,\n} from \"../../models/exercise\";\nimport { PlannerProgramExercise_currentDescription } from \"../../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise, IPlannerState, IPlannerUi } from \"../../pages/planner/models/types\";\nimport { IHistoryEntry, ISettings, IStats } from \"../../types\";\nimport { StringUtils_dashcase } from \"../../utils/string\";\nimport { ExerciseImage } from \"../exerciseImage\";\nimport { HistoryRecordSetsView } from \"../historyRecordSets\";\nimport { Markdown } from \"../markdown\";\nimport { IconEditSquare } from \"../icons/iconEditSquare\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { navigateToModal } from \"../../navigation/navigationService\";\nimport { Thunk_pushExerciseStatsScreen } from \"../../ducks/thunks\";\nimport { ProgramExercise_doesUse1RM } from \"../../models/programExercise\";\nimport { Weight_print } from \"../../models/weight\";\nimport { LinkButton } from \"../linkButton\";\nimport {\n  Equipment_getEquipmentNameForExerciseType,\n  Equipment_getEquipmentDataForExerciseType,\n} from \"../../models/equipment\";\nimport { IconArrowRight } from \"../icons/iconArrowRight\";\nimport { GroupHeader } from \"../groupHeader\";\nimport { Progress_getNextSupersetEntry } from \"../../models/progress\";\n\ninterface IProgramPreviewTabExerciseProps {\n  entry: IHistoryEntry;\n  programExercise: IPlannerProgramExercise;\n  entries: IHistoryEntry[];\n  program: IEvaluatedProgram;\n  programId: string;\n  day: number;\n  settings: ISettings;\n  index: number;\n  stats: IStats;\n  ui: IPlannerUi;\n  dispatch: IDispatch;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n}\n\nexport const ProgramPreviewTabExercise = memo(function ProgramPreviewTabExercise(\n  props: IProgramPreviewTabExerciseProps\n): JSX.Element {\n  const exercise = useMemo(\n    () => Exercise_get(props.entry.exercise, props.settings.exercises),\n    [props.entry.exercise, props.settings.exercises]\n  );\n  const programExercise = props.programExercise;\n  const description = useMemo(() => PlannerProgramExercise_currentDescription(programExercise), [programExercise]);\n  const currentEquipmentName = useMemo(\n    () => Equipment_getEquipmentNameForExerciseType(props.settings, exercise),\n    [props.settings, exercise]\n  );\n  const currentEquipmentNotes = useMemo(\n    () => Equipment_getEquipmentDataForExerciseType(props.settings, exercise)?.notes,\n    [props.settings, exercise]\n  );\n  const exerciseNotes = useMemo(\n    () => Exercise_getNotes(props.entry.exercise, props.settings),\n    [props.entry.exercise, props.settings]\n  );\n  const onerm = useMemo(() => Exercise_onerm(exercise, props.settings), [exercise, props.settings]);\n  const supersetEntry = useMemo(\n    () => Progress_getNextSupersetEntry(props.entries, props.entry),\n    [props.entries, props.entry]\n  );\n  const supersetExercise = useMemo(\n    () => (supersetEntry ? Exercise_get(supersetEntry.exercise, props.settings.exercises) : undefined),\n    [supersetEntry, props.settings.exercises]\n  );\n\n  return (\n    <View\n      className=\"relative px-2 py-2 mx-4 mb-3 rounded-lg bg-background-cardpurple\"\n      data-testid={StringUtils_dashcase(exercise.name)}\n      testID={StringUtils_dashcase(exercise.name)}\n    >\n      <View className=\"flex-row items-center gap-2\">\n        <ProgramPreviewTabExerciseTopBar\n          plannerDispatch={props.plannerDispatch}\n          index={props.index}\n          entry={props.entry}\n          programExercise={props.programExercise}\n          programId={props.programId}\n          day={props.day}\n          isPlayground={false}\n        />\n        <View className=\"w-scaled-10\">\n          <Pressable\n            className=\"p-1 rounded-lg bg-background-image\"\n            onPress={() => props.dispatch(Thunk_pushExerciseStatsScreen(props.entry.exercise))}\n          >\n            <ExerciseImage settings={props.settings} className=\"w-full\" exerciseType={exercise} size=\"small\" />\n          </Pressable>\n        </View>\n        <View className=\"flex-1 ml-auto\" style={{ minWidth: 64 }}>\n          <View>\n            <Pressable\n              className=\"flex-row items-center\"\n              onPress={() => props.dispatch(Thunk_pushExerciseStatsScreen(props.entry.exercise))}\n            >\n              <Text className=\"pr-1 text-sm font-bold text-left\">\n                {Exercise_nameWithEquipment(exercise, props.settings)}\n              </Text>\n              <IconArrowRight width={5} height={10} />\n            </Pressable>\n          </View>\n          <View\n            data-testid=\"exercise-equipment\"\n            testID=\"exercise-equipment\"\n            className=\"flex-row flex-wrap items-center\"\n          >\n            <Text className=\"text-xs text-text-secondary\">Equipment: </Text>\n            <LinkButton\n              name=\"exercise-equipment-picker\"\n              data-testid=\"exercise-equipment-picker\"\n              testID=\"exercise-equipment-picker\"\n              className=\"text-xs font-semibold\"\n              onClick={() => {\n                props.plannerDispatch(\n                  lb<IPlannerState>()\n                    .pi(\"ui\")\n                    .p(\"previewEquipmentModal\")\n                    .record({ plannerExercise: props.programExercise }),\n                  \"Open preview equipment modal\"\n                );\n                navigateToModal(\"equipmentModal\", { context: \"preview\", programId: props.programId });\n              }}\n            >\n              {currentEquipmentName || \"None\"}\n            </LinkButton>\n          </View>\n          {!!currentEquipmentNotes && (\n            <View>\n              <Markdown className=\"text-xs\" value={currentEquipmentNotes} />\n            </View>\n          )}\n          {programExercise && ProgramExercise_doesUse1RM(programExercise) && (\n            <View data-testid=\"exercise-rm1\" testID=\"exercise-rm1\" className=\"flex-row flex-wrap items-center\">\n              <Text className=\"text-xs text-text-secondary\">1RM: </Text>\n              <LinkButton\n                name=\"exercise-rm1-picker\"\n                data-testid=\"exercise-rm1-picker\"\n                testID=\"exercise-rm1-picker\"\n                className=\"text-xs font-semibold\"\n                onClick={() => {\n                  props.plannerDispatch(\n                    lb<IPlannerState>()\n                      .pi(\"ui\")\n                      .p(\"previewOneRepMaxModal\")\n                      .record({ plannerExercise: props.programExercise }),\n                    \"Open preview 1RM modal\"\n                  );\n                  navigateToModal(\"rm1Modal\", { context: \"preview\", programId: props.programId });\n                }}\n              >\n                {Weight_print(onerm)}\n              </LinkButton>\n            </View>\n          )}\n          {supersetExercise && (\n            <View data-testid=\"exercise-superset\" testID=\"exercise-superset\">\n              <Text className=\"text-xs text-text-secondary\">\n                Supersets with:{\" \"}\n                <Text className=\"text-xs font-bold text-text-secondary\">\n                  {Exercise_fullName(supersetExercise, props.settings)}\n                </Text>\n              </Text>\n            </View>\n          )}\n        </View>\n        <View className=\"mt-1 ml-1\">\n          <HistoryRecordSetsView sets={props.entry.sets} units={props.settings.units} isNext={true} />\n        </View>\n      </View>\n      {!!exerciseNotes && (\n        <View className=\"mt-1\">\n          {!!exerciseNotes && !!description && <GroupHeader name=\"Exercise Notes\" />}\n          <Markdown className=\"text-sm\" value={exerciseNotes} />\n        </View>\n      )}\n      {!!description && (\n        <View className=\"mt-1\">\n          {!!exerciseNotes && !!description && <GroupHeader name=\"Program Exercise Description\" />}\n          <Markdown className=\"text-sm\" value={description} />\n        </View>\n      )}\n    </View>\n  );\n});\n\ninterface IProgramPreviewTabExerciseTopBarProps {\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  index: number;\n  entry: IHistoryEntry;\n  programExercise: IPlannerProgramExercise;\n  programId: string;\n  day: number;\n  isPlayground: boolean;\n  xOffset?: number;\n}\n\nfunction ProgramPreviewTabExerciseTopBar(props: IProgramPreviewTabExerciseTopBarProps): JSX.Element {\n  return (\n    <View\n      className=\"absolute z-0 px-2 py-1 rounded-full bg-background-neutral border-border-neutral\"\n      style={{ right: -12 + (props.xOffset ?? 0), top: -18 }}\n    >\n      <View className=\"flex-row items-center gap-2\">\n        <Pressable\n          className=\"nm-program-details-playground-edit\"\n          data-testid=\"program-preview-edit-exercise\"\n          testID=\"program-preview-edit-exercise\"\n          onPress={() => {\n            props.plannerDispatch(\n              lb<IPlannerState>()\n                .pi(\"ui\")\n                .p(\"previewExerciseModal\")\n                .record({ plannerExercise: props.programExercise, day: props.day }),\n              \"Open preview exercise modal\"\n            );\n            navigateToModal(\"playgroundEditModal\", { context: \"preview\", programId: props.programId });\n          }}\n        >\n          <IconEditSquare color={Tailwind_semantic().icon.neutralsubtle} />\n        </Pressable>\n      </View>\n    </View>\n  );\n}\n","import { IHistoryRecord, IProgram, ISettings, IStats } from \"../../types\";\nimport { Program_evaluate, Program_nextHistoryRecord } from \"../../models/program\";\n\nexport interface IProgramPreviewDay {\n  day: number;\n  progress: IHistoryRecord;\n}\n\nexport interface IProgramPreviewWeek {\n  name: string;\n  description?: string;\n  days: IProgramPreviewDay[];\n}\n\nexport function ProgramPreviewWeeks_build(\n  program: IProgram,\n  settings: ISettings,\n  stats: IStats,\n  weekIndex: number\n): IProgramPreviewWeek | undefined {\n  const evaluatedProgram = Program_evaluate(program, settings);\n  const week = evaluatedProgram.weeks[weekIndex];\n  if (week == null) {\n    return undefined;\n  }\n  const daysBefore = evaluatedProgram.weeks.slice(0, weekIndex).reduce((sum, w) => sum + w.days.length, 0);\n  return {\n    name: week.name,\n    description: week.description,\n    days: week.days.map((_, i) => {\n      const day = daysBefore + i + 1;\n      return { day, progress: Program_nextHistoryRecord(program, settings, stats, day) };\n    }),\n  };\n}\n","import { JSX } from \"react\";\nimport { IHistoryRecord, ISettings } from \"../../types\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { ModalAmrap } from \"../modalAmrap\";\nimport { Modal } from \"../modal\";\nimport { SetTimerBannerContent } from \"../setTimerBanner\";\nimport { Progress_getActiveSetTimer } from \"../../models/progress\";\nimport { SetTimerEditContent } from \"../setTimerEdit\";\nimport { WeightRoundingInfoContent } from \"../weightRoundingInfo\";\nimport { BottomSheetEditTarget } from \"../bottomSheetEditTarget\";\nimport { ProgramPreviewPlaygroundExerciseEditModal } from \"./programPreviewPlaygroundExerciseEditModal\";\nimport { lb } from \"lens-shmens\";\nimport { EditProgramLenses_properlyUpdateStateVariable } from \"../../models/editProgramLenses\";\nimport {\n  IEvaluatedProgram,\n  Program_getProgramExercise,\n  Program_getDayData,\n  Program_stateValue,\n} from \"../../models/program\";\nimport { Exercise_toKey, Exercise_getIsUnilateral } from \"../../models/exercise\";\nimport { Weight_build } from \"../../models/weight\";\nimport { PlannerProgramExercise_getState } from \"../../pages/planner/models/plannerProgramExercise\";\n\ninterface IWebWorkoutModalsProps {\n  progress: IHistoryRecord;\n  dispatch: IDispatch;\n  settings: ISettings;\n  program: IEvaluatedProgram;\n  day: number;\n  onProgramChange: (newProgram: IEvaluatedProgram) => void;\n  onSettingsChange: (newSettings: ISettings) => void;\n}\n\nexport function WebWorkoutModals(props: IWebWorkoutModalsProps): JSX.Element {\n  const editModalProgramExerciseId = props.progress.ui?.editModal?.programExerciseId;\n  const editModalProgramExercise = editModalProgramExerciseId\n    ? Program_getProgramExercise(props.day, props.program, editModalProgramExerciseId)\n    : undefined;\n\n  const setTimerModal = Progress_getActiveSetTimer(props.progress);\n  // A timed AMRAP set keeps setTimer set behind the amrap modal (see Progress_proceedAfterTimedSet) — yield to\n  // the amrap modal here like SetTimerBannerContent does, so the set-timer shell doesn't show behind it.\n  const showSetTimerModal = setTimerModal != null && props.progress.amrapModal == null;\n  const closeSetTimerModal = (): void => {\n    props.dispatch({ type: \"CloseSetTimerAction\", isPlayground: true });\n  };\n\n  const setTimerEditModal = props.progress.ui?.setTimerEditModal;\n  const setTimerEditSet = setTimerEditModal\n    ? props.progress.entries[setTimerEditModal.entryIndex]?.sets[setTimerEditModal.setIndex]\n    : undefined;\n  const closeSetTimerEditModal = (): void => {\n    props.dispatch({\n      type: \"UpdateProgress\",\n      lensRecordings: [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"setTimerEditModal\").record(undefined)],\n      desc: \"close-set-timer-edit\",\n    });\n  };\n\n  const roundingModal = props.progress.ui?.roundingModal;\n  const roundingEntry = roundingModal ? props.progress.entries[roundingModal.entryIndex] : undefined;\n  const roundingSet = roundingModal ? roundingEntry?.sets[roundingModal.setIndex] : undefined;\n  const closeRoundingModal = (): void => {\n    props.dispatch({\n      type: \"UpdateProgress\",\n      lensRecordings: [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"roundingModal\").record(undefined)],\n      desc: \"close-rounding-info\",\n    });\n  };\n\n  return (\n    <>\n      {showSetTimerModal && setTimerModal && (\n        <Modal maxWidth=\"480px\" isHidden={false} isFullWidth={true} shouldShowClose={true} onClose={closeSetTimerModal}>\n          <SetTimerBannerContent\n            progress={props.progress}\n            settings={props.settings}\n            setTimerModal={setTimerModal}\n            dispatch={props.dispatch}\n            onClose={closeSetTimerModal}\n            isPlayground={true}\n            programExercise={Program_getProgramExercise(\n              props.day,\n              props.program,\n              props.progress.entries[setTimerModal.entryIndex]?.programExerciseId\n            )}\n            otherStates={props.program.states}\n          />\n        </Modal>\n      )}\n      {setTimerEditModal && setTimerEditSet && (\n        <Modal\n          maxWidth=\"480px\"\n          isHidden={false}\n          isFullWidth={true}\n          shouldShowClose={true}\n          onClose={closeSetTimerEditModal}\n        >\n          <SetTimerEditContent\n            set={setTimerEditSet}\n            entryIndex={setTimerEditModal.entryIndex}\n            setIndex={setTimerEditModal.setIndex}\n            isUnilateral={Exercise_getIsUnilateral(\n              props.progress.entries[setTimerEditModal.entryIndex].exercise,\n              props.settings\n            )}\n            dispatch={props.dispatch}\n          />\n        </Modal>\n      )}\n      {roundingModal && roundingEntry && roundingSet && (\n        <Modal maxWidth=\"480px\" isHidden={false} isFullWidth={true} shouldShowClose={true} onClose={closeRoundingModal}>\n          <WeightRoundingInfoContent\n            set={roundingSet}\n            exerciseType={roundingEntry.exercise}\n            settings={props.settings}\n          />\n        </Modal>\n      )}\n      {props.progress.amrapModal && (\n        <ModalAmrap\n          isPlayground={true}\n          progress={props.progress}\n          dispatch={props.dispatch}\n          settings={props.settings}\n          programExercise={Program_getProgramExercise(\n            props.day,\n            props.program,\n            props.progress.entries[props.progress.amrapModal?.entryIndex || 0]?.programExerciseId\n          )}\n          otherStates={props.program.states}\n        />\n      )}\n      <BottomSheetEditTarget\n        settings={props.settings}\n        progress={props.progress}\n        dispatch={props.dispatch}\n        editSetModal={props.progress.ui?.editSetModal}\n        isHidden={props.progress.ui?.editSetModal == null}\n        onClose={() => {\n          props.dispatch({\n            type: \"UpdateProgress\",\n            lensRecordings: [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"editSetModal\").record(undefined)],\n            desc: \"close-bottomsheet-target\",\n          });\n        }}\n      />\n      {editModalProgramExercise && (\n        <ProgramPreviewPlaygroundExerciseEditModal\n          onClose={() =>\n            props.dispatch({\n              type: \"UpdateProgress\",\n              lensRecordings: [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"editModal\").record(undefined)],\n              desc: \"close-playground-exercise-edit-modal\",\n            })\n          }\n          onEditStateVariable={(stateKey, newValue) => {\n            const dayData = Program_getDayData(props.program, props.day);\n            const lensRecording = EditProgramLenses_properlyUpdateStateVariable(\n              lb<IEvaluatedProgram>()\n                .p(\"weeks\")\n                .i(dayData.week - 1)\n                .p(\"days\")\n                .i(dayData.dayInWeek - 1)\n                .p(\"exercises\")\n                .find((e) => e.key === editModalProgramExerciseId),\n              {\n                [stateKey]: Program_stateValue(\n                  PlannerProgramExercise_getState(editModalProgramExercise),\n                  stateKey,\n                  newValue\n                ),\n              }\n            );\n            const newProgram = lensRecording.reduce((acc, lens) => lens.fn(acc), props.program);\n            props.onProgramChange(newProgram);\n          }}\n          onEditVariable={(variableKey, newValue) => {\n            if (!editModalProgramExercise.exerciseType) {\n              return;\n            }\n            const exerciseType = Exercise_toKey(editModalProgramExercise.exerciseType);\n            const newSettings = {\n              ...props.settings,\n              exerciseData: {\n                ...props.settings.exerciseData,\n                [exerciseType]: {\n                  ...props.settings.exerciseData[exerciseType],\n                  [variableKey]: Weight_build(newValue, props.settings.units),\n                },\n              },\n            };\n            props.onSettingsChange(newSettings);\n          }}\n          programExercise={editModalProgramExercise}\n          settings={props.settings}\n        />\n      )}\n    </>\n  );\n}\n","import { CSSProperties, JSX } from \"react\";\nimport { IFastTextProps, IFastTextStyle, StyledText_fragmentsToSpans } from \"../../utils/styledText\";\n\nfunction fragmentCss(style?: IFastTextStyle): CSSProperties | undefined {\n  if (style == null) {\n    return undefined;\n  }\n  return {\n    color: style.color as string | undefined,\n    backgroundColor: style.backgroundColor as string | undefined,\n    fontWeight: normalizeFontWeight(style.fontWeight),\n    fontSize: style.fontSize != null ? style.fontSize : undefined,\n    fontStyle: style.fontStyle,\n    textDecorationLine: style.textDecorationLine,\n  };\n}\n\n// fonts.css only declares Poppins 400/600/700; CSS matching would resolve 500 down to 400,\n// while the native renderers map 500-699 to the SemiBold face — normalize to match them.\nfunction normalizeFontWeight(fontWeight: IFastTextStyle[\"fontWeight\"]): string | undefined {\n  return fontWeight === \"500\" ? \"600\" : fontWeight;\n}\n\nfunction numberOfLinesCss(numberOfLines: number | undefined): CSSProperties | undefined {\n  if (numberOfLines == null || numberOfLines <= 0) {\n    return undefined;\n  }\n  if (numberOfLines === 1) {\n    return { display: \"block\", whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" };\n  }\n  return {\n    display: \"-webkit-box\",\n    WebkitLineClamp: numberOfLines,\n    WebkitBoxOrient: \"vertical\",\n    overflow: \"hidden\",\n  };\n}\n\nexport function FastText(props: IFastTextProps): JSX.Element {\n  const spans = StyledText_fragmentsToSpans(props.text, props.fragments);\n  // Base color/fontSize/fontWeight/fontStyle inherit via CSS; backgroundColor does not.\n  const baseStyle: CSSProperties = {\n    color: props.color as string | undefined,\n    backgroundColor: props.backgroundColor as string | undefined,\n    fontFamily: props.fontFamily,\n    fontWeight: normalizeFontWeight(props.fontWeight),\n    fontSize: props.fontSize != null ? props.fontSize : undefined,\n    fontStyle: props.fontStyle,\n    textDecorationLine: props.textDecorationLine,\n    paddingLeft: props.paddingHorizontal,\n    paddingRight: props.paddingHorizontal,\n    lineHeight: props.lineHeight != null ? `${props.lineHeight}px` : undefined,\n    // whitespace preserved + no soft-wrap; the parent scroll container provides overflow.\n    ...(props.noWrap ? { whiteSpace: \"pre\" } : props.preserveWhitespace ? { whiteSpace: \"pre-wrap\" } : undefined),\n    // textAlign only takes effect on a block-level box (an inline span shrinks to content).\n    ...(props.textAlign != null ? { display: \"block\", textAlign: props.textAlign } : undefined),\n    ...numberOfLinesCss(props.numberOfLines),\n    ...(props.style as CSSProperties),\n  };\n  const topTestId = props[\"data-testid\"] ?? props.testID;\n  const topDataCy = props[\"data-cy\"];\n  return (\n    <span style={baseStyle} aria-label={props.accessibilityLabel} data-testid={topTestId} data-cy={topDataCy}>\n      {spans.map((span, i) =>\n        span.style != null || span.testID != null ? (\n          <span key={i} style={fragmentCss(span.style)} data-testid={span.testID} data-cy={span.testID}>\n            {span.text}\n          </span>\n        ) : (\n          <span key={i}>{span.text}</span>\n        )\n      )}\n    </span>\n  );\n}\n","import { SyntaxNode, Tree } from \"@lezer/common\";\nimport { PlannerNodeName } from \"../../pages/planner/plannerExerciseStyles\";\nimport { PlannerDocument_descriptionAt } from \"../../pages/planner/models/plannerDocument\";\nimport { ITextEdit } from \"./liftoEditorBrain\";\nimport { LiftoEditorStateVars_sanitizeName } from \"./liftoEditorStateVars\";\nimport type { ITextInputModalData } from \"../../navigation/ModalStateContext\";\n\n// What the user can DO at each syntax node: the pill registry (label + category + static\n// templates) and the per-node builders that decide which pills apply and where they splice.\n// Pure syntax-tree analysis — no React, no settings, no editor handles. The brain's\n// contextAt attaches these to breadcrumb levels; surfaces color chips by category.\n\nexport type ILiftoEditorPillCategory = \"weight\" | \"timer\" | \"logic\" | \"sets\" | \"progress\" | \"neutral\";\n\n// A value a set group carries, named the way an action that reaches every set in the program\n// spelling the same value would name it.\nexport type ILiftoEditorAcrossField = \"reps\" | \"weight\" | \"rpe\" | \"timer\";\n\n// start === end is a plain insert; start < end replaces that range (token transformations\n// like \"Make rep range\" or progression type switches). Pills with an `action` are not text\n// edits — the hosting surface intercepts them (exercise picker, rename prompt) and uses\n// start/end as the target range, text as the current content.\ntype IPillDefKey = keyof typeof LiftoEditorActions_pillDefs;\n\nexport type ILiftoEditorPillKind =\n  | IPillDefKey\n  | \"makeSetVariationCurrent\"\n  | \"makeExerciseVariationCurrent\"\n  | \"makeDescriptionCurrent\"\n  | \"switchProgression\"\n  | \"changeExercise\"\n  | \"changeReuse\"\n  | \"editReuse\"\n  | \"rename\"\n  | \"editStateVars\"\n  | \"editAcrossProgram\";\n\nexport interface ILiftoEditorPill {\n  kind: ILiftoEditorPillKind;\n  label: string;\n  // Pills wear the syntax color of what they insert, so the chip previews the code (design).\n  category: ILiftoEditorPillCategory;\n  start: number;\n  end: number;\n  text: string;\n  // Additional disjoint spans applied together with the primary edit, in original-text\n  // coordinates (\"Make current\" inserts a marker here and removes one elsewhere).\n  extraEdits?: ITextEdit[];\n  // Which token a rename action edits — they sanitize the typed value differently.\n  renameKind?: \"label\" | \"stateVar\";\n  action?:\n    | \"changeExercise\"\n    | \"rename\"\n    | \"editReuse\"\n    | \"reuseSets\"\n    | \"reuseProgressScript\"\n    | \"reuseUpdateScript\"\n    | \"editStateVars\"\n    | \"editAcrossProgram\";\n  // For editStateVars: everything the sheet needs that only the text knows.\n  stateVars?: ILiftoEditorStateVarsTarget;\n  // For editAcrossProgram: which of the set's values the action is about.\n  acrossField?: ILiftoEditorAcrossField;\n  // For reuse* actions: how the picked `...Target[w:d]` lands in this pill's range —\n  // \"{target}\" gets substituted (\" / {target}\" appends a section, \"{ {target} }\" swaps a\n  // script body, bare \"{target}\" swaps just the reuse target).\n  reuseTemplate?: string;\n}\n\nexport interface ILiftoEditorStateVarEntry {\n  name: string;\n  // The value as the text spells it (\"5lb\", \"80%\", \"-2.5\"); the sheet converts it.\n  value: string;\n  userPrompted: boolean;\n}\n\n// The state-var picture the text paints, which is the one the sheet has to believe: the\n// evaluation behind it can be a few keystrokes old.\nexport interface ILiftoEditorStateVarsTarget {\n  entries: ILiftoEditorStateVarEntry[];\n  // The argument list holds something that isn't a `name: value` pair. Rewriting the list\n  // would drop it, so the sheet reads it out but refuses to save.\n  hasUnparsed: boolean;\n  // A body spelled out in the text, or the exercise a reused body names. Both properties\n  // matter: progress declares the state, and update's script can use it too.\n  progressScript?: string;\n  progressReuse?: string;\n  updateScript?: string;\n  updateReuse?: string;\n}\n\n// What the reuse picker hands back: the sets variant carries week/day when the target is\n// ambiguous (absent from the current week, present on several days, or the same exercise).\nexport interface ILiftoEditorReuseSelection {\n  fullName: string;\n  week?: number;\n  day?: number;\n}\n\ninterface IPillDef {\n  label: string;\n  category: ILiftoEditorPillCategory;\n  // Static insert text. Pills whose text depends on context omit it and pass text at\n  // build time. Settings-dependent defaults (100lb vs kg) will land here as functions.\n  template?: string;\n}\n\nexport const LiftoEditorActions_pillDefs = {\n  addWeight: { label: \"Add weight\", category: \"weight\", template: \" 100lb\" },\n  addRpe: { label: \"Add RPE\", category: \"weight\", template: \" @8\" },\n  addSetTimer: { label: \"Add set timer\", category: \"timer\", template: \" 30s|60s\" },\n  addRestTimer: { label: \"Add rest timer\", category: \"timer\", template: \" 60s\" },\n  splitTimer: { label: \"Split set/rest timer\", category: \"timer\" },\n  backToRestTimer: { label: \"Back to rest timer\", category: \"timer\" },\n  addAuto: { label: \"Add auto\", category: \"logic\", template: \" auto\" },\n  addStateVar: { label: \"Add state var\", category: \"logic\" },\n  require2Successes: { label: \"Require 2 successes\", category: \"logic\", template: \", 2, 0\" },\n  addDeload: { label: \"Add deload on failure\", category: \"logic\" },\n  makeWeight: { label: \"Make weight\", category: \"weight\" },\n  makeNumber: { label: \"Make number\", category: \"weight\" },\n  addSetGroup: { label: \"Add another set group\", category: \"sets\", template: \", 3x8\" },\n  addSetVariation: { label: \"Add set variation\", category: \"sets\", template: \" / 3x8\" },\n  addSets: { label: \"Add sets\", category: \"sets\", template: \" / 3x8\" },\n  makeRepRange: { label: \"Make rep range\", category: \"sets\" },\n  makeFixedReps: { label: \"Make fixed reps\", category: \"sets\" },\n  addWarmupSetGroup: { label: \"Add another warmup set group\", category: \"sets\", template: \", 1x5 50%\" },\n  addWarmupWeight: { label: \"Add weight\", category: \"weight\", template: \" 50%\" },\n  addWarmups: { label: \"Add warmups\", category: \"sets\" },\n  removeWarmups: { label: \"Remove warmups\", category: \"sets\" },\n  overrideSets: { label: \"Override sets\", category: \"sets\", template: \" / 3x8\" },\n  addProgress: { label: \"Add progress\", category: \"progress\", template: \" / progress: lp(5lb)\" },\n  addUpdate: { label: \"Add update\", category: \"progress\", template: \" / update: custom() {~ ~}\" },\n  addSetLabel: { label: \"Add set label\", category: \"neutral\", template: \" (myo)\" },\n  addGlobals: { label: \"Add globals\", category: \"neutral\", template: \" / 100lb\" },\n  addUsedNone: { label: \"Add used: none\", category: \"neutral\", template: \" / used: none\" },\n  addLabel: { label: \"Add label\", category: \"neutral\", template: \"label: \" },\n  addIdTags: { label: \"Add id: tags\", category: \"neutral\", template: \" / id: tags(1)\" },\n  reuse: { label: \"Reuse…\", category: \"neutral\", template: \" / ...Squat\" },\n  reuseScript: { label: \"Reuse script from…\", category: \"neutral\", template: \" { ...Squat }\" },\n  fromWeekDay: { label: \"From specific week/day…\", category: \"neutral\", template: \"[1:1]\" },\n  repeat: { label: \"Repeat…\", category: \"neutral\", template: \"[1-4]\" },\n  forcedOrder: { label: \"Add forced order…\", category: \"neutral\", template: \"[1]\" },\n  enableSuperset: { label: \"Enable superset\", category: \"neutral\", template: \" / superset: A\" },\n} satisfies Record<string, IPillDef>;\n\ntype IPillDefsWithKinds = { [K in IPillDefKey]: (typeof LiftoEditorActions_pillDefs)[K] & { kind: K } };\n\nfunction stampKinds(table: typeof LiftoEditorActions_pillDefs): IPillDefsWithKinds {\n  const stamped: Partial<Record<IPillDefKey, IPillDef & { kind: IPillDefKey }>> = {};\n  for (const key of Object.keys(table) as IPillDefKey[]) {\n    stamped[key] = { ...table[key], kind: key };\n  }\n  return stamped as IPillDefsWithKinds;\n}\n\nconst defs = stampKinds(LiftoEditorActions_pillDefs);\n\nfunction insertPill(def: IPillDef & { kind: IPillDefKey }, at: number, text?: string): ILiftoEditorPill {\n  return {\n    kind: def.kind,\n    label: def.label,\n    category: def.category,\n    start: at,\n    end: at,\n    text: text ?? def.template ?? \"\",\n  };\n}\n\nfunction replacePill(def: IPillDef & { kind: IPillDefKey }, node: SyntaxNode, text: string): ILiftoEditorPill {\n  return { kind: def.kind, label: def.label, category: def.category, start: node.from, end: node.to, text };\n}\n\nfunction renamePill(\n  current: string,\n  start: number,\n  end: number,\n  kind: \"label\" | \"stateVar\" = \"label\"\n): ILiftoEditorPill {\n  return {\n    kind: \"rename\",\n    label: \"Rename…\",\n    category: \"neutral\",\n    start,\n    end,\n    text: current,\n    action: \"rename\",\n    renameKind: kind,\n  };\n}\n\nfunction nodeText(text: string, node: SyntaxNode): string {\n  return text.slice(node.from, node.to);\n}\n\nfunction exercisePropertyNames(text: string, exercise: SyntaxNode): string[] {\n  const names: string[] = [];\n  for (const section of exercise.getChildren(PlannerNodeName.ExerciseSection)) {\n    const property = section.getChild(PlannerNodeName.ExerciseProperty);\n    const name = property?.getChild(PlannerNodeName.ExercisePropertyName);\n    if (name != null) {\n      names.push(nodeText(text, name));\n    }\n  }\n  return names;\n}\n\nexport function LiftoEditorActions_endOfExerciseLine(text: string, exercise: SyntaxNode): number {\n  let end = exercise.to;\n  while (end > exercise.from && (text[end - 1] === \"\\n\" || text[end - 1] === \"\\r\")) {\n    end -= 1;\n  }\n  return end;\n}\n\nfunction trimmedEnd(text: string, node: SyntaxNode): number {\n  let end = node.to;\n  while (end > node.from && text[end - 1] === \" \") {\n    end -= 1;\n  }\n  return end;\n}\n\nexport function LiftoEditorActions_enclosingExercise(node: SyntaxNode): SyntaxNode | null {\n  let cur: SyntaxNode | null = node;\n  while (cur != null && cur.name !== PlannerNodeName.ExerciseExpression) {\n    cur = cur.parent;\n  }\n  return cur;\n}\n\n// The exercise's set variations: sets sections with at least one real set group. Globals\n// sections parse as ExerciseSets too but can't be a variation.\nexport function LiftoEditorActions_setVariationSections(exercise: SyntaxNode): SyntaxNode[] {\n  return exercise\n    .getChildren(PlannerNodeName.ExerciseSection)\n    .map((section) => section.getChild(PlannerNodeName.ExerciseSets))\n    .filter(\n      (sets): sets is SyntaxNode =>\n        sets != null &&\n        sets.getChildren(PlannerNodeName.ExerciseSet).some((set) => set.getChild(PlannerNodeName.SetPart) != null)\n    );\n}\n\n// Same `!` convention as set and exercise variations, but over runs of `//` lines rather than\n// syntax siblings — so it can't go through makeCurrentPill, which keys off a node's children.\n// Which runs exist, which is current and where a marker sits are all the document's answers,\n// not this layer's: see PlannerDocument_descriptions.\nfunction descriptionPills(text: string, node: SyntaxNode, tree?: Tree): ILiftoEditorPill[] {\n  const found = PlannerDocument_descriptionAt(text, node.from, tree);\n  const target = found != null ? found.siblings[found.index] : undefined;\n  if (found == null || target == null || found.siblings.length < 2 || target.isCurrent) {\n    return [];\n  }\n  const marked = found.siblings.find((d) => d.marker != null);\n  const markerRemoval: ITextEdit | undefined =\n    marked?.marker != null ? { start: marked.marker.from, end: marked.marker.to, text: \"\" } : undefined;\n  // The first run is current whenever nothing is marked, so making it current is only taking the\n  // other run's marker away — the text never carries a redundant `!` on the first one.\n  if (found.index === 0) {\n    return markerRemoval != null\n      ? [{ kind: \"makeDescriptionCurrent\", label: \"Make current\", category: \"neutral\", ...markerRemoval }]\n      : [];\n  }\n  return [\n    {\n      kind: \"makeDescriptionCurrent\",\n      label: \"Make current\",\n      category: \"neutral\",\n      start: target.markerAt,\n      end: target.markerAt,\n      text: \"! \",\n      extraEdits: markerRemoval != null ? [markerRemoval] : undefined,\n    },\n  ];\n}\n\n// Both variation kinds (set variations, exercise variations) share the `!` convention:\n// the marked sibling is current, the first one when nothing is marked. Making the first\n// current just unmarks the marked one; anything else gets marked (plus the old marker\n// removed), so the text never carries a redundant `!` on the first sibling.\nfunction makeCurrentPill(\n  text: string,\n  target: SyntaxNode,\n  siblings: SyntaxNode[],\n  category: ILiftoEditorPillCategory,\n  kind: \"makeSetVariationCurrent\" | \"makeExerciseVariationCurrent\"\n): ILiftoEditorPill | undefined {\n  const index = siblings.findIndex((s) => s.from === target.from);\n  if (siblings.length < 2 || index === -1) {\n    return undefined;\n  }\n  const markedIndex = siblings.findIndex((s) => s.getChild(PlannerNodeName.CurrentVariation) != null);\n  if (index === (markedIndex === -1 ? 0 : markedIndex)) {\n    return undefined;\n  }\n  const marker = markedIndex === -1 ? null : siblings[markedIndex].getChild(PlannerNodeName.CurrentVariation);\n  let markerRemoval: ITextEdit | undefined;\n  if (marker != null) {\n    let end = marker.to;\n    while (end < text.length && text[end] === \" \") {\n      end += 1;\n    }\n    markerRemoval = { start: marker.from, end, text: \"\" };\n  }\n  if (index === 0 && markerRemoval != null) {\n    return { kind, label: \"Make current\", category, ...markerRemoval };\n  }\n  return {\n    kind,\n    label: \"Make current\",\n    category,\n    start: target.from,\n    end: target.from,\n    text: \"! \",\n    extraEdits: markerRemoval != null ? [markerRemoval] : undefined,\n  };\n}\n\nfunction setGroupPills(text: string, set: SyntaxNode): ILiftoEditorPill[] {\n  const insertAt = trimmedEnd(text, set);\n  const pills: ILiftoEditorPill[] = [];\n  const hasWeight =\n    set.getChild(PlannerNodeName.WeightWithPlus) != null ||\n    set.getChild(PlannerNodeName.PercentageWithPlus) != null ||\n    set.getChild(PlannerNodeName.AskWeight) != null;\n  if (!hasWeight) {\n    pills.push(insertPill(defs.addWeight, insertAt));\n  }\n  if (set.getChild(PlannerNodeName.Rpe) == null) {\n    pills.push(insertPill(defs.addRpe, insertAt));\n  }\n  // A set timer subsumes the rest timer (`30s|60s`), so offer either only while the set\n  // has no timer of any kind — mixing `60s` with `30s|60s` is ambiguous.\n  const hasAnyTimer = set.getChild(PlannerNodeName.SetTimer) != null || set.getChild(PlannerNodeName.Timer) != null;\n  if (!hasAnyTimer) {\n    pills.push(insertPill(defs.addSetTimer, insertAt));\n    pills.push(insertPill(defs.addRestTimer, insertAt));\n  }\n  const isSetGroup = set.getChild(PlannerNodeName.SetPart) != null;\n  if (isSetGroup) {\n    pills.push(insertPill(defs.addSetGroup, insertAt));\n  }\n  if (set.getChild(PlannerNodeName.Auto) == null) {\n    pills.push(insertPill(defs.addAuto, insertAt));\n  }\n  if (isSetGroup && set.getChild(PlannerNodeName.SetLabel) == null) {\n    pills.push(insertPill(defs.addSetLabel, insertAt));\n  }\n  return pills;\n}\n\nfunction setsPills(text: string, sets: SyntaxNode): ILiftoEditorPill[] {\n  const hasSetGroup = sets\n    .getChildren(PlannerNodeName.ExerciseSet)\n    .some((set) => set.getChild(PlannerNodeName.SetPart) != null);\n  if (!hasSetGroup) {\n    return [];\n  }\n  const at = trimmedEnd(text, sets);\n  const pills = [insertPill(defs.addSetGroup, at), insertPill(defs.addSetVariation, at)];\n  const exercise = LiftoEditorActions_enclosingExercise(sets);\n  if (exercise != null) {\n    const current = makeCurrentPill(\n      text,\n      sets,\n      LiftoEditorActions_setVariationSections(exercise),\n      \"sets\",\n      \"makeSetVariationCurrent\"\n    );\n    if (current != null) {\n      pills.unshift(current);\n    }\n  }\n  return pills;\n}\n\nfunction exerciseVariationPills(text: string, variation: SyntaxNode): ILiftoEditorPill[] {\n  const pills: ILiftoEditorPill[] = [];\n  const siblings = variation.parent?.getChildren(PlannerNodeName.ExerciseVariation) ?? [];\n  const current = makeCurrentPill(text, variation, siblings, \"neutral\", \"makeExerciseVariationCurrent\");\n  if (current != null) {\n    pills.push(current);\n  }\n  const nameNode = variation.getChild(PlannerNodeName.ExerciseName);\n  if (nameNode != null) {\n    pills.push({\n      kind: \"changeExercise\",\n      label: \"Change exercise…\",\n      category: \"neutral\",\n      start: nameNode.from,\n      end: nameNode.to,\n      text: nodeText(text, nameNode),\n      action: \"changeExercise\",\n    });\n  }\n  return pills;\n}\n\nfunction setPartPills(text: string, setPart: SyntaxNode): ILiftoEditorPill[] {\n  const repRange = setPart.getChild(PlannerNodeName.RepRange);\n  if (repRange != null) {\n    const maxRep = repRange.getChildren(PlannerNodeName.Rep)[1];\n    return maxRep != null ? [replacePill(defs.makeFixedReps, repRange, nodeText(text, maxRep))] : [];\n  }\n  const reps = setPart.getChildren(PlannerNodeName.Rep);\n  const repNode = reps[reps.length - 1];\n  if (reps.length < 2 || repNode == null) {\n    return [];\n  }\n  const rep = parseInt(nodeText(text, repNode), 10);\n  if (isNaN(rep)) {\n    return [];\n  }\n  return [replacePill(defs.makeRepRange, repNode, `${rep}-${rep + 4}`)];\n}\n\nfunction setLabelPills(text: string, label: SyntaxNode): ILiftoEditorPill[] {\n  // Target range is the content between the parens.\n  return [renamePill(text.slice(label.from + 1, label.to - 1), label.from + 1, label.to - 1)];\n}\n\n// One Repeat node serves both bracket meanings: RepRange entries repeat the exercise\n// across weeks, bare Rep entries force the exercise order. Offer whichever is missing,\n// spliced inside the existing brackets (\"[1-4]\" → \"[1-4,1]\", \"[2]\" → \"[1-4,2]\").\nfunction repeatPills(text: string, repeat: SyntaxNode): ILiftoEditorPill[] {\n  const hasRepeat = repeat.getChildren(PlannerNodeName.RepRange).length > 0;\n  const hasOrder = repeat.getChildren(PlannerNodeName.Rep).length > 0;\n  const pills: ILiftoEditorPill[] = [];\n  if (!hasOrder) {\n    pills.push(insertPill(defs.forcedOrder, repeat.to - 1, \",1\"));\n  }\n  if (!hasRepeat) {\n    pills.push(insertPill(defs.repeat, repeat.from + 1, \"1-4,\"));\n  }\n  return pills;\n}\n\nfunction supersetPills(text: string, superset: SyntaxNode): ILiftoEditorPill[] {\n  const name = superset.getChild(PlannerNodeName.ExerciseName);\n  if (name == null) {\n    return [];\n  }\n  const end = trimmedEnd(text, name);\n  return [renamePill(text.slice(name.from, end), name.from, end)];\n}\n\nfunction restTimerPills(text: string, timer: SyntaxNode): ILiftoEditorPill[] {\n  return [replacePill(defs.splitTimer, timer, `30s|${nodeText(text, timer)}`)];\n}\n\nfunction setTimerPills(text: string, timer: SyntaxNode): ILiftoEditorPill[] {\n  const rest = nodeText(text, timer).split(\"|\")[1];\n  return [replacePill(defs.backToRestTimer, timer, rest != null && rest !== \"?\" ? rest : \"60s\")];\n}\n\nfunction warmupSetsPills(text: string, warmupSets: SyntaxNode): ILiftoEditorPill[] {\n  return [\n    insertPill(defs.addWarmupSetGroup, trimmedEnd(text, warmupSets)),\n    {\n      kind: \"removeWarmups\",\n      label: defs.removeWarmups.label,\n      category: defs.removeWarmups.category,\n      start: warmupSets.from,\n      end: trimmedEnd(text, warmupSets),\n      text: \"none\",\n    },\n  ];\n}\n\n// A warmup group without a weight evaluates to a warmup set with no load at all, so this is\n// the one thing a half-written group always needs. It lands as a percentage — the usual way\n// to write a warmup — and the keypad's unit switch turns it into an absolute load.\nfunction warmupSetGroupPills(text: string, warmupSet: SyntaxNode): ILiftoEditorPill[] {\n  const hasWeight =\n    warmupSet.getChild(PlannerNodeName.Weight) != null || warmupSet.getChild(PlannerNodeName.Percentage) != null;\n  if (hasWeight) {\n    return [];\n  }\n  return [insertPill(defs.addWarmupWeight, trimmedEnd(text, warmupSet))];\n}\n\n// Warmup groups deliberately aren't breadcrumb levels, so their actions ride on the \"Warmup\n// sets\" rail — which makes it the one rail whose contents depend on where the caret is.\nexport function LiftoEditorActions_warmupSetsPillsAt(\n  text: string,\n  warmupSets: SyntaxNode,\n  index: number\n): ILiftoEditorPill[] {\n  const group = warmupSets\n    .getChildren(PlannerNodeName.WarmupExerciseSet)\n    .find((set) => index >= set.from && index <= set.to);\n  return [...(group != null ? warmupSetGroupPills(text, group) : []), ...warmupSetsPills(text, warmupSets)];\n}\n\nconst progressionDefaults: Record<string, string> = {\n  lp: \"lp(5lb)\",\n  dp: \"dp(5lb, 8, 12)\",\n  sum: \"sum(25, 5lb)\",\n  custom: \"custom() {~ ~}\",\n  none: \"none\",\n};\n\n// lp(increment, successes, successCounter, decrement, failures, failureCounter).\nfunction lpPills(text: string, fn: SyntaxNode): ILiftoEditorPill[] {\n  const args = fn.getChildren(PlannerNodeName.FunctionArgument);\n  const last = args[args.length - 1];\n  if (last == null) {\n    return [];\n  }\n  const pills: ILiftoEditorPill[] = [];\n  if (args.length === 1) {\n    pills.push(insertPill(defs.require2Successes, last.to));\n  }\n  if (args.length < 4) {\n    const padding = [\", 1\", \", 0\"].slice(args.length - 1).join(\"\");\n    pills.push(insertPill(defs.addDeload, last.to, `${padding}, 5lb, 3, 0`));\n  }\n  return pills;\n}\n\nfunction enclosingPropertyName(text: string, node: SyntaxNode): string | undefined {\n  for (let cur: SyntaxNode | null = node.parent; cur != null; cur = cur.parent) {\n    if (cur.name === PlannerNodeName.ExerciseProperty) {\n      const nameNode = cur.getChild(PlannerNodeName.ExercisePropertyName);\n      return nameNode != null ? nodeText(text, nameNode) : undefined;\n    }\n  }\n  return undefined;\n}\n\n// The grammar skips spaces and tabs, so `custom (x: 1)` is the same call as `custom(x: 1)`.\nfunction skipSpace(text: string, index: number): number {\n  let i = index;\n  while (i < text.length && (text[i] === \" \" || text[i] === \"\\t\")) {\n    i += 1;\n  }\n  return i;\n}\n\n// The argument list's span, parens included — an empty list still has to come back as\n// `custom()`, so they're part of the range rather than something the sheet re-emits. The\n// parens aren't nodes of their own, so they're found between the surrounding ones: after\n// the name, and after the last argument but before the body.\nfunction argListRange(text: string, fn: SyntaxNode, nameNode: SyntaxNode): { start: number; end: number } | undefined {\n  const open = skipSpace(text, nameNode.to);\n  if (text[open] !== \"(\") {\n    return { start: nameNode.to, end: nameNode.to };\n  }\n  const args = fn.getChildren(PlannerNodeName.FunctionArgument);\n  const body = fn.getChild(PlannerNodeName.Liftoscript) ?? fn.getChild(PlannerNodeName.ReuseLiftoscript);\n  const limit = body != null ? body.from : fn.to;\n  const close = text.indexOf(\")\", args.length > 0 ? args[args.length - 1].to : open + 1);\n  // An unclosed list — the match, if any, belongs to something else entirely.\n  return close === -1 || close >= limit ? undefined : { start: open, end: close + 1 };\n}\n\nfunction stateVarEntries(\n  text: string,\n  fn: SyntaxNode,\n  range: { start: number; end: number }\n): { entries: ILiftoEditorStateVarEntry[]; hasUnparsed: boolean } {\n  const entries: ILiftoEditorStateVarEntry[] = [];\n  const args = fn.getChildren(PlannerNodeName.FunctionArgument);\n  let hasUnparsed = false;\n  for (const arg of args) {\n    const keyValue = arg.getChild(PlannerNodeName.KeyValue);\n    const keyword = keyValue?.getChild(PlannerNodeName.Keyword);\n    const value =\n      keyValue?.getChild(PlannerNodeName.Number) ??\n      keyValue?.getChild(PlannerNodeName.Weight) ??\n      keyValue?.getChild(PlannerNodeName.Percentage);\n    // `broken` and `bad: nope` both parse as a KeyValue with no value node.\n    if (keyValue == null || keyword == null || value == null) {\n      hasUnparsed = true;\n      continue;\n    }\n    entries.push({\n      name: nodeText(text, keyword),\n      value: nodeText(text, value),\n      userPrompted: keyValue.getChild(PlannerNodeName.Plus) != null,\n    });\n  }\n  // Anything between the parens that no argument covers would be dropped by a rewrite —\n  // `custom(x: 1: 2)` parses one argument and leaves `: 2` stranded.\n  if (range.end > range.start) {\n    let stray = \"\";\n    let at = range.start + 1;\n    for (const arg of args) {\n      stray += text.slice(at, arg.from);\n      at = arg.to;\n    }\n    stray += text.slice(at, range.end - 1);\n    hasUnparsed = hasUnparsed || stray.replace(/,/g, \"\").trim() !== \"\";\n  }\n  return { entries, hasUnparsed };\n}\n\n// A property's body as the text spells it: the script itself, or the exercise a reused body\n// names.\nfunction propertyScript(\n  text: string,\n  exercise: SyntaxNode | null,\n  property: string\n): { script?: string; reuse?: string } {\n  const fn = exercise != null ? propertyFunction(text, exercise, property) : undefined;\n  const own = fn?.getChild(PlannerNodeName.Liftoscript);\n  if (own != null) {\n    return { script: nodeText(text, own) };\n  }\n  const reuse = fn\n    ?.getChild(PlannerNodeName.ReuseLiftoscript)\n    ?.getChild(PlannerNodeName.ReuseSection)\n    ?.getChild(PlannerNodeName.ExerciseName);\n  return { reuse: reuse != null ? nodeText(text, reuse).trim() : undefined };\n}\n\nfunction propertyFunction(text: string, exercise: SyntaxNode, property: string): SyntaxNode | undefined {\n  for (const section of exercise.getChildren(PlannerNodeName.ExerciseSection)) {\n    const node = section.getChild(PlannerNodeName.ExerciseProperty);\n    const nameNode = node?.getChild(PlannerNodeName.ExercisePropertyName);\n    if (node != null && nameNode != null && nodeText(text, nameNode) === property) {\n      return node.getChild(PlannerNodeName.FunctionExpression) ?? undefined;\n    }\n  }\n  return undefined;\n}\n\nexport function LiftoEditorActions_stateVarsPill(text: string, fn: SyntaxNode): ILiftoEditorPill | undefined {\n  const nameNode = fn.getChild(PlannerNodeName.FunctionName);\n  if (nameNode == null || nodeText(text, nameNode) !== \"custom\" || enclosingPropertyName(text, fn) === \"update\") {\n    return undefined;\n  }\n  const range = argListRange(text, fn, nameNode);\n  if (range == null) {\n    return undefined;\n  }\n  const exercise = LiftoEditorActions_enclosingExercise(fn);\n  const progress = propertyScript(text, exercise, \"progress\");\n  const update = propertyScript(text, exercise, \"update\");\n  return {\n    kind: \"editStateVars\",\n    label: \"State vars…\",\n    category: \"logic\",\n    action: \"editStateVars\",\n    start: range.start,\n    end: range.end,\n    text: range.end > range.start ? text.slice(range.start + 1, range.end - 1) : \"\",\n    stateVars: {\n      ...stateVarEntries(text, fn, range),\n      progressScript: progress.script,\n      progressReuse: progress.reuse,\n      updateScript: update.script,\n      updateReuse: update.reuse,\n    },\n  };\n}\n\n// State vars live in custom()'s argument list; lp()/sum()/dp() have fixed signatures.\n// Only progress custom() declares them — update custom() reads the same exercise's state,\n// so offering \"Add state var\" there would splice an invalid declaration.\nfunction customFnPills(text: string, fn: SyntaxNode): ILiftoEditorPill[] {\n  const nameNode = fn.getChild(PlannerNodeName.FunctionName);\n  if (nameNode == null) {\n    return [];\n  }\n  const pills: ILiftoEditorPill[] = [];\n  const args = fn.getChildren(PlannerNodeName.FunctionArgument);\n  const stateVars = LiftoEditorActions_stateVarsPill(text, fn);\n  if (stateVars != null) {\n    pills.push(stateVars);\n  }\n  if (enclosingPropertyName(text, fn) !== \"update\") {\n    if (args.length > 0) {\n      pills.push(insertPill(defs.addStateVar, args[args.length - 1].to, \", myvar: 0\"));\n    } else if (text[nameNode.to] === \"(\") {\n      pills.push(insertPill(defs.addStateVar, nameNode.to + 1, \"myvar: 0\"));\n    } else {\n      pills.push(insertPill(defs.addStateVar, nameNode.to, \"(myvar: 0)\"));\n    }\n  }\n  const body = fn.getChild(PlannerNodeName.Liftoscript) ?? fn.getChild(PlannerNodeName.ReuseLiftoscript);\n  const action = enclosingPropertyName(text, fn) === \"update\" ? \"reuseUpdateScript\" : \"reuseProgressScript\";\n  if (body == null) {\n    pills.push({ ...insertPill(defs.reuseScript, trimmedEnd(text, fn)), action, reuseTemplate: \" { {target} }\" });\n  } else {\n    // With a body the pill swaps it for the reuse form (`{~ ... ~}` → `{ ...Name }`).\n    const bodyEnd = trimmedEnd(text, body);\n    pills.push({\n      kind: \"reuseScript\",\n      label: defs.reuseScript.label,\n      category: defs.reuseScript.category,\n      start: body.from,\n      end: bodyEnd,\n      text: text.slice(body.from, bodyEnd),\n      action,\n      reuseTemplate: \"{ {target} }\",\n    });\n  }\n  return pills;\n}\n\n// Both surfaces prompt for a rename the same way — and a state variable is neither a label\n// nor capped at a label's 8 characters.\nexport function LiftoEditorActions_renamePrompt(current: string, kind: \"label\" | \"stateVar\"): ITextInputModalData {\n  const isStateVar = kind === \"stateVar\";\n  return {\n    title: isStateVar ? \"Rename state variable\" : \"Rename label\",\n    inputLabel: isStateVar ? \"Name\" : \"Label\",\n    placeholder: current,\n    submitLabel: \"Rename\",\n    dataCyPrefix: isStateVar ? \"rename-state-var\" : \"rename-label\",\n    maxLength: isStateVar ? undefined : 8,\n  };\n}\n\nexport function LiftoEditorActions_reuseTargetText(selection: ILiftoEditorReuseSelection): string {\n  const weekDay =\n    selection.week != null\n      ? `[${selection.week}:${selection.day ?? 1}]`\n      : selection.day != null\n        ? `[${selection.day}]`\n        : \"\";\n  return `...${selection.fullName}${weekDay}`;\n}\n\nfunction fnPills(text: string, fn: SyntaxNode): ILiftoEditorPill[] {\n  const nameNode = fn.getChild(PlannerNodeName.FunctionName);\n  const name = nameNode != null ? nodeText(text, nameNode) : \"\";\n  if (name === \"custom\") {\n    return customFnPills(text, fn);\n  }\n  if (name === \"lp\") {\n    return lpPills(text, fn);\n  }\n  return [];\n}\n\nfunction progressSwitchPills(value: SyntaxNode, current: string): ILiftoEditorPill[] {\n  return Object.keys(progressionDefaults)\n    .filter((name) => name !== current)\n    .map((name) => ({\n      kind: \"switchProgression\" as const,\n      label: `Switch to ${name}`,\n      category: \"progress\" as const,\n      start: value.from,\n      end: value.to,\n      text: progressionDefaults[name],\n    }));\n}\n\nfunction propertyPills(text: string, property: SyntaxNode): ILiftoEditorPill[] {\n  const nameNode = property.getChild(PlannerNodeName.ExercisePropertyName);\n  const name = nameNode != null ? nodeText(text, nameNode) : \"\";\n  if (name === \"warmup\") {\n    const warmupSets = property.getChild(PlannerNodeName.WarmupExerciseSets);\n    if (warmupSets != null) {\n      return warmupSetsPills(text, warmupSets);\n    }\n    const none = property.getChild(PlannerNodeName.None);\n    return none != null ? [replacePill(defs.addWarmups, none, \"2x5 45%, 1x3 60%\")] : [];\n  }\n  if (name === \"progress\") {\n    const fn = property.getChild(PlannerNodeName.FunctionExpression);\n    if (fn != null) {\n      const fnNameNode = fn.getChild(PlannerNodeName.FunctionName);\n      const fnName = fnNameNode != null ? nodeText(text, fnNameNode) : \"\";\n      return [...fnPills(text, fn), ...progressSwitchPills(fn, fnName)];\n    }\n    const none = property.getChild(PlannerNodeName.None);\n    return none != null ? progressSwitchPills(none, \"none\") : [];\n  }\n  if (name === \"update\") {\n    const fn = property.getChild(PlannerNodeName.FunctionExpression);\n    return fn != null ? fnPills(text, fn) : [];\n  }\n  return [];\n}\n\nfunction reuseSectionPills(text: string, reuse: SyntaxNode): ILiftoEditorPill[] {\n  const pills: ILiftoEditorPill[] = [];\n  // The same ReuseSection node also lives inside `custom() { ...X }` — there the picker\n  // must offer that property's scripts, and week/day makes no sense (the grammar allows\n  // WeekDay only on the sets-reuse form).\n  const isScriptReuse = reuse.parent?.name === PlannerNodeName.ReuseLiftoscript;\n  const weekDay = reuse.parent?.getChild(PlannerNodeName.WeekDay);\n  const changeEnd = weekDay != null ? weekDay.to : trimmedEnd(text, reuse);\n  pills.push({\n    kind: \"changeReuse\",\n    label: \"Change…\",\n    category: \"neutral\",\n    start: reuse.from,\n    end: changeEnd,\n    // Fallback when no picker host is wired: replacing with itself is a no-op.\n    text: text.slice(reuse.from, changeEnd),\n    action: isScriptReuse\n      ? enclosingPropertyName(text, reuse) === \"update\"\n        ? \"reuseUpdateScript\"\n        : \"reuseProgressScript\"\n      : \"reuseSets\",\n    reuseTemplate: \"{target}\",\n  });\n  const targetName = reuse.getChild(PlannerNodeName.ExerciseName);\n  if (targetName != null) {\n    pills.push({\n      kind: \"editReuse\",\n      label: \"Edit reused exercise…\",\n      category: \"neutral\",\n      start: targetName.from,\n      end: targetName.to,\n      text: nodeText(text, targetName).trim(),\n      action: \"editReuse\",\n    });\n  }\n  if (!isScriptReuse && weekDay == null) {\n    pills.push(insertPill(defs.fromWeekDay, trimmedEnd(text, reuse)));\n  }\n  const exercise = LiftoEditorActions_enclosingExercise(reuse);\n  if (!isScriptReuse && exercise != null) {\n    const hasOwnSets = exercise\n      .getChildren(PlannerNodeName.ExerciseSection)\n      .some((section) => section.getChild(PlannerNodeName.ExerciseSets) != null);\n    if (!hasOwnSets) {\n      pills.push(insertPill(defs.overrideSets, LiftoEditorActions_endOfExerciseLine(text, exercise)));\n    }\n  }\n  return pills;\n}\n\nfunction exercisePills(text: string, exercise: SyntaxNode): ILiftoEditorPill[] {\n  const pills: ILiftoEditorPill[] = [];\n  const properties = exercisePropertyNames(text, exercise);\n  const lineEnd = LiftoEditorActions_endOfExerciseLine(text, exercise);\n  const sections = exercise.getChildren(PlannerNodeName.ExerciseSection);\n  const setsSections = sections\n    .map((section) => section.getChild(PlannerNodeName.ExerciseSets))\n    .filter((sets): sets is SyntaxNode => sets != null);\n  const setNodes = setsSections.flatMap((sets) => sets.getChildren(PlannerNodeName.ExerciseSet));\n  const hasSetGroups = setNodes.some((set) => set.getChild(PlannerNodeName.SetPart) != null);\n  const hasGlobals = setNodes.some((set) => set.getChild(PlannerNodeName.SetPart) == null);\n  const hasReuse = sections.some((section) => section.getChild(PlannerNodeName.ReuseSectionWithWeekDay) != null);\n  const hasSuperset = sections.some((section) => section.getChild(PlannerNodeName.Superset) != null);\n  const variations = exercise.getChild(PlannerNodeName.ExerciseVariations);\n  const nameNode = variations?.getChild(PlannerNodeName.ExerciseVariation)?.getChild(PlannerNodeName.ExerciseName);\n  if (nameNode != null) {\n    pills.push({\n      kind: \"changeExercise\",\n      label: \"Change exercise…\",\n      category: \"neutral\",\n      start: nameNode.from,\n      end: nameNode.to,\n      text: nodeText(text, nameNode),\n      action: \"changeExercise\",\n    });\n  }\n  if (!properties.includes(\"warmup\")) {\n    pills.push(insertPill(defs.addWarmups, lineEnd, \" / warmup: 2x5 45%, 1x3 60%\"));\n  }\n  if (!hasSetGroups) {\n    pills.push(insertPill(defs.addSets, lineEnd));\n  }\n  if (hasSetGroups && !hasGlobals) {\n    pills.push(insertPill(defs.addGlobals, lineEnd));\n  }\n  const setGroupSections = LiftoEditorActions_setVariationSections(exercise);\n  const lastSetGroupSection = setGroupSections[setGroupSections.length - 1];\n  if (lastSetGroupSection != null) {\n    pills.push(insertPill(defs.addSetVariation, trimmedEnd(text, lastSetGroupSection)));\n  }\n  if (!properties.includes(\"used\")) {\n    pills.push(insertPill(defs.addUsedNone, lineEnd));\n  }\n  if (!properties.includes(\"progress\")) {\n    pills.push(insertPill(defs.addProgress, lineEnd));\n  }\n  if (!properties.includes(\"update\")) {\n    pills.push(insertPill(defs.addUpdate, lineEnd));\n  }\n  if (!hasSuperset) {\n    pills.push(insertPill(defs.enableSuperset, lineEnd));\n  }\n  if (!hasReuse) {\n    pills.push({ ...insertPill(defs.reuse, lineEnd), action: \"reuseSets\", reuseTemplate: \" / {target}\" });\n  }\n  // A label is just a `word:` prefix inside the exercise name token.\n  if (nameNode != null && !nodeText(text, nameNode).includes(\":\")) {\n    pills.push(insertPill(defs.addLabel, nameNode.from));\n  }\n  if (exercise.getChild(PlannerNodeName.Repeat) == null && variations != null) {\n    pills.push(insertPill(defs.repeat, variations.to));\n    pills.push(insertPill(defs.forcedOrder, variations.to));\n  }\n  if (!properties.includes(\"id\")) {\n    pills.push(insertPill(defs.addIdTags, lineEnd));\n  }\n  return pills;\n}\n\nfunction keyValuePills(text: string, node: SyntaxNode): ILiftoEditorPill[] {\n  const pills: ILiftoEditorPill[] = [];\n  // Focusing one state var is the likeliest moment to want the whole list — the sheet is\n  // where the reused ones and their defaults are visible at all.\n  let fn: SyntaxNode | null = node.parent;\n  while (fn != null && fn.name !== PlannerNodeName.FunctionExpression) {\n    fn = fn.parent;\n  }\n  const stateVars = fn != null ? LiftoEditorActions_stateVarsPill(text, fn) : undefined;\n  if (stateVars != null) {\n    pills.push(stateVars);\n  }\n  const keyword = node.getChild(PlannerNodeName.Keyword);\n  if (keyword != null) {\n    pills.push(renamePill(nodeText(text, keyword), keyword.from, keyword.to, \"stateVar\"));\n  }\n  const numberNode = node.getChild(PlannerNodeName.Number);\n  if (numberNode != null) {\n    pills.push(replacePill(defs.makeWeight, numberNode, `${nodeText(text, numberNode)}lb`));\n  }\n  const weightNode = node.getChild(PlannerNodeName.Weight);\n  if (weightNode != null) {\n    const numericPart = nodeText(text, weightNode).match(/^[+-]?\\d+(?:\\.\\d+)?/);\n    if (numericPart != null) {\n      pills.push(replacePill(defs.makeNumber, weightNode, numericPart[0]));\n    }\n  }\n  return pills;\n}\n\n// The `label:` prefix of `label: Name` (one ExerciseName token in the grammar); undefined\n// when the name carries no label.\nexport function LiftoEditorActions_labelRenamePill(text: string, nameNode: SyntaxNode): ILiftoEditorPill | undefined {\n  const nameText = nodeText(text, nameNode);\n  const colonIdx = nameText.indexOf(\":\");\n  if (colonIdx === -1) {\n    return undefined;\n  }\n  return renamePill(nameText.slice(0, colonIdx), nameNode.from, nameNode.from + colonIdx);\n}\n\n// Fulfillment transforms for action pills: the controller collects the modal result from\n// the host and turns it into a text edit here.\n\n// A `label:` prefix survives the swap unless the picked exercise carries its own label.\nexport function LiftoEditorActions_swapExerciseEdit(target: ITextEdit, pickedName: string): ITextEdit {\n  const existingLabel = target.text.includes(\":\") ? target.text.split(\":\")[0].trim() : undefined;\n  const text = existingLabel != null && !pickedName.includes(\":\") ? `${existingLabel}: ${pickedName}` : pickedName;\n  return { start: target.start, end: target.end, text };\n}\n\n// Strip characters that would break out of the token: for a label, the ones that end it\n// (parens close a set label, \":\" ends an exercise label, \"/\" starts a new section); for a\n// state variable, everything the two grammars' keyword rules don't allow. Undefined when\n// nothing usable is left.\nexport function LiftoEditorActions_renameEdit(\n  target: ITextEdit,\n  newLabel: string,\n  kind: \"label\" | \"stateVar\" = \"label\"\n): ITextEdit | undefined {\n  const sanitized =\n    kind === \"stateVar\" ? LiftoEditorStateVars_sanitizeName(newLabel.trim()) : newLabel.trim().replace(/[():/]/g, \"\");\n  if (sanitized === \"\") {\n    return undefined;\n  }\n  return { start: target.start, end: target.end, text: sanitized };\n}\n\nconst pillBuilders: Partial<\n  Record<PlannerNodeName, (text: string, node: SyntaxNode, tree?: Tree) => ILiftoEditorPill[]>\n> = {\n  [PlannerNodeName.ExerciseSet]: setGroupPills,\n  [PlannerNodeName.ExerciseVariation]: exerciseVariationPills,\n  [PlannerNodeName.ExerciseExpression]: exercisePills,\n  [PlannerNodeName.ExerciseProperty]: propertyPills,\n  [PlannerNodeName.FunctionExpression]: fnPills,\n  [PlannerNodeName.KeyValue]: keyValuePills,\n  [PlannerNodeName.ExerciseSets]: setsPills,\n  [PlannerNodeName.SetPart]: setPartPills,\n  [PlannerNodeName.Timer]: restTimerPills,\n  [PlannerNodeName.SetTimer]: setTimerPills,\n  [PlannerNodeName.WarmupExerciseSets]: warmupSetsPills,\n  [PlannerNodeName.ReuseSection]: reuseSectionPills,\n  [PlannerNodeName.SetLabel]: setLabelPills,\n  [PlannerNodeName.Superset]: supersetPills,\n  [PlannerNodeName.Repeat]: repeatPills,\n  [PlannerNodeName.LineComment]: descriptionPills,\n  // The only ExerciseName level is the synthesized Label one (brain builds its rename pill\n  // directly); registering it here makes Label a pill boundary, so focusing a label shows\n  // just Rename instead of falling through to the whole exercise's rail.\n  [PlannerNodeName.ExerciseName]: (text, node) => {\n    const pill = LiftoEditorActions_labelRenamePill(text, node);\n    return pill != null ? [pill] : [];\n  },\n};\n\nconst acrossFields: Partial<Record<PlannerNodeName, ILiftoEditorAcrossField>> = {\n  [PlannerNodeName.SetPart]: \"reps\",\n  [PlannerNodeName.Weight]: \"weight\",\n  [PlannerNodeName.Percentage]: \"weight\",\n  [PlannerNodeName.Rpe]: \"rpe\",\n  [PlannerNodeName.Timer]: \"timer\",\n  [PlannerNodeName.SetTimer]: \"timer\",\n};\n\n// The set group a value token belongs to, or null if it isn't one of a set group's values.\n// Only the grammar's own wrappers are stepped through (`WeightWithPlus { Weight Plus? }`), so\n// this answers null for the same node names appearing anywhere else — a warmup group's weight,\n// `lp(5kg)`'s argument, a `weight: 100kg` state var — without any of them being listed.\nfunction enclosingSetGroup(node: SyntaxNode): SyntaxNode | null {\n  const parent = node.parent;\n  if (parent == null) {\n    return null;\n  }\n  if (parent.name === PlannerNodeName.ExerciseSet) {\n    return parent;\n  }\n  const isWrapper =\n    parent.name === PlannerNodeName.WeightWithPlus || parent.name === PlannerNodeName.PercentageWithPlus;\n  return isWrapper && parent.parent?.name === PlannerNodeName.ExerciseSet ? parent.parent : null;\n}\n\n// Which of a set's values this node is, for actions that reach every set in the program that\n// shares it. Only within a set group: a warmup weight or a progression's argument is not\n// something the whole program can be retuned by.\nexport function LiftoEditorActions_acrossField(node: SyntaxNode): ILiftoEditorAcrossField | undefined {\n  const field = acrossFields[node.name as PlannerNodeName];\n  return field != null && enclosingSetGroup(node) != null ? field : undefined;\n}\n\n// Everything the rail needs to know about a node, from one place — what it offers, and whether\n// the walk outward stops here. Answering the two separately is how they drift: `ownsRail` used\n// to be \"is this node name a pill builder\", which can't tell a set group's weight from a warmup\n// group's, because they are the same node name.\nexport interface ILiftoEditorRail {\n  pills: ILiftoEditorPill[];\n  // The rail's ancestor fall-through stops here even when the pill list is empty, so e.g.\n  // `used: none` shows \"No actions\" instead of the whole exercise's pills.\n  ownsRail: boolean;\n  // Set-group values only: which of the set's values this node is, so a host can act on the\n  // focused field without parsing the document a second time.\n  acrossField?: ILiftoEditorAcrossField;\n}\n\n// The label doesn't name the field: the rail is a row of chips on a phone, and the user just\n// tapped the value it is about. Only the chip's colour distinguishes them, matching the token.\nconst acrossPillDefs: Record<ILiftoEditorAcrossField, IPillDef> = {\n  reps: { label: \"Change everywhere\", category: \"sets\" },\n  weight: { label: \"Change everywhere\", category: \"weight\" },\n  rpe: { label: \"Change everywhere\", category: \"weight\" },\n  timer: { label: \"Change everywhere\", category: \"timer\" },\n};\n\n// `tree` is optional so a caller that has no parse of its own can still ask; the ones that do —\n// every editor surface — pass it, and the builders that need a document-level answer get it for\n// free instead of parsing the text again.\nexport function LiftoEditorActions_railForNode(text: string, node: SyntaxNode, tree?: Tree): ILiftoEditorRail {\n  const own = pillBuilders[node.name as PlannerNodeName]?.(text, node, tree) ?? [];\n  // Set-group children with their own rails (sets×reps, timers, set label, and the values that\n  // own one only to carry a field-specific action) would otherwise hide the group's additive\n  // actions: the walk stops at the first owner, so focusing \"3x8\" showed only \"Make rep range\"\n  // while focusing the weight fell through to the full group rail.\n  const setGroup = node.name !== PlannerNodeName.ExerciseSet ? enclosingSetGroup(node) : null;\n  const groupPills = setGroup != null ? setGroupPills(text, setGroup) : [];\n  const acrossField = LiftoEditorActions_acrossField(node);\n  if (acrossField == null) {\n    return { pills: [...own, ...groupPills], ownsRail: node.name in pillBuilders };\n  }\n  // First on the rail, ahead of the token's own actions: retuning a value across the program is\n  // the reason to focus one on a phone at all, and hunting for it behind \"Make rep range\" on\n  // every set of a multiweek program is the thing this feature exists to stop. Not a text edit —\n  // the host rewrites the program and hands the line back — so the range covers the focused\n  // token only so that the pill has one.\n  const def = acrossPillDefs[acrossField];\n  const acrossPill: ILiftoEditorPill = {\n    kind: \"editAcrossProgram\",\n    label: def.label,\n    category: def.category,\n    start: node.from,\n    end: node.to,\n    text: nodeText(text, node),\n    action: \"editAcrossProgram\",\n    acrossField,\n  };\n  return { pills: [acrossPill, ...own, ...groupPills], ownsRail: true, acrossField };\n}\n","import { SyntaxNode, Tree, TreeFragment } from \"@lezer/common\";\nimport { parser } from \"../../pages/planner/plannerExerciseParser\";\nimport { parser as liftoscriptParser } from \"../../liftoscript\";\nimport { PlannerNodeName } from \"../../pages/planner/plannerExerciseStyles\";\nimport {\n  PlannerDocument_blockSpans,\n  PlannerDocument_descriptionAt,\n  PlannerDocument_descriptions,\n} from \"../../pages/planner/models/plannerDocument\";\nimport { IDayData } from \"../../types\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport {\n  ILiftoEditorAcrossField,\n  ILiftoEditorPill,\n  LiftoEditorActions_endOfExerciseLine,\n  LiftoEditorActions_enclosingExercise,\n  LiftoEditorActions_railForNode,\n  LiftoEditorActions_setVariationSections,\n  LiftoEditorActions_warmupSetsPillsAt,\n} from \"./liftoEditorActions\";\n\nfunction nodeText(text: string, node: SyntaxNode): string {\n  return text.slice(node.from, node.to);\n}\n\n// Every gesture re-derives tokens/context/styles from the same text, and each brain\n// function used to run its own full parse — a single tap cost 2+ parses, a keystroke 3+.\n// One cache instance shared by all of them makes them parse once. It's owned by whoever\n// is editing (the session creates one, the editor view borrows it) rather than living in\n// the module, so two editors never evict each other's tree and it dies with its owner.\nexport class LiftoEditorParseCache {\n  private lastParse: { text: string; tree: Tree } | undefined;\n  // Script bodies are small and repeat across keystrokes (an edit elsewhere leaves them\n  // byte-identical), so a keyed memo covers them; the cap only guards against unbounded\n  // growth over a very long session.\n  private readonly liftoscriptTrees = new Map<string, Tree>();\n\n  // Consecutive versions reparse incrementally: the edited span is recovered by\n  // prefix/suffix diff and everything outside it is reused from the previous tree, so\n  // typing cost stays proportional to the edited line, not the document.\n  public parse(text: string): Tree {\n    const previous = this.lastParse;\n    if (previous?.text === text) {\n      return previous.tree;\n    }\n    let tree: Tree;\n    if (previous == null) {\n      tree = parser.parse(text);\n    } else {\n      const old = previous.text;\n      let from = 0;\n      const minLength = Math.min(old.length, text.length);\n      while (from < minLength && old.charCodeAt(from) === text.charCodeAt(from)) {\n        from += 1;\n      }\n      let toA = old.length;\n      let toB = text.length;\n      while (toA > from && toB > from && old.charCodeAt(toA - 1) === text.charCodeAt(toB - 1)) {\n        toA -= 1;\n        toB -= 1;\n      }\n      const fragments = TreeFragment.applyChanges(TreeFragment.addTree(previous.tree), [\n        { fromA: from, toA, fromB: from, toB },\n      ]);\n      tree = parser.parse(text, fragments);\n    }\n    this.lastParse = { text, tree };\n    return tree;\n  }\n\n  public parseLiftoscript(source: string): Tree {\n    let tree = this.liftoscriptTrees.get(source);\n    if (tree == null) {\n      if (this.liftoscriptTrees.size > 500) {\n        this.liftoscriptTrees.clear();\n      }\n      tree = liftoscriptParser.parse(source);\n      this.liftoscriptTrees.set(source, tree);\n    }\n    return tree;\n  }\n}\n\nimport type { ITextEdit } from \"../../utils/textDiff\";\nexport type { ITextEdit };\n\nexport interface ILiftoEditorStyledRange {\n  start: number;\n  end: number;\n  color?: string;\n  backgroundColor?: string;\n  bold?: boolean;\n  italic?: boolean;\n}\n\ninterface INodeStyle {\n  color?: string;\n  bold?: boolean;\n  italic?: boolean;\n}\n\n// Mirrors plannerExerciseStyles.ts tag assignments and plannerEditor.ts tag->semantic-color\n// mapping, collapsed into node->color since there's no CodeMirror HighlightStyle here.\nfunction nodeStyles(): Partial<Record<PlannerNodeName, INodeStyle>> {\n  const syntax = Tailwind_semantic().syntax;\n  return {\n    [PlannerNodeName.SetPart]: { color: syntax.atom },\n    [PlannerNodeName.WarmupSetPart]: { color: syntax.atom },\n    [PlannerNodeName.Rpe]: { color: syntax.literal },\n    [PlannerNodeName.Timer]: { color: syntax.keyword },\n    [PlannerNodeName.SetTimer]: { color: syntax.keyword },\n    [PlannerNodeName.Auto]: { color: syntax.keyword },\n    [PlannerNodeName.Weight]: { color: syntax.literal },\n    [PlannerNodeName.Percentage]: { color: syntax.literal },\n    [PlannerNodeName.AskWeight]: { color: syntax.literal },\n    [PlannerNodeName.LineComment]: { color: syntax.comment },\n    [PlannerNodeName.TripleLineComment]: { color: syntax.blockComment },\n    [PlannerNodeName.SupersetKeyword]: { color: syntax.keyword },\n    [PlannerNodeName.SectionSeparator]: { color: syntax.comment },\n    [PlannerNodeName.ExercisePropertyName]: { color: syntax.keyword },\n    [PlannerNodeName.FunctionName]: { color: syntax.attributeName },\n    [PlannerNodeName.FunctionArgument]: { color: syntax.attributeValue },\n    [PlannerNodeName.None]: { color: syntax.atom },\n    [PlannerNodeName.Week]: { color: syntax.annotation, bold: true },\n    [PlannerNodeName.Day]: { color: syntax.docComment, bold: true },\n    [PlannerNodeName.WeekDay]: { color: syntax.atom },\n    [PlannerNodeName.Repeat]: { color: syntax.atom },\n  };\n}\n\n// Mirrors liftoscriptLanguage.ts styleTags resolved through plannerEditor.ts's HighlightStyle\n// (Number is a subtag of literal, Unit of keyword), except StateVariable is styled as a whole —\n// web's nested Keyword rule splits \"state.foo\" into differently-colored pieces, which looks\n// accidental rather than intentional.\nfunction liftoscriptNodeStyles(): Partial<Record<string, INodeStyle>> {\n  const syntax = Tailwind_semantic().syntax;\n  return {\n    StateVariable: { color: syntax.variable },\n    Keyword: { color: syntax.keyword },\n    Unit: { color: syntax.keyword },\n    Number: { color: syntax.literal },\n    LineComment: { color: syntax.comment },\n  };\n}\n\n// The Liftoscript planner token includes the {~ ~} delimiters; the liftoscript grammar\n// @skips them, so parsing the raw slice works and the delimiters stay unstyled.\nfunction pushLiftoscriptRanges(\n  cache: LiftoEditorParseCache,\n  text: string,\n  from: number,\n  to: number,\n  ranges: ILiftoEditorStyledRange[]\n): void {\n  const styles = liftoscriptNodeStyles();\n  const tree = cache.parseLiftoscript(text.slice(from, to));\n  tree.iterate({\n    enter: (node) => {\n      const style = styles[node.name];\n      if (style != null && node.to > node.from) {\n        ranges.push({ start: from + node.from, end: from + node.to, ...style });\n        return false;\n      }\n      return true;\n    },\n  });\n}\n\nexport function LiftoEditorBrain_computeStyledRanges(\n  cache: LiftoEditorParseCache,\n  text: string\n): ILiftoEditorStyledRange[] {\n  const styles = nodeStyles();\n  const ranges: ILiftoEditorStyledRange[] = [];\n  const tree = cache.parse(text);\n  tree.iterate({\n    enter: (node) => {\n      if (node.name === PlannerNodeName.Liftoscript) {\n        pushLiftoscriptRanges(cache, text, node.from, node.to, ranges);\n        return false;\n      }\n      const style = styles[node.name as PlannerNodeName];\n      if (style != null && node.to > node.from) {\n        ranges.push({ start: node.from, end: node.to, ...style });\n        return false;\n      }\n      return true;\n    },\n  });\n  return ranges;\n}\n\nexport interface IEditorTokenNumeric {\n  kind: \"weight\" | \"percentage\" | \"timer\" | \"number\";\n  // Weights in function args (lp/dp/sum increments) step by a plain unit; weights in set\n  // sections (incl. globals and warmups) are real lifted weights, so the controller steps\n  // them through Weight_increment/decrement to respect equipment settings.\n  inFunctionArgs: boolean;\n}\n\nexport interface IEditorToken {\n  start: number;\n  end: number;\n  text: string;\n  // ‹ › stops on it. False only for numeric tap-targets nested inside a larger stop (the\n  // timers inside a `30s|60s` SetTimer, ints inside a ReuseSection) — tapping them opens\n  // the keypad, but the walk treats the enclosing token as one stop.\n  walkStop: boolean;\n  // Present iff tapping the token opens the numeric keypad.\n  numeric?: IEditorTokenNumeric;\n}\n\n// \"Whole\" = the node's entire text (digits + suffix, e.g. \"100kg\", \"45%\", \"60s\") is one\n// steppable token — as opposed to bare Int/Float leaves, which become \"number\" tokens.\nconst wholeNumericTokenKinds: Partial<Record<PlannerNodeName, IEditorTokenNumeric[\"kind\"]>> = {\n  [PlannerNodeName.Weight]: \"weight\",\n  [PlannerNodeName.Percentage]: \"percentage\",\n  [PlannerNodeName.Timer]: \"timer\",\n};\n\n// Numeric spans inside a {~ ~} script body, found by nest-parsing like the highlighting\n// does. They all count as \"function args\" for stepping: script weights are increments\n// (weights += 5lb), not lifted loads, so they step by a plain unit.\nfunction liftoscriptNumericSpans(\n  cache: LiftoEditorParseCache,\n  text: string,\n  from: number,\n  to: number\n): { start: number; end: number; kind: IEditorTokenNumeric[\"kind\"] }[] {\n  const spans: { start: number; end: number; kind: IEditorTokenNumeric[\"kind\"] }[] = [];\n  const tree = cache.parseLiftoscript(text.slice(from, to));\n  tree.iterate({\n    enter: (node) => {\n      const kind =\n        node.name === \"WeightExpression\"\n          ? (\"weight\" as const)\n          : node.name === \"Percentage\"\n            ? (\"percentage\" as const)\n            : node.name === \"NumberExpression\"\n              ? (\"number\" as const)\n              : undefined;\n      if (kind != null && node.to > node.from) {\n        spans.push({ start: from + node.from, end: from + node.to, kind });\n        return false;\n      }\n      return true;\n    },\n  });\n  return spans;\n}\n\nfunction isInFunctionArgs(node: SyntaxNode): boolean {\n  for (let cur: SyntaxNode | null = node.parent; cur != null; cur = cur.parent) {\n    if (cur.name === PlannerNodeName.FunctionExpression) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// Set-section weights never reach this table — the controller steps them through\n// Weight_increment/decrement so equipment settings (plates, fixed weights) apply.\n// The weight entry here only serves function-argument weights like lp() increments.\nconst stepByKind: Record<IEditorTokenNumeric[\"kind\"], (suffix: string) => number> = {\n  weight: () => 1,\n  percentage: () => 1,\n  timer: () => 15,\n  number: () => 1,\n};\n\nexport function LiftoEditorBrain_stepToken(token: IEditorToken, direction: 1 | -1): string | undefined {\n  if (token.numeric == null) {\n    return undefined;\n  }\n  const match = token.text.match(/^([+-]?)(\\d+(?:\\.\\d+)?)(.*)$/);\n  if (match == null) {\n    return undefined;\n  }\n  const [, sign, num, suffix] = match;\n  const value = parseFloat(`${sign}${num}`);\n  const step = stepByKind[token.numeric.kind](suffix);\n  const next = Math.round((value + step * direction) * 100) / 100;\n  return `${next}${suffix}`;\n}\n\nexport interface ILiftoEditorHandle {\n  setSelection: (start: number, end: number) => void;\n  replaceRange: (start: number, end: number, text: string) => void;\n  getText: () => string;\n  blurEditor: () => void;\n  // Asks the native side for the range's vertical extent; answered via onCaretRect.\n  requestCaretRect: (start: number, end: number) => void;\n  // The same question for many ranges at once; answered via onRangeRects, in order.\n  requestRangeRects: (ranges: { start: number; end: number }[]) => void;\n}\n\nconst breadcrumbLabels: Partial<Record<PlannerNodeName, string>> = {\n  [PlannerNodeName.SetPart]: \"Sets×Reps\",\n  [PlannerNodeName.Weight]: \"Weight\",\n  [PlannerNodeName.WeightWithPlus]: \"Weight\",\n  [PlannerNodeName.Percentage]: \"Percentage\",\n  [PlannerNodeName.PercentageWithPlus]: \"Percentage\",\n  [PlannerNodeName.Rpe]: \"RPE\",\n  [PlannerNodeName.Timer]: \"Rest timer\",\n  [PlannerNodeName.SetTimer]: \"Set timer\",\n  [PlannerNodeName.Auto]: \"Auto\",\n  [PlannerNodeName.WarmupExerciseSets]: \"Warmup sets\",\n  [PlannerNodeName.WarmupSetPart]: \"Sets×Reps\",\n  [PlannerNodeName.Repeat]: \"Repeat\",\n  [PlannerNodeName.WeekDay]: \"Week/Day\",\n  [PlannerNodeName.Superset]: \"Superset\",\n  [PlannerNodeName.ReuseSection]: \"Reuse\",\n  [PlannerNodeName.SetLabel]: \"Set label\",\n  [PlannerNodeName.Week]: \"Week\",\n  [PlannerNodeName.Day]: \"Day\",\n};\n\nexport interface ILiftoEditorLevel {\n  label: string;\n  nodeName: string;\n  start: number;\n  end: number;\n  pills: ILiftoEditorPill[];\n  // Whether the rail's walk outward stops here. Required rather than optional so it can't be\n  // the field a new contextAt branch forgets — see makeLevel.\n  ownsRail: boolean;\n  // Set-group values only: which of the set's values this level is, for actions that reach every\n  // set in the program spelling the same one.\n  acrossField?: ILiftoEditorAcrossField;\n  // Exercise levels only: every variation, i.e. the planner's fullName. The label is just\n  // the first variation — enough for a breadcrumb, but not enough to identify the exercise.\n  fullName?: string;\n}\n\nexport interface ILiftoEditorContext {\n  // Outer -> inner; breadcrumb is levels' labels. Each level carries its node's extent for\n  // level highlighting, its node name for sibling walking, and the add-actions valid there.\n  breadcrumb: string[];\n  levels: ILiftoEditorLevel[];\n}\n\n// Week/Day headers are siblings of the exercises rather than their parents, so which day an\n// offset belongs to is \"how many headers came before it\" rather than an ancestor walk. Read\n// off the raw lines: a line can only start with \"#\" as a header (comments start with \"//\"),\n// and a whole-program document is big enough that this is worth not parsing for.\nexport function LiftoEditorBrain_dayDataAt(text: string, index: number): Required<IDayData> {\n  let weeks = 0;\n  let daysInWeek = 0;\n  let days = 0;\n  for (const line of text.slice(0, index).split(\"\\n\")) {\n    if (line.startsWith(\"##\")) {\n      daysInWeek += 1;\n      days += 1;\n    } else if (line.startsWith(\"#\")) {\n      weeks += 1;\n      daysInWeek = 0;\n    }\n  }\n  return { week: Math.max(1, weeks), dayInWeek: Math.max(1, daysInWeek), day: Math.max(1, days) };\n}\n\nexport interface ILiftoEditorBlock {\n  // The whole movable extent, trailing linebreaks excluded.\n  start: number;\n  end: number;\n  // Where the exercise itself begins — the same offset the focus stack anchors an exercise\n  // level at, so a focused offset can be matched back to its block.\n  exerciseStart: number;\n  fullName: string;\n}\n\n// The movable unit within a day: one exercise plus the `//` description lines above it. Which\n// lines those are is a question about the document rather than about dragging, so it is asked\n// once for the whole app — see plannerDocument.ts, which exists because the editor and the grid\n// used to answer it differently. The session's tree is handed over so an edit still costs one\n// incremental reparse, not two.\nexport function LiftoEditorBrain_exerciseBlocks(cache: LiftoEditorParseCache, text: string): ILiftoEditorBlock[] {\n  return PlannerDocument_blockSpans(text, cache.parse(text)).map((span) => ({\n    start: span.from,\n    end: span.to,\n    exerciseStart: span.exerciseFrom,\n    fullName: span.fullName,\n  }));\n}\n\nexport function LiftoEditorBrain_blockIndexAt(blocks: ILiftoEditorBlock[], index: number): number {\n  return blocks.findIndex((block) => index >= block.start && index <= block.end);\n}\n\n// Where a dragged block lands, from where its ghost currently sits: it has passed a block below\n// once its bottom edge clears that block's middle, and one above once its top edge does.\n//\n// Edge against middle, never middle against middle: a block only ever reaches the position of\n// one no shorter than itself that way, and since the ghost can travel no further than the ends\n// of the list, the tallest exercise of a day — the one with the custom() script — could never be\n// dropped either first or last. The edges also make the answer independent of the dragged\n// block's own height, so a two-line exercise and a twenty-line one cross at the same place.\nexport function LiftoEditorBrain_dropIndex(\n  rects: { top: number; bottom: number }[],\n  fromIndex: number,\n  top: number,\n  height: number\n): number {\n  const bottom = top + height;\n  let target = fromIndex;\n  for (let i = 0; i < rects.length; i += 1) {\n    const middle = (rects[i].top + rects[i].bottom) / 2;\n    if (i > fromIndex && middle < bottom) {\n      target += 1;\n    } else if (i < fromIndex && middle > top) {\n      target -= 1;\n    }\n  }\n  return target;\n}\n\n// Moving a block re-slots only the blocks themselves: the text between two of them keeps its\n// position in the day rather than travelling with its neighbour, so a `///` note or a blank\n// line stays where the eye last saw it. One edit over the whole affected span, so the mirror\n// sees a single delta and the day reparses once.\nexport function LiftoEditorBrain_reorderEdit(\n  cache: LiftoEditorParseCache,\n  text: string,\n  fromIndex: number,\n  toIndex: number\n): ITextEdit | undefined {\n  const blocks = LiftoEditorBrain_exerciseBlocks(cache, text);\n  const isInRange = (index: number): boolean => index >= 0 && index < blocks.length;\n  if (fromIndex === toIndex || !isInRange(fromIndex) || !isInRange(toIndex)) {\n    return undefined;\n  }\n  const order = blocks.map((_, index) => index);\n  order.splice(toIndex, 0, ...order.splice(fromIndex, 1));\n  const low = Math.min(fromIndex, toIndex);\n  const high = Math.max(fromIndex, toIndex);\n  const pieces: string[] = [];\n  for (let i = low; i <= high; i += 1) {\n    const block = blocks[order[i]];\n    pieces.push(text.slice(block.start, block.end));\n    if (i < high) {\n      pieces.push(text.slice(blocks[i].end, blocks[i + 1].start));\n    }\n  }\n  return { start: blocks[low].start, end: blocks[high].end, text: pieces.join(\"\") };\n}\n\n// Ghosts a span: every token keeps its own syntax color, just at reduced opacity, so the run\n// still reads as Liftoscript while sitting visibly behind the local text.\n//\n// Alpha on the glyphs rather than a blend toward the page color: a blend would have to know\n// what is behind the text, which differs between themes and isn't necessarily the default\n// background anyway. Both native sides parse #RRGGBBAA (LiftoEditorView.swift parseColor,\n// LiftoEditorView.kt parseHexColor), so the composite happens against whatever is actually\n// there and light/dark both come out right without a second palette.\n//\n// Emitted default-first then per-token, matching flattenRanges' later-wins rule; only `color`\n// is set, so bold/italic from the underlying styles survive.\nexport function LiftoEditorBrain_fadedRanges(\n  cache: LiftoEditorParseCache,\n  text: string,\n  spans: { start: number; end: number }[],\n  defaultColor: string,\n  alpha: string\n): ILiftoEditorStyledRange[] {\n  if (spans.length === 0) {\n    return [];\n  }\n  const fade = (color: string): string => `${color}${alpha}`;\n  const result: ILiftoEditorStyledRange[] = spans.map((span) => ({ ...span, color: fade(defaultColor) }));\n  for (const range of LiftoEditorBrain_computeStyledRanges(cache, text)) {\n    if (range.color == null) {\n      continue;\n    }\n    for (const span of spans) {\n      const start = Math.max(range.start, span.start);\n      const end = Math.min(range.end, span.end);\n      if (start < end) {\n        result.push({ start, end, color: fade(range.color) });\n      }\n    }\n  }\n  return result;\n}\n\n// Flattens possibly-overlapping styled ranges into sorted non-overlapping segments with\n// merged properties (later input ranges win per property). The native sides assume exactly\n// this. Sweep-line rather than filtering all ranges per segment — the naive version was\n// O(ranges²) and dominated every keystroke on multi-hundred-line programs.\nexport function LiftoEditorBrain_flattenRanges(ranges: ILiftoEditorStyledRange[]): ILiftoEditorStyledRange[] {\n  const boundaries = Array.from(new Set(ranges.flatMap((r) => [r.start, r.end]))).sort((a, b) => a - b);\n  const byStart = ranges\n    .map((range, inputIndex) => ({ range, inputIndex }))\n    .sort((a, b) => a.range.start - b.range.start);\n  const result: ILiftoEditorStyledRange[] = [];\n  let nextToEnter = 0;\n  let active: { range: ILiftoEditorStyledRange; inputIndex: number }[] = [];\n  for (let i = 0; i < boundaries.length - 1; i += 1) {\n    const start = boundaries[i];\n    const end = boundaries[i + 1];\n    while (nextToEnter < byStart.length && byStart[nextToEnter].range.start <= start) {\n      active.push(byStart[nextToEnter]);\n      nextToEnter += 1;\n    }\n    active = active.filter((a) => a.range.end >= end);\n    if (active.length === 0) {\n      continue;\n    }\n    const covering = [...active].sort((a, b) => a.inputIndex - b.inputIndex);\n    const merged = covering.reduce<ILiftoEditorStyledRange>((acc, a) => ({ ...acc, ...a.range, start, end }), {\n      start,\n      end,\n    });\n    result.push(merged);\n  }\n  return result;\n}\n\n// Mirrors the native stores' edit shifting (ExternalRangesStore.applyEdit on iOS and its\n// Kotlin twin) so the JS-side mirror of pushed ranges stays byte-identical with what the\n// native side holds between pushes. Any rule change here must land on both native sides too.\nexport function LiftoEditorBrain_shiftStyledRanges(\n  ranges: ILiftoEditorStyledRange[],\n  editStart: number,\n  editEnd: number,\n  insertedLength: number\n): ILiftoEditorStyledRange[] {\n  const delta = insertedLength - (editEnd - editStart);\n  if (delta === 0) {\n    return ranges;\n  }\n  const result: ILiftoEditorStyledRange[] = [];\n  for (const range of ranges) {\n    let start = range.start;\n    let end = range.end;\n    if (editEnd <= start) {\n      start += delta;\n      end += delta;\n    } else if (editStart < end) {\n      end = Math.max(start, end + delta);\n    }\n    if (end > start) {\n      result.push(start === range.start && end === range.end ? range : { ...range, start, end });\n    }\n  }\n  return result;\n}\n\nexport interface IStyledRangesPatch {\n  start: number;\n  end: number;\n  ranges: ILiftoEditorStyledRange[];\n}\n\nfunction styledRangesEqual(a: ILiftoEditorStyledRange, b: ILiftoEditorStyledRange): boolean {\n  return (\n    a.start === b.start &&\n    a.end === b.end &&\n    a.color === b.color &&\n    a.backgroundColor === b.backgroundColor &&\n    a.bold === b.bold &&\n    a.italic === b.italic\n  );\n}\n\n// The delta protocol's JS half: previous = the mirror of what the native store holds (last\n// push shifted through subsequent edits), next = freshly computed flattened ranges. Returns\n// the window to replace, \"unchanged\" when no push is needed, or \"full\" when the diff spans\n// most of the document and a full resend is cheaper. Both arrays must be flattened (sorted,\n// non-overlapping) — the window math relies on it.\n//\n// editedSpan (next-text coordinates) forces ranges intersecting a just-applied programmatic\n// edit into the window even when they compare equal: Android applies a replace as separate\n// delete+insert shifts, whose composition can drop or shorten a range that the one-shot\n// shift (this mirror, and iOS) preserves — replacing the edit's neighborhood wholesale makes\n// that divergence unobservable.\nexport function LiftoEditorBrain_diffStyledRanges(\n  previous: ILiftoEditorStyledRange[],\n  next: ILiftoEditorStyledRange[],\n  editedSpan?: { start: number; end: number }\n): IStyledRangesPatch | \"unchanged\" | \"full\" {\n  let prefix = 0;\n  const maxPrefix = Math.min(previous.length, next.length);\n  while (prefix < maxPrefix && styledRangesEqual(previous[prefix], next[prefix])) {\n    prefix += 1;\n  }\n  let suffix = 0;\n  const maxSuffix = maxPrefix - prefix;\n  while (\n    suffix < maxSuffix &&\n    styledRangesEqual(previous[previous.length - 1 - suffix], next[next.length - 1 - suffix])\n  ) {\n    suffix += 1;\n  }\n  let windowStart: number | undefined;\n  let windowEnd: number | undefined;\n  const extend = (rangeStart: number): void => {\n    windowStart = windowStart == null ? rangeStart : Math.min(windowStart, rangeStart);\n    windowEnd = windowEnd == null ? rangeStart + 1 : Math.max(windowEnd, rangeStart + 1);\n  };\n  for (let i = prefix; i < previous.length - suffix; i += 1) {\n    extend(previous[i].start);\n  }\n  for (let i = prefix; i < next.length - suffix; i += 1) {\n    extend(next[i].start);\n  }\n  if (editedSpan != null && editedSpan.end > editedSpan.start) {\n    for (const ranges of [previous, next]) {\n      for (const range of ranges) {\n        if (range.start < editedSpan.end && range.end > editedSpan.start) {\n          extend(range.start);\n        }\n      }\n    }\n  }\n  if (windowStart == null || windowEnd == null) {\n    return \"unchanged\";\n  }\n  const finalStart = windowStart;\n  const finalEnd = windowEnd;\n  const inside = next.filter((r) => r.start >= finalStart && r.start < finalEnd);\n  if (inside.length > next.length / 2) {\n    return \"full\";\n  }\n  return { start: windowStart, end: windowEnd, ranges: inside };\n}\n\n// A set group whose Sets×Reps is removed stops reading as a set group (\"warmup: 40%\", or a\n// weight that now looks like globals), so removal must target the whole group. Warmup\n// groups aren't breadcrumb levels, so the extent is re-derived from the tree; isOnlyGroup\n// lets the caller cascade further when the group list would end up empty.\nexport function LiftoEditorBrain_enclosingSetGroup(\n  cache: LiftoEditorParseCache,\n  text: string,\n  level: { nodeName: string; start: number }\n): { nodeName: string; start: number; end: number; isOnlyGroup: boolean } | undefined {\n  const groupName =\n    level.nodeName === PlannerNodeName.SetPart\n      ? PlannerNodeName.ExerciseSet\n      : level.nodeName === PlannerNodeName.WarmupSetPart\n        ? PlannerNodeName.WarmupExerciseSet\n        : undefined;\n  if (groupName == null) {\n    return undefined;\n  }\n  let node: SyntaxNode | null = cache.parse(text).resolveInner(level.start + 1, -1);\n  while (node != null && node.name !== groupName) {\n    node = node.parent;\n  }\n  if (node == null) {\n    return undefined;\n  }\n  const siblings = node.parent?.getChildren(groupName) ?? [];\n  return { nodeName: node.name, start: node.from, end: node.to, isOnlyGroup: siblings.length <= 1 };\n}\n\n// The `...X` of a script reuse (`custom() { ...X }`) can't just be deleted — `{ }` without\n// tildes doesn't parse — so removal must swap the whole body back to an empty script.\nexport function LiftoEditorBrain_scriptReuseBody(\n  cache: LiftoEditorParseCache,\n  text: string,\n  level: { nodeName: string; start: number }\n): { start: number; end: number } | undefined {\n  if (level.nodeName !== PlannerNodeName.ReuseSection) {\n    return undefined;\n  }\n  let node: SyntaxNode | null = cache.parse(text).resolveInner(level.start + 1, -1);\n  while (node != null && node.name !== PlannerNodeName.ReuseSection) {\n    node = node.parent;\n  }\n  const body = node?.parent;\n  if (body == null || body.name !== PlannerNodeName.ReuseLiftoscript) {\n    return undefined;\n  }\n  return { start: body.from, end: body.to };\n}\n\nexport interface ILiftoEditorExerciseVariationSpan {\n  // The name as written — label, name and equipment, without the `!` current marker.\n  text: string;\n  start: number;\n  end: number;\n  isCurrent: boolean;\n}\n\nexport interface ILiftoEditorExerciseName {\n  fullName: string;\n  start: number;\n  end: number;\n  usedNone: boolean;\n  variations: ILiftoEditorExerciseVariationSpan[];\n}\n\nfunction trimmedSpan<K extends string>(\n  text: string,\n  from: number,\n  to: number,\n  key: K\n): { [P in K]: string } & { start: number; end: number } {\n  const raw = text.slice(from, to);\n  const trimmed = raw.trim();\n  const start = from + (raw.length - raw.trimStart().length);\n  return { [key]: trimmed, start, end: start + trimmed.length } as { [P in K]: string } & {\n    start: number;\n    end: number;\n  };\n}\n\n// The rungs of a ladder, straight off the grammar. Splitting the full name on \"|\" and peeling\n// a leading \"!\" gets the same answer for well-formed text and quietly disagrees for anything\n// else, so the separator and the current marker are read as nodes, never as characters.\nfunction readVariations(text: string, variations: SyntaxNode): ILiftoEditorExerciseVariationSpan[] {\n  return variations.getChildren(PlannerNodeName.ExerciseVariation).map((variation) => {\n    const name = variation.getChild(PlannerNodeName.ExerciseName);\n    return {\n      ...trimmedSpan(text, name?.from ?? variation.from, name?.to ?? variation.to, \"text\"),\n      isCurrent: variation.getChild(PlannerNodeName.CurrentVariation) != null,\n    };\n  });\n}\n\n// The exercise's planner fullName (every `|` variation, no properties) and where it sits in\n// the text — the identity of the thing being edited, independent of where the focus is. The\n// span is the trimmed name, so replacing it can't eat the separator that follows. `usedNone`\n// mirrors the evaluator's own `used: none` check rather than matching on the raw text, which\n// would also fire inside a description.\nexport function LiftoEditorBrain_exerciseFullName(\n  cache: LiftoEditorParseCache,\n  text: string\n): ILiftoEditorExerciseName | undefined {\n  const tree = cache.parse(text);\n  let variations: Omit<ILiftoEditorExerciseName, \"usedNone\"> | undefined;\n  let usedNone = false;\n  tree.iterate({\n    enter: (node) => {\n      if (variations == null && node.name === PlannerNodeName.ExerciseVariations) {\n        variations = {\n          ...trimmedSpan(text, node.from, node.to, \"fullName\"),\n          variations: readVariations(text, node.node),\n        };\n        return false;\n      }\n      if (!usedNone && node.name === PlannerNodeName.ExerciseProperty) {\n        const property = node.node;\n        const name = property.getChild(PlannerNodeName.ExercisePropertyName);\n        if (name != null && nodeText(text, name).trim() === \"used\") {\n          usedNone = property.getChild(PlannerNodeName.None) != null;\n        }\n        return false;\n      }\n      return true;\n    },\n  });\n  return variations != null ? { ...variations, usedNone } : undefined;\n}\n\n// Whether anything on this line stands in for text written elsewhere. One node covers both\n// forms — `/ ...Squat` for sets and `{ ...Squat }` inside a progress/update script — because the\n// grammar builds them from the same ReuseSection.\nexport function LiftoEditorBrain_hasReuse(cache: LiftoEditorParseCache, text: string): boolean {\n  const tree = cache.parse(text);\n  let found = false;\n  tree.iterate({\n    enter: (node) => {\n      if (node.name === PlannerNodeName.ReuseSection) {\n        found = true;\n      }\n      return !found;\n    },\n  });\n  return found;\n}\n\n// The one place a level is built. Every branch below differs only in what it calls the level\n// and where it ends; what the level offers and whether it owns the rail are two answers to the\n// same question about the node, and are always taken from the same call.\nfunction makeLevel(\n  text: string,\n  // Handed on to the rail so a pill builder asking a document-level question answers it from the\n  // session's tree rather than parsing the text again on every tap.\n  tree: Tree,\n  node: SyntaxNode,\n  label: string,\n  overrides?: { start?: number; end?: number; pills?: ILiftoEditorPill[]; fullName?: string }\n): ILiftoEditorLevel {\n  const rail = LiftoEditorActions_railForNode(text, node, tree);\n  return {\n    label,\n    nodeName: node.name,\n    start: overrides?.start ?? node.from,\n    end: overrides?.end ?? node.to,\n    pills: overrides?.pills ?? rail.pills,\n    ownsRail: rail.ownsRail,\n    acrossField: rail.acrossField,\n    fullName: overrides?.fullName,\n  };\n}\n\nexport function LiftoEditorBrain_contextAt(\n  cache: LiftoEditorParseCache,\n  text: string,\n  index: number\n): ILiftoEditorContext {\n  const tree = cache.parse(text);\n  const inner = tree.resolveInner(index, -1);\n  const levels: ILiftoEditorLevel[] = [];\n  for (let node: SyntaxNode | null = inner; node != null; node = node.parent) {\n    const name = node.name as PlannerNodeName;\n    if (name === PlannerNodeName.ExerciseSet) {\n      const isGlobals = node.getChild(PlannerNodeName.SetPart) == null;\n      const siblings = node.parent?.getChildren(PlannerNodeName.ExerciseSet) ?? [];\n      const setIndex = siblings.findIndex((s) => s.from === node!.from);\n      levels.unshift(\n        makeLevel(text, tree, node, isGlobals ? \"Globals\" : `Set group${siblings.length > 1 ? ` ${setIndex + 1}` : \"\"}`)\n      );\n    } else if (name === PlannerNodeName.ExerciseSets) {\n      const exercise = LiftoEditorActions_enclosingExercise(node);\n      const variations = exercise != null ? LiftoEditorActions_setVariationSections(exercise) : [];\n      const variationIndex = variations.findIndex((s) => s.from === node!.from);\n      levels.unshift(\n        makeLevel(\n          text,\n          tree,\n          node,\n          variations.length > 1 && variationIndex !== -1 ? `Sets ${variationIndex + 1}` : \"Sets\"\n        )\n      );\n    } else if (name === PlannerNodeName.ExerciseVariation) {\n      const siblings = node.parent?.getChildren(PlannerNodeName.ExerciseVariation) ?? [];\n      // Single-variation exercises (the common case) get no level: the exercise level\n      // already covers the name, and \"Variation 1\" would just be noise.\n      if (siblings.length > 1) {\n        const variationIndex = siblings.findIndex((s) => s.from === node!.from);\n        levels.unshift(makeLevel(text, tree, node, `Variation ${variationIndex + 1}`));\n      }\n    } else if (name === PlannerNodeName.ExerciseExpression) {\n      const variations = node.getChild(PlannerNodeName.ExerciseVariations);\n      const exerciseName = variations\n        ?.getChild(PlannerNodeName.ExerciseVariation)\n        ?.getChild(PlannerNodeName.ExerciseName);\n      levels.unshift(\n        makeLevel(text, tree, node, exerciseName != null ? nodeText(text, exerciseName).trim() : \"Exercise\", {\n          end: LiftoEditorActions_endOfExerciseLine(text, node),\n          fullName: variations != null ? nodeText(text, variations).trim() : undefined,\n        })\n      );\n    } else if (name === PlannerNodeName.KeyValue) {\n      const keyword = node.getChild(PlannerNodeName.Keyword);\n      if (keyword != null) {\n        levels.unshift(makeLevel(text, tree, node, nodeText(text, keyword)));\n      }\n    } else if (name === PlannerNodeName.ExerciseName && node.parent?.name === PlannerNodeName.ExerciseVariation) {\n      // The grammar lumps `label: Name` into one ExerciseName token (\":\" is a name char),\n      // so the Label level is synthesized: it exists only when the tap lands inside the\n      // label part. Level extent includes \": \" so ✕-removal eats the whole prefix; the\n      // rename pill targets just the label word.\n      const nameText = nodeText(text, node);\n      const colonIdx = nameText.indexOf(\":\");\n      if (colonIdx !== -1 && index <= node.from + colonIdx) {\n        const labelEnd = node.from + colonIdx;\n        let afterColon = labelEnd + 1;\n        while (text[afterColon] === \" \") {\n          afterColon += 1;\n        }\n        levels.unshift(makeLevel(text, tree, node, \"Label\", { end: afterColon }));\n      }\n    } else if (name === PlannerNodeName.ExerciseProperty) {\n      const propertyName = node.getChild(PlannerNodeName.ExercisePropertyName);\n      if (propertyName != null) {\n        const label = nodeText(text, propertyName);\n        levels.unshift(makeLevel(text, tree, node, label.charAt(0).toUpperCase() + label.slice(1)));\n      }\n    } else if (name === PlannerNodeName.WarmupExerciseSets) {\n      // The only branch that overrides pills: which warmup group the caret is in decides what\n      // the rail offers, and the node alone can't say.\n      levels.unshift(\n        makeLevel(text, tree, node, breadcrumbLabels[name] ?? \"Warmup sets\", {\n          pills: LiftoEditorActions_warmupSetsPillsAt(text, node, index),\n        })\n      );\n    } else if (name === PlannerNodeName.FunctionExpression) {\n      const functionName = node.getChild(PlannerNodeName.FunctionName);\n      if (functionName != null) {\n        levels.unshift(makeLevel(text, tree, node, `${nodeText(text, functionName)}()`));\n      }\n    } else if (name === PlannerNodeName.LineComment) {\n      // A description spans as many `//` lines as were written in a row, and the tap can land on\n      // any of them, so the level covers the whole run rather than the one node the tree resolved\n      // to. Numbered only when the exercise has more than one — with a single description\n      // \"Description 1\" would be inventing a choice that isn't there. A `//` line the evaluator\n      // gives to no exercise gets no level: it is a comment, not a description.\n      const found = PlannerDocument_descriptionAt(text, node.from, cache.parse(text));\n      const description = found != null ? found.siblings[found.index] : undefined;\n      if (found != null && description != null) {\n        levels.unshift(\n          makeLevel(text, tree, node, found.siblings.length > 1 ? `Description ${found.index + 1}` : \"Description\", {\n            start: description.from,\n            end: description.to,\n          })\n        );\n      }\n    } else {\n      const isHeader = name === PlannerNodeName.Week || name === PlannerNodeName.Day;\n      // \"# Week 1\" reads better as its own name than as the generic \"Week\", and in full-program\n      // mode the crumb is the only thing saying where in the program the caret is.\n      const label = (isHeader ? nodeText(text, node).replace(/^#+/, \"\").trim() : \"\") || breadcrumbLabels[name];\n      if (label != null && levels[0]?.label !== label) {\n        // Week/Day tokens include their trailing linebreak; keep the highlight on the line.\n        const end = isHeader ? LiftoEditorActions_endOfExerciseLine(text, node) : node.to;\n        levels.unshift(makeLevel(text, tree, node, label, { end }));\n      }\n    }\n  }\n  return { breadcrumb: levels.map((level) => level.label), levels };\n}\n\n// Non-numeric word-level stops. A tap or ‹ › lands on the whole token; unlike numeric\n// tokens they open no keypad. The walk descends INTO them looking for nested numeric\n// tap-targets (a SetTimer's inner timers, a ReuseSection's week/day ints) — those come out\n// with walkStop: false so the enclosing token stays a single ‹ › stop.\nconst plainFocusNames = new Set<string>([\n  PlannerNodeName.ExerciseName,\n  PlannerNodeName.ExercisePropertyName,\n  PlannerNodeName.FunctionName,\n  PlannerNodeName.SetTimer,\n  PlannerNodeName.None,\n  PlannerNodeName.Auto,\n  PlannerNodeName.AskWeight,\n  PlannerNodeName.Liftoscript,\n  PlannerNodeName.ReuseSection,\n  PlannerNodeName.SetLabel,\n]);\n\n// The single walk behind both ‹ › focus hopping (walkStop tokens) and keypad targeting\n// (numeric tokens). Whole numeric terminals (Weight/Percentage/Timer) are checked before\n// plain names because their digits are not separate Int nodes.\nexport function LiftoEditorBrain_tokens(cache: LiftoEditorParseCache, text: string): IEditorToken[] {\n  const tree = cache.parse(text);\n  const tokens: IEditorToken[] = [];\n  const plainStopStack: { from: number; to: number }[] = [];\n  const plainSpan = (start: number, end: number): IEditorToken => {\n    return { start, end, text: text.slice(start, end), walkStop: true };\n  };\n  // A description is one thing to focus however many lines it was written across, so the run's\n  // first `//` is the only one that opens a stop. Resolved once for the document rather than per\n  // comment: this runs on every tap and every focus walk.\n  const descriptionStarts = new Map<number, { from: number; to: number }>();\n  for (const group of PlannerDocument_descriptions(text, tree)) {\n    for (const description of group) {\n      descriptionStarts.set(description.from, description);\n    }\n  }\n  tree.iterate({\n    enter: (node) => {\n      if (node.to <= node.from) {\n        return true;\n      }\n      if (node.name === PlannerNodeName.LineComment) {\n        const description = descriptionStarts.get(node.from);\n        if (description != null) {\n          tokens.push(plainSpan(description.from, description.to));\n        }\n        return false;\n      }\n      const insidePlainStop = plainStopStack.length > 0;\n      if (node.name === PlannerNodeName.Liftoscript) {\n        for (const span of liftoscriptNumericSpans(cache, text, node.from, node.to)) {\n          tokens.push({\n            start: span.start,\n            end: span.end,\n            text: text.slice(span.start, span.end),\n            walkStop: true,\n            numeric: { kind: span.kind, inFunctionArgs: true },\n          });\n        }\n        return false;\n      }\n      const whole = wholeNumericTokenKinds[node.name as PlannerNodeName];\n      if (whole != null) {\n        tokens.push({\n          start: node.from,\n          end: node.to,\n          text: text.slice(node.from, node.to),\n          walkStop: !insidePlainStop,\n          numeric: { kind: whole, inFunctionArgs: isInFunctionArgs(node.node) },\n        });\n        return false;\n      }\n      if (node.name === PlannerNodeName.Int || node.name === PlannerNodeName.Float) {\n        tokens.push({\n          start: node.from,\n          end: node.to,\n          text: text.slice(node.from, node.to),\n          walkStop: !insidePlainStop,\n          numeric: { kind: \"number\", inFunctionArgs: isInFunctionArgs(node.node) },\n        });\n        return false;\n      }\n      if (insidePlainStop) {\n        // The enclosing token already is the stop; keep descending for numeric tap-targets.\n        return true;\n      }\n      // State var names in custom(): the raw Keyword token inside KeyValue, so tapping\n      // `myvar` in `custom(myvar: 0)` focuses it (the value stays a numeric keypad stop).\n      if (node.name === PlannerNodeName.Keyword && node.node.parent?.name === PlannerNodeName.KeyValue) {\n        tokens.push(plainSpan(node.from, node.to));\n        return false;\n      }\n      if (plainFocusNames.has(node.name)) {\n        // `label: Name` is one ExerciseName token; split it so the label and the name are\n        // separate focus stops (matching the synthesized Label breadcrumb level).\n        if (\n          node.name === PlannerNodeName.ExerciseName &&\n          node.node.parent?.name === PlannerNodeName.ExerciseVariation\n        ) {\n          const colonIdx = text.slice(node.from, node.to).indexOf(\":\");\n          if (colonIdx !== -1) {\n            tokens.push(plainSpan(node.from, node.from + colonIdx));\n            let rest = node.from + colonIdx + 1;\n            while (text[rest] === \" \") {\n              rest += 1;\n            }\n            if (rest < node.to) {\n              tokens.push(plainSpan(rest, node.to));\n            }\n            return false;\n          }\n        }\n        // SetTimer is one terminal (\"30s|60s\"), so its two timers aren't Int children the\n        // descent below could find — split them out here as keypad tap-targets.\n        if (node.name === PlannerNodeName.SetTimer) {\n          tokens.push(plainSpan(node.from, node.to));\n          const raw = text.slice(node.from, node.to);\n          const timerRe = /\\d+s/g;\n          let timerMatch: RegExpExecArray | null;\n          while ((timerMatch = timerRe.exec(raw)) != null) {\n            const start = node.from + timerMatch.index;\n            tokens.push({\n              start,\n              end: start + timerMatch[0].length,\n              text: timerMatch[0],\n              walkStop: false,\n              numeric: { kind: \"timer\", inFunctionArgs: false },\n            });\n          }\n          return false;\n        }\n        tokens.push(plainSpan(node.from, node.to));\n        plainStopStack.push({ from: node.from, to: node.to });\n        return true;\n      }\n      return true;\n    },\n    leave: (node) => {\n      const top = plainStopStack[plainStopStack.length - 1];\n      if (top != null && top.from === node.from && top.to === node.to) {\n        plainStopStack.pop();\n      }\n    },\n  });\n  return tokens;\n}\n","import { ILiftoEditorContext } from \"./liftoEditorBrain\";\n\nexport interface ILiftoEditorHint {\n  short: string;\n  detail: string;\n}\n\nexport const LiftoEditorHints_helpId = \"lifto-editor-hints\";\n\n// Both structured-mode surfaces (the sheet and the inline dock) teach the same two gestures,\n// and they sit next to each other often enough that differing wording would read as a bug.\nexport const LiftoEditorHints_gestures = \"Swipe to switch elements · double-tap to type\";\n\nconst editorPropertyHints: Partial<Record<string, ILiftoEditorHint>> = {\n  progress: {\n    short: \"Progress: how the exercise changes after workouts.\",\n    detail:\n      \"Runs after you finish a workout and adjusts the future ones. Defined via a function — tap it to learn what it does. 'progress: none' disables it, e.g. for a deload week.\",\n  },\n  update: {\n    short: \"Update: a script that runs when the workout starts and after each set.\",\n    detail:\n      \"'setIndex' is the set you just completed — 0 means it's running before the workout starts. Use it to adjust the remaining sets right away, e.g. '{~ if (setIndex == 1) { weights += 2.5kg } ~}'.\",\n  },\n  warmup: {\n    short: \"Warmups: warmup sets — not counted for progress, update or volume.\",\n    detail:\n      \"E.g. 'warmup: 2x5 45%, 1x3 135lb' — percentages here are of the first work set's weight, not your 1RM. 'warmup: none' removes warmups.\",\n  },\n  used: {\n    short: \"'used: none' removes this exercise from workouts — others can still reuse it.\",\n    detail:\n      \"With an unknown exercise name it acts as a template (e.g. '...T1'). Templates never progress, so reusing them never breaks — while a reuser that progresses gets its changed values extracted into overrides on its own line.\",\n  },\n  id: {\n    short: \"Id: tags this exercise so other exercises' scripts can reach its state.\",\n    detail:\n      \"'id: tags(1, 100)' — progress/update scripts of other exercises can change state variables of everything sharing a tag: 'state[1].rating = 5'.\",\n  },\n};\n\nconst editorProgressFunctionHints: Partial<Record<string, ILiftoEditorHint>> = {\n  lp: {\n    short: \"lp: linear progression — add weight after successful workouts.\",\n    detail:\n      \"'lp(5lb)' adds 5lb after every successful workout. 'lp(5lb, 2, 0)' waits for 2 successes; 'lp(5lb, 1, 0, 10lb, 2, 0)' also drops 10lb after 2 failed ones.\",\n  },\n  dp: {\n    short: \"dp: double progression — reps climb first, then the weight.\",\n    detail:\n      \"'dp(5lb, 8, 12)' — on success reps go up from 8 towards 12; at 12 the weight adds 5lb and reps reset to 8.\",\n  },\n  sum: {\n    short: \"sum: progress when total reps across all sets reach a target.\",\n    detail: \"'sum(30, 5lb)' — if completed reps across all sets add up to 30 or more, add 5lb.\",\n  },\n  custom: {\n    short: \"custom: your own progression script, run after finishing the workout.\",\n    detail:\n      \"'custom() {~ if (completedReps >= reps) { weights += 5lb } ~}'. Reuse another exercise's script with 'custom() { ...Squat }'.\",\n  },\n  none: {\n    short: \"none: suppresses the progression defined for this exercise.\",\n    detail:\n      \"Nothing changes after workouts, even when a reused exercise or a repeated declaration defines a progression. Mostly used on deload weeks so the weights stay put.\",\n  },\n};\n\nconst editorNodeHints: Partial<Record<string, ILiftoEditorHint>> = {\n  SetPart: {\n    short: \"Sets × reps: '3x8' — 3 sets of 8 reps.\",\n    detail: \"'3x8-12' — rep range, '1x5+' — AMRAP (do as many reps as you can, the app asks how many you did).\",\n  },\n  Weight: {\n    short: \"Weight: an explicit weight for these sets.\",\n    detail: \"E.g. '100kg' or '85lb'. Add '+' ('100lb+') and the app asks what weight you actually used.\",\n  },\n  WeightWithPlus: {\n    short: \"Weight: an explicit weight for these sets.\",\n    detail: \"E.g. '100kg' or '85lb'. Add '+' ('100lb+') and the app asks what weight you actually used.\",\n  },\n  Percentage: {\n    short: \"Percentage: weight as a % of your 1RM for this exercise.\",\n    detail: \"'80%' resolves against the 1RM from your settings. '80%+' also asks what weight you actually used.\",\n  },\n  PercentageWithPlus: {\n    short: \"Percentage: weight as a % of your 1RM for this exercise.\",\n    detail: \"'80%' resolves against the 1RM from your settings. '80%+' also asks what weight you actually used.\",\n  },\n  Rpe: {\n    short: \"RPE: target effort for these sets, from 1 to 10.\",\n    detail:\n      \"'@8' — target RPE 8. With no explicit weight, the app derives it from your 1RM, reps and RPE. '@8+' also logs the actual RPE after the set.\",\n  },\n  Timer: {\n    short: \"Rest timer: how long to rest after each of these sets.\",\n    detail: \"'90s' starts a 90-second rest timer when you complete a set of this group.\",\n  },\n  SetTimer: {\n    short: \"Set timer: how long the set itself lasts, then the rest.\",\n    detail:\n      \"'60s|30s' — 60s active set (plank, carries…), then 30s rest. '30s+|60s' counts up past 30s until you stop it. Add 'auto' to advance sets automatically (EMOM/circuits).\",\n  },\n  SetLabel: {\n    short: \"Set label: a name shown next to these sets in the workout.\",\n    detail: \"'4x5 (Main), 1x5+ (AMRAP)' — in parentheses after sets×reps, 8 characters max.\",\n  },\n  ReuseSection: {\n    short: \"Reuse: copies sets, weight, RPE, timer, warmups and progress from another exercise.\",\n    detail:\n      \"'...Bench Press' finds it in the current week. '...Bench Press[2]' — day 2 of this week, '...Bench Press[2:1]' — week 2, day 1. Sections after it override the reused parts.\",\n  },\n  WeekDay: {\n    short: \"Week/Day: where to reuse the exercise from.\",\n    detail: \"'[2]' — day 2 of the current week, '[2:1]' — week 2, day 1. '_' means the current week: '[_:1]'.\",\n  },\n  Repeat: {\n    short: \"Repeat: this exercise repeats across the listed weeks.\",\n    detail:\n      \"'Squat[1-3]' — appears in weeks 1–3 on this day without copy-pasting it. Editing the declaration applies to all the repeated weeks.\",\n  },\n  Superset: {\n    short: \"Superset: exercises sharing a group name alternate together.\",\n    detail:\n      \"'superset: A' — completing a set jumps to the next exercise marked with group 'A'. Groups match within the same day only.\",\n  },\n  KeyValue: {\n    short: \"State variable: a value the script remembers between workouts.\",\n    detail:\n      \"Defined as 'name: initialValue' inside custom(). Scripts read and change it via 'state.name', and the app stores it per exercise.\",\n  },\n  ExerciseName: {\n    short: \"Label: distinguishes two copies of the same exercise.\",\n    detail:\n      \"'aux: Bench Press' and 'Bench Press' count as separate exercises with their own progress, so the same movement can appear twice in a program.\",\n  },\n  LineComment: {\n    short: \"Description: notes shown under the exercise during the workout.\",\n    detail:\n      \"Written as '//' lines above the exercise, in Markdown. Leave a blank line between them for several descriptions — '!' marks the current one (the first when unmarked), and progress scripts switch it via 'descriptionIndex'.\",\n  },\n  ExerciseVariation: {\n    short: \"Exercise variation: alternative movements, the app uses the current one.\",\n    detail:\n      \"'Squat | Pistol Squat' — '!' marks the current variation (the first one when unmarked). Sets and progress are shared; progress scripts switch it via 'exerciseVariationIndex'.\",\n  },\n};\n\nconst editorFallbackHints = {\n  exercise: {\n    short: \"Exercise: one movement — its warmups, set groups and progression.\",\n    detail:\n      \"Sections are separated by '/'. E.g. 'Squat / 3x5 / 100kg / progress: lp(5kg)' — name, sets×reps, weight, progression.\",\n  },\n  property: {\n    short: \"Property: progression, warmups or update logic for this exercise.\",\n    detail:\n      \"E.g. 'progress: lp(5kg)' adds 5kg after a successful day, 'warmup: 2x5 45%' defines warmup sets, 'update: custom() {~ ... ~}' runs a script after each set.\",\n  },\n  globals: {\n    short: \"Globals: defaults applied to every set group of this exercise.\",\n    detail:\n      \"E.g. 'Squat / 3x5, 5x3 / 100kg 90s' — the weight and timer apply to both set groups unless a group sets its own.\",\n  },\n  warmupPercentage: {\n    short: \"Warmup percentage: % of the first work set's weight, not your 1RM.\",\n    detail: \"'warmup: 1x5 45%, 1x3 80%' — 45% and 80% of the weight of the first work set.\",\n  },\n  setGroup: {\n    short: \"Set group: sets × reps, then weight. % here resolve against your 1RM.\",\n    detail: \"E.g. '3x8-10 @8 60s 80%' — 3 sets of 8-10 reps at RPE 8, 60s rest timer, at 80% of your 1RM.\",\n  },\n  setVariation: {\n    short: \"Set variation: one of several sets×reps schemes, the app uses the current one.\",\n    detail:\n      \"'3x8 / ! 5x5' — '!' marks the current variation (the first one when unmarked). Progress scripts switch it via 'setVariationIndex', e.g. on failure in GZCLP.\",\n  },\n  valueWeight: {\n    short: \"Weight value.\",\n    detail: \"Could be lb or kg, likely would be converted to your default or equipment unit in the workout.\",\n  },\n};\n\nexport function LiftoEditorHints_forContext(\n  context: ILiftoEditorContext | undefined,\n  activeLevelIndex: number,\n  text: string\n): ILiftoEditorHint | undefined {\n  const levels = context?.levels ?? [];\n  const level = levels[activeLevelIndex];\n  if (level == null) {\n    return undefined;\n  }\n  if (level.nodeName === \"ExerciseExpression\") {\n    return editorFallbackHints.exercise;\n  }\n  const property = levels.find((l) => l.nodeName === \"ExerciseProperty\")?.label.toLowerCase();\n  if (level.nodeName === \"FunctionExpression\" && property === \"progress\") {\n    const functionHint = editorProgressFunctionHints[level.label.replace(\"()\", \"\")];\n    if (functionHint != null) {\n      return functionHint;\n    }\n  }\n  // `progress: none` has no FunctionExpression level, so the none hint keys off the\n  // property's own text.\n  if (\n    level.nodeName === \"ExerciseProperty\" &&\n    property === \"progress\" &&\n    /:\\s*none\\b/.test(text.slice(level.start, level.end))\n  ) {\n    return editorProgressFunctionHints.none;\n  }\n  if (level.nodeName === \"ExerciseProperty\" || level.nodeName === \"FunctionExpression\") {\n    return (property != null ? editorPropertyHints[property] : undefined) ?? editorFallbackHints.property;\n  }\n  const inWarmup = levels.some((l) => l.nodeName === \"WarmupExerciseSets\");\n  if (inWarmup) {\n    if (level.nodeName === \"Percentage\" || level.nodeName === \"PercentageWithPlus\") {\n      return editorFallbackHints.warmupPercentage;\n    }\n    return editorPropertyHints.warmup;\n  }\n  if (level.nodeName === \"ExerciseSet\" && level.label === \"Globals\") {\n    return editorFallbackHints.globals;\n  }\n  // The Sets level is numbered (\"Sets 2\") only when the exercise has multiple set variations.\n  if (level.nodeName === \"ExerciseSets\" && level.label !== \"Sets\") {\n    return editorFallbackHints.setVariation;\n  }\n  // Only set-group weights support the '+' suffix (the grammar's WeightWithPlus); weights\n  // inside function args, state vars or scripts are plain values and get their own hint.\n  const isValueContext = levels.some(\n    (l) => l.nodeName === \"FunctionExpression\" || l.nodeName === \"KeyValue\" || l.nodeName === \"Liftoscript\"\n  );\n  if (level.nodeName === \"Weight\" && isValueContext) {\n    return editorFallbackHints.valueWeight;\n  }\n  return editorNodeHints[level.nodeName] ?? editorFallbackHints.setGroup;\n}\n","import type { IPercentage, IProgramState, IProgramStateMetadata, ISettings, IWeight } from \"../../types\";\nimport { PlannerStateVars_fromArgs } from \"../../pages/planner/models/plannerStateVars\";\nimport type { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { PlannerKey_fromFullName } from \"../../pages/planner/plannerKey\";\nimport type { ILiftoEditorStateVarEntry, ILiftoEditorStateVarsTarget } from \"./liftoEditorActions\";\nimport {\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_getStateMetadata,\n  PlannerProgramExercise_getUpdateScript,\n} from \"../../pages/planner/models/plannerProgramExercise\";\nimport { ScriptRunner } from \"../../parser\";\nimport { Weight_print } from \"../../models/weight\";\nimport { ObjectUtils_entries, ObjectUtils_keys } from \"../../utils/object\";\n\nexport type ILiftoEditorStateVarValue = number | IWeight | IPercentage;\n\nexport interface ILiftoEditorStateVar {\n  name: string;\n  value: ILiftoEditorStateVarValue;\n  userPrompted: boolean;\n}\n\n// One row per variable the exercise has: the ones it declares itself, and the ones it\n// inherits from the exercise its progress reuses. An inherited one turns into a declared\n// one the moment its value changes — that's what an override is in Liftoscript.\nexport interface ILiftoEditorStateVarRow {\n  name: string;\n  value: ILiftoEditorStateVarValue;\n  userPrompted: boolean;\n  defaultValue?: ILiftoEditorStateVarValue;\n  isDeclared: boolean;\n}\n\n// The syntax tree hands over name/value pairs; this turns each value token into the number,\n// weight or percentage the evaluator would make of it. One argument at a time, so the order\n// they're written in survives (the evaluator's map doesn't keep it).\nexport function LiftoEditorStateVars_fromEntries(entries: ILiftoEditorStateVarEntry[]): ILiftoEditorStateVar[] {\n  const vars: ILiftoEditorStateVar[] = [];\n  for (const entry of entries) {\n    const { state } = PlannerStateVars_fromArgs([`${entry.name}: ${entry.value}`]);\n    for (const name of ObjectUtils_keys(state)) {\n      vars.push({ name, value: state[name], userPrompted: entry.userPrompted });\n    }\n  }\n  return vars;\n}\n\n// Both grammars have to accept the name. The planner's KeyValue keyword allows a leading\n// underscore (`_x: 1` parses), but liftoscript's `state.name` doesn't — so a name starting\n// with anything but a letter declares fine and then can't be read from the script it's for.\nconst nameRegex = /^[a-zA-Z][a-zA-Z0-9_]*$/;\n\nexport function LiftoEditorStateVars_sanitizeName(name: string): string {\n  return name.replace(/[^a-zA-Z0-9_]/g, \"\").replace(/^[^a-zA-Z]+/, \"\");\n}\n\nexport function LiftoEditorStateVars_nameError(name: string, existingNames?: string[]): string | undefined {\n  if (name === \"\") {\n    return \"Enter a variable name.\";\n  }\n  if (!nameRegex.test(name)) {\n    return \"Variable names must start with a letter, and can only contain letters, numbers and underscores.\";\n  }\n  if (existingNames?.includes(name)) {\n    return `There's already a state variable named \"${name}\".`;\n  }\n  return undefined;\n}\n\nexport function LiftoEditorStateVars_print(vars: ILiftoEditorStateVar[]): string {\n  return vars.map((v) => `${v.name}${v.userPrompted ? \"+\" : \"\"}: ${Weight_print(v.value)}`).join(\", \");\n}\n\nexport function LiftoEditorStateVars_rows(\n  vars: ILiftoEditorStateVar[],\n  defaults?: IProgramState,\n  defaultsMetadata?: IProgramStateMetadata\n): ILiftoEditorStateVarRow[] {\n  const declared = new Map(vars.map((v) => [v.name, v]));\n  const rows: ILiftoEditorStateVarRow[] = [];\n  for (const [name, defaultValue] of defaults != null ? ObjectUtils_entries(defaults) : []) {\n    const own = declared.get(name);\n    rows.push({\n      name,\n      value: own?.value ?? defaultValue,\n      userPrompted: own?.userPrompted ?? !!defaultsMetadata?.[name]?.userPrompted,\n      defaultValue,\n      isDeclared: own != null,\n    });\n  }\n  for (const v of vars) {\n    if (defaults?.[v.name] == null) {\n      rows.push({ name: v.name, value: v.value, userPrompted: v.userPrompted, isDeclared: true });\n    }\n  }\n  return rows;\n}\n\n// Editing an inherited variable declares it here, which is how an override is written.\nexport function LiftoEditorStateVars_set(\n  vars: ILiftoEditorStateVar[],\n  name: string,\n  update: Partial<Omit<ILiftoEditorStateVar, \"name\">>\n): ILiftoEditorStateVar[] {\n  const existing = vars.find((v) => v.name === name);\n  if (existing == null) {\n    return [...vars, { name, value: 0, userPrompted: false, ...update }];\n  }\n  return vars.map((v) => (v.name === name ? { ...v, ...update } : v));\n}\n\nexport function LiftoEditorStateVars_remove(vars: ILiftoEditorStateVar[], name: string): ILiftoEditorStateVar[] {\n  return vars.filter((v) => v.name !== name);\n}\n\n// Everything the sheet needs beyond the variables themselves: where the inherited ones come\n// from, and every script that can reference them — progress declares the state, and update\n// reads the same state, so a variable only update mentions still can't be deleted.\nexport interface ILiftoEditorStateVarsContext {\n  defaults?: IProgramState;\n  defaultsMetadata?: IProgramStateMetadata;\n  sourceName?: string;\n  progressScript?: string;\n  updateScript?: string;\n}\n\n// Mirrors PlannerProgramExercise_getState's inheritance: an own progress declaration that\n// reuses nothing inherits nothing, however the exercise itself reuses another one.\nfunction progressSource(exercise: IPlannerProgramExercise): IPlannerProgramExercise | undefined {\n  if (exercise.progress?.state != null && exercise.progress.reuse == null) {\n    return undefined;\n  }\n  return exercise.progress?.reuse?.exercise ?? exercise.reuse?.exercise;\n}\n\n// Deleting a variable a script still reads breaks the program, and both of an exercise's\n// scripts can read its state — progress declares it, update uses the same state.\nexport function LiftoEditorStateVars_isUsed(name: string, context: ILiftoEditorStateVarsContext): boolean {\n  return (\n    ScriptRunner.hasStateVariable(context.progressScript ?? \"\", name) ||\n    ScriptRunner.hasStateVariable(context.updateScript ?? \"\", name)\n  );\n}\n\n// A reuse target names an exercise the same way the evaluator resolves it — by planner key,\n// not by display name. `Squat, Smith Machine` and `Squat` share a name, and matching on that\n// picks whichever comes first in the program instead of the one `...Squat` really means.\nexport function LiftoEditorStateVars_findExercise(\n  exercises: IPlannerProgramExercise[],\n  fullName: string,\n  settings: ISettings\n): IPlannerProgramExercise | undefined {\n  const key = PlannerKey_fromFullName(fullName, settings.exercises);\n  return exercises.find((exercise) => exercise.key === key);\n}\n\n// What the sheet should believe, given both the live text and the last evaluation. The text\n// wins wherever it says anything: a body spelled out there means the progress declares its\n// own state and inherits nothing, and a reuse there names the source — both stay right when\n// the evaluation still remembers the body the user has since replaced.\nexport function LiftoEditorStateVars_contextFor(\n  target: ILiftoEditorStateVarsTarget,\n  exercise: IPlannerProgramExercise | undefined,\n  exercises: IPlannerProgramExercise[],\n  settings: ISettings\n): ILiftoEditorStateVarsContext {\n  const find = (fullName: string): IPlannerProgramExercise | undefined =>\n    LiftoEditorStateVars_findExercise(exercises, fullName, settings);\n  const progress =\n    target.progressScript != null\n      ? { progressScript: target.progressScript }\n      : target.progressReuse != null\n        ? // An unresolvable target (mid-edit, or a typo the evaluation will flag) contributes\n          // no defaults and no script — better an empty sheet than another exercise's values.\n          (sourceContext(find(target.progressReuse)) ?? { sourceName: target.progressReuse })\n        : LiftoEditorStateVars_context(exercise);\n  const updateSource = target.updateReuse != null ? find(target.updateReuse) : exercise;\n  return {\n    ...progress,\n    updateScript:\n      target.updateScript ?? (updateSource != null ? PlannerProgramExercise_getUpdateScript(updateSource) : undefined),\n  };\n}\n\nfunction sourceContext(source: IPlannerProgramExercise | undefined): ILiftoEditorStateVarsContext | undefined {\n  return source != null\n    ? {\n        defaults: PlannerProgramExercise_getState(source),\n        defaultsMetadata: PlannerProgramExercise_getStateMetadata(source),\n        sourceName: source.fullName,\n        progressScript: PlannerProgramExercise_getProgressScript(source),\n      }\n    : undefined;\n}\n\nexport function LiftoEditorStateVars_context(\n  exercise: IPlannerProgramExercise | undefined\n): ILiftoEditorStateVarsContext {\n  if (exercise == null) {\n    return {};\n  }\n  return {\n    ...(sourceContext(progressSource(exercise)) ?? {}),\n    progressScript: PlannerProgramExercise_getProgressScript(exercise),\n    updateScript: PlannerProgramExercise_getUpdateScript(exercise),\n  };\n}\n","export { Pressable } from \"react-native\";\n","import React, { JSX } from \"react\";\n\ninterface ISelectOption {\n  value: string;\n  label: string;\n}\n\ninterface ISelectProps {\n  value: string;\n  options: ISelectOption[];\n  onChange: (value: string) => void;\n  className?: string;\n}\n\nexport function Select(props: ISelectProps): JSX.Element {\n  return React.createElement(\n    \"select\",\n    {\n      className: props.className,\n      value: props.value,\n      onChange: (e: React.ChangeEvent<HTMLSelectElement>) => props.onChange(e.currentTarget.value),\n    },\n    props.options.map((o) => React.createElement(\"option\", { key: o.value, value: o.value }, o.label))\n  );\n}\n","import React, { JSX } from \"react\";\n\ninterface ISliderProps {\n  value: number;\n  min: number;\n  max: number;\n  step?: number;\n  onChange: (value: number) => void;\n}\n\nexport function Slider(props: ISliderProps): JSX.Element {\n  return React.createElement(\"input\", {\n    type: \"range\",\n    style: { width: \"100%\" },\n    min: props.min,\n    max: props.max,\n    step: props.step ?? 1,\n    value: props.value,\n    onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n      const v = parseFloat(e.currentTarget.value);\n      if (!isNaN(v)) {\n        props.onChange(v);\n      }\n    },\n  });\n}\n","import React from \"react\";\nimport { Platform } from \"react-native\";\n\ntype ISvgProps = React.SVGProps<SVGSVGElement> & { children?: React.ReactNode };\ntype IPathProps = React.SVGProps<SVGPathElement>;\ntype ICircleProps = React.SVGProps<SVGCircleElement>;\ntype IRectProps = React.SVGProps<SVGRectElement>;\ntype ILineProps = React.SVGProps<SVGLineElement>;\ntype IGProps = React.SVGProps<SVGGElement>;\ntype IDefsProps = React.SVGProps<SVGDefsElement>;\ntype IClipPathProps = React.SVGProps<SVGClipPathElement>;\ntype IPolygonProps = React.SVGProps<SVGPolygonElement>;\ntype IPolylineProps = React.SVGProps<SVGPolylineElement>;\ntype IEllipseProps = React.SVGProps<SVGEllipseElement>;\ntype IStopProps = React.SVGProps<SVGStopElement>;\ntype ILinearGradientProps = React.SVGProps<SVGLinearGradientElement>;\ntype IRadialGradientProps = React.SVGProps<SVGRadialGradientElement>;\ntype ITextProps = React.SVGProps<SVGTextElement>;\ntype ITSpanProps = React.SVGProps<SVGTSpanElement>;\ntype IUseProps = React.SVGProps<SVGUseElement>;\ntype IMaskProps = React.SVGProps<SVGMaskElement>;\ntype IPatternProps = React.SVGProps<SVGPatternElement>;\ntype IImageProps = React.SVGProps<SVGImageElement>;\ntype IForeignObjectProps = React.SVGProps<SVGForeignObjectElement>;\ntype ISymbolProps = React.SVGProps<SVGSymbolElement>;\n\nexport type ISvgComponentProps = ISvgProps;\n\nexport function Svg(props: ISvgProps): React.JSX.Element {\n  if (\n    Platform.OS === \"web\" &&\n    [\"inline-block\", \"inline\", \"block\", \"flex\"].every((cl) => !props.className?.includes(cl))\n  ) {\n    props = { ...props, className: `inline-block ${props.className || \"\"}` };\n  }\n  return React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", ...props });\n}\n\nexport function Path(props: IPathProps): React.JSX.Element {\n  return React.createElement(\"path\", props);\n}\n\nexport function Circle(props: ICircleProps): React.JSX.Element {\n  return React.createElement(\"circle\", props);\n}\n\nexport function Rect(props: IRectProps): React.JSX.Element {\n  return React.createElement(\"rect\", props);\n}\n\nexport function Line(props: ILineProps): React.JSX.Element {\n  return React.createElement(\"line\", props);\n}\n\nexport function G(props: IGProps): React.JSX.Element {\n  return React.createElement(\"g\", props);\n}\n\nexport function Defs(props: IDefsProps): React.JSX.Element {\n  return React.createElement(\"defs\", props);\n}\n\nexport function ClipPath(props: IClipPathProps): React.JSX.Element {\n  return React.createElement(\"clipPath\", props);\n}\n\nexport function Polygon(props: IPolygonProps): React.JSX.Element {\n  return React.createElement(\"polygon\", props);\n}\n\nexport function Polyline(props: IPolylineProps): React.JSX.Element {\n  return React.createElement(\"polyline\", props);\n}\n\nexport function Ellipse(props: IEllipseProps): React.JSX.Element {\n  return React.createElement(\"ellipse\", props);\n}\n\nexport function LinearGradient(props: ILinearGradientProps): React.JSX.Element {\n  return React.createElement(\"linearGradient\", props);\n}\n\nexport function RadialGradient(props: IRadialGradientProps): React.JSX.Element {\n  return React.createElement(\"radialGradient\", props);\n}\n\nexport function Stop(props: IStopProps): React.JSX.Element {\n  return React.createElement(\"stop\", props);\n}\n\nexport function SvgText(props: ITextProps): React.JSX.Element {\n  return React.createElement(\"text\", props);\n}\n\nexport function TSpan(props: ITSpanProps): React.JSX.Element {\n  return React.createElement(\"tspan\", props);\n}\n\nexport function Use(props: IUseProps): React.JSX.Element {\n  return React.createElement(\"use\", props);\n}\n\nexport function Mask(props: IMaskProps): React.JSX.Element {\n  return React.createElement(\"mask\", props);\n}\n\nexport function Pattern(props: IPatternProps): React.JSX.Element {\n  return React.createElement(\"pattern\", props);\n}\n\nexport function SvgImage(props: IImageProps): React.JSX.Element {\n  return React.createElement(\"image\", props);\n}\n\nexport function ForeignObject(props: IForeignObjectProps): React.JSX.Element {\n  return React.createElement(\"foreignObject\", props);\n}\n\nexport function SvgSymbol(props: ISymbolProps): React.JSX.Element {\n  return React.createElement(\"symbol\", props);\n}\n\ninterface ISvgXmlProps {\n  xml: string;\n  width?: number | string;\n  height?: number | string;\n  style?: React.CSSProperties;\n  className?: string;\n  preserveAspectRatio?: string;\n}\n\nexport function SvgXml(props: ISvgXmlProps): React.JSX.Element {\n  const { xml, width, height, style, className } = props;\n  return React.createElement(\"span\", {\n    className,\n    style: {\n      display: \"inline-block\",\n      width,\n      height,\n      lineHeight: 0,\n      ...style,\n    },\n    dangerouslySetInnerHTML: { __html: xml },\n  });\n}\n\ninterface ISvgUriProps {\n  uri: string;\n  width?: number | string;\n  height?: number | string;\n  style?: React.CSSProperties;\n  className?: string;\n}\n\nexport function SvgUri(props: ISvgUriProps): React.JSX.Element {\n  const { uri, width, height, style, className } = props;\n  return React.createElement(\"img\", {\n    src: uri,\n    width,\n    height,\n    className,\n    style,\n    alt: \"\",\n  });\n}\n","import React, { JSX } from \"react\";\n\ninterface ISwitchProps {\n  value: boolean | undefined;\n  onValueChange: (value: boolean) => void;\n  disabled?: boolean;\n  testID?: string;\n}\n\nexport function Switch(props: ISwitchProps): JSX.Element {\n  return (\n    <input\n      type=\"checkbox\"\n      className=\"checkbox text-text-link\"\n      checked={!!props.value}\n      disabled={props.disabled}\n      data-testid={props.testID}\n      onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n        props.onValueChange(e.currentTarget.checked);\n      }}\n    />\n  );\n}\n","import { Text as RNText, TextProps, Platform } from \"react-native\";\nimport { JSX } from \"react\";\n\nconst textColorPattern =\n  /\\btext-(icon|text|syntax|red|green|blue|yellow|purple|gray|slate|zinc|stone|neutral|orange|amber|lime|emerald|teal|cyan|sky|indigo|violet|fuchsia|pink|rose|white|black|transparent|inherit|current)\\b/;\nconst textSizePattern = /\\btext-(2xs|xs|sm|base|lg|xl|\\dxl|\\[)/;\n\nexport function Text_hasSizeClass(className: string | undefined): boolean {\n  return className != null && textSizePattern.test(className);\n}\n\nexport function Text_resolveFontFamily(className: string | undefined): string {\n  return resolveFontFamily(className);\n}\n\nfunction resolveFontFamily(className: string | undefined): string {\n  if (Platform.OS !== \"android\") {\n    return \"Poppins\";\n  }\n  const isBold = className != null && /\\bfont-bold\\b/.test(className);\n  const isSemiBold = className != null && /\\bfont-semibold\\b/.test(className);\n  const isItalic = className != null && /\\bitalic\\b/.test(className);\n  if (isBold && isItalic) {\n    return \"Poppins-BoldItalic\";\n  }\n  if (isBold) {\n    return \"Poppins-Bold\";\n  }\n  if (isSemiBold && isItalic) {\n    return \"Poppins-SemiBoldItalic\";\n  }\n  if (isSemiBold) {\n    return \"Poppins-SemiBold\";\n  }\n  if (isItalic) {\n    return \"Poppins-Italic\";\n  }\n  return \"Poppins-Regular\";\n}\n\n// RN's <Text> with none of the defaults Text injects below - for nested spans, which would\n// otherwise get text-base forced on them, and for trees that resolve their own font family.\nexport function TextRaw(props: TextProps & { className?: string }): JSX.Element {\n  return <RNText allowFontScaling={false} {...props} />;\n}\n\n// The OS font scale is folded into the rem instead (see Settings_getTextSize), which moves\n// spacing and icons along with the type. Letting RN also scale fontSize here would apply it\n// twice, and only to the text, so it would overflow boxes that didn't grow.\nexport function Text({\n  style,\n  className,\n  ...props\n}: TextProps & { className?: string; \"data-testid\"?: string }): JSX.Element {\n  const defaults: string[] = [];\n  if (className == null || !textColorPattern.test(className)) {\n    defaults.push(\"text-text-primary\");\n  }\n  if (className == null || !textSizePattern.test(className)) {\n    defaults.push(\"text-base\");\n  }\n  const effectiveClassName =\n    defaults.length > 0 ? (className ? `${defaults.join(\" \")} ${className}` : defaults.join(\" \")) : className;\n  const fontFamily = resolveFontFamily(effectiveClassName);\n  const dataTestid = (props as { \"data-testid\"?: string })[\"data-testid\"];\n  const testID = props.testID || dataTestid;\n  return (\n    <RNText\n      className={effectiveClassName}\n      style={[{ fontFamily }, style]}\n      allowFontScaling={false}\n      {...props}\n      testID={testID}\n    />\n  );\n}\n","import { TextInput as RNTextInput, TextInputProps } from \"react-native\";\nimport { forwardRef, JSX, Ref } from \"react\";\nimport { Text_hasSizeClass, Text_resolveFontFamily } from \"./text\";\n\nexport type ITextInput = RNTextInput;\n\n// See the note in ./text.tsx - the OS font scale is folded into the rem instead, so letting\n// RN scale fontSize here too would apply it twice and only to the text.\n// Without a size class RN falls back to its own fixed default, which is the one font size in the\n// app that ignores the text size setting entirely - so default it the same way Text does. The\n// family comes from the same resolver too, so inputs don't render in the system font next to\n// Poppins labels (and Android gets a real face name rather than the family alias).\nexport const TextInput = forwardRef(function TextInputInner(\n  props: TextInputProps & { className?: string; \"data-testid\"?: string },\n  ref: Ref<RNTextInput>\n): JSX.Element {\n  const className = Text_hasSizeClass(props.className) ? props.className : `text-base ${props.className ?? \"\"}`.trim();\n  const fontFamily = Text_resolveFontFamily(className);\n  return (\n    <RNTextInput\n      ref={ref}\n      allowFontScaling={false}\n      {...props}\n      className={className}\n      style={[{ fontFamily }, props.style]}\n    />\n  );\n});\n","import { JSX, useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTimedMemo } from \"../utils/useTimedMemo\";\nimport { usePerfScrollMarkers } from \"../utils/usePerfScrollMarkers\";\nimport { View } from \"react-native\";\nimport { LegendList, LegendListRef } from \"@legendapp/list\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IProgram, IHistoryRecord, ISettings, ISubscription } from \"../types\";\nimport { INavCommon, IState, updateState } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { History_getHistoryRecordsForTimerange, History_getHomeAggregates } from \"../models/history\";\nimport { WeekInsights } from \"./weekInsights\";\nimport { lb } from \"lens-shmens\";\nimport { WeekCalendar } from \"./weekCalendar\";\nimport { HistoryRecordsNullState } from \"./historyRecordsNullState\";\nimport { Progress_isCurrent } from \"../models/progress\";\nimport { Program_nextHistoryRecord } from \"../models/program\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { useTrackedState } from \"../navigation/TrackedStateContext\";\nimport { HistoryRecordView } from \"./historyRecord\";\nimport { Program_evaluate, Program_getProgramDay } from \"../models/program\";\n\ninterface IProps {\n  program: IProgram;\n  progress?: IHistoryRecord;\n  history: IHistoryRecord[];\n  settings: ISettings;\n  subscription: ISubscription;\n  navCommon: INavCommon;\n  dispatch: IDispatch;\n  initialHistoryRecordId?: number;\n}\n\nexport function getWeekHistory(\n  history: IHistoryRecord[],\n  firstDayOfWeek: number,\n  startWeekFromMonday?: boolean\n): IHistoryRecord[] {\n  return History_getHistoryRecordsForTimerange(history, firstDayOfWeek, \"week\", startWeekFromMonday);\n}\n\nexport function ProgramHistoryView(props: IProps): JSX.Element {\n  const dispatch = props.dispatch;\n  const aggregates = useTimedMemo(\n    \"programHistory.aggregates\",\n    () => History_getHomeAggregates(props.history, !!props.settings.startWeekFromMonday),\n    [props.history, props.settings.startWeekFromMonday]\n  );\n  const { sortedHistoryDesc, weeksData, prs } = aggregates;\n  const { firstDayOfWeeks, historyRecordDateToFirstDayOfWeek, firstDayOfWeekToHistoryRecord } = weeksData;\n\n  const sortedHistory = useTimedMemo(\n    \"programHistory.sortedHistory\",\n    () => {\n      if (!props.progress && (!props.program || sortedHistoryDesc.length === 0)) {\n        return sortedHistoryDesc;\n      }\n      const arr = sortedHistoryDesc.slice();\n      if (props.progress) {\n        arr.unshift(props.progress);\n      } else if (props.program) {\n        arr.unshift(Program_nextHistoryRecord(props.program, props.settings, props.navCommon.stats));\n      }\n      return arr;\n    },\n    [sortedHistoryDesc, props.progress, props.program, props.settings, props.navCommon.stats]\n  );\n\n  const [selectedFirstDayOfWeek, setSelectedWeekFirstDay] = useState(firstDayOfWeeks[firstDayOfWeeks.length - 1]);\n  const previousWeekFirstDayDate = new Date(selectedFirstDayOfWeek);\n  previousWeekFirstDayDate.setDate(previousWeekFirstDayDate.getDate() - 7);\n  const previousWeekFirstDay = previousWeekFirstDayDate.getTime();\n  const [selectedWeekCalendarFirstDayOfWeek, setSelectedWeekCalendarFirstDayOfWeek] = useState(selectedFirstDayOfWeek);\n\n  const thisWeekHistory = useTimedMemo(\n    \"programHistory.thisWeekHistory\",\n    () => getWeekHistory(sortedHistory, selectedFirstDayOfWeek, props.settings.startWeekFromMonday),\n    [sortedHistory, selectedFirstDayOfWeek, props.settings.startWeekFromMonday]\n  );\n  const lastWeekHistory = useTimedMemo(\n    \"programHistory.lastWeekHistory\",\n    () => getWeekHistory(sortedHistory, previousWeekFirstDay, props.settings.startWeekFromMonday),\n    [sortedHistory, previousWeekFirstDay, props.settings.startWeekFromMonday]\n  );\n  const loadingItems = props.navCommon.loading.items;\n  const loadingKeys = Object.keys(loadingItems).filter((k) => loadingItems[k]?.endTime == null);\n  const isLoading = Object.keys(loadingKeys).length > 0;\n\n  const programDay = useTimedMemo(\n    \"programHistory.programDay\",\n    () => {\n      const program = Program_evaluate(props.program, props.settings);\n      return Program_getProgramDay(program, program.nextDay);\n    },\n    [props.program, props.settings]\n  );\n  const isOngoing = !!(props.progress && Progress_isCurrent(props.progress));\n\n  const flatListRef = useRef<LegendListRef>(null);\n  const historyRecordDateToFirstDayOfWeekRef = useRef(historyRecordDateToFirstDayOfWeek);\n  historyRecordDateToFirstDayOfWeekRef.current = historyRecordDateToFirstDayOfWeek;\n  const selectedFirstDayOfWeekRef = useRef(selectedFirstDayOfWeek);\n  selectedFirstDayOfWeekRef.current = selectedFirstDayOfWeek;\n\n  const onViewableItemsChanged = useRef(({ viewableItems }: { viewableItems: Array<{ item: IHistoryRecord }> }) => {\n    if (viewableItems.length > 0) {\n      const firstVisibleRecord = viewableItems[0].item;\n      const firstDayOfWeek = historyRecordDateToFirstDayOfWeekRef.current[firstVisibleRecord.id];\n      if (firstDayOfWeek != null && firstDayOfWeek !== selectedFirstDayOfWeekRef.current) {\n        setSelectedWeekFirstDay(firstDayOfWeek);\n      }\n    }\n  }).current;\n\n  const initialHistoryRecordId = props.initialHistoryRecordId;\n\n  const [initialScrollIndex, setInitialScrollIndex] = useState(() => {\n    if (initialHistoryRecordId == null) {\n      return 0;\n    }\n    const idx = sortedHistory.findIndex((record) => record.id === initialHistoryRecordId);\n    return idx >= 0 ? idx : 0;\n  });\n  const [listRemountKey, setListRemountKey] = useState(0);\n\n  const trackedState = useTrackedState();\n  const scrollToRecordId = trackedState.scrollToHistoryRecordId;\n  useEffect(() => {\n    if (scrollToRecordId != null) {\n      updateState(props.dispatch, [lb<IState>().p(\"scrollToHistoryRecordId\").record(undefined)], \"Clear scroll target\");\n      const index = sortedHistory.findIndex((record) => record.id === scrollToRecordId);\n      if (index >= 0) {\n        setInitialScrollIndex(index);\n        setListRemountKey((k) => k + 1);\n      }\n    }\n  }, [scrollToRecordId]);\n\n  useNavOptions({ navHidden: true });\n\n  const renderItem = useCallback(\n    ({ item }: { item: IHistoryRecord }) => (\n      <View key={item.id} className=\"mx-4 mb-6\">\n        <HistoryRecordView\n          isOngoing={isOngoing}\n          showTitle={true}\n          programDay={programDay}\n          prs={prs}\n          settings={props.settings}\n          historyRecord={item}\n          dispatch={dispatch}\n        />\n      </View>\n    ),\n    [isOngoing, programDay, prs, props.settings, dispatch]\n  );\n\n  const keyExtractor = useCallback((item: IHistoryRecord) => String(item.id), []);\n\n  const scrollMarkers = usePerfScrollMarkers(\"ProgramHistoryView\");\n\n  const stickyHeader = (\n    <View>\n      <View className=\"border-b border-border-neutral\">\n        <WeekCalendar\n          startWeekFromMonday={props.settings.startWeekFromMonday}\n          selectedWeekCalendarFirstDayOfWeek={selectedWeekCalendarFirstDayOfWeek}\n          history={sortedHistory}\n          firstDayOfWeekToHistoryRecord={firstDayOfWeekToHistoryRecord}\n          firstDayOfWeeks={firstDayOfWeeks}\n          isLoading={isLoading}\n          selectedFirstDayOfWeek={selectedFirstDayOfWeek}\n          onClick={() => navigateToModal(\"monthCalendarModal\")}\n          onSelectFirstDayOfWeek={(firstDayOfWeek) => {\n            setSelectedWeekCalendarFirstDayOfWeek(firstDayOfWeek);\n          }}\n        />\n      </View>\n      <WeekInsights\n        dispatch={props.dispatch}\n        prs={prs}\n        selectedFirstDayOfWeek={selectedFirstDayOfWeek}\n        thisWeekHistory={thisWeekHistory}\n        lastWeekHistory={lastWeekHistory}\n        settings={props.settings}\n        subscription={props.subscription}\n      />\n    </View>\n  );\n\n  if (sortedHistory.length === 0) {\n    return (\n      <View className=\"flex-1\">\n        {stickyHeader}\n        <HistoryRecordsNullState />\n      </View>\n    );\n  }\n\n  return (\n    <View className=\"flex-1\">\n      {stickyHeader}\n      <LegendList\n        key={listRemountKey}\n        ref={flatListRef}\n        data={sortedHistory}\n        renderItem={renderItem}\n        keyExtractor={keyExtractor}\n        estimatedItemSize={300}\n        initialScrollIndex={initialScrollIndex}\n        waitForInitialLayout={true}\n        onViewableItemsChanged={onViewableItemsChanged}\n        onScrollBeginDrag={scrollMarkers.onScrollBeginDrag}\n        onScrollEndDrag={scrollMarkers.onScrollEndDrag}\n        onMomentumScrollEnd={scrollMarkers.onMomentumScrollEnd}\n      />\n    </View>\n  );\n}\n","import { JSX, ReactNode, useMemo, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IProgram, ISettings, ISubscription, IStats } from \"../types\";\nimport { IconMuscles2 } from \"./icons/iconMuscles2\";\nimport { IPoints, Muscle_normalizePoints, Muscle_getPointsForProgram, Muscle_getPointsForDay } from \"../models/muscle\";\nimport { Modal } from \"./modal\";\nimport { MusclesView } from \"./muscles/musclesView\";\nimport { Locker } from \"./locker\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport {\n  IEvaluatedProgram,\n  Program_evaluate,\n  Program_dayAverageTimeMs,\n  Program_daysRange,\n  Program_exerciseRange,\n  Program_getProgramDay,\n} from \"../models/program\";\nimport { TimeUtils_formatHHMM } from \"../utils/time\";\nimport { IconWatch } from \"./icons/iconWatch\";\nimport { ProgramPreviewOrPlayground } from \"./programPreviewOrPlayground\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { SimpleMarkdown } from \"./simpleMarkdown\";\nimport { Link } from \"./link\";\n\nexport type IPreviewProgramMuscles =\n  | {\n      dayIndex: number;\n      type: \"day\";\n    }\n  | { type: \"program\" };\n\ninterface IProps {\n  dispatch?: IDispatch;\n  settings: ISettings;\n  program: IProgram;\n  isMobile: boolean;\n  subscription: ISubscription;\n  stats: IStats;\n  hasNavbar?: boolean;\n  useNavModals?: boolean;\n  headerContent?: ReactNode;\n}\n\nexport function ProgramPreview(props: IProps): JSX.Element {\n  const program = props.program;\n  const settings = props.settings;\n  const evaluatedProgram = useMemo(() => Program_evaluate(program, settings), [program, settings]);\n  const [musclesModal, setMusclesModal] = useState<IPreviewProgramMuscles | undefined>(undefined);\n  const isWeb = Platform.OS === \"web\";\n  const headerContent = props.headerContent;\n\n  const previewHeader = useMemo(\n    () => (\n      <View>\n        {headerContent}\n        <View className=\"px-4\">\n          <View className=\"flex-row items-center pt-2\">\n            <View className=\"flex-1\">\n              {program.url ? (\n                <Link\n                  testID=\"program-name\"\n                  className=\"text-2xl font-bold leading-tight underline text-text-link\"\n                  href={program.url}\n                >\n                  {program.name}\n                </Link>\n              ) : (\n                <Text data-testid=\"program-name\" testID=\"program-name\" className=\"text-2xl font-bold leading-tight\">\n                  {program.name}\n                </Text>\n              )}\n            </View>\n            <Pressable\n              data-testid=\"program-show-muscles\"\n              testID=\"program-show-muscles\"\n              className=\"p-2\"\n              onPress={() => {\n                if (isWeb) {\n                  setMusclesModal({ type: \"program\" });\n                } else {\n                  navigateToModal(\"programPreviewMusclesModal\", { type: \"program\" });\n                }\n              }}\n            >\n              <IconMuscles2 />\n            </Pressable>\n          </View>\n          <View>\n            {program.author && (\n              <Text\n                data-testid=\"program-author\"\n                testID=\"program-author\"\n                className=\"text-sm font-bold uppercase text-text-secondary\"\n              >\n                By {program.author}\n              </Text>\n            )}\n            <View className=\"flex-row items-start py-1\">\n              <View className=\"mt-0.5\">\n                <IconWatch />\n              </View>\n              <Text className=\"flex-1 ml-1\">\n                Average time to finish a workout:{\" \"}\n                <Text className=\"font-bold\">\n                  {TimeUtils_formatHHMM(Program_dayAverageTimeMs(evaluatedProgram, settings))}\n                </Text>\n              </Text>\n            </View>\n            <View className=\"flex-row items-start py-1\">\n              <View className=\"mt-0.5\">\n                <IconDoc width={15} height={20} />\n              </View>\n              <Text className=\"flex-1 ml-1 text-text-secondary\">\n                {evaluatedProgram.weeks.length > 1 &&\n                  `${evaluatedProgram.weeks.length} ${StringUtils_pluralize(\"week\", evaluatedProgram.weeks.length)}, `}\n                {Program_daysRange(evaluatedProgram)}, {Program_exerciseRange(evaluatedProgram)}\n              </Text>\n            </View>\n            {program.description && (\n              <View className=\"pt-2\">\n                <SimpleMarkdown value={program.description} />\n              </View>\n            )}\n          </View>\n        </View>\n      </View>\n    ),\n    [headerContent, program, evaluatedProgram, settings, isWeb]\n  );\n\n  if (!isWeb) {\n    return (\n      <ProgramPreviewOrPlayground\n        headerContent={previewHeader}\n        program={program}\n        settings={props.settings}\n        isMobile={props.isMobile}\n        hasNavbar={props.hasNavbar}\n        stats={props.stats}\n        useNavModals={props.useNavModals}\n      />\n    );\n  }\n\n  return (\n    <View className=\"flex-1 pb-6\">\n      <ProgramPreviewOrPlayground\n        headerContent={previewHeader}\n        program={program}\n        settings={props.settings}\n        isMobile={props.isMobile}\n        hasNavbar={props.hasNavbar}\n        stats={props.stats}\n        useNavModals={props.useNavModals}\n      />\n      {musclesModal && (\n        <ProgramPreviewMusclesModal\n          muscles={musclesModal}\n          onClose={() => setMusclesModal(undefined)}\n          stats={props.stats}\n          program={evaluatedProgram}\n          subscription={props.subscription}\n          dispatch={props.dispatch}\n          settings={props.settings}\n        />\n      )}\n    </View>\n  );\n}\n\ninterface IProgramPreviewMusclesModalProps {\n  muscles: IPreviewProgramMuscles;\n  program: IEvaluatedProgram;\n  stats: IStats;\n  settings: ISettings;\n  dispatch?: IDispatch;\n  subscription: ISubscription;\n  onClose: () => void;\n}\n\nexport function ProgramPreviewMusclesModal(props: IProgramPreviewMusclesModalProps): JSX.Element {\n  let points: IPoints | undefined;\n  let name = \"\";\n  if (props.muscles.type === \"program\") {\n    points = Muscle_normalizePoints(Muscle_getPointsForProgram(props.program, props.stats, props.settings));\n    name = props.program.name;\n  } else {\n    const programDay = Program_getProgramDay(props.program, props.muscles.dayIndex + 1);\n    if (programDay) {\n      points = Muscle_normalizePoints(Muscle_getPointsForDay(props.program, programDay, props.stats, props.settings));\n      name = programDay.name;\n    }\n  }\n  if (!points || !name) {\n    return <></>;\n  }\n  const title =\n    props.muscles.type === \"program\" ? `Muscles for program '${props.program.name}'` : `Muscles for day '${name}'`;\n\n  return (\n    <Modal\n      shouldShowClose={true}\n      onClose={props.onClose}\n      isFullWidth={true}\n      overflowHidden={props.dispatch && !Subscriptions_hasSubscription(props.subscription)}\n    >\n      {props.dispatch && (\n        <Locker topic=\"Muscles\" dispatch={props.dispatch} blur={8} subscription={props.subscription} />\n      )}\n      <Text className=\"pb-2 text-xl font-bold text-center\">{title}</Text>\n      <MusclesView settings={props.settings} points={points} title={props.program.name} />\n    </Modal>\n  );\n}\n","import { JSX, ReactNode, useMemo, useState } from \"react\";\nimport { View, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { ProgramPreviewPlayground } from \"./preview/programPreviewPlayground\";\nimport { IProgram, ISettings, IStats, IUnit } from \"../types\";\nimport { IconEditSquare } from \"./icons/iconEditSquare\";\nimport { MenuItemEditable, MenuItemValue } from \"./menuItemEditable\";\nimport { IScrollableTabsProps } from \"./scrollableTabs\";\n\ninterface IProgramPreviewOrPlaygroundProps {\n  program: IProgram;\n  settings: ISettings;\n  isMobile: boolean;\n  hasNavbar?: boolean;\n  onChangeUnit?: (unit: IUnit) => void;\n  stats: IStats;\n  useNavModals?: boolean;\n  headerContent?: ReactNode;\n  scrollableTabsProps?: Partial<IScrollableTabsProps>;\n}\n\nexport function ProgramPreviewOrPlayground(props: IProgramPreviewOrPlaygroundProps): JSX.Element {\n  const [isPlayground, setIsPlayground] = useState<boolean>(false);\n  const isWeb = Platform.OS === \"web\";\n  const { headerContent, isMobile, settings, onChangeUnit } = props;\n  const unitsValue = settings.units;\n\n  const playgroundHeader = useMemo(\n    () => (\n      <View pointerEvents=\"box-none\">\n        {headerContent}\n        {isWeb ? (\n          <View className=\"mx-4 mt-2\">\n            {isMobile ? (\n              <MenuItemEditable\n                name=\"Enable Playground\"\n                type=\"boolean\"\n                value={isPlayground ? \"true\" : \"false\"}\n                onChange={(v) => setIsPlayground(v === \"true\")}\n              />\n            ) : (\n              <View className=\"flex-row items-center\">\n                <Text className=\"mr-2\">Enable Playground:</Text>\n                <MenuItemValue\n                  type=\"desktop-select\"\n                  setPatternError={() => undefined}\n                  name=\"Enable Playground\"\n                  value={isPlayground ? \"true\" : \"false\"}\n                  values={[\n                    [\"true\", \"Yes\"],\n                    [\"false\", \"No\"],\n                  ]}\n                  onChange={(newValue) => setIsPlayground(newValue === \"true\")}\n                />\n                <View className=\"flex-row items-center ml-4\">\n                  <Text className=\"mr-2\">Units:</Text>\n                  <MenuItemValue\n                    name=\"Units\"\n                    setPatternError={() => undefined}\n                    type=\"desktop-select\"\n                    value={unitsValue}\n                    values={[\n                      [\"lb\", \"lb\"],\n                      [\"kg\", \"kg\"],\n                    ]}\n                    onChange={(newValue) => {\n                      if (onChangeUnit) {\n                        onChangeUnit(newValue as IUnit);\n                      }\n                    }}\n                  />\n                </View>\n              </View>\n            )}\n          </View>\n        ) : (\n          <View className=\"mx-4 mt-2\" pointerEvents=\"box-none\">\n            <MenuItemEditable\n              name=\"Enable Playground\"\n              type=\"boolean\"\n              value={isPlayground ? \"true\" : \"false\"}\n              onChange={(v) => setIsPlayground(v === \"true\")}\n            />\n          </View>\n        )}\n        {isPlayground && (\n          <Text className=\"py-2 mx-4 text-sm\" pointerEvents=\"none\">\n            Playground mode emulates the workout, you can complete sets by tapping on squares below, and see how the\n            program logic works. Some programs may do nothing, some may update the weights, some may switch to different\n            set schemes. You can adjust your weights and other variables by clicking on the <IconEditSquare /> icon.\n          </Text>\n        )}\n      </View>\n    ),\n    [headerContent, isWeb, isMobile, isPlayground, unitsValue, onChangeUnit]\n  );\n\n  return (\n    <ProgramPreviewPlayground\n      headerContent={playgroundHeader}\n      hasNavbar={props.hasNavbar}\n      key={isPlayground ? \"playground\" : \"preview\"}\n      isPlayground={isPlayground}\n      program={props.program}\n      settings={props.settings}\n      stats={props.stats}\n      useNavModals={props.useNavModals}\n      scrollableTabsProps={props.scrollableTabsProps}\n    />\n  );\n}\n","import { JSX, useEffect, useState } from \"react\";\nimport { View } from \"react-native\";\nimport QRCode from \"qrcode\";\nimport { SvgXml } from \"./primitives/svg\";\nimport { Text } from \"./primitives/text\";\n\ninterface IProgramQrCodeProps {\n  url: string;\n  size?: number;\n  title?: string;\n}\n\nexport function ProgramQrCode(props: IProgramQrCodeProps): JSX.Element | null {\n  const size = props.size ?? 160;\n  const [svg, setSvg] = useState<string | undefined>(undefined);\n\n  useEffect(() => {\n    let cancelled = false;\n    QRCode.toString(props.url, { type: \"svg\", margin: 1 })\n      .then((result) => {\n        if (!cancelled) {\n          setSvg(result);\n        }\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, [props.url]);\n\n  if (!svg) {\n    return null;\n  }\n\n  return (\n    <View className=\"mt-1\">\n      {props.title && <Text className=\"text-xs text-text-secondary\">{props.title}</Text>}\n      <SvgXml xml={svg} width={size} height={size} />\n    </View>\n  );\n}\n","import { JSX, ReactNode, Ref, forwardRef, useState } from \"react\";\nimport { View, LayoutChangeEvent } from \"react-native\";\nimport { SvgUri } from \"./primitives/svg\";\nimport { ISettings, IPlannerProgram, IPlannerProgramWeek, IPlannerProgramDay } from \"../types\";\nimport { PlannerProgram_evaluate } from \"../pages/planner/models/plannerProgram\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { equipmentName, Exercise_findByNameAndEquipment, Exercise_toKey } from \"../models/exercise\";\nimport { IPlannerEvalResult, PlannerExerciseEvaluator } from \"../pages/planner/plannerExerciseEvaluator\";\nimport {\n  PlannerProgramExercise_sets,\n  PlannerProgramExercise_progressionType,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseSet } from \"../pages/planner/models/types\";\nimport { Markdown } from \"./markdown\";\nimport { Weight_print } from \"../models/weight\";\nimport { CollectionUtils_compact, CollectionUtils_inGroupsOf } from \"../utils/collection\";\nimport { ProgramQrCode } from \"./programQrCode\";\nimport { Equipment_currentEquipment } from \"../models/equipment\";\nimport { Text } from \"./primitives/text\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\nimport { n } from \"../utils/math\";\n\nexport interface IProgramShareOutputOptions {\n  showInfo: boolean;\n  showWeekDescription: boolean;\n  showDayDescription: boolean;\n  showQRCode: boolean;\n  columns: number;\n  daysToShow: number[];\n}\n\ninterface IProgramShareOutputProps {\n  settings: ISettings;\n  program: IPlannerProgram;\n  options: IProgramShareOutputOptions;\n  url?: string;\n}\n\nfunction Card(props: { children: ReactNode }): JSX.Element {\n  return (\n    <View\n      style={{\n        shadowColor: \"#000\",\n        shadowOffset: { width: 0, height: 2 },\n        shadowOpacity: 0.1,\n        shadowRadius: 3,\n        elevation: 2,\n      }}\n      className=\"py-2 bg-background-default rounded-xl\"\n    >\n      {props.children}\n    </View>\n  );\n}\n\nexport const ProgramShareOutput = forwardRef((props: IProgramShareOutputProps, ref: Ref<View>): JSX.Element => {\n  const options = props.options;\n  const { evaluatedWeeks } = PlannerProgram_evaluate(props.program, props.settings);\n  const minDays = Math.min(...evaluatedWeeks.map((week) => week.length));\n  const maxDays = Math.max(...evaluatedWeeks.map((week) => week.length));\n  const [contentWidth, setContentWidth] = useState<number | undefined>(undefined);\n  let dayIndex = 0;\n\n  const onContentLayout = (e: LayoutChangeEvent): void => {\n    setContentWidth(e.nativeEvent.layout.width);\n  };\n\n  return (\n    <View ref={ref} collapsable={false} style={{ alignSelf: \"flex-start\" }}>\n      <View\n        className=\"flex-row gap-2 px-2 pt-2 bg-background-subtle\"\n        style={contentWidth ? { width: contentWidth } : undefined}\n      >\n        <View className=\"flex-1\">\n          {options.showInfo && (\n            <View className=\"flex-row items-center gap-2 px-1 pt-2\">\n              <Text className=\"text-4xl\">🏋️</Text>\n              <View className=\"flex-1\">\n                <Text className=\"mb-1 text-xl font-bold\">{props.program.name}</Text>\n                <Text className=\"text-base text-text-secondary\">\n                  {props.program.weeks.length > 1 && (\n                    <Text className=\"text-base text-text-secondary\">{props.program.weeks.length} weeks, </Text>\n                  )}\n                  {minDays === maxDays ? (\n                    <Text className=\"text-base text-text-secondary\">\n                      {minDays} {StringUtils_pluralize(\"day\", minDays)}\n                    </Text>\n                  ) : (\n                    <Text className=\"text-base text-text-secondary\">\n                      {minDays}-{maxDays} days\n                    </Text>\n                  )}\n                </Text>\n              </View>\n            </View>\n          )}\n        </View>\n        {props.url && options.showQRCode && <ProgramQrCode url={props.url} size={80} />}\n      </View>\n      <View className=\"p-2 bg-background-subtle\" style={{ alignSelf: \"flex-start\" }} onLayout={onContentLayout}>\n        {props.program.weeks.map((week, weekIndex) => {\n          const visibleDays = CollectionUtils_compact(\n            week.days.map((day) => {\n              const shouldInclude = options.daysToShow.includes(dayIndex);\n              let result = undefined;\n              if (shouldInclude) {\n                result = { day, dayIndex };\n              }\n              dayIndex += 1;\n              return result;\n            })\n          );\n          const groupedDays = CollectionUtils_inGroupsOf(options.columns, visibleDays);\n          return (\n            <View key={weekIndex} style={{ alignSelf: \"flex-start\" }}>\n              {options.showWeekDescription && week.description && visibleDays.length > 0 && (\n                <View className=\"mt-2\">\n                  <Card>\n                    <View className=\"px-4 pt-1\">\n                      <Markdown value={week.description} />\n                    </View>\n                  </Card>\n                </View>\n              )}\n              {groupedDays.map((days, gi) => {\n                return (\n                  <View key={gi} className=\"flex-row gap-2\">\n                    {days.map((day) => {\n                      const evaluatedDay = findDayInEvaluatedWeeks(evaluatedWeeks, day.dayIndex);\n                      if (evaluatedDay == null) {\n                        return null;\n                      }\n                      return (\n                        <View key={day.dayIndex} className=\"mt-2\" style={{ width: 384 }}>\n                          <Workout\n                            isMultiweek={props.program.weeks.length > 1}\n                            week={week}\n                            day={day.day}\n                            exercises={evaluatedDay.filter((e) => !e.notused)}\n                            settings={props.settings}\n                            options={props.options}\n                          />\n                        </View>\n                      );\n                    })}\n                  </View>\n                );\n              })}\n            </View>\n          );\n        })}\n        <View className=\"flex-row items-center justify-end mt-1\">\n          <SvgUri uri={HostConfig_resolveUrl(\"/images/logo.svg\")} width={24} height={24} style={{ marginRight: 4 }} />\n          <Text className=\"text-sm font-bold\">Liftosaur</Text>\n        </View>\n      </View>\n    </View>\n  );\n});\n\nfunction findDayInEvaluatedWeeks(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  dayIndex: number\n): IPlannerProgramExercise[] | undefined {\n  let currentDayIndex = 0;\n  for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n    const week = evaluatedWeeks[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex++) {\n      const day = week[dayInWeekIndex];\n      if (currentDayIndex === dayIndex) {\n        return day.success ? day.data : undefined;\n      }\n      currentDayIndex += 1;\n    }\n  }\n  return undefined;\n}\n\ninterface IWorkoutProps {\n  options: IProgramShareOutputOptions;\n  week: IPlannerProgramWeek;\n  day: IPlannerProgramDay;\n  exercises: IPlannerProgramExercise[];\n  settings: ISettings;\n  isMultiweek: boolean;\n}\n\nfunction Workout(props: IWorkoutProps): JSX.Element {\n  const { week, day, exercises } = props;\n  const setsNumber = exercises\n    .map((e) => PlannerProgramExercise_sets(e).reduce((m, a) => m + (a.repRange?.numberOfSets || 0), 0))\n    .reduce((a, b) => a + b, 0);\n  return (\n    <Card>\n      <View className=\"px-2\">\n        <Text className=\"px-2 py-1 text-lg font-bold\">\n          {props.isMultiweek ? `${week.name} ` : \"\"}\n          {day.name}\n        </Text>\n      </View>\n      <Text className=\"px-4 text-base text-text-secondary\">\n        {exercises.length} {StringUtils_pluralize(\"exercise\", exercises.length)}\n        {\" · \"}\n        {setsNumber} {StringUtils_pluralize(\"set\", setsNumber)}\n      </Text>\n      {day.description && (\n        <View className=\"px-2 py-1 mx-4 my-2 rounded-md bg-background-subtle\">\n          <Markdown value={day.description} />\n        </View>\n      )}\n      {exercises.map((plannerProgramExercise, i) => {\n        const { name, equipment } = PlannerExerciseEvaluator.extractNameParts(\n          plannerProgramExercise.fullName,\n          props.settings.exercises\n        );\n        const allEquipment = Equipment_currentEquipment(props.settings);\n        const nameAndEquipment = `${name}${equipment ? `, ${equipmentName(equipment, allEquipment)}` : \"\"}`;\n        const exercise = Exercise_findByNameAndEquipment(nameAndEquipment, props.settings.exercises);\n        if (!exercise) {\n          return null;\n        }\n        const descriptions = plannerProgramExercise.descriptions.values.filter((d) => d.isCurrent);\n        if (descriptions.length === 0) {\n          const firstDescription = plannerProgramExercise.descriptions.values[0];\n          if (firstDescription != null) {\n            descriptions.push(firstDescription);\n          }\n        }\n\n        return (\n          <View key={i} className={`mx-4 pb-4 ${i > 0 ? \"pt-2 border-t border-border-neutral\" : \"\"}`}>\n            <View className=\"flex-row items-stretch pl-1\" style={{ paddingRight: 1 }} key={Exercise_toKey(exercise)}>\n              <View className=\"flex-row items-center w-scaled-12 pr-2\">\n                <ExerciseImage suppressCustom={true} exerciseType={exercise} size=\"small\" settings={props.settings} />\n              </View>\n              <View className=\"flex-col justify-center flex-1\">\n                <View className=\"flex-row items-center w-full gap-2\">\n                  <Text className=\"flex-1 text-base font-bold\">{plannerProgramExercise.fullName}</Text>\n                  <View className=\"flex-col pr-2\">\n                    {PlannerProgramExercise_sets(plannerProgramExercise).map((set, si) => {\n                      return <Set key={si} set={set} />;\n                    })}\n                  </View>\n                </View>\n              </View>\n            </View>\n            <View>\n              <Progression exercise={plannerProgramExercise} />\n            </View>\n            {descriptions.length > 0 && (\n              <View className=\"px-2 py-1 mt-2 rounded-md bg-background-subtle\">\n                {descriptions.map((d) => (\n                  <Markdown key={d.value} value={d.value} />\n                ))}\n              </View>\n            )}\n          </View>\n        );\n      })}\n    </Card>\n  );\n}\n\ninterface ISetProps {\n  set: IPlannerProgramExerciseSet;\n}\n\nfunction Set(props: ISetProps): JSX.Element | null {\n  const set = props.set;\n  const repRange = set.repRange;\n  if (!repRange) {\n    return null;\n  }\n  return (\n    <Text className=\"text-base leading-scaled-4 text-right text-text-secondary\">\n      {repRange.numberOfSets > 1 && (\n        <Text className=\"text-base text-text-secondary\">\n          <Text className=\"text-base font-semibold text-text-purple\">{repRange.numberOfSets}</Text>\n          <Text className=\"text-xs text-text-secondary\"> × </Text>\n        </Text>\n      )}\n      {repRange.minrep == null ? (\n        <Text className=\"text-base font-semibold text-text-primary\">{repRange.maxrep}</Text>\n      ) : (\n        <Text className=\"text-base text-text-secondary\">\n          <Text className=\"text-base font-semibold text-text-primary\">{repRange.minrep}</Text>\n          <Text className=\"text-base text-text-secondary\">-</Text>\n          <Text className=\"text-base font-semibold text-text-primary\">{repRange.maxrep}</Text>\n        </Text>\n      )}\n      {repRange.isAmrap && <Text className=\"text-base font-semibold text-text-primary\">+</Text>}\n      {set.weight ? (\n        <Text className=\"text-base text-text-secondary\">\n          <Text className=\"text-xs text-text-secondary\"> × </Text>\n          <Text className=\"text-base text-text-primary\">{n(set.weight.value)}</Text>\n          {set.askWeight && <Text className=\"text-base font-semibold text-text-primary\">+</Text>}\n          <Text className=\"text-xs text-text-secondary\">{set.weight.unit}</Text>\n        </Text>\n      ) : set.percentage ? (\n        <Text className=\"text-base text-text-secondary\">\n          <Text className=\"text-xs text-text-secondary\"> × </Text>\n          <Text className=\"text-base text-text-primary\">{set.percentage}</Text>\n          {set.askWeight && <Text className=\"text-base font-semibold text-text-primary\">+</Text>}\n          <Text className=\"text-xs text-text-secondary\">%</Text>\n        </Text>\n      ) : null}\n      {set.rpe != null && (\n        <Text className=\"ml-1 text-base text-greenv2-900\">\n          <Text className=\"text-xs text-greenv2-900\">@</Text>\n          <Text className=\"text-sm text-greenv2-900\">{set.rpe}</Text>\n        </Text>\n      )}\n      {set.logRpe && <Text className=\"text-base text-greenv2-900\">+</Text>}\n      {set.timer != null && (\n        <Text className=\"ml-1 text-xs text-purplev2-900\">\n          {set.timer}\n          <Text className=\"text-xs text-purplev2-900\">s</Text>\n        </Text>\n      )}\n    </Text>\n  );\n}\n\ninterface IProgressionProps {\n  exercise: IPlannerProgramExercise;\n}\n\nexport function Progression(props: IProgressionProps): JSX.Element | null {\n  const type = PlannerProgramExercise_progressionType(props.exercise);\n  if (type == null) {\n    return null;\n  }\n  switch (type.type) {\n    case \"linear\":\n      return (\n        <Text className=\"text-sm\">\n          <Text className=\"text-sm font-bold\">Linear Progression:</Text>\n          <Text className=\"text-sm\"> </Text>\n          <Text className=\"text-sm font-bold text-text-success\">+{Weight_print(type.increase)}</Text>\n          {(type.successesRequired || 0 > 1) && (\n            <Text className=\"text-sm\">\n              <Text className=\"text-sm\"> after </Text>\n              <Text className=\"text-sm font-bold text-text-success\">{type.successesRequired}</Text>\n              <Text className=\"text-sm\"> successes</Text>\n            </Text>\n          )}\n          {type.decrease != null && type.decrease.value > 0 && (\n            <Text className=\"text-sm\">\n              <Text className=\"text-sm\">, </Text>\n              <Text className=\"text-sm font-bold text-text-error\">{Weight_print(type.decrease)}</Text>\n            </Text>\n          )}\n          {type.decrease != null && type.decrease.value > 0 && (\n            <Text className=\"text-sm\">\n              <Text className=\"text-sm\"> after </Text>\n              <Text className=\"text-sm font-bold text-text-error\">{type.failuresRequired}</Text>\n              <Text className=\"text-sm\"> failures</Text>\n            </Text>\n          )}\n          <Text className=\"text-sm\">.</Text>\n        </Text>\n      );\n    case \"double\":\n      return (\n        <Text className=\"text-sm\">\n          <Text className=\"text-sm font-bold\">Double Progression</Text>\n          <Text className=\"text-sm\">: </Text>\n          <Text className=\"text-sm font-bold text-text-success\">+{Weight_print(type.increase)}</Text>\n          <Text className=\"text-sm\"> within </Text>\n          <Text className=\"text-sm font-bold\">{type.minReps}</Text>\n          <Text className=\"text-sm\">-</Text>\n          <Text className=\"text-sm font-bold\">{type.maxReps}</Text>\n          <Text className=\"text-sm\"> rep range.</Text>\n        </Text>\n      );\n    case \"sumreps\":\n      return (\n        <Text className=\"text-sm\">\n          <Text className=\"text-sm font-bold\">Sum Reps Progression</Text>\n          <Text className=\"text-sm\">: </Text>\n          <Text className=\"text-sm font-bold text-text-success\">+{Weight_print(type.increase)}</Text>\n          <Text className=\"text-sm\"> if sum of all reps is at least </Text>\n          <Text className=\"text-sm font-bold\">{type.reps}</Text>\n          <Text className=\"text-sm\">.</Text>\n        </Text>\n      );\n    case \"custom\":\n      return (\n        <Text className=\"text-sm\">\n          <Text className=\"text-sm font-bold\">Custom Progression</Text>\n        </Text>\n      );\n  }\n}\n","import { JSX, memo } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IEvaluatedProgram, Program_computeProgressStateChanges } from \"../models/program\";\nimport { ObjectUtils_isNotEmpty, ObjectUtils_keys } from \"../utils/object\";\nimport { Weight_print } from \"../models/weight\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { Reps_isFinished } from \"../models/set\";\nimport { IHistoryEntry, ISettings, IProgramState, IDayData, IPercentage, IWeight, IStats } from \"../types\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { LinkButton } from \"./linkButton\";\n\n// Not a \"line-through\" className - RN doesn't inherit text decoration from a View into its Text\n// children the way CSS does, so it has to sit on every Text node itself.\nconst strikeThrough = { textDecorationLine: \"line-through\" } as const;\n\ninterface IProps {\n  entry: IHistoryEntry;\n  settings: ISettings;\n  dayData: IDayData;\n  programExercise: IPlannerProgramExercise;\n  program: IEvaluatedProgram;\n  stats: IStats;\n  userPromptedStateVars?: IProgramState;\n  onSuppressProgress?: (isSuppressed: boolean) => void;\n  forceShow?: boolean;\n}\n\nfunction ProgressStateChangesInner(props: IProps): JSX.Element | null {\n  const { entry, settings, dayData } = props;\n  const showEndOfDay = props.forceShow || Reps_isFinished(entry.sets);\n  const changes = showEndOfDay\n    ? Program_computeProgressStateChanges(\n        entry,\n        dayData,\n        settings,\n        props.programExercise,\n        props.program,\n        props.stats,\n        props.userPromptedStateVars\n      )\n    : undefined;\n  if (showEndOfDay && !changes) {\n    return null;\n  }\n\n  return (\n    <ProgressStateChangesView\n      diffState={changes?.diffState}\n      diffVars={changes?.diffVars}\n      prints={changes?.prints}\n      updatePrints={entry.updatePrints}\n      isSuppressed={entry.isSuppressed}\n      onSuppressProgress={props.onSuppressProgress}\n    />\n  );\n}\n\nexport const ProgressStateChanges = memo(ProgressStateChangesInner);\n\ninterface IViewProps {\n  diffState?: Record<string, string | undefined>;\n  diffVars?: Record<string, string | undefined>;\n  prints?: (number | IWeight | IPercentage)[][];\n  updatePrints?: (number | IWeight | IPercentage)[][];\n  isSuppressed?: boolean;\n  onSuppressProgress?: (isSuppressed: boolean) => void;\n}\n\nexport function ProgressStateChangesView(props: IViewProps): JSX.Element | null {\n  const diffState = props.diffState ?? {};\n  const diffVars = props.diffVars ?? {};\n  const prints = props.prints ?? [];\n  const updatePrints = props.updatePrints ?? [];\n  const hasDiffState = ObjectUtils_isNotEmpty(diffState);\n  const hasDiffVars = ObjectUtils_isNotEmpty(diffVars);\n  const onSuppressProgress = props.onSuppressProgress;\n\n  if (!hasDiffVars && !hasDiffState && prints.length === 0 && updatePrints.length === 0) {\n    return null;\n  }\n\n  return (\n    <View\n      data-help-id=\"progress-state-changes\"\n      data-help=\"This shows how state variables of the exercise are going to change after finishing this workout day. It usually indicates progression or deload, so next time you'd do more/less reps, or lift more/less weight.\"\n    >\n      <View>\n        {hasDiffVars && <ExerciseChanges diffVars={diffVars} isSuppressed={props.isSuppressed} />}\n        {hasDiffState && <StateVariablesChanges diffState={diffState} isSuppressed={props.isSuppressed} />}\n        {prints.length > 0 && <Prints title=\"Progress Prints\" prints={prints} />}\n        {updatePrints.length > 0 && <Prints title=\"Update Prints\" prints={updatePrints} />}\n      </View>\n      {onSuppressProgress && (\n        <View>\n          <LinkButton\n            name=\"supress-progress\"\n            className=\"text-xs\"\n            data-testid=\"suppress-progress\"\n            testID=\"suppress-progress\"\n            onClick={() => {\n              onSuppressProgress(!props.isSuppressed);\n            }}\n          >\n            {props.isSuppressed ? \"Enable\" : \"Suppress\"}\n          </LinkButton>\n        </View>\n      )}\n    </View>\n  );\n}\n\nfunction ExerciseChanges({\n  diffVars,\n  isSuppressed,\n}: {\n  diffVars: Record<string, string | undefined>;\n  isSuppressed?: boolean;\n}): JSX.Element | null {\n  if (ObjectUtils_isNotEmpty(diffVars)) {\n    const strike = isSuppressed ? strikeThrough : undefined;\n    return (\n      <View>\n        <Text className=\"text-xs font-bold\">Exercise Changes</Text>\n        <View data-testid=\"variable-changes\" testID=\"variable-changes\">\n          {ObjectUtils_keys(diffVars).map((key) => (\n            <View\n              key={key}\n              data-testid={`variable-changes-key-${StringUtils_dashcase(key)}`}\n              testID={`variable-changes-key-${StringUtils_dashcase(key)}`}\n            >\n              <Text style={strike} className=\"text-xs\">\n                <Text style={strike} className=\"text-xs italic\">\n                  {key}\n                </Text>\n                :{\" \"}\n                <Text\n                  style={strike}\n                  className=\"text-xs font-bold\"\n                  data-testid={`variable-changes-value-${StringUtils_dashcase(key)}`}\n                  testID={`variable-changes-value-${StringUtils_dashcase(key)}`}\n                >\n                  {diffVars[key]}\n                </Text>\n              </Text>\n            </View>\n          ))}\n        </View>\n      </View>\n    );\n  }\n  return null;\n}\n\nfunction StateVariablesChanges({\n  diffState,\n  isSuppressed,\n}: {\n  diffState: Record<string, string | undefined>;\n  isSuppressed?: boolean;\n}): JSX.Element | null {\n  if (ObjectUtils_isNotEmpty(diffState)) {\n    const strike = isSuppressed ? strikeThrough : undefined;\n    return (\n      <View>\n        <Text style={strike} className=\"text-xs font-bold\">\n          State Variables changes\n        </Text>\n        <View data-testid=\"state-changes\" testID=\"state-changes\">\n          {ObjectUtils_keys(diffState).map((key) => (\n            <View\n              key={key}\n              data-testid={`state-changes-key-${StringUtils_dashcase(key)}`}\n              testID={`state-changes-key-${StringUtils_dashcase(key)}`}\n            >\n              <Text style={strike} className=\"text-xs\">\n                <Text style={strike} className=\"text-xs italic\">\n                  {key}\n                </Text>\n                :{\" \"}\n                <Text\n                  style={strike}\n                  className=\"text-xs font-bold\"\n                  data-testid={`state-changes-value-${StringUtils_dashcase(key)}`}\n                  testID={`state-changes-value-${StringUtils_dashcase(key)}`}\n                >\n                  {diffState[key]}\n                </Text>\n              </Text>\n            </View>\n          ))}\n        </View>\n      </View>\n    );\n  }\n  return null;\n}\n\nfunction Prints({\n  title,\n  prints,\n}: {\n  title: string;\n  prints: (IWeight | IPercentage | number)[][];\n}): JSX.Element | null {\n  if (prints.length > 0) {\n    return (\n      <View>\n        <Text className=\"text-xs font-bold\">{title}</Text>\n        <View>\n          {prints.map((print) => (\n            <View key={JSON.stringify(print)}>\n              <Text className=\"text-xs\">\n                {print.map((p, i) => (\n                  <Text key={i}>\n                    {i > 0 ? \", \" : \"\"}\n                    {Weight_print(p)}\n                  </Text>\n                ))}\n              </Text>\n            </View>\n          ))}\n        </View>\n      </View>\n    );\n  }\n  return null;\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Weight_calculateRepMax } from \"../models/weight\";\nimport { IUnit } from \"../types\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\n\ninterface IRepMaxCalculatorProps {\n  unit: IUnit;\n  backLabel: string;\n  onSelect: (weight?: number) => void;\n}\n\nexport function RepMaxCalculator(props: IRepMaxCalculatorProps): JSX.Element {\n  const [knownReps, setKnownReps] = useState<string>(\"5\");\n  const [knownRpe, setKnownRpe] = useState<string>(\"10\");\n  const [knownWeight, setKnownWeight] = useState<string>(\"200\");\n  const [targetReps, setTargetReps] = useState<string>(\"1\");\n  const [targetRpe, setTargetRpe] = useState<string>(\"10\");\n\n  function parseAndClamp(raw: string, type: \"int\" | \"float\", min: number, max: number): number {\n    const num = type === \"int\" ? parseInt(raw, 10) : parseFloat(raw);\n    const val = isNaN(num) ? 1 : num;\n    return Math.min(Math.max(val, min), max);\n  }\n\n  const weight = Weight_calculateRepMax(\n    parseAndClamp(knownReps, \"int\", 1, 24),\n    parseAndClamp(knownRpe, \"float\", 1, 10),\n    parseAndClamp(knownWeight, \"float\", 1, 9999),\n    parseAndClamp(targetReps, \"int\", 1, 24),\n    parseAndClamp(targetRpe, \"float\", 1, 10)\n  );\n\n  return (\n    <View>\n      <Text className=\"mb-4 text-xl font-bold text-center\">Rep Max Calculator</Text>\n      <Text className=\"mb-2\">Enter the weight you lift for number of reps and RPE. For Rep Max, use 10 RPE.</Text>\n      <View className=\"flex-row items-center mb-4 gap-2\">\n        <View className=\"flex-1\">\n          <Input\n            type=\"number\"\n            label=\"Reps\"\n            data-testid=\"rep-max-calculator-known-reps\"\n            testID=\"rep-max-calculator-known-reps\"\n            identifier=\"rep-max-calculator-known-reps\"\n            value={knownReps}\n            maxLength={2}\n            min={1}\n            max={24}\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setKnownReps(e.data);\n              }\n            }}\n          />\n        </View>\n        <Text>@</Text>\n        <View className=\"flex-1\">\n          <Input\n            type=\"number\"\n            label=\"RPE\"\n            value={knownRpe}\n            maxLength={4}\n            data-testid=\"rep-max-calculator-known-rpe\"\n            testID=\"rep-max-calculator-known-rpe\"\n            identifier=\"rep-max-calculator-known-rpe\"\n            min={1}\n            max={10}\n            step=\"0.5\"\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setKnownRpe(e.data);\n              }\n            }}\n          />\n        </View>\n        <Text>x</Text>\n        <View className=\"flex-1\">\n          <Input\n            type=\"number\"\n            label=\"Weight\"\n            data-testid=\"rep-max-calculator-known-weight\"\n            testID=\"rep-max-calculator-known-weight\"\n            identifier=\"rep-max-calculator-known-weight\"\n            value={knownWeight}\n            maxLength={8}\n            max={99999}\n            min={0}\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setKnownWeight(e.data);\n              }\n            }}\n          />\n        </View>\n        <Text>{props.unit}</Text>\n      </View>\n      <Text className=\"mb-2\">Now enter the Reps & RPE you want to find out your weight for:</Text>\n      <View className=\"flex-row items-center mb-4 gap-2\">\n        <View className=\"flex-1\">\n          <Input\n            type=\"number\"\n            data-testid=\"rep-max-calculator-target-reps\"\n            testID=\"rep-max-calculator-target-reps\"\n            identifier=\"rep-max-calculator-target-reps\"\n            value={targetReps}\n            label=\"Reps\"\n            min={1}\n            max={24}\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setTargetReps(e.data);\n              }\n            }}\n          />\n        </View>\n        <Text>@</Text>\n        <View className=\"flex-1\">\n          <Input\n            type=\"number\"\n            data-testid=\"rep-max-calculator-target-rpe\"\n            testID=\"rep-max-calculator-target-rpe\"\n            identifier=\"rep-max-calculator-target-rpe\"\n            label=\"RPE\"\n            value={targetRpe}\n            min={1}\n            max={10}\n            step=\"0.5\"\n            changeType=\"oninput\"\n            changeHandler={(e) => {\n              if (e.success) {\n                setTargetRpe(e.data);\n              }\n            }}\n          />\n        </View>\n        <Text>=</Text>\n        <View\n          className=\"flex-1\"\n          data-testid=\"rep-max-calculator-target-weight\"\n          testID=\"rep-max-calculator-target-weight\"\n        >\n          <Text className=\"text-lg font-bold\">\n            {weight} {props.unit}\n          </Text>\n        </View>\n      </View>\n      <View className=\"flex-row gap-2\">\n        <View className=\"flex-1 items-center\">\n          <Button\n            name=\"rep-max-calculator-back\"\n            kind=\"grayv2\"\n            onClick={() => props.onSelect()}\n            data-testid=\"rep-max-calculator-back\"\n            testID=\"rep-max-calculator-back\"\n          >\n            {props.backLabel}\n          </Button>\n        </View>\n        <View className=\"flex-1 items-center\">\n          <Button\n            name=\"rep-max-calculator-submit\"\n            kind=\"purple\"\n            data-testid=\"rep-max-calculator-submit\"\n            testID=\"rep-max-calculator-submit\"\n            onClick={() => props.onSelect(weight)}\n          >\n            Use it!\n          </Button>\n        </View>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable, Platform, Animated, useWindowDimensions } from \"react-native\";\nimport Reanimated, {\n  Easing,\n  FadeIn,\n  FadeOut,\n  LinearTransition,\n  useAnimatedStyle,\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useCustomKeyboardActiveId } from \"../navigation/CustomKeyboardContext\";\nimport { useActiveSheet } from \"../navigation/ActiveSheetHeightContext\";\nimport { useTrackedState } from \"../navigation/TrackedStateContext\";\nimport { Text } from \"./primitives/text\";\nimport { TimeUtils_formatMMSS } from \"../utils/time\";\nimport { StringUtils_pad } from \"../utils/string\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_playAudioNotification, Thunk_updateTimer, Thunk_checkSetTimer } from \"../ducks/thunks\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { IconBack } from \"./icons/iconBack\";\nimport { IHistoryRecord, ISettings, ISubscription } from \"../types\";\nimport { Reps_findNextEntryAndSetIndex } from \"../models/set\";\nimport { Progress_getCurrentProgress } from \"../models/progress\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { useRem, useRemScale } from \"../utils/useRem\";\nimport { TEXT_SIZE_MAX } from \"../models/settings\";\nimport { RestTimerProgress_at } from \"../models/restTimerProgress\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { RestTimerWidth_em } from \"../models/restTimerWidth\";\n\nconst TEXT_2XL_PX = 24;\n\nconst TRANSITION_MS = 220;\nconst RestTimerLayoutTransition =\n  Platform.OS === \"web\" ? undefined : LinearTransition.duration(TRANSITION_MS).easing(Easing.inOut(Easing.quad));\nconst RestTimerContentEntering = Platform.OS === \"web\" ? undefined : FadeIn.duration(TRANSITION_MS);\nconst RestTimerContentExiting = Platform.OS === \"web\" ? undefined : FadeOut.duration(TRANSITION_MS / 2);\n\nfunction useRestTimerProgressStyle(\n  timerSince: number | undefined,\n  timer: number | undefined\n): ReturnType<typeof useAnimatedStyle> {\n  const fraction = useSharedValue(0);\n  // No cancelAnimation in cleanup: scheduleOnUI runs after the next .value write, so it stopped the new rest at 0.\n  useEffect(() => {\n    if (timerSince == null || timer == null) {\n      return;\n    }\n    const progress = RestTimerProgress_at(timerSince, timer, Date.now());\n    fraction.value = progress.fraction;\n    if (progress.remainingMs > 0) {\n      fraction.value = withTiming(1, { duration: progress.remainingMs, easing: Easing.linear });\n    }\n  }, [timerSince, timer, fraction]);\n  return useAnimatedStyle(() => ({ transform: [{ scaleX: fraction.value }] }));\n}\n\nfunction useRestTimerTick(isActive: boolean): void {\n  const [, setTick] = useState(0);\n  useEffect(() => {\n    if (!isActive) {\n      return undefined;\n    }\n    const intervalId = setInterval(() => setTick((t) => t + 1), 1000);\n    return () => clearInterval(intervalId);\n  }, [isActive]);\n}\n\nexport function RestTimer_formatCompact(ms: number): string {\n  const seconds = Math.floor((ms / 1000) % 60);\n  const minutes = Math.floor(ms / 1000 / 60);\n  return `${minutes}:${StringUtils_pad(seconds.toString(), 2)}`;\n}\n\ninterface IProps {\n  progress: IHistoryRecord;\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  settings: ISettings;\n}\n\nconst shadowStyle = Platform.select({\n  ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: 0 }, shadowOpacity: 0.25, shadowRadius: 8 },\n  android: { elevation: 8 },\n  default: { boxShadow: \"0px 0px 8px rgb(0 0 0 / 25%)\" },\n});\n\nexport function RestTimer(props: IProps): JSX.Element | null {\n  const prevProps = useRef<IProps>(props);\n  const sentNotification = useRef<boolean>(false);\n  const [isExpanded, setIsExpanded] = useState(false);\n  const trackClick = useTrackClick();\n  const insets = useSafeAreaInsets();\n  const keyboardActiveId = useCustomKeyboardActiveId();\n  const { height: windowHeight } = useWindowDimensions();\n  const activeSheet = useActiveSheet();\n  const expandedSpacing = useRem() >= TEXT_SIZE_MAX ? 4 : 8;\n  const remScale = useRemScale();\n  const activeSheetHeight = activeSheet.height;\n  // When the custom keyboard is open, the timer is shown inside it (see KeyboardRestTimer), so hide\n  // the floating one here. We keep it mounted (not returning null) so the completion chirp still fires.\n  const hideTimer = activeSheet.hidesFloatingUi || activeSheetHeight > windowHeight * 0.5 || keyboardActiveId != null;\n  const baseBottom = insets.bottom + 80;\n  const targetBottom = Math.max(baseBottom, activeSheetHeight > 0 ? activeSheetHeight + 16 : 0);\n  const animatedTargetBottom = useRef(new Animated.Value(targetBottom)).current;\n  const animatedOpacity = useRef(new Animated.Value(1)).current;\n  const wasHiddenRef = useRef(false);\n  useEffect(() => {\n    if (hideTimer) {\n      animatedTargetBottom.setValue(targetBottom);\n      animatedOpacity.setValue(0);\n      wasHiddenRef.current = true;\n    } else if (wasHiddenRef.current) {\n      animatedTargetBottom.setValue(targetBottom);\n      animatedOpacity.setValue(0);\n      Animated.timing(animatedOpacity, { toValue: 1, duration: 200, useNativeDriver: false }).start();\n      wasHiddenRef.current = false;\n    } else {\n      animatedOpacity.setValue(1);\n      Animated.timing(animatedTargetBottom, {\n        toValue: targetBottom,\n        duration: 200,\n        useNativeDriver: false,\n      }).start();\n    }\n  }, [hideTimer, targetBottom, animatedTargetBottom, animatedOpacity]);\n  const { progress } = props;\n  const { timer, timerSince } = progress;\n\n  useRestTimerTick(timerSince != null);\n  const progressStyle = useRestTimerProgressStyle(timerSince, timer);\n\n  useEffect(() => {\n    if (timerSince != null) {\n      const timeDifference = Date.now() - timerSince;\n      const timerMs = timer != null ? timer * 1000 : 0;\n      // Only play notification within 5s of completion; avoids repeat plays when syncing from another device past the threshold\n      const maxNotificationWindowMs = 5000;\n      if (\n        timer != null &&\n        timeDifference > timerMs &&\n        timeDifference <= timerMs + maxNotificationWindowMs &&\n        !sentNotification.current\n      ) {\n        if (!progress.ui?.nativeNotificationScheduled) {\n          props.dispatch(Thunk_playAudioNotification());\n        }\n        sentNotification.current = true;\n      } else if (timer != null && timeDifference > timerMs + maxNotificationWindowMs) {\n        sentNotification.current = true;\n      }\n      // Reset on any deadline change (start time OR duration), so extending the timer re-arms the chirp\n      const prevDeadline =\n        (prevProps.current.progress.timerSince ?? 0) + (prevProps.current.progress.timer ?? 0) * 1000;\n      const currDeadline = (props.progress.timerSince ?? 0) + (props.progress.timer ?? 0) * 1000;\n      if (prevDeadline !== currDeadline) {\n        sentNotification.current = false;\n      }\n    }\n    prevProps.current = props;\n  });\n\n  // The corner rest timer shows the rest for `auto` timed sets. Poll the model each tick so it advances\n  // to the next set's work window when the rest expires; a cheap no-op otherwise (Progress_checkSetTimer).\n  useEffect(() => {\n    if (timer == null || timerSince == null) {\n      return;\n    }\n    props.dispatch(Thunk_checkSetTimer());\n  });\n\n  if (timer == null || timerSince == null) {\n    return null;\n  }\n  const pointerEventsMode = hideTimer ? \"none\" : \"box-none\";\n\n  const { elapsedMs, isTimeOut } = RestTimerProgress_at(timerSince, timer, Date.now());\n  const elapsedText = TimeUtils_formatMMSS(elapsedMs);\n  const bgClass = isTimeOut ? \"bg-background-darkred\" : \"bg-background-darkgray\";\n  const totalColorClass = isTimeOut ? \"text-white\" : \"text-gray-300\";\n  const nextEntryAndSetIndex =\n    progress.timerEntryIndex != null && progress.timerMode != null\n      ? Reps_findNextEntryAndSetIndex(progress, progress.timerEntryIndex, progress.timerMode)\n      : undefined;\n  const expanded = (\n    <View className=\"flex-row items-center\" style={{ gap: expandedSpacing, padding: expandedSpacing }}>\n      <Pressable\n        data-testid=\"rest-timer-minus\"\n        testID=\"rest-timer-minus\"\n        className=\"relative items-center justify-center px-1 min-w-scaled-10 min-h-scaled-10\"\n        onPress={() => {\n          trackClick(\"rest-timer-minus\");\n          props.dispatch(\n            Thunk_updateTimer(timer - 15, nextEntryAndSetIndex?.entryIndex, nextEntryAndSetIndex?.setIndex, false)\n          );\n        }}\n      >\n        <View className=\"absolute inset-0 rounded-lg bg-background-default\" style={{ opacity: 0.2 }} />\n        <Text numberOfLines={1} className=\"font-bold text-text-alwayswhite\" style={{ userSelect: \"none\" }}>\n          -15s\n        </Text>\n      </Pressable>\n      <Pressable\n        data-testid=\"rest-timer-cancel\"\n        testID=\"rest-timer-cancel\"\n        className=\"relative items-center justify-center min-w-scaled-10 min-h-scaled-10\"\n        onPress={() => {\n          trackClick(\"rest-timer-cancel\");\n          props.dispatch({ type: \"StopTimer\" });\n        }}\n      >\n        <View className=\"absolute inset-0 rounded-lg bg-background-default\" style={{ opacity: 0.2 }} />\n        <IconTrash color=\"white\" />\n      </Pressable>\n      <Pressable\n        data-testid=\"rest-timer-expanded\"\n        testID=\"rest-timer-expanded\"\n        className=\"items-center justify-center flex-1\"\n        onPress={() => setIsExpanded(false)}\n      >\n        <Text\n          numberOfLines={1}\n          data-testid=\"rest-timer-current\"\n          className=\"text-2xl font-bold text-text-alwayswhite\"\n          style={{ userSelect: \"none\" }}\n        >\n          {elapsedText}\n        </Text>\n        <Text\n          numberOfLines={1}\n          data-testid=\"rest-timer-total\"\n          className={`text-sm ${totalColorClass}`}\n          style={{ userSelect: \"none\" }}\n        >\n          {TimeUtils_formatMMSS(timer * 1000)}\n        </Text>\n      </Pressable>\n      <Pressable\n        data-testid=\"rest-timer-back\"\n        testID=\"rest-timer-back\"\n        className=\"relative items-center justify-center min-w-scaled-10 min-h-scaled-10\"\n        onPress={() => setIsExpanded(false)}\n      >\n        <View className=\"absolute inset-0 rounded-lg bg-background-default\" style={{ opacity: 0.2 }} />\n        <View style={{ transform: [{ rotate: \"180deg\" }] }}>\n          <IconBack color=\"white\" />\n        </View>\n      </Pressable>\n      <Pressable\n        data-testid=\"rest-timer-plus\"\n        testID=\"rest-timer-plus\"\n        className=\"relative items-center justify-center px-1 min-w-scaled-10 min-h-scaled-10\"\n        onPress={() => {\n          trackClick(\"rest-timer-plus\");\n          props.dispatch(\n            Thunk_updateTimer(timer + 15, nextEntryAndSetIndex?.entryIndex, nextEntryAndSetIndex?.setIndex, false)\n          );\n        }}\n      >\n        <View className=\"absolute inset-0 rounded-lg bg-background-default\" style={{ opacity: 0.2 }} />\n        <Text numberOfLines={1} className=\"font-bold text-text-alwayswhite\" style={{ userSelect: \"none\" }}>\n          +15s\n        </Text>\n      </Pressable>\n    </View>\n  );\n\n  const collapsed = (\n    <Pressable\n      data-testid=\"rest-timer-collapsed\"\n      testID=\"rest-timer-collapsed\"\n      onPress={() => {\n        trackClick(\"rest-timer-expand\");\n        setIsExpanded(true);\n      }}\n      className=\"items-center px-3 py-2 min-w-scaled-20\"\n    >\n      <Text\n        data-testid=\"rest-timer-current\"\n        numberOfLines={1}\n        className=\"text-2xl font-bold text-center text-text-alwayswhite\"\n        style={{ minWidth: Math.ceil(RestTimerWidth_em(elapsedText) * TEXT_2XL_PX * remScale), userSelect: \"none\" }}\n      >\n        {elapsedText}\n      </Text>\n      <Text data-testid=\"rest-timer-total\" numberOfLines={1} className={`text-sm ${totalColorClass} whitespace-nowrap`}>\n        {TimeUtils_formatMMSS(timer * 1000)}\n      </Text>\n    </Pressable>\n  );\n\n  return (\n    <Animated.View\n      style={{\n        position: \"absolute\",\n        left: 0,\n        right: 0,\n        bottom: animatedTargetBottom,\n        zIndex: 30,\n        opacity: animatedOpacity,\n      }}\n      pointerEvents={pointerEventsMode}\n    >\n      <Reanimated.View\n        layout={RestTimerLayoutTransition}\n        className={bgClass}\n        style={[\n          shadowStyle,\n          { borderRadius: 8 },\n          isExpanded ? { marginHorizontal: expandedSpacing * 2 } : { alignSelf: \"flex-end\", marginRight: 16 },\n        ]}\n      >\n        <Reanimated.View layout={RestTimerLayoutTransition} style={{ borderRadius: 8, overflow: \"hidden\" }}>\n          <Reanimated.View\n            layout={RestTimerLayoutTransition}\n            pointerEvents=\"none\"\n            style={[\n              { position: \"absolute\", left: 0, right: 0, top: 0 },\n              isExpanded ? { height: 5, opacity: 0.6 } : { bottom: 0, opacity: isTimeOut ? 0 : 0.3 },\n            ]}\n          >\n            <Reanimated.View\n              style={[\n                {\n                  flex: 1,\n                  backgroundColor: isExpanded ? Tailwind_colors().white : Tailwind_colors().black,\n                  transformOrigin: \"left\",\n                },\n                progressStyle,\n              ]}\n            />\n          </Reanimated.View>\n          <Reanimated.View\n            key={isExpanded ? \"expanded\" : \"collapsed\"}\n            entering={RestTimerContentEntering}\n            exiting={RestTimerContentExiting}\n          >\n            {isExpanded ? expanded : collapsed}\n          </Reanimated.View>\n        </Reanimated.View>\n      </Reanimated.View>\n    </Animated.View>\n  );\n}\n\nexport function KeyboardRestTimer(): JSX.Element | null {\n  const state = useTrackedState();\n  const progress = Progress_getCurrentProgress(state);\n  const timer = progress?.timer;\n  const timerSince = progress?.timerSince;\n  useRestTimerTick(timerSince != null);\n\n  if (timer == null || timerSince == null) {\n    return null;\n  }\n  const { elapsedMs, isTimeOut } = RestTimerProgress_at(timerSince, timer, Date.now());\n  return (\n    <View pointerEvents=\"none\" className=\"items-center absolute left-0 right-0 bottom-full mb-1\">\n      <Text\n        data-testid=\"keyboard-rest-timer\"\n        testID=\"keyboard-rest-timer\"\n        numberOfLines={1}\n        className={`text-xs font-bold ${isTimeOut ? \"text-text-error\" : \"text-text-secondary\"}`}\n      >\n        {RestTimer_formatCompact(elapsedMs)} /{RestTimer_formatCompact(timer * 1000)}\n      </Text>\n    </View>\n  );\n}\n","import { JSX, useEffect, useState } from \"react\";\nimport { MenuItem } from \"./menuItem\";\nimport { useAppContext } from \"./appContext\";\nimport {\n  IRestTimerAlertStatus,\n  RestTimerAlert_label,\n  RestTimerAlert_status,\n  RestTimerAlert_tapAction,\n} from \"../models/restTimerAlert\";\nimport { WebPush_browserState, WebPush_subscribe, WebPush_unsubscribe } from \"../utils/webPush\";\n\nexport function RestTimerAlertRow(): JSX.Element {\n  const { service } = useAppContext();\n  const [status, setStatus] = useState<IRestTimerAlertStatus | undefined>();\n  const [vapidKey, setVapidKey] = useState<string | undefined>();\n\n  const refresh = (): Promise<void> => WebPush_browserState().then((state) => setStatus(RestTimerAlert_status(state)));\n\n  useEffect(() => {\n    refresh();\n    service.getRestTimerPushKey().then(setVapidKey);\n  }, [service]);\n\n  const onClick = (): void => {\n    const action = status != null ? RestTimerAlert_tapAction(status) : \"none\";\n    if (action === \"subscribe\" && vapidKey != null) {\n      WebPush_subscribe(vapidKey)\n        .catch(() => undefined)\n        .finally(refresh);\n    } else if (action === \"unsubscribe\") {\n      WebPush_unsubscribe()\n        .catch(() => undefined)\n        .finally(refresh);\n    }\n  };\n\n  return (\n    <MenuItem\n      name=\"Alerts when app is closed\"\n      value={status != null ? RestTimerAlert_label(status) : undefined}\n      onClick={onClick}\n    />\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, ScrollView, Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IExerciseType, IProgram, ISettings } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { Settings_getExercisesWithUnset1RMs, Settings_setOneRM } from \"../models/settings\";\nimport { Exercise_get, Exercise_onerm, Exercise_nameWithEquipment } from \"../models/exercise\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { InputWeight2 } from \"./inputWeight2\";\nimport { Button } from \"./button\";\nimport { Weight_isPct } from \"../models/weight\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../utils/tailwindConfig\";\n\nfunction getFooterShadowStyle(): Record<string, unknown> {\n  const semantic = Tailwind_semantic();\n  const colors = Tailwind_colors();\n  return Platform.select({\n    ios: {\n      shadowColor: semantic.background.default === colors.black ? colors.white : colors.black,\n      shadowOffset: { width: 0, height: -2 },\n      shadowOpacity: 0.1,\n      shadowRadius: 4,\n    },\n    android: { elevation: 4 },\n    default: { boxShadow: \"0 0 4px 0 rgba(0, 0, 0, 0.2)\" },\n  }) as Record<string, unknown>;\n}\n\ninterface IScreen1RMProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  program: IProgram;\n  navCommon: INavCommon;\n}\n\nexport function Screen1RM(props: IScreen1RMProps): JSX.Element {\n  const [exerciseTypes] = useState<IExerciseType[]>(Settings_getExercisesWithUnset1RMs(props.program, props.settings));\n  const insets = useSafeAreaInsets();\n\n  useNavOptions({ navTitle: \"Set 1 Rep Maxes\" });\n\n  return (\n    <View className=\"flex-1 bg-background-default\">\n      <ScrollView\n        className=\"flex-1 bg-background-default\"\n        contentContainerStyle={{ paddingBottom: 80 + (insets.bottom || 16) }}\n        keyboardShouldPersistTaps=\"never\"\n        keyboardDismissMode=\"interactive\"\n      >\n        <View className=\"px-gutter pb-2\">\n          <Text className=\"text-sm\">\n            The selected program uses <Text className=\"text-sm font-bold\">1RM</Text> -{\" \"}\n            <Text className=\"text-sm font-bold\">1 Rep Max</Text> weights - it calculates set weights based on what\n            weight you can do for 1 rep max.\n          </Text>\n        </View>\n        <View className=\"px-gutter pb-2\">\n          <Text className=\"text-sm\">\n            Enter your <Text className=\"text-sm font-bold\">1 Rep Max</Text> for the following exercises. If you don't\n            know it, but you know <Text className=\"text-sm font-bold\">N rep max</Text> (for example, you remember you\n            were able to do only 5 reps with 185lb) - use the{\" \"}\n            <Text className=\"text-sm font-bold\">1 Rep Max calculator in the keyboard</Text>.\n          </Text>\n        </View>\n        <View className=\"px-gutter pb-4\">\n          <Text className=\"text-sm font-bold text-text-secondary\">\n            You can skip it - and do it later during your first workout!\n          </Text>\n        </View>\n        <View className=\"flex-row pb-1 border-b border-background-subtle\">\n          <View className=\"flex-1 pl-4\">\n            <Text className=\"text-xs text-text-secondary\">Exercise</Text>\n          </View>\n          <View className=\"pr-4 w-scaled-36\">\n            <Text className=\"text-xs text-center text-text-secondary\">1 Rep Max</Text>\n          </View>\n        </View>\n        {exerciseTypes.map((exerciseType) => {\n          const exercise = Exercise_get(exerciseType, props.settings.exercises);\n          const onerm = Exercise_onerm(exerciseType, props.settings);\n          return (\n            <View\n              key={`${exerciseType.id}_${exerciseType.equipment}`}\n              className=\"flex-row items-center py-1 border-b border-background-subtle\"\n            >\n              <View className=\"flex-row items-center flex-1 pl-4\" style={{ gap: 16 }}>\n                <View className=\"w-scaled-12\">\n                  <ExerciseImage settings={props.settings} exerciseType={exerciseType} size=\"small\" width={48} />\n                </View>\n                <View className=\"flex-1\">\n                  <Text className=\"text-base font-semibold\">\n                    {Exercise_nameWithEquipment(exercise, props.settings)}\n                  </Text>\n                </View>\n              </View>\n              <View className=\"items-center justify-center pr-4 w-scaled-36\">\n                <InputWeight2\n                  name=\"onerm-weight\"\n                  width={4}\n                  exerciseType={exerciseType}\n                  data-testid=\"onerm-weight\"\n                  testID=\"onerm-weight\"\n                  units={[\"lb\", \"kg\"] as const}\n                  inputCommitMode=\"blur\"\n                  onInput={(v) => {\n                    if (v != null && !Weight_isPct(v)) {\n                      Settings_setOneRM(props.dispatch, exerciseType, v, props.settings);\n                    }\n                  }}\n                  onBlur={(v) => {\n                    if (v != null && !Weight_isPct(v)) {\n                      Settings_setOneRM(props.dispatch, exerciseType, v, props.settings);\n                    }\n                  }}\n                  showUnitInside={true}\n                  subscription={undefined}\n                  value={onerm}\n                  max={9999}\n                  min={-9999}\n                  settings={props.settings}\n                />\n              </View>\n            </View>\n          );\n        })}\n      </ScrollView>\n      <View\n        className=\"absolute bottom-0 left-0 right-0 px-4 pt-4 bg-background-default\"\n        style={[{ paddingBottom: insets.bottom || 16 }, getFooterShadowStyle()]}\n      >\n        <Button\n          className=\"w-full\"\n          name=\"continue-1rms\"\n          kind=\"purple\"\n          buttonSize=\"lg\"\n          onClick={() => {\n            props.dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n          }}\n          data-testid=\"continue-1rms\"\n          testID=\"continue-1rms\"\n        >\n          Continue\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useEffect, useState } from \"react\";\nimport { View, Pressable, Platform, AppState } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  Thunk_logOut,\n  Thunk_googleSignIn,\n  Thunk_appleSignIn,\n  Thunk_switchAccount,\n  Thunk_deleteAccount,\n  Thunk_createAccount,\n  Thunk_deleteAccountRemote,\n  Thunk_pushScreen,\n  Thunk_openManageSubscriptions,\n  Thunk_iapRefreshActiveSubscriptions,\n  Thunk_fetchAccounts,\n} from \"../ducks/thunks\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Button } from \"./button\";\nimport { IAccount } from \"../models/account\";\nimport { AdminDebug_isDebugAccountId } from \"../models/adminDebug\";\nimport { IPartialStorage } from \"../types\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { MenuItem } from \"./menuItem\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { IconDumbbell } from \"./icons/iconDumbbell\";\nimport { IconGoogle } from \"./icons/iconGoogle\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { IconApple } from \"./icons/iconApple\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Dialog_confirm, Dialog_prompt, Dialog_alert } from \"../utils/dialog\";\nimport { EmailAuthButton } from \"./account\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { IIapActiveSubscription } from \"../utils/iapAdapter\";\nimport { SubscriptionPlan_derive, ISubscriptionPlanKind, IDerivedSubscriptionPlan } from \"../utils/subscriptionPlan\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { StoreRuntime_isIos } from \"../utils/storeRuntime\";\n\ndeclare let __HOST__: string;\n\ninterface IProps {\n  email?: string;\n  userId?: string;\n  nosync?: boolean;\n  storage: IPartialStorage;\n  subscriptionStatus?: IIapActiveSubscription[];\n  subscriptionStatusLoading?: boolean;\n  ownedLifetime?: boolean;\n  navCommon: INavCommon;\n  dispatch: IDispatch;\n}\n\nexport function ScreenAccount(props: IProps): JSX.Element {\n  const [otherAccounts, setOtherAccounts] = useState<IAccount[]>([]);\n  const [isOtherAccountsEditMode, setIsOtherAccountsEditMode] = useState<boolean>(false);\n\n  const currentAccountId = props.userId || props.storage.tempUserId;\n  const currentAccount: IAccount = {\n    id: currentAccountId,\n    email: props.email,\n    name: props.storage.settings.nickname,\n    numberOfPrograms: props.storage.programs?.length ?? 0,\n    numberOfWorkouts: props.storage.history?.length ?? 0,\n    affiliateEnabled: props.storage.settings.affiliateEnabled,\n    isCurrent: true,\n  };\n\n  function refetchAccounts(): void {\n    props.dispatch(\n      Thunk_fetchAccounts((accounts) => {\n        setOtherAccounts(accounts.filter((a) => a.id !== currentAccountId));\n      })\n    );\n  }\n\n  useEffect(() => {\n    refetchAccounts();\n  }, [currentAccountId]);\n\n  useEffect(() => {\n    props.dispatch(Thunk_iapRefreshActiveSubscriptions());\n    // Re-check on foreground so a cancel/change made in the system subscription manager (App Store /\n    // Google Play) — e.g. after tapping \"Cancel subscription\" here — is reflected when the user returns.\n    const sub = AppState.addEventListener(\"change\", (state) => {\n      if (state === \"active\") {\n        props.dispatch(Thunk_iapRefreshActiveSubscriptions());\n      }\n    });\n    return () => sub.remove();\n  }, []);\n\n  const isNative = Platform.OS === \"ios\" || Platform.OS === \"android\";\n  const plan = SubscriptionPlan_derive({\n    subscription: props.storage.subscription,\n    status: props.subscriptionStatus,\n    ownedLifetime: props.ownedLifetime,\n    isNative,\n    isIos: Platform.OS === \"ios\",\n  });\n  // \"loading\" = native subscriber whose store status hasn't arrived yet (status undefined). Spinning here\n  // (rather than flashing \"Free plan\") covers the first render and a failed getActiveSubscriptions(); once a\n  // known status arrives a re-check keeps showing it instead of flipping back to a spinner.\n  const isLoadingSubscription = plan.state === \"loading\";\n\n  useEffect(() => {\n    if (Platform.OS === \"web\" && typeof window !== \"undefined\" && window.AppleID?.auth) {\n      window.AppleID.auth.init({\n        clientId: \"com.liftosaur.www.signinapple\",\n        scope: \"email\",\n        redirectURI: `${__HOST__}/appleauthcallback.html`,\n        usePopup: true,\n      });\n    }\n  }, []);\n\n  useNavOptions({ navTitle: \"Account\", navHelpKey: \"account\" });\n\n  const premiumCard = buildPremiumCard(plan);\n\n  const semantic = Tailwind_semantic();\n  const colors = Tailwind_colors();\n  const googleShadow = Platform.select({\n    ios: {\n      shadowColor: semantic.background.default === colors.black ? colors.white : colors.black,\n      shadowOffset: { width: 0, height: 1 },\n      shadowOpacity: 0.1,\n      shadowRadius: 4,\n    },\n    android: { elevation: 2 },\n    default: { boxShadow: \"0 1px 4px 0 rgba(0,0,0,0.1)\" },\n  });\n\n  return (\n    <View className=\"px-gutter\">\n      <GroupHeader name=\"Current Account\" />\n      <MenuItem\n        isBorderless={true}\n        expandName={true}\n        name={currentAccount.name ? currentAccount.name : `id: ${currentAccount.id}`}\n        value={\n          <View className=\"flex-row items-center\">\n            <Text className=\"pr-2 text-text-primary\">{currentAccount.numberOfPrograms}</Text>\n            <View className=\"pr-4\">\n              <IconDoc width={12} height={16} />\n            </View>\n            <Text className=\"pr-2 text-text-primary\">{currentAccount.numberOfWorkouts}</Text>\n            <View>\n              <IconDumbbell width={28} height={19} />\n            </View>\n          </View>\n        }\n        addons={\n          <View>\n            {AdminDebug_isDebugAccountId(currentAccount.id) ? (\n              <Text className=\"-mt-1 text-xs font-bold text-text-error\">\n                {props.nosync ? \"DEBUG · sync off\" : \"DEBUG · sync ON (server)\"}\n              </Text>\n            ) : null}\n            {currentAccount.name ? (\n              <Text className=\"-mt-1 text-xs text-text-secondary\">{`id: ${currentAccount.id}`}</Text>\n            ) : null}\n            {props.email ? (\n              props.email === \"noemail@example.com\" ? null : (\n                <Text className=\"text-xs text-text-secondary\">\n                  Signed in as <Text className=\"text-sm font-bold text-text-secondary\">{props.email}</Text>\n                </Text>\n              )\n            ) : (\n              <Text className=\"text-xs text-text-error\">Not signed in to cloud</Text>\n            )}\n          </View>\n        }\n      />\n      {props.email ? (\n        <View className=\"items-center\">\n          <Button\n            name=\"account-sign-out\"\n            kind=\"purple\"\n            data-testid=\"menu-item-logout\"\n            className=\"ls-logout\"\n            onClick={() => props.dispatch(Thunk_logOut())}\n          >\n            Sign Out\n          </Button>\n          <View className=\"mt-3\">\n            <LinkButton\n              name=\"account-change-password\"\n              className=\"text-sm\"\n              onPress={() => navigateToModal(\"changePasswordModal\")}\n            >\n              Change password\n            </LinkButton>\n          </View>\n        </View>\n      ) : (\n        <View>\n          <Pressable\n            className=\"flex-row items-center w-full px-4 py-2 mt-2 rounded-lg nm-sign-in-with-google bg-background-default\"\n            style={googleShadow}\n            data-testid=\"menu-item-login\"\n            testID=\"menu-item-login\"\n            onPress={() => props.dispatch(Thunk_googleSignIn())}\n          >\n            <View>\n              <IconGoogle />\n            </View>\n            <Text className=\"flex-1 ml-2 text-base text-center\">Sign in with Google</Text>\n          </Pressable>\n          <Pressable\n            className=\"flex-row items-center w-full px-4 py-3 mt-2 bg-black rounded-lg nm-sign-in-with-apple\"\n            onPress={() => props.dispatch(Thunk_appleSignIn())}\n          >\n            <View style={{ marginTop: -3 }}>\n              <IconApple />\n            </View>\n            <Text className=\"flex-1 ml-2 text-base text-center text-text-alwayswhite\">Sign in with Apple</Text>\n          </Pressable>\n          <EmailAuthButton onPress={() => navigateToModal(\"emailAuthModal\")} />\n        </View>\n      )}\n      <GroupHeader name=\"🌟 Liftosaur Premium\" topPadding={true} />\n      {isLoadingSubscription ? (\n        <MenuItem name=\"Checking your subscription…\" expandName={true} value={<IconSpinner width={18} height={18} />} />\n      ) : (\n        <>\n          <MenuItem\n            name={premiumCard.title}\n            value={premiumCard.actionLabel}\n            shouldShowRightArrow={!!premiumCard.actionLabel}\n            expandName={true}\n            onClick={premiumCard.actionLabel ? () => props.dispatch(Thunk_pushScreen(\"subscription\")) : undefined}\n            addons={\n              premiumCard.subtitle ? (\n                <Text className=\"-mt-1 text-xs text-text-secondary\">{premiumCard.subtitle}</Text>\n              ) : undefined\n            }\n          />\n          {premiumCard.showCancel && (\n            <View className=\"pt-1\">\n              <LinkButton\n                name=\"account-cancel-subscription\"\n                className=\"text-sm text-text-error\"\n                onClick={() => props.dispatch(Thunk_openManageSubscriptions())}\n              >\n                Cancel subscription\n              </LinkButton>\n            </View>\n          )}\n        </>\n      )}\n      <GroupHeader\n        name=\"Other local accounts\"\n        topPadding={true}\n        rightAddOn={\n          otherAccounts.length > 0 ? (\n            <LinkButton\n              name=\"account-edit\"\n              onClick={() => {\n                setIsOtherAccountsEditMode(!isOtherAccountsEditMode);\n              }}\n            >\n              {isOtherAccountsEditMode ? \"Finish Editing\" : \"Edit\"}\n            </LinkButton>\n          ) : undefined\n        }\n      />\n      {otherAccounts.map((account) => (\n        <MenuItem\n          key={account.id}\n          shouldShowRightArrow={!isOtherAccountsEditMode}\n          name={account.name ? account.name : `id: ${account.id}`}\n          onClick={async () => {\n            if (\n              !isOtherAccountsEditMode &&\n              (await Dialog_confirm(\n                \"Want to switch to this account? You WILL NOT lose your current account, you'll be able to switch back to it later.\"\n              ))\n            ) {\n              props.dispatch(Thunk_switchAccount(account.id));\n            }\n          }}\n          value={\n            isOtherAccountsEditMode ? (\n              <Pressable\n                className=\"p-2 nm-account-delete-account\"\n                onPress={async () => {\n                  const answer = await Dialog_prompt(\n                    \"Are you sure? All the local data for this account will be lost, and you won't be able to restore it unless you have a cloud account. Type 'delete' to confirm.\"\n                  );\n                  if (answer?.toLocaleLowerCase() === \"delete\") {\n                    props.dispatch(Thunk_deleteAccount(account.id, () => refetchAccounts()));\n                  }\n                }}\n              >\n                <IconTrash />\n              </Pressable>\n            ) : (\n              <View className=\"flex-row items-center\">\n                <Text className=\"pr-2 text-text-primary\">{account.numberOfPrograms}</Text>\n                <View className=\"pr-4\">\n                  <IconDoc width={12} height={16} />\n                </View>\n                <Text className=\"pr-2 text-text-primary\">{account.numberOfWorkouts}</Text>\n                <View>\n                  <IconDumbbell width={28} height={19} />\n                </View>\n              </View>\n            )\n          }\n          expandName={true}\n          addons={\n            <View>\n              {AdminDebug_isDebugAccountId(account.id) ? (\n                <Text className=\"-mt-1 text-xs font-bold text-text-error\">DEBUG · sync off</Text>\n              ) : null}\n              {account.name ? <Text className=\"-mt-1 text-xs text-text-secondary\">{`id: ${account.id}`}</Text> : null}\n              {account.email && account.email !== \"noemail@example.com\" && (\n                <Text className=\"text-xs text-text-secondary\">\n                  Was logged in as <Text className=\"text-sm font-bold text-text-secondary\">{account.email}</Text>\n                </Text>\n              )}\n            </View>\n          }\n        />\n      ))}\n      <LinkButton\n        name=\"local-account-create\"\n        onClick={async () => {\n          if (\n            await Dialog_confirm(\n              \"Want to create a new local account? You WILL NOT lose your current account, you'll be able to switch back to it later.\"\n            )\n          ) {\n            props.dispatch(Thunk_createAccount());\n          }\n        }}\n      >\n        Create New Local Account\n      </LinkButton>\n      <GroupHeader name=\"Delete current account\" topPadding={true} />\n      <View>\n        <Button\n          name=\"account-delete\"\n          kind=\"red\"\n          className=\"mt-4 ls-delete-account\"\n          onClick={async () => {\n            const answer = await Dialog_prompt(\n              \"Are you sure? All the local data for this account will be lost, and you won't be able to restore it unless you have a cloud account. Type 'delete' to confirm.\"\n            );\n            if (answer?.toLocaleLowerCase() === \"delete\") {\n              props.dispatch(\n                Thunk_logOut(() => {\n                  props.dispatch(Thunk_deleteAccount(currentAccount.id));\n                  props.dispatch(Thunk_createAccount());\n                })\n              );\n            }\n          }}\n        >\n          Delete Current Local Account\n        </Button>\n      </View>\n      {props.email && (\n        <View>\n          <Button\n            name=\"account-delete-remote\"\n            kind=\"red\"\n            className=\"mt-4 ls-delete-account-remote\"\n            onClick={async () => {\n              const answer = await Dialog_prompt(\n                \"Are you sure? All the data for this account will be deleted from the cloud, and you won't be able to restore it unless you resignup and sync your data again. Type 'delete' to confirm.\"\n              );\n              if (answer?.toLocaleLowerCase() === \"delete\") {\n                props.dispatch(\n                  Thunk_deleteAccountRemote((result) => {\n                    if (result) {\n                      Dialog_alert(\"Account deleted from cloud.\");\n                    } else {\n                      Dialog_alert(\n                        \"Couldn't delete the account from the cloud - error happened. Please send an email to info@liftosaur.com to delete it.\"\n                      );\n                    }\n                  })\n                );\n              }\n            }}\n          >\n            Delete Current Cloud Account\n          </Button>\n        </View>\n      )}\n    </View>\n  );\n}\n\ninterface IPremiumCard {\n  title: string;\n  subtitle?: string;\n  actionLabel?: string;\n  showCancel: boolean;\n}\n\nfunction buildPremiumCard(plan: IDerivedSubscriptionPlan): IPremiumCard {\n  const planKindLabel = (k?: ISubscriptionPlanKind): string =>\n    k === \"yearly\" ? \"Yearly\" : k === \"monthly\" ? \"Monthly\" : \"Premium\";\n  const dateStr = plan.expirationDate ? DateUtils_format(plan.expirationDate, true) : undefined;\n  switch (plan.state) {\n    case \"subscriber\":\n      return {\n        title: `Premium — ${planKindLabel(plan.plan)}`,\n        subtitle: dateStr ? `Renews on ${dateStr}` : \"Active subscription\",\n        actionLabel: \"Manage\",\n        showCancel: true,\n      };\n    case \"cancelled\":\n      return {\n        title: `Premium — ${planKindLabel(plan.plan)}`,\n        subtitle: dateStr ? `Ends on ${dateStr}, won't renew` : \"Won't renew\",\n        actionLabel: \"Manage\",\n        showCancel: false,\n      };\n    case \"lifetime\":\n      return {\n        title: \"Lifetime Premium\",\n        subtitle: \"All features unlocked forever\",\n        actionLabel: \"View\",\n        showCancel: false,\n      };\n    case \"freeaccess\":\n      return {\n        title: \"Free access\",\n        subtitle: \"All features unlocked\",\n        actionLabel: \"View\",\n        showCancel: false,\n      };\n    case \"premium\":\n      return { title: \"Premium\", subtitle: \"Manage on the mobile app\", actionLabel: \"Manage\", showCancel: false };\n    case \"otherstore\":\n      return {\n        title: \"Premium\",\n        subtitle:\n          plan.managedOn === \"apple\"\n            ? \"Bought on the App Store — manage it on an Apple device\"\n            : StoreRuntime_isIos()\n              ? \"Bought on another device — manage it there\"\n              : \"Bought on Google Play — manage it on an Android device\",\n        actionLabel: \"View\",\n        showCancel: false,\n      };\n    default:\n      return { title: \"Free plan\", actionLabel: \"Get Premium\", showCancel: false };\n  }\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { INavCommon } from \"../models/state\";\nimport { Service } from \"../api/service\";\nimport { ClipboardUtils_copy } from \"../utils/clipboard\";\nimport { ISubscription } from \"../types\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Dialog_confirm } from \"../utils/dialog\";\n\ninterface IApiKey {\n  key: string;\n  name: string;\n  createdAt: number;\n}\n\ninterface IProps {\n  dispatch: IDispatch;\n  navCommon: INavCommon;\n  service: Service;\n  subscription: ISubscription;\n  userId?: string;\n}\n\nexport function ScreenApiKeys(props: IProps): JSX.Element {\n  const [keys, setKeys] = useState<IApiKey[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const newKeyNameRef = useRef(\"\");\n  const [copiedKey, setCopiedKey] = useState<string | undefined>(undefined);\n  const [isCreating, setIsCreating] = useState(false);\n  const [createError, setCreateError] = useState<string | undefined>(undefined);\n  const isLoggedIn = props.userId != null;\n  const isSubscribed = Subscriptions_hasSubscription(props.subscription);\n\n  useEffect(() => {\n    if (isSubscribed) {\n      props.service.getApiKeys().then((result) => {\n        setKeys(result);\n        setIsLoading(false);\n      });\n    } else {\n      setIsLoading(false);\n    }\n  }, []);\n\n  const handleCreate = async (): Promise<void> => {\n    const name = newKeyNameRef.current.trim() || \"API Key\";\n    setIsCreating(true);\n    setCreateError(undefined);\n    const result = await props.service.createApiKey(name);\n    setIsCreating(false);\n    if (result) {\n      setKeys([...keys, result]);\n      newKeyNameRef.current = \"\";\n    } else {\n      setCreateError(\"Failed to create API key. Please try again.\");\n    }\n  };\n\n  const handleDelete = async (key: string): Promise<void> => {\n    if (!(await Dialog_confirm(\"Are you sure you want to delete this API key?\"))) {\n      return;\n    }\n    const success = await props.service.deleteApiKey(key);\n    if (success) {\n      setKeys(keys.filter((k) => k.key !== key));\n    }\n  };\n\n  const handleCopy = (key: string): void => {\n    ClipboardUtils_copy(key);\n    setCopiedKey(key);\n    setTimeout(() => setCopiedKey(undefined), 2000);\n  };\n\n  useNavOptions({ navTitle: \"API Keys\" });\n\n  return (\n    <View className=\"px-gutter\">\n      {!isLoggedIn ? (\n        <View className=\"py-8\">\n          <Text className=\"mb-4 text-center text-text-secondary\">\n            API keys let you integrate Liftosaur with external tools, LLMs, and MCP servers. You can read and edit your\n            workout history and programs, and simulate workouts via the playground endpoint.\n          </Text>\n          <Text className=\"text-center text-text-secondary\">You need to log in first to manage API keys.</Text>\n          <View className=\"items-center mt-4\">\n            <Button kind=\"purple\" name=\"login-for-api\" onClick={() => props.dispatch(Thunk_pushScreen(\"account\"))}>\n              Log in\n            </Button>\n          </View>\n        </View>\n      ) : !isSubscribed ? (\n        <View className=\"py-8\">\n          <Text className=\"mb-4 text-center text-text-secondary\">\n            API keys let you integrate Liftosaur with external tools, LLMs, and MCP servers. You can read and edit your\n            workout history and programs, and simulate workouts via the playground endpoint.\n          </Text>\n          <View className=\"items-center\">\n            <Button\n              kind=\"purple\"\n              name=\"subscribe-for-api\"\n              onClick={() => props.dispatch(Thunk_pushScreen(\"subscription\"))}\n            >\n              Subscribe to unlock\n            </Button>\n          </View>\n        </View>\n      ) : (\n        <>\n          <GroupHeader name=\"Create New Key\" />\n          <View className=\"flex-row items-center gap-2 pb-2\">\n            <View className=\"flex-1\">\n              <Input\n                type=\"text\"\n                inputSize=\"sm\"\n                placeholder=\"Key name\"\n                changeHandler={(result) => {\n                  if (result.success) {\n                    newKeyNameRef.current = result.data;\n                  }\n                }}\n              />\n            </View>\n            <Button kind=\"purple\" buttonSize=\"lg\" name=\"create-api-key\" disabled={isCreating} onClick={handleCreate}>\n              {isCreating ? (\n                <IconSpinner color=\"white\" width={18} height={18} />\n              ) : (\n                <Text className=\"text-text-alwayswhite font-semibold\">Create</Text>\n              )}\n            </Button>\n          </View>\n          {createError && <Text className=\"pb-2 text-xs text-text-error\">{createError}</Text>}\n\n          <GroupHeader name=\"Your Keys\" topPadding={true} />\n          {isLoading ? (\n            <View className=\"items-center py-4\">\n              <IconSpinner width={40} height={40} />\n            </View>\n          ) : keys.length === 0 ? (\n            <Text className=\"py-4 text-center text-text-secondary\">No API keys yet</Text>\n          ) : (\n            keys.map((apiKey) => (\n              <View key={apiKey.key} className=\"py-2 border-b border-border-neutral\">\n                <View className=\"flex-row items-center justify-between\">\n                  <View className=\"flex-1 min-w-0\">\n                    <Text className=\"font-bold\">{apiKey.name}</Text>\n                    <Text className=\"text-xs text-text-secondary\">{apiKey.key}</Text>\n                    <Text className=\"text-xs text-text-secondary\">\n                      Created {new Date(apiKey.createdAt).toLocaleDateString()}\n                    </Text>\n                  </View>\n                  <View className=\"flex-row gap-4 ml-2 shrink-0\">\n                    <Pressable testID=\"copy-api-key\" data-testid=\"copy-api-key\" onPress={() => handleCopy(apiKey.key)}>\n                      <Text className=\"text-xs underline text-text-link\">\n                        {copiedKey === apiKey.key ? \"Copied!\" : \"Copy\"}\n                      </Text>\n                    </Pressable>\n                    <Pressable\n                      testID=\"delete-api-key\"\n                      data-testid=\"delete-api-key\"\n                      onPress={() => handleDelete(apiKey.key)}\n                    >\n                      <Text className=\"text-xs underline text-text-error\">Delete</Text>\n                    </Pressable>\n                  </View>\n                </View>\n              </View>\n            ))\n          )}\n        </>\n      )}\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { lb } from \"lens-shmens\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { ISettings } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_syncHealthKit } from \"../ducks/thunks\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  navCommon: INavCommon;\n}\n\nexport function ScreenAppleHealthSettings(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Apple Health\" });\n\n  return (\n    <View className=\"px-gutter\">\n      <MenuItemEditable\n        name=\"Sync Workouts\"\n        type=\"boolean\"\n        value={props.settings.appleHealthSyncWorkout ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"appleHealthSyncWorkout\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Apple Health workouts\",\n          });\n        }}\n      />\n      <MenuItemEditable\n        name=\"Confirm each workout sync?\"\n        type=\"boolean\"\n        value={props.settings.healthConfirmation ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"healthConfirmation\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Health workout confirmation\",\n          });\n        }}\n      />\n      <MenuItemEditable\n        name=\"Sync Measurements\"\n        type=\"boolean\"\n        value={props.settings.appleHealthSyncMeasurements ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"appleHealthSyncMeasurements\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Apple Health measurements\",\n          });\n        }}\n      />\n      <MenuItemEditable\n        name=\"Sync Sleep & Nutrition\"\n        type=\"boolean\"\n        value={props.settings.appleHealthSyncSleepNutrition ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"appleHealthSyncSleepNutrition\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Apple Health sleep & nutrition\",\n          });\n          if (newValue === \"true\") {\n            props.dispatch(Thunk_syncHealthKit());\n          }\n        }}\n      />\n    </View>\n  );\n}\n","import { JSX, memo } from \"react\";\nimport { IDispatch } from \"../ducks/types\";\nimport { EditProgramDaysList } from \"./editProgram/editProgramDaysList\";\nimport { IProgram, ISettings, ISubscription } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { ScreenProgram } from \"./editProgram/screenProgram\";\nimport { IPlannerState } from \"../pages/planner/models/types\";\nimport { NavScreenContent } from \"../navigation/NavScreenContent\";\n\ninterface IProps {\n  helps: string[];\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  settings: ISettings;\n  originalProgram: IProgram;\n  plannerState: IPlannerState;\n  client: Window[\"fetch\"];\n  revisions: string[];\n  isLoggedIn: boolean;\n  navCommon: INavCommon;\n}\n\nexport const ScreenEditProgram = memo(function ScreenEditProgram(props: IProps): JSX.Element {\n  const originalProgram = props.originalProgram;\n  const plannerState = props.plannerState;\n\n  if (plannerState.current.program.planner != null) {\n    return (\n      <ScreenProgram\n        client={props.client}\n        revisions={props.revisions}\n        helps={props.helps}\n        settings={props.settings}\n        dispatch={props.dispatch}\n        originalProgram={originalProgram}\n        plannerState={plannerState}\n        isLoggedIn={props.isLoggedIn}\n        navCommon={props.navCommon}\n      />\n    );\n  } else {\n    return (\n      <NavScreenContent>\n        <EditProgramDaysList\n          settings={props.settings}\n          dispatch={props.dispatch}\n          editProgram={originalProgram}\n          navCommon={props.navCommon}\n        />\n      </NavScreenContent>\n    );\n  }\n});\n","import { JSX, ReactNode, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { View, ScrollView, findNodeHandle, LayoutAnimation } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ISettings, IEquipment, IAllEquipment, IStats } from \"../types\";\nimport { INavCommon, IState, updateState } from \"../models/state\";\nimport { EquipmentRowHeader, EquipmentRowBody } from \"./equipmentSettings\";\nimport { ILensDispatch } from \"../utils/useLensReducer\";\nimport { ILensRecordingPayload, lb } from \"lens-shmens\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { equipmentName } from \"../models/exercise\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { LinkButton } from \"./linkButton\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { NavScreenContent, NavScreenScrollContext } from \"../navigation/NavScreenContent\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  expandedEquipment?: IEquipment;\n  stats: IStats;\n  allEquipment: IAllEquipment;\n  selectedGymId?: string;\n  navCommon: INavCommon;\n}\n\nfunction buildLensDispatch(originalDispatch: IDispatch): ILensDispatch<IState> {\n  return (lensRecording: ILensRecordingPayload<IState>[] | ILensRecordingPayload<IState>, desc: string) => {\n    originalDispatch({\n      type: \"UpdateState\",\n      lensRecording: Array.isArray(lensRecording) ? lensRecording : [lensRecording],\n      desc,\n    });\n  };\n}\n\nexport function ScreenEquipment(props: IProps): JSX.Element {\n  const scrollCtx = useContext(NavScreenScrollContext);\n  const scrollRef = scrollCtx?.scrollRef;\n  const expandedItemRef = useRef<View>(null);\n\n  const [expandedMap, setExpandedMap] = useState<Record<string, boolean>>(() =>\n    props.expandedEquipment ? { [props.expandedEquipment]: true } : {}\n  );\n\n  useEffect(() => {\n    if (!props.expandedEquipment) {\n      return;\n    }\n    const scrollNode = scrollRef?.current as ScrollView | null;\n    const itemNode = expandedItemRef.current;\n    if (scrollNode && itemNode) {\n      const handle = findNodeHandle(scrollNode);\n      if (handle != null) {\n        itemNode.measureLayout(\n          handle,\n          (_x, y) => scrollNode.scrollTo({ y: Math.max(0, y - 70), animated: false }),\n          () => undefined\n        );\n      }\n    }\n    updateState(\n      props.dispatch,\n      [lb<IState>().p(\"defaultEquipmentExpanded\").record(undefined)],\n      \"Clear expanded equipment\"\n    );\n  }, []);\n\n  useNavOptions({ navTitle: \"Equipment Settings\", navHelpKey: \"plates\" });\n\n  const selectedGym = props.settings.gyms.find((g) => g.id === props.selectedGymId) ?? props.settings.gyms[0];\n  const lensDispatch = useMemo(() => buildLensDispatch(props.dispatch), [props.dispatch]);\n  const lensPrefix = useMemo(\n    () => lb<IState>().p(\"storage\").p(\"settings\").p(\"gyms\").findBy(\"id\", selectedGym.id).p(\"equipment\").get(),\n    [selectedGym.id]\n  );\n\n  const toggleExpanded = (key: string): void => {\n    LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);\n    setExpandedMap((m) => ({ ...m, [key]: !m[key] }));\n  };\n\n  const visibleKeys = ObjectUtils_keys(props.allEquipment).filter((e) => !props.allEquipment[e]?.isDeleted);\n  const hiddenEquipment = ObjectUtils_keys(props.allEquipment).filter((e) => {\n    const eq = props.allEquipment[e];\n    return !eq?.name && eq?.isDeleted;\n  });\n\n  const children: ReactNode[] = [];\n  const stickyIndices: number[] = [];\n\n  if (props.settings.gyms.length > 1) {\n    children.push(\n      <View key=\"gym-name\" className=\"px-gutter pb-2\">\n        <MenuItemEditable\n          type=\"text\"\n          name=\"Gym Name\"\n          value={selectedGym.name}\n          onChange={(name) => {\n            if (name?.trim()) {\n              updateState(\n                props.dispatch,\n                [\n                  lb<IState>()\n                    .p(\"storage\")\n                    .p(\"settings\")\n                    .p(\"gyms\")\n                    .findBy(\"id\", selectedGym.id)\n                    .p(\"name\")\n                    .record(name.trim()),\n                ],\n                \"Update gym name\"\n              );\n            }\n          }}\n        />\n      </View>\n    );\n  } else {\n    children.push(\n      <View key=\"manage-gyms\" className=\"px-2 mb-2 items-end\">\n        <LinkButton className=\"text-sm\" name=\"add-new-gym\" onClick={() => props.dispatch(Thunk_pushScreen(\"gyms\"))}>\n          Manage Gyms\n        </LinkButton>\n      </View>\n    );\n  }\n\n  visibleKeys.forEach((key) => {\n    const equipmentData = props.allEquipment[key];\n    if (!equipmentData) {\n      return;\n    }\n    const isExpanded = !!expandedMap[key];\n    const headerIndex = children.length;\n    const assignRef = props.expandedEquipment === key;\n\n    stickyIndices.push(headerIndex);\n    children.push(\n      <View key={`${key}-header`} className={`mx-2 ${isExpanded ? \"\" : \"mb-6\"}`}>\n        <EquipmentRowHeader\n          headerRef={assignRef ? expandedItemRef : undefined}\n          lensPrefix={lensPrefix}\n          lensDispatch={lensDispatch}\n          equipment={key}\n          equipmentData={equipmentData}\n          allEquipment={props.allEquipment}\n          settings={props.settings}\n          isExpanded={isExpanded}\n          onToggle={() => toggleExpanded(key)}\n        />\n      </View>\n    );\n\n    if (isExpanded) {\n      children.push(\n        <View key={`${key}-body`} className=\"mx-2 mb-6\">\n          <EquipmentRowBody\n            lensPrefix={lensPrefix}\n            lensDispatch={lensDispatch}\n            dispatch={props.dispatch}\n            equipment={key}\n            equipmentData={equipmentData}\n            allEquipment={props.allEquipment}\n            settings={props.settings}\n            stats={props.stats}\n          />\n        </View>\n      );\n    }\n  });\n\n  return (\n    <NavScreenContent stickyHeaderIndices={stickyIndices} avoidSystemKeyboard=\"reveal\">\n      {children}\n      {hiddenEquipment.length > 0 && (\n        <View className=\"flex-row flex-wrap mx-4 my-2\">\n          <Text className=\"text-xs\">Hidden Equipment: </Text>\n          {hiddenEquipment.map((e, i) => (\n            <View key={e} className=\"flex-row\">\n              {i !== 0 && <Text className=\"text-xs\">, </Text>}\n              <LinkButton\n                className=\"text-xs\"\n                name={`show-equipment-${e}`}\n                onClick={() => {\n                  const lensRecording = lensPrefix.then(lb<IAllEquipment>().pi(e).p(\"isDeleted\").get()).record(false);\n                  lensDispatch(lensRecording, `Show equipment ${e}`);\n                }}\n              >\n                {equipmentName(e, props.allEquipment)}\n              </LinkButton>\n            </View>\n          ))}\n        </View>\n      )}\n      <View className=\"m-4\">\n        <LinkButton className=\"text-sm\" name=\"add-new-equipment\" onClick={() => navigateToModal(\"newEquipmentModal\")}>\n          Add New Equipment Type\n        </LinkButton>\n      </View>\n    </NavScreenContent>\n  );\n}\n","import { Component, ErrorInfo, ReactNode } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { TextRaw as Text } from \"./primitives/text\";\nimport RB from \"rollbar\";\n\ndeclare let Rollbar: RB | undefined;\n\ninterface INavigationLike {\n  canGoBack?: () => boolean;\n  goBack?: () => void;\n}\n\ninterface IProps {\n  screenName: string;\n  navigation?: INavigationLike;\n  children: ReactNode;\n}\n\ninterface IState {\n  hasError: boolean;\n}\n\nexport class ScreenErrorBoundary extends Component<IProps, IState> {\n  public state: IState = { hasError: false };\n\n  public static getDerivedStateFromError(): IState {\n    return { hasError: true };\n  }\n\n  public componentDidCatch(error: Error, info: ErrorInfo): void {\n    // Report here so the JS error + stack survives. Without a boundary a render-phase\n    // throw tears down the Fabric tree and surfaces as an unactionable native\n    // EXC_BAD_ACCESS in Hermes, captured by the native crash reporter instead of the JS one.\n    if (typeof Rollbar !== \"undefined\" && Rollbar != null) {\n      Rollbar.error(error, { componentStack: info.componentStack, screen: this.props.screenName });\n    }\n  }\n\n  // canGoBack() can throw while navigation is mid-transition/unmount, which is exactly the\n  // state we're in during error recovery. A throw here escapes this boundary (a boundary\n  // can't catch its own render), so keep the fallback bulletproof and never let it throw.\n  private safeCanGoBack(): boolean {\n    try {\n      return this.props.navigation?.canGoBack?.() ?? false;\n    } catch {\n      return false;\n    }\n  }\n\n  private readonly onReset = (): void => {\n    this.setState({ hasError: false });\n  };\n\n  private readonly onGoBack = (): void => {\n    this.setState({ hasError: false });\n    try {\n      this.props.navigation?.goBack?.();\n    } catch {\n      // Navigation may already be gone; the tab bar / nav header remain usable.\n    }\n  };\n\n  public render(): ReactNode {\n    if (this.state.hasError) {\n      // On modal/form-sheet routes the tab bar is hidden behind the overlay, so offer an\n      // explicit way out instead of relying on tabs being reachable.\n      const canGoBack = this.safeCanGoBack();\n      return (\n        <View className=\"items-center justify-center flex-1 px-8 bg-background-default\">\n          <Text className=\"pb-2 text-xl font-bold text-text-primary\">Something went wrong</Text>\n          <Text className=\"pb-6 text-sm text-center text-text-secondary\">\n            This screen ran into an error. You can try again{canGoBack ? \" or go back\" : \"\"}.\n          </Text>\n          <View className=\"flex-row items-center gap-3\">\n            <Pressable\n              testID=\"screen-error-retry\"\n              onPress={this.onReset}\n              className=\"px-6 py-3 rounded-lg bg-background-purpledark\"\n            >\n              <Text className=\"text-base text-text-primary\">Try again</Text>\n            </Pressable>\n            {canGoBack && (\n              <Pressable\n                testID=\"screen-error-goback\"\n                onPress={this.onGoBack}\n                className=\"px-6 py-3 rounded-lg bg-background-subtle\"\n              >\n                <Text className=\"text-base text-text-primary\">Go back</Text>\n              </Pressable>\n            )}\n          </View>\n        </View>\n      );\n    }\n    return this.props.children;\n  }\n}\n","import { JSX, memo, useCallback, useMemo, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IExerciseType, IHistoryRecord, IProgram, ISettings, ISubscription } from \"../types\";\nimport { INavCommon, updateSettings } from \"../models/state\";\nimport {\n  History_collectMinAndMaxTime,\n  History_collectAllUsedExerciseTypes,\n  History_collectAllHistoryRecordsOfExerciseType,\n  History_collectWeightPersonalRecord,\n  History_collect1RMPersonalRecord,\n} from \"../models/history\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport {\n  IExercise,\n  Exercise_get,\n  Exercise_fullName,\n  Exercise_isCustom,\n  Exercise_getNotes,\n  Exercise_toKey,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscleMultipliers,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroups,\n} from \"../models/exercise\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\nimport { lb } from \"lens-shmens\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { GraphExercise } from \"./graphExercise\";\nimport { Collector } from \"../utils/collector\";\nimport { Locker } from \"./locker\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { ExerciseDataSettings } from \"./exerciseDataSettings\";\nimport { LinkButton } from \"./linkButton\";\nimport { Thunk_pullScreen } from \"../ducks/thunks\";\nimport { Program_evaluate, Program_getProgramExercisesFromExerciseType } from \"../models/program\";\nimport { ExerciseAllTimePRs } from \"./exerciseAllTimePRs\";\nimport { ExerciseHistory } from \"./exerciseHistory\";\nimport { MarkdownEditorBorderless } from \"./markdownEditorBorderless\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { StringUtils_capitalize } from \"../utils/string\";\nimport { Muscle_getMuscleGroupName } from \"../models/muscle\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { Dialog_confirm } from \"../utils/dialog\";\n\ninterface IProps {\n  exerciseType: IExerciseType;\n  history: IHistoryRecord[];\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  settings: ISettings;\n  navCommon: INavCommon;\n  currentProgram?: IProgram;\n}\n\nexport function ScreenExerciseStats(props: IProps): JSX.Element {\n  const exerciseType = props.exerciseType;\n  const { settings, dispatch, history: rawHistory, currentProgram } = props;\n\n  const evaluatedProgram = useMemo(\n    () => (currentProgram ? Program_evaluate(currentProgram, settings) : undefined),\n    [currentProgram, settings]\n  );\n  const programExerciseIds = useMemo(\n    () =>\n      evaluatedProgram\n        ? Program_getProgramExercisesFromExerciseType(evaluatedProgram, exerciseType).map((pe) => pe.key)\n        : [],\n    [evaluatedProgram, exerciseType]\n  );\n  const fullExercise = useMemo(\n    () => Exercise_get(exerciseType, settings.exercises),\n    [exerciseType, settings.exercises]\n  );\n\n  const units = settings.units;\n  const collectorResult = useMemo(() => {\n    const historyCollector = Collector.build(rawHistory)\n      .addFn(History_collectMinAndMaxTime())\n      .addFn(History_collectAllUsedExerciseTypes())\n      .addFn(History_collectAllHistoryRecordsOfExerciseType(exerciseType))\n      .addFn(History_collectWeightPersonalRecord(exerciseType, units))\n      .addFn(History_collect1RMPersonalRecord(exerciseType, units));\n    return historyCollector.run();\n  }, [rawHistory, exerciseType, units]);\n\n  const [\n    { maxTime: maxX, minTime: minX },\n    _exerciseTypes,\n    unsortedHistory,\n    { maxWeight, maxWeightHistoryRecord },\n    { max1RM, max1RMHistoryRecord, max1RMSet },\n  ] = collectorResult;\n\n  const ascendingSort = settings.exerciseStatsSettings.ascendingSort;\n  const history = useMemo(\n    () =>\n      CollectionUtils_sort(unsortedHistory, (a, b) =>\n        ascendingSort ? a.startTime - b.startTime : b.startTime - a.startTime\n      ),\n    [unsortedHistory, ascendingSort]\n  );\n\n  const showPrs = maxWeight.value > 0 || max1RM.value > 0;\n\n  useNavOptions({ navTitle: \"Exercise Stats\", navHelpKey: \"exerciseStats\" });\n\n  const onOverrideMuscles = useCallback(() => {\n    navigateToModal(\"musclesOverrideModal\", { exerciseType });\n  }, [exerciseType]);\n\n  const onEditCustomExercise = useCallback(() => {\n    navigateToModal(\"customExerciseModal\", { exerciseId: exerciseType.id });\n  }, [exerciseType.id]);\n\n  const onDeleteCustomExercise = useCallback(async () => {\n    if (await Dialog_confirm(\"Are you sure you want to delete this exercise?\")) {\n      updateSettings(\n        dispatch,\n        lb<ISettings>()\n          .p(\"exercises\")\n          .recordModify((exercises) => {\n            const exercise = exercises[fullExercise.id];\n            return exercise != null ? { ...exercises, [fullExercise.id]: { ...exercise, isDeleted: true } } : exercises;\n          }),\n        \"Delete custom exercise\"\n      );\n      dispatch(Thunk_pullScreen());\n    }\n  }, [dispatch, fullExercise.id]);\n\n  const onNotesChange = useCallback(\n    (v: string) => {\n      updateSettings(\n        dispatch,\n        lb<ISettings>()\n          .p(\"exerciseData\")\n          .recordModify((data) => {\n            const key = Exercise_toKey(exerciseType);\n            return { ...data, [key]: { ...data[key], notes: v } };\n          }),\n        \"Update exercise notes\"\n      );\n    },\n    [dispatch, exerciseType]\n  );\n\n  const notesValue = useMemo(() => Exercise_getNotes(exerciseType, settings), [exerciseType, settings.exerciseData]);\n  const isCustom = useMemo(\n    () => Exercise_isCustom(fullExercise.id, settings.exercises),\n    [fullExercise.id, settings.exercises]\n  );\n  const exerciseKey = useMemo(() => Exercise_toKey(exerciseType), [exerciseType]);\n  const fullName = useMemo(() => Exercise_fullName(fullExercise, settings), [fullExercise, settings]);\n  const isInteractive = useMemo(() => Subscriptions_hasSubscription(props.subscription), [props.subscription]);\n\n  const maxWeightProp = useMemo(\n    () => (maxWeight ? { weight: maxWeight, historyRecord: maxWeightHistoryRecord } : undefined),\n    [maxWeight, maxWeightHistoryRecord]\n  );\n  const max1RMProp = useMemo(\n    () => (max1RM ? { weight: max1RM, historyRecord: max1RMHistoryRecord, set: max1RMSet } : undefined),\n    [max1RM, max1RMHistoryRecord, max1RMSet]\n  );\n\n  return (\n    <View className=\"px-gutter\">\n      <Text className=\"text-xl font-bold\">{fullName}</Text>\n      <Text className=\"text-xs text-text-secondary\">{isCustom ? \"Custom exercise\" : \"Built-in exercise\"}</Text>\n      <View className=\"py-2\">\n        <MuscleGroupsView exercise={fullExercise} settings={settings} onOverride={onOverrideMuscles} />\n      </View>\n      {isCustom && (\n        <View className=\"flex-row mb-2\">\n          <View className=\"flex-1\">\n            <LinkButton className=\"text-sm\" name=\"edit-custom-exercise-stats\" onClick={onEditCustomExercise}>\n              Edit\n            </LinkButton>\n          </View>\n          <View>\n            <LinkButton\n              name=\"edit-custom-exercise-stats\"\n              className=\"text-sm text-text-error\"\n              onClick={onDeleteCustomExercise}\n            >\n              Delete Exercise\n            </LinkButton>\n          </View>\n        </View>\n      )}\n\n      <GroupHeader name=\"Notes\" />\n      <View style={{ marginHorizontal: -4 }}>\n        <MarkdownEditorBorderless\n          debounceMs={500}\n          value={notesValue}\n          placeholder={`Exercise notes in Markdown...`}\n          onChange={onNotesChange}\n        />\n      </View>\n\n      <ExerciseDataSettings\n        fullExercise={fullExercise}\n        programExerciseIds={programExerciseIds}\n        settings={settings}\n        dispatch={dispatch}\n        show1RM={true}\n      />\n\n      <View data-testid=\"exercise-stats-image\" testID=\"exercise-stats-image\">\n        <ExerciseImage settings={settings} key={exerciseKey} exerciseType={exerciseType} size=\"large\" />\n      </View>\n      {history.length > 1 && (\n        <View data-testid=\"exercise-stats-graph\" testID=\"exercise-stats-graph\" className=\"relative\">\n          <Locker topic=\"Graphs\" dispatch={dispatch} blur={8} subscription={props.subscription} />\n          <GraphExercise\n            isSameXAxis={false}\n            minX={Math.round(minX / 1000)}\n            maxX={Math.round(maxX / 1000)}\n            isWithOneRm={true}\n            key={exerciseKey}\n            settings={settings}\n            isWithProgramLines={true}\n            history={rawHistory}\n            exercise={exerciseType}\n            initialType={settings.graphsSettings.defaultType}\n            dispatch={dispatch}\n            isInteractive={isInteractive}\n          />\n        </View>\n      )}\n      {showPrs && (\n        <View className=\"mt-8\">\n          <ExerciseAllTimePRs maxWeight={maxWeightProp} max1RM={max1RMProp} settings={settings} dispatch={dispatch} />\n        </View>\n      )}\n      <ExerciseHistory\n        exerciseType={exerciseType}\n        settings={settings}\n        dispatch={dispatch}\n        history={history}\n        source=\"stats\"\n      />\n    </View>\n  );\n}\n\ninterface IMuscleGroupsViewProps {\n  exercise: IExercise;\n  settings: ISettings;\n  onOverride: () => void;\n}\n\nexport const MuscleGroupsView = memo(function MuscleGroupsView(props: IMuscleGroupsViewProps): JSX.Element {\n  const { exercise, settings } = props;\n  const targetMuscles = useMemo(() => Exercise_targetMuscles(exercise, settings), [exercise, settings]);\n  const synergistMuscles = useMemo(\n    () =>\n      Exercise_synergistMuscleMultipliers(exercise, settings)\n        .filter((m) => targetMuscles.indexOf(m.muscle) === -1)\n        .map((m) => `${m.muscle}${m.multiplier !== settings.planner.synergistMultiplier ? `:${m.multiplier}` : \"\"}`),\n    [exercise, settings, targetMuscles]\n  );\n  const targetMuscleGroups = useMemo(\n    () => Exercise_targetMusclesGroups(exercise, settings).map((m) => Muscle_getMuscleGroupName(m, settings)),\n    [exercise, settings]\n  );\n  const synergistMuscleGroups = useMemo(\n    () =>\n      Exercise_synergistMusclesGroups(exercise, settings)\n        .map((m) => Muscle_getMuscleGroupName(m, settings))\n        .filter((m) => targetMuscleGroups.indexOf(m) === -1),\n    [exercise, settings, targetMuscleGroups]\n  );\n  const [showMuscles, setShowMuscles] = useState(false);\n\n  const types = useMemo(() => exercise.types.map((t) => StringUtils_capitalize(t)), [exercise.types]);\n  const onToggleMuscles = useCallback(() => setShowMuscles((s) => !s), []);\n\n  return (\n    <View>\n      <View>\n        <LinkButton\n          data-testid=\"override-exercise-muscles\"\n          testID=\"override-exercise-muscles\"\n          name=\"override-exercise-muscles\"\n          className=\"text-xs\"\n          onClick={props.onOverride}\n        >\n          Override Muscles\n        </LinkButton>\n      </View>\n      <Pressable onPress={onToggleMuscles}>\n        {types.length > 0 && (\n          <View>\n            <Text className=\"text-xs\">\n              <Text className=\"text-xs text-text-secondary\">Type: </Text>\n              <Text className=\"text-xs font-bold\">{types.join(\", \")}</Text>\n            </Text>\n          </View>\n        )}\n        {targetMuscleGroups.length > 0 && (\n          <View>\n            <Text className=\"text-xs\">\n              <Text className=\"text-xs text-text-secondary\">Target: </Text>\n              <Text className=\"text-xs font-bold\">\n                {showMuscles ? targetMuscles.join(\", \") : targetMuscleGroups.join(\", \")}\n              </Text>\n            </Text>\n          </View>\n        )}\n        {synergistMuscleGroups.length > 0 && (\n          <View>\n            <Text className=\"text-xs\">\n              <Text className=\"text-xs text-text-secondary\">Synergist: </Text>\n              <Text className=\"text-xs font-bold\">\n                {showMuscles ? synergistMuscles.join(\", \") : synergistMuscleGroups.join(\", \")}\n              </Text>\n            </Text>\n          </View>\n        )}\n      </Pressable>\n    </View>\n  );\n});\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IHistoryRecord, IProgram, ISettings } from \"../types\";\nimport { ExercisesList } from \"./exercisesList\";\nimport { Program_fullProgram } from \"../models/program\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  program: IProgram;\n  history: IHistoryRecord[];\n  navCommon: INavCommon;\n}\n\nexport function ScreenExercises(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Exercises\", navHelpKey: \"exercises\" });\n\n  return (\n    <View className=\"px-gutter\">\n      <ExercisesList\n        isLoggedIn={!!props.navCommon.userId}\n        dispatch={props.dispatch}\n        settings={props.settings}\n        program={Program_fullProgram(props.program, props.settings)}\n        history={props.history}\n      />\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { SvgUri, SvgXml } from \"react-native-svg\";\nimport { BundledImages_svgXml } from \"../utils/bundledImages\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport {\n  History_getPersonalRecords,\n  History_totalRecordWeight,\n  History_getStartedEntries,\n  History_totalRecordReps,\n  History_totalRecordSets,\n  History_collectMuscleGroups,\n  History_workoutTime,\n} from \"../models/history\";\nimport { Button } from \"./button\";\nimport { Weight_display } from \"../models/weight\";\nimport { Confetti } from \"./confetti\";\nimport { IHistoryRecord, IProgram, IScreenMuscle, ISettings, IStats } from \"../types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_maybeRequestReview, Thunk_maybeRequestSignup, Thunk_pushScreen } from \"../ducks/thunks\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { HistoryEntryView } from \"./historyEntry\";\nimport { Collector } from \"../utils/collector\";\nimport { CollectionUtils_splitIntoNGroups } from \"../utils/collection\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { TimeUtils_formatHHMM } from \"../utils/time\";\nimport { IconInstagram } from \"./icons/iconInstagram\";\nimport { WorkoutShareButton } from \"./workoutShareButton\";\nimport { IconLink } from \"./icons/iconLink\";\nimport { IconKebab } from \"./icons/iconKebab\";\nimport { IconPicture } from \"./icons/iconPicture\";\nimport { Share_generateLink } from \"../models/share\";\nimport { ClipboardUtils_copy } from \"../utils/clipboard\";\nimport { InternalLink } from \"../internalLink\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconTiktok } from \"./icons/iconTiktok\";\nimport { PersonalRecords } from \"./personalRecords\";\nimport { ImagePreloader_dynohappy } from \"../utils/imagePreloader\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\nimport { n } from \"../utils/math\";\nimport { Muscle_getMuscleGroupName } from \"../models/muscle\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { LiftohistorySerializer_serialize } from \"../liftohistory/liftohistorySerializer\";\nimport { navigateToModal } from \"../navigation/navigationService\";\n\ninterface IProps {\n  history: IHistoryRecord[];\n  historyRecordId?: number;\n  settings: ISettings;\n  userId?: string;\n  dispatch: IDispatch;\n  stats: IStats;\n  allPrograms: IProgram[];\n  currentProgramId?: string;\n}\n\nexport function ScreenFinishDay(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Congratulations!\" });\n\n  const recordById =\n    props.historyRecordId != null ? props.history.find((h) => h.id === props.historyRecordId) : undefined;\n  const record = recordById ?? props.history[0];\n\n  // On the very first workout, history is momentarily empty between the\n  // navigate-to-finishDay and the FinishProgramDayAction commit, so `record`\n  // is undefined for one render until the committed record arrives.\n  if (record == null) {\n    return <></>;\n  }\n\n  const allPrs = History_getPersonalRecords(props.history);\n  const totalWeight = History_totalRecordWeight(record, props.settings);\n\n  const startedEntries = History_getStartedEntries(record);\n  const totalReps = History_totalRecordReps(record);\n  const totalSets = History_totalRecordSets(record);\n\n  const historyCollector = Collector.build([record]).addFn(History_collectMuscleGroups(props.settings));\n  const [muscleGroupsData] = historyCollector.run();\n  const muscleGroups = ObjectUtils_keys(muscleGroupsData).reduce<[IScreenMuscle, number][]>((memo, mg) => {\n    const values = muscleGroupsData[mg];\n    if (values[2][0] > 0 && mg !== \"total\") {\n      memo.push([mg, values[2][0]]);\n    }\n    return memo;\n  }, []);\n  muscleGroups.sort((a, b) => b[1] - a[1]);\n  const muscleGroupsGrouped = CollectionUtils_splitIntoNGroups(muscleGroups, 2);\n  const eligibleForCreateProgramDay = props.allPrograms.every((p) => p.id !== record.programId);\n\n  const isMobile = Platform.OS === \"ios\" || Platform.OS === \"android\";\n\n  return (\n    <>\n      <View className=\"px-gutter pb-6\">\n        <View className=\"flex-row items-center justify-center pb-2\">\n          {Platform.OS === \"web\" ? (\n            <SvgUri uri={HostConfig_resolveUrl(ImagePreloader_dynohappy)} width={170} height={150} />\n          ) : (\n            <SvgXml xml={BundledImages_svgXml(ImagePreloader_dynohappy) ?? \"\"} width={170} height={150} />\n          )}\n        </View>\n        <View className=\"items-center px-gutter pb-2\">\n          <Text className=\"text-sm text-text-secondary\">{record.programName}</Text>\n          <Text className=\"text-base\">{record.dayName}</Text>\n        </View>\n        <View className=\"px-4 pt-2 pb-3 rounded-lg bg-background-purpledark\" testID=\"totals-summary\">\n          <GroupHeader name=\"Totals\" />\n          <View className=\"flex-row gap-2\">\n            <View className=\"flex-1\">\n              <Text className=\"text-sm\">\n                <Text className=\"mr-1\">🕐</Text> Time:{\" \"}\n                <Text className=\"font-bold\">{TimeUtils_formatHHMM(History_workoutTime(record))} h</Text>\n              </Text>\n              <Text className=\"text-sm\">\n                <Text className=\"mr-1\">🏋</Text> Volume:{\" \"}\n                <Text className=\"font-bold\">{Weight_display(totalWeight)}</Text>\n              </Text>\n            </View>\n            <View className=\"flex-1\">\n              <Text className=\"text-sm\">\n                <Text className=\"mr-1\">💪</Text> Sets: <Text className=\"font-bold\">{totalSets}</Text>\n              </Text>\n              <Text className=\"text-sm\">\n                <Text className=\"mr-1\">🔄</Text> Reps: <Text className=\"font-bold\">{totalReps}</Text>\n              </Text>\n            </View>\n          </View>\n        </View>\n\n        {startedEntries.length > 0 && (\n          <View className=\"px-4 py-2 mt-2 rounded-lg bg-background-purpledark\" testID=\"completed-exercises\">\n            <GroupHeader name=\"Exercises\" />\n            {startedEntries.map((entry, i) => {\n              return (\n                <HistoryEntryView\n                  key={`${entry.exercise.id}_${entry.exercise.equipment}`}\n                  showNotes={false}\n                  entry={entry}\n                  isNext={false}\n                  isLast={i === startedEntries.length - 1}\n                  settings={props.settings}\n                />\n              );\n            })}\n          </View>\n        )}\n\n        <View className=\"px-4 py-2 mt-2 rounded-lg bg-background-purpledark\" testID=\"sets-per-muscle-group\">\n          <GroupHeader name=\"Sets per muscle group\" />\n          <View className=\"flex-row gap-4\">\n            {muscleGroupsGrouped.map((group, gi) => {\n              return (\n                <View key={gi} className=\"flex-1\">\n                  {group.map(([mg, value]) => {\n                    return (\n                      <Text key={mg} className=\"text-sm\">\n                        {Muscle_getMuscleGroupName(mg, props.settings)}: <Text className=\"font-bold\">{n(value)}</Text>\n                      </Text>\n                    );\n                  })}\n                </View>\n              );\n            })}\n          </View>\n        </View>\n\n        <View className=\"px-gutter py-4 mt-4\">\n          <PersonalRecords prs={allPrs} historyRecords={[record]} settings={props.settings} />\n        </View>\n\n        {isMobile ? (\n          <MobileShare userId={props.userId} history={props.history} record={record} settings={props.settings} />\n        ) : (\n          <WebappShare userId={props.userId} history={props.history} record={record} settings={props.settings} />\n        )}\n\n        {eligibleForCreateProgramDay && (\n          <Text className=\"mx-2 my-1 text-xs text-text-secondary\">You can create a program day from this workout</Text>\n        )}\n\n        <View className=\"flex-row w-full gap-4 pt-4\">\n          {eligibleForCreateProgramDay && (\n            <View className=\"items-center flex-1\">\n              <Button\n                name=\"create-program-day\"\n                kind=\"purple\"\n                buttonSize=\"lg2\"\n                className=\"w-36\"\n                testID=\"create-program-day\"\n                onPress={() => {\n                  navigateToModal(\"dayFromAdhocModal\", { historyRecordId: record.id });\n                }}\n              >\n                Create Program Day\n              </Button>\n            </View>\n          )}\n          <View className=\"items-center justify-center flex-1 pb-8\">\n            <Button\n              name=\"finish-day-continue\"\n              kind=\"purple\"\n              className=\"w-36\"\n              testID=\"finish-day-continue\"\n              onPress={() => {\n                props.dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n                props.dispatch(Thunk_maybeRequestReview());\n                props.dispatch(Thunk_maybeRequestSignup());\n              }}\n            >\n              Continue\n            </Button>\n          </View>\n        </View>\n      </View>\n      <Confetti />\n    </>\n  );\n}\n\ninterface IMobileShareProps {\n  history: IHistoryRecord[];\n  record: IHistoryRecord;\n  settings: ISettings;\n  userId?: string;\n}\n\nfunction MobileShare(props: IMobileShareProps): JSX.Element {\n  const historyRecordId = props.record.id;\n  return (\n    <View className=\"px-gutter py-4\">\n      <GroupHeader name=\"Share it!\" />\n      <View className=\"flex-row justify-between gap-4\">\n        <View className=\"items-center\">\n          <Pressable\n            testID=\"finish-day-share-igstory\"\n            className=\"nm-finishday-share-igstory\"\n            onPress={() => navigateToModal(\"socialShareModal\", { type: \"igstory\", historyRecordId })}\n          >\n            <IconInstagram />\n          </Pressable>\n          <Text className=\"text-xs text-text-secondary\">IG Story</Text>\n        </View>\n        <View className=\"items-center\">\n          <Pressable\n            testID=\"finish-day-share-igfeed\"\n            className=\"nm-finishday-share-igfeed\"\n            onPress={() => navigateToModal(\"socialShareModal\", { type: \"igfeed\", historyRecordId })}\n          >\n            <IconInstagram />\n          </Pressable>\n          <Text className=\"text-xs text-text-secondary\">IG Feed</Text>\n        </View>\n        <View className=\"items-center\">\n          <Pressable\n            testID=\"finish-day-share-tiktok\"\n            className=\"nm-finishday-share-tiktok\"\n            onPress={() => navigateToModal(\"socialShareModal\", { type: \"tiktok\", historyRecordId })}\n          >\n            <IconTiktok />\n          </Pressable>\n          <Text className=\"text-xs text-text-secondary\">Tiktok</Text>\n        </View>\n        <View className=\"items-center\">\n          <Pressable\n            testID=\"finish-day-share-text\"\n            className=\"items-center justify-center w-scaled-10 h-scaled-10 rounded-full nm-finishday-share-text bg-background-subtle\"\n            onPress={() => {\n              const text = LiftohistorySerializer_serialize(props.record, props.settings);\n              ClipboardUtils_copy(text);\n              Dialog_alert(\"Copied!\");\n            }}\n          >\n            <IconDoc />\n          </Pressable>\n          <Text className=\"text-xs text-text-secondary\">Text</Text>\n        </View>\n        <View className=\"items-center\">\n          <WorkoutShareButton\n            history={props.history}\n            record={props.record}\n            settings={props.settings}\n            icon={<IconKebab />}\n          />\n          <Text className=\"text-xs text-text-secondary\">More</Text>\n        </View>\n      </View>\n      <View className=\"items-center mt-1\">\n        <LinkButton\n          name=\"copy-workout-link\"\n          onPress={() => {\n            if (props.userId) {\n              const link = Share_generateLink(props.userId, props.record.id);\n              ClipboardUtils_copy(link);\n              Dialog_alert(\"Copied!\");\n            } else {\n              Dialog_alert(\"You should be logged in to copy link to a workout\");\n            }\n          }}\n        >\n          or just copy a link\n        </LinkButton>\n      </View>\n    </View>\n  );\n}\n\ninterface IWebappShareProps {\n  history: IHistoryRecord[];\n  record: IHistoryRecord;\n  userId?: string;\n  settings: ISettings;\n}\n\nfunction WebappShare(props: IWebappShareProps): JSX.Element {\n  const [copiedLink, setCopiedLink] = useState<string | undefined>(undefined);\n  const userId = props.userId;\n\n  return (\n    <View className=\"px-gutter py-4\">\n      <GroupHeader name=\"Share it!\" />\n      <View className=\"flex-row justify-between gap-4\">\n        <View className=\"items-center\">\n          <WorkoutShareButton\n            history={props.history}\n            record={props.record}\n            settings={props.settings}\n            icon={<IconPicture />}\n          />\n          <Text className=\"text-xs text-text-secondary\">Image</Text>\n        </View>\n        <View className=\"items-center\">\n          <Pressable\n            testID=\"finishday-share-text\"\n            className=\"items-center justify-center w-scaled-10 h-scaled-10 rounded-full bg-background-subtle\"\n            onPress={() => {\n              const text = LiftohistorySerializer_serialize(props.record, props.settings);\n              ClipboardUtils_copy(text);\n              Dialog_alert(\"Copied!\");\n            }}\n          >\n            <IconDoc />\n          </Pressable>\n          <Text className=\"text-xs text-text-secondary\">Text</Text>\n        </View>\n        <View className=\"items-center\">\n          <Pressable\n            className=\"items-center justify-center w-scaled-10 h-scaled-10 rounded-full bg-background-subtle\"\n            onPress={() => {\n              if (userId) {\n                const link = Share_generateLink(userId, props.record.id);\n                ClipboardUtils_copy(link);\n                setCopiedLink(link);\n              } else {\n                Dialog_alert(\"You should be logged in to copy link to a workout\");\n              }\n            }}\n          >\n            <IconLink />\n          </Pressable>\n          {copiedLink ? (\n            <View className=\"flex-row\">\n              <Text className=\"text-xs text-text-secondary\">Copied: </Text>\n              <InternalLink name=\"shared-workout-link\" href={copiedLink} className=\"font-bold underline text-text-link\">\n                Link\n              </InternalLink>\n            </View>\n          ) : (\n            <Text className=\"text-xs text-text-secondary\">Copy Link</Text>\n          )}\n        </View>\n      </View>\n    </View>\n  );\n}\n","import { JSX, ReactNode, useEffect, useRef } from \"react\";\nimport { View, Image, Platform, Animated, Easing } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { IDispatch } from \"../ducks/types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Button } from \"./button\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport StorySlider from \"./storySlider\";\nimport { IconKettlebell } from \"./icons/iconKettlebell\";\nimport { Svg, Defs, LinearGradient, Stop, Rect, SvgXml } from \"./primitives/svg\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { IconWorkoutProgress } from \"./icons/iconWorkoutProgress\";\nimport { IconEditor } from \"./icons/iconEditor\";\nimport { IconTracker } from \"./icons/iconTracker\";\nimport { ImagePreloader_preload } from \"../utils/imagePreloader\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { BundledImages_resolve, BundledImages_svgXml } from \"../utils/bundledImages\";\n\ninterface IProps {\n  dispatch: IDispatch;\n}\n\nconst onboardingImages = [\n  \"/images/dinounit.png\",\n  \"/images/dinoequipment.png\",\n  \"/images/dinoplates.png\",\n  \"/images/dinoprogramselect.png\",\n  \"/images/dino-scope.png\",\n];\n\nexport function ScreenFirst(props: IProps): JSX.Element {\n  useNavOptions({ navHidden: true });\n\n  useEffect(() => {\n    for (const url of onboardingImages) {\n      ImagePreloader_preload(url);\n    }\n  }, []);\n\n  return (\n    <View className=\"flex flex-col flex-1 h-screen bg-background-default\">\n      <View className=\"flex-1 px-gutter pt-16 pb-4\">\n        <StorySlider\n          slides={[\n            <FirstSlide />,\n            <RestSlide\n              bgColorHexFrom={Tailwind_colors().purple[200]}\n              bgColor=\"bg-purple-100\"\n              borderColor=\"border-purple-200\"\n              header={\n                <View className=\"flex-row items-center justify-center\">\n                  <IconKettlebell color={Tailwind_colors().purple[600]} />\n                  <Text className=\"ml-1 font-semibold text-text-purple\">Weightlifting Programs</Text>\n                </View>\n              }\n              bodyText=\"Start with a pre-built weightlifting program, or create your own.\"\n              image=\"slide-2-image\"\n            />,\n            <RestSlide\n              bgColorHexFrom={Tailwind_colors().yellow[200]}\n              bgColor=\"bg-yellow-100\"\n              borderColor=\"border-border-cardyellow\"\n              header={\n                <View className=\"flex-row items-center justify-center\">\n                  <IconWorkoutProgress color={Tailwind_colors().yellow[600]} />\n                  <Text className=\"ml-1 font-semibold text-icon-yellow\">Workout Tracker</Text>\n                </View>\n              }\n              bodyText=\"Log sets with one tap. Your reps and weight adjust automatically.\"\n              image=\"slide-3-image\"\n            />,\n            <RestSlide\n              bgColorHexFrom={Tailwind_colors().purple[200]}\n              bgColor=\"bg-purple-100\"\n              borderColor=\"border-purple-200\"\n              header={\n                <View className=\"flex-row items-center justify-center\">\n                  <IconEditor color={Tailwind_colors().purple[600]} />\n                  <Text className=\"ml-1 font-semibold text-text-purple\">Program Editor</Text>\n                </View>\n              }\n              bodyText=\"Modify or switch any program anytime to fit your goals.\"\n              image=\"slide-4-image\"\n            />,\n            <RestSlide\n              bgColorHexFrom={Tailwind_colors().red[200]}\n              bgColor=\"bg-red-100\"\n              borderColor=\"border-red-200\"\n              header={\n                <View className=\"flex-row items-center justify-center\">\n                  <IconTracker color={Tailwind_colors().red[600]} />\n                  <Text className=\"ml-1 font-semibold text-text-error\">Workout History</Text>\n                </View>\n              }\n              bodyText=\"Track your weekly stats to stay on target!\"\n              image=\"slide-5-image\"\n            />,\n          ]}\n          duration={5000}\n        />\n      </View>\n      <View className=\"pb-6 mx-4\">\n        <Button\n          className=\"w-full ls-onboarding-start\"\n          name=\"see-how-it-works\"\n          kind=\"purple\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"units\"))}\n        >\n          <View className=\"flex-row items-center justify-center\">\n            <Text className=\"text-xs font-semibold text-text-alwayswhite\">Get started</Text>\n            <AnimatedArrow />\n          </View>\n        </Button>\n        <View className=\"pb-4 mt-2\">\n          <Button\n            className=\"w-full ls-onboarding-have-account\"\n            name=\"see-how-it-works\"\n            kind=\"transparent-purple\"\n            onClick={() => navigateToModal(\"accountModal\")}\n          >\n            I have an account\n          </Button>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nfunction AnimatedArrow(): JSX.Element {\n  const translateX = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    const animation = Animated.loop(\n      Animated.sequence([\n        Animated.timing(translateX, {\n          toValue: 4,\n          duration: 500,\n          easing: Easing.inOut(Easing.ease),\n          useNativeDriver: Platform.OS !== \"web\",\n        }),\n        Animated.timing(translateX, {\n          toValue: 0,\n          duration: 500,\n          easing: Easing.inOut(Easing.ease),\n          useNativeDriver: Platform.OS !== \"web\",\n        }),\n      ])\n    );\n    animation.start();\n    return () => animation.stop();\n  }, [translateX]);\n\n  return (\n    <Animated.View style={{ marginLeft: 8, transform: [{ translateX }] }}>\n      <IconArrowRight color=\"white\" />\n    </Animated.View>\n  );\n}\n\nfunction FirstSlide(): JSX.Element {\n  return (\n    <View className=\"relative flex flex-col w-full h-full overflow-hidden bg-white rounded-2xl\">\n      <Image\n        source={BundledImages_resolve(\"/images/slide-1-bg.jpg\")}\n        className=\"absolute top-0 bottom-0 left-0 right-0 w-full h-full\"\n        resizeMode=\"cover\"\n      />\n      <Text className=\"px-8 pt-24 text-3xl font-bold leading-scaled-9 text-text-alwayswhite\">\n        The most powerful weightlifting{\" \"}\n        <Text className=\"text-3xl\" style={{ color: Tailwind_colors().purple[400] }}>\n          planner\n        </Text>{\" \"}\n        and{\" \"}\n        <Text className=\"text-3xl\" style={{ color: Tailwind_colors().red[400] }}>\n          tracker\n        </Text>{\" \"}\n        app\n      </Text>\n      <Text className=\"px-8 py-6 text-base text-text-alwayswhite\">\n        Build any weightlifting program using a simple scripting language and track your progress.\n      </Text>\n      <View className=\"flex-1 w-full overflow-hidden\">\n        {Platform.OS === \"web\" ? (\n          <Image\n            source={{ uri: \"/images/logo.svg\" }}\n            className=\"w-full h-full\"\n            resizeMode=\"contain\"\n            style={{ alignSelf: \"flex-end\" }}\n          />\n        ) : (\n          <SvgXml\n            xml={BundledImages_svgXml(\"/images/logo.svg\") ?? \"\"}\n            width=\"100%\"\n            height=\"100%\"\n            preserveAspectRatio=\"xMidYMax meet\"\n          />\n        )}\n      </View>\n    </View>\n  );\n}\n\ninterface IRestSlideProps {\n  bgColorHexFrom: string;\n  bgColor: string;\n  borderColor: string;\n  header: ReactNode;\n  bodyText: string;\n  image: string;\n}\n\nfunction RestSlide(props: IRestSlideProps): JSX.Element {\n  const gradientId = `slide-gradient-${props.image}`;\n  return (\n    <View\n      className={`relative flex flex-col w-full h-full overflow-hidden border ${props.borderColor} rounded-2xl ${props.bgColor}`}\n    >\n      <View pointerEvents=\"none\" style={{ position: \"absolute\", top: 0, left: 0, right: 0, height: 80 }}>\n        <Svg width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" viewBox=\"0 0 100 100\">\n          <Defs>\n            <LinearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"100\" gradientUnits=\"userSpaceOnUse\">\n              <Stop offset=\"0%\" stopColor={props.bgColorHexFrom} stopOpacity={0.8} />\n              <Stop offset=\"100%\" stopColor={props.bgColorHexFrom} stopOpacity={0} />\n            </LinearGradient>\n          </Defs>\n          <Rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradientId})`} />\n        </Svg>\n      </View>\n      <View className=\"h-12 px-8\" />\n      <View className=\"px-8\">{props.header}</View>\n      <Text className=\"px-8 py-6 text-xl font-semibold text-center text-black\">{props.bodyText}</Text>\n      <View className=\"items-center justify-center flex-1 w-full\">\n        <Image\n          source={BundledImages_resolve(`/images/${props.image}.png`)}\n          className=\"w-full h-full\"\n          resizeMode=\"contain\"\n        />\n      </View>\n    </View>\n  );\n}\n","import { JSX, useMemo, useState } from \"react\";\nimport { Pressable, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { IFoodItem, IFoodMeal, IMealTemplate, INutritionGoals, IStats, IUnit } from \"../types\";\nimport {\n  Food_copyValues,\n  Food_daySummary,\n  Food_defaultMeal,\n  Food_entryTotals,\n  Food_formatAmount,\n  Food_formatWater,\n  Food_localDate,\n  Food_mealNames,\n  Food_remaining,\n  Food_shiftDate,\n  Food_sumNutrients,\n  Food_waterEntries,\n  IFoodRemaining,\n} from \"../models/food\";\nimport {\n  Expenditure_current,\n  Expenditure_fromKg,\n  Expenditure_minLoggedDays,\n  Expenditure_minWeighIns,\n  Expenditure_minWeighInSpanDays,\n  IExpenditureStatus,\n} from \"../models/expenditure\";\nimport { EditFood_addEntries, EditFood_addWater, EditFood_deleteWater } from \"../models/editFood\";\nimport { FoodSearch_formatServing } from \"../models/foodSearch\";\nimport { MenuItem } from \"./menuItem\";\nimport { IconBack } from \"./icons/iconBack\";\nimport { IconPlus2 } from \"./icons/iconPlus2\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  stats: IStats;\n  goals?: INutritionGoals;\n  library: IFoodItem[];\n  templates: IMealTemplate[];\n  units: IUnit;\n  initialDate?: string;\n}\n\nconst waterAmounts = [250, 500];\n\nconst macroNames: Record<IFoodRemaining[\"key\"], string> = {\n  calories: \"Calories\",\n  protein: \"Protein\",\n  carbs: \"Carbs\",\n  fat: \"Fat\",\n  fiber: \"Fiber\",\n};\n\nfunction shortDate(date: string): string {\n  const [y, m, d] = date.split(\"-\").map(Number);\n  return new Date(y, m - 1, d).toLocaleDateString(undefined, { weekday: \"short\", month: \"short\", day: \"numeric\" });\n}\n\nfunction dateLabel(date: string, today: string): string {\n  if (date === today) {\n    return \"Today\";\n  } else if (date === Food_shiftDate(today, -1)) {\n    return \"Yesterday\";\n  } else if (date === Food_shiftDate(today, 1)) {\n    return \"Tomorrow\";\n  }\n  return shortDate(date);\n}\n\n// For mid-sentence use: \"copy from yesterday\", but \"copy from Thu, Oct 15\".\nfunction inlineDateLabel(date: string, today: string): string {\n  const label = dateLabel(date, today);\n  return label === shortDate(date) ? label : label.toLowerCase();\n}\n\nfunction MealLinks(props: {\n  meal: IFoodMeal;\n  prevLabel: string;\n  prevCount: number;\n  canCopy: boolean;\n  hasTemplates: boolean;\n  onCopy: () => void;\n  onTemplates: () => void;\n}): JSX.Element | null {\n  const showCopy = props.canCopy && props.prevCount > 0;\n  if (!showCopy && !props.hasTemplates) {\n    return null;\n  }\n  return (\n    <View className=\"flex-row pt-1\">\n      {showCopy && (\n        <Pressable\n          testID={`food-copy-${props.meal}`}\n          data-testid={`food-copy-${props.meal}`}\n          className=\"py-1 mr-4\"\n          onPress={props.onCopy}\n        >\n          <Text className=\"text-xs text-text-link\">{`Copy from ${props.prevLabel} (${props.prevCount})`}</Text>\n        </Pressable>\n      )}\n      {props.hasTemplates && (\n        <Pressable\n          testID={`food-templates-${props.meal}`}\n          data-testid={`food-templates-${props.meal}`}\n          className=\"py-1\"\n          onPress={props.onTemplates}\n        >\n          <Text className=\"text-xs text-text-link\">Templates</Text>\n        </Pressable>\n      )}\n    </View>\n  );\n}\n\nfunction ProgressBar(props: { item: IFoodRemaining }): JSX.Element {\n  const ratio = Math.min(props.item.eaten / props.item.goal, 1);\n  const isOver = props.item.eaten > props.item.goal * 1.05;\n  const unit = props.item.key === \"calories\" ? \"\" : \" g\";\n  return (\n    <View className=\"pb-2\">\n      <View className=\"flex-row justify-between\">\n        <Text className=\"text-xs text-text-secondary\">{macroNames[props.item.key]}</Text>\n        <Text className=\"text-xs text-text-secondary\">\n          {Food_formatAmount(props.item.eaten)} / {Food_formatAmount(props.item.goal)}\n          {unit}\n        </Text>\n      </View>\n      <View className=\"h-2 mt-1 overflow-hidden rounded-full bg-background-neutral\">\n        <View\n          className={`h-2 rounded-full ${isOver ? \"bg-text-error\" : \"bg-button-primarybackground\"}`}\n          style={{ width: `${Math.round(ratio * 100)}%` }}\n        />\n      </View>\n    </View>\n  );\n}\n\nfunction ExpenditureCard(props: { status: IExpenditureStatus; units: IUnit; calorieGoal?: number }): JSX.Element {\n  const { estimate } = props.status;\n  if (!estimate) {\n    const missing = [\n      props.status.loggedDays < Expenditure_minLoggedDays\n        ? `log food on ${Expenditure_minLoggedDays - props.status.loggedDays} more days`\n        : undefined,\n      props.status.weighIns < Expenditure_minWeighIns\n        ? `weigh in ${Expenditure_minWeighIns - props.status.weighIns} more times`\n        : props.status.weighInSpanDays < Expenditure_minWeighInSpanDays\n          ? `keep weighing in for ${Expenditure_minWeighInSpanDays - props.status.weighInSpanDays} more days`\n          : undefined,\n    ].filter(Boolean);\n    return (\n      <View\n        className=\"p-3 mb-4 border rounded-lg border-border-neutral\"\n        testID=\"food-expenditure\"\n        data-testid=\"food-expenditure\"\n      >\n        <Text className=\"text-sm font-semibold\">Estimated expenditure</Text>\n        <Text className=\"text-xs text-text-secondary\">\n          Not enough data yet. To get an estimate, {missing.join(\" and \")} within the last 4 weeks.\n        </Text>\n      </View>\n    );\n  }\n  const perWeek = Expenditure_fromKg(estimate.weightChangeKgPerWeek, props.units);\n  const trend = `${perWeek > 0 ? \"+\" : \"\"}${Math.round(perWeek * 100) / 100} ${props.units}/week`;\n  const diff = props.calorieGoal != null ? props.calorieGoal - estimate.tdee : undefined;\n  return (\n    <View\n      className=\"p-3 mb-4 border rounded-lg border-border-neutral\"\n      testID=\"food-expenditure\"\n      data-testid=\"food-expenditure\"\n    >\n      <View className=\"flex-row items-end justify-between\">\n        <Text className=\"text-sm font-semibold\">Estimated expenditure</Text>\n        <Text className=\"text-xl font-semibold\">{Food_formatAmount(estimate.tdee)} kcal</Text>\n      </View>\n      <Text className=\"text-xs text-text-secondary\">\n        {`Ate ${Food_formatAmount(estimate.averageIntake)} kcal/day on average, weight trend ${trend}. From ${\n          estimate.loggedDays\n        } logged days and ${estimate.weighIns} weigh-ins since ${shortDate(estimate.startDate)}.`}\n      </Text>\n      {diff != null && Math.abs(diff) >= 25 && (\n        <Text className=\"pt-1 text-xs text-text-secondary\">\n          Your calorie goal is {Food_formatAmount(Math.abs(diff))} kcal {diff < 0 ? \"below\" : \"above\"} it.\n        </Text>\n      )}\n    </View>\n  );\n}\n\nfunction WaterCard(props: { dispatch: IDispatch; stats: IStats; date: string; goalMl?: number }): JSX.Element {\n  const entries = Food_waterEntries(props.stats, props.date);\n  const total = entries.reduce((memo, w) => memo + w.value.ml, 0);\n  const last = entries[entries.length - 1];\n  const goal = props.goalMl;\n  return (\n    <View className=\"p-3 mb-4 border rounded-lg border-border-neutral\" testID=\"food-water\" data-testid=\"food-water\">\n      <View className=\"flex-row items-center justify-between\">\n        <View>\n          <Text className=\"text-sm font-semibold\">Water</Text>\n          <Text className=\"text-xs text-text-secondary\">\n            {goal ? `${Food_formatWater(total)} of ${Food_formatWater(goal)}` : Food_formatWater(total)}\n          </Text>\n        </View>\n        <View className=\"flex-row items-center\">\n          {last && (\n            <Pressable\n              testID=\"food-water-undo\"\n              data-testid=\"food-water-undo\"\n              className=\"px-2 py-1 mr-1\"\n              onPress={() => EditFood_deleteWater(props.dispatch, last.timestamp)}\n            >\n              <Text className=\"text-sm text-text-link\">Undo</Text>\n            </Pressable>\n          )}\n          {waterAmounts.map((ml) => (\n            <Pressable\n              key={ml}\n              testID={`food-water-add-${ml}`}\n              data-testid={`food-water-add-${ml}`}\n              className=\"px-3 py-1 ml-2 border rounded-full border-border-prominent\"\n              onPress={() => EditFood_addWater(props.dispatch, props.date, ml)}\n            >\n              <Text className=\"text-sm\">+{ml} ml</Text>\n            </Pressable>\n          ))}\n        </View>\n      </View>\n      {goal != null && goal > 0 && (\n        <View className=\"h-2 mt-2 overflow-hidden rounded-full bg-background-neutral\">\n          <View\n            className=\"h-2 rounded-full bg-button-primarybackground\"\n            style={{ width: `${Math.round(Math.min(total / goal, 1) * 100)}%` }}\n          />\n        </View>\n      )}\n    </View>\n  );\n}\n\nexport function ScreenFood(props: IProps): JSX.Element {\n  const today = Food_localDate(Date.now());\n  const [date, setDate] = useState(props.initialDate || today);\n  const summary = Food_daySummary(props.stats, date);\n  const remaining = Food_remaining(props.goals, summary.totals);\n  const calorieGoal = remaining.find((r) => r.key === \"calories\");\n  const semantic = Tailwind_semantic();\n  const prevDate = Food_shiftDate(date, -1);\n  const prevSummary = Food_daySummary(props.stats, prevDate);\n  const prevEntries = prevSummary.meals.flatMap((m) => m.entries);\n  const isDayEmpty = summary.meals.every((m) => m.entries.length === 0);\n  const expenditure = useMemo(() => Expenditure_current(props.stats, Date.now()), [props.stats]);\n\n  useNavOptions({ navTitle: \"Food\" });\n\n  const addFood = (meal = Food_defaultMeal(new Date().getHours())): void => {\n    props.dispatch(Thunk_pushScreen(\"foodAdd\", { date, meal }));\n  };\n\n  const copyFromPrev = (meal?: IFoodMeal): void => {\n    const source = meal ? prevSummary.meals.find((m) => m.meal === meal)?.entries || [] : prevEntries;\n    EditFood_addEntries(props.dispatch, Food_copyValues(source, { date, meal }));\n  };\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      <View className=\"flex-row items-center justify-between py-2\">\n        <Pressable\n          testID=\"food-prev-day\"\n          data-testid=\"food-prev-day\"\n          className=\"p-2\"\n          onPress={() => setDate(Food_shiftDate(date, -1))}\n        >\n          <IconBack />\n        </Pressable>\n        <Pressable testID=\"food-today\" data-testid=\"food-today\" onPress={() => setDate(today)}>\n          <Text className=\"text-base font-semibold\">{dateLabel(date, today)}</Text>\n        </Pressable>\n        <Pressable\n          testID=\"food-next-day\"\n          data-testid=\"food-next-day\"\n          className=\"p-2\"\n          style={{ transform: [{ scaleX: -1 }] }}\n          onPress={() => setDate(Food_shiftDate(date, 1))}\n        >\n          <IconBack />\n        </Pressable>\n      </View>\n\n      <View className=\"p-4 mb-4 border rounded-lg border-border-cardpurple bg-background-cardpurple\">\n        <View className=\"flex-row items-end justify-between pb-3\">\n          <View>\n            <Text className=\"text-3xl font-bold\">{Food_formatAmount(summary.totals.calories)}</Text>\n            <Text className=\"text-xs text-text-secondary\">kcal eaten</Text>\n          </View>\n          {calorieGoal ? (\n            <View className=\"items-end\">\n              <Text className={`text-xl font-semibold ${calorieGoal.remaining < 0 ? \"text-text-error\" : \"\"}`}>\n                {Food_formatAmount(Math.abs(calorieGoal.remaining))}\n              </Text>\n              <Text className=\"text-xs text-text-secondary\">\n                {calorieGoal.remaining < 0 ? \"kcal over\" : \"kcal left\"}\n              </Text>\n            </View>\n          ) : (\n            <Pressable\n              testID=\"food-set-goals\"\n              data-testid=\"food-set-goals\"\n              onPress={() => props.dispatch(Thunk_pushScreen(\"foodGoals\"))}\n            >\n              <Text className=\"text-sm text-text-link\">Set daily goals</Text>\n            </Pressable>\n          )}\n        </View>\n        {remaining.length > 0 ? (\n          remaining.map((item) => <ProgressBar key={item.key} item={item} />)\n        ) : (\n          <Text className=\"text-xs text-text-secondary\">\n            {`Protein ${Food_formatAmount(summary.totals.protein)} g · Carbs ${Food_formatAmount(\n              summary.totals.carbs\n            )} g · Fat ${Food_formatAmount(summary.totals.fat)} g · Fiber ${Food_formatAmount(summary.totals.fiber ?? 0)} g`}\n          </Text>\n        )}\n      </View>\n\n      <ExpenditureCard status={expenditure} units={props.units} calorieGoal={props.goals?.calories} />\n      <WaterCard dispatch={props.dispatch} stats={props.stats} date={date} goalMl={props.goals?.waterMl} />\n\n      {isDayEmpty && prevEntries.length > 0 && (\n        <Pressable\n          testID=\"food-copy-day\"\n          data-testid=\"food-copy-day\"\n          className=\"p-3 mb-4 border border-dashed rounded-lg border-border-prominent\"\n          onPress={() => copyFromPrev()}\n        >\n          <Text className=\"text-sm text-center text-text-link\">\n            {`Copy all of ${inlineDateLabel(prevDate, today)} (${prevEntries.length} items, ${Food_formatAmount(\n              Food_sumNutrients(prevEntries.map((e) => Food_entryTotals(e.value))).calories\n            )} kcal)`}\n          </Text>\n        </Pressable>\n      )}\n\n      {summary.meals.map((meal) => (\n        <View key={meal.meal} className=\"mb-4\">\n          <View className=\"flex-row items-center justify-between pb-1 border-b border-border-prominent\">\n            <Text className=\"text-base font-semibold\">{Food_mealNames[meal.meal]}</Text>\n            <View className=\"flex-row items-center\">\n              {meal.entries.length > 0 && (\n                <Text className=\"mr-3 text-sm text-text-secondary\">{Food_formatAmount(meal.totals.calories)} kcal</Text>\n              )}\n              <Pressable\n                testID={`food-add-${meal.meal}`}\n                data-testid={`food-add-${meal.meal}`}\n                className=\"p-1\"\n                onPress={() => addFood(meal.meal)}\n              >\n                <IconPlus2 size={16} color={semantic.icon.purple} />\n              </Pressable>\n            </View>\n          </View>\n          {meal.entries.map((entry) => {\n            const totals = Food_entryTotals(entry.value);\n            return (\n              <Pressable\n                key={entry.timestamp}\n                testID={`food-entry-${entry.timestamp}`}\n                data-testid={`food-entry-${entry.timestamp}`}\n                className=\"flex-row items-center py-2 border-b border-border-neutral\"\n                onPress={() =>\n                  props.dispatch(Thunk_pushScreen(\"foodAdd\", { date, meal: meal.meal, editTimestamp: entry.timestamp }))\n                }\n              >\n                <View className=\"flex-1 pr-2\">\n                  <Text className=\"text-sm\" numberOfLines={1}>\n                    {entry.value.name}\n                  </Text>\n                  <Text className=\"text-xs text-text-secondary\" numberOfLines={1}>\n                    {[entry.value.brand, FoodSearch_formatServing(entry.value.servingLabel, entry.value.servings)]\n                      .filter(Boolean)\n                      .join(\" · \")}\n                  </Text>\n                </View>\n                <View className=\"items-end\">\n                  <Text className=\"text-sm\">{Food_formatAmount(totals.calories)}</Text>\n                  <Text className=\"text-xs text-text-secondary\">\n                    {`P${Food_formatAmount(totals.protein)} C${Food_formatAmount(totals.carbs)} F${Food_formatAmount(totals.fat)}`}\n                  </Text>\n                </View>\n              </Pressable>\n            );\n          })}\n          <MealLinks\n            meal={meal.meal}\n            prevLabel={inlineDateLabel(prevDate, today)}\n            prevCount={prevSummary.meals.find((m) => m.meal === meal.meal)?.entries.length ?? 0}\n            canCopy={meal.entries.length === 0}\n            onCopy={() => copyFromPrev(meal.meal)}\n            onTemplates={() => props.dispatch(Thunk_pushScreen(\"foodTemplates\", { date, meal: meal.meal }))}\n            hasTemplates={props.templates.length > 0 || meal.entries.length > 0}\n          />\n        </View>\n      ))}\n\n      <MenuItem\n        name=\"Saved foods & recipes\"\n        value={`${props.library.length}`}\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"foodLibrary\"))}\n      />\n      <MenuItem\n        name=\"Daily goals\"\n        value={calorieGoal ? `${Food_formatAmount(calorieGoal.goal)} kcal` : \"Not set\"}\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"foodGoals\"))}\n      />\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pullScreen, Thunk_pushScreen } from \"../ducks/thunks\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Service } from \"../api/service\";\nimport { IFoodEntryValue, IFoodItem, IFoodMeal, IStats } from \"../types\";\nimport {\n  Food_defaultAmount,\n  Food_entries,\n  Food_parseNumber,\n  Food_recentEntries,\n  Food_selectionForEntry,\n  IFoodSelection,\n} from \"../models/food\";\nimport {\n  FoodLabel_emptyForm,\n  FoodLabel_formFromSelection,\n  FoodLabel_parse,\n  FoodLabel_quickAdd,\n  IFoodLabelForm,\n} from \"../models/foodLabel\";\nimport { FoodPick_confirm, FoodPick_view } from \"../models/foodPick\";\nimport { EditFood_addEntries, EditFood_deleteEntry, EditFood_saveItem, EditFood_updateEntry } from \"../models/editFood\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { Dialog_confirm } from \"../utils/dialog\";\nimport { Button } from \"./button\";\nimport { Chip, FoodTextField, MealPicker } from \"./food/foodFields\";\nimport { FoodLabelFields } from \"./food/foodLabelFields\";\nimport { FoodPicker } from \"./food/foodPicker\";\nimport { IServingChoice, ServingPicker } from \"./food/servingPicker\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  service: Service;\n  stats: IStats;\n  library: IFoodItem[];\n  date: string;\n  meal: IFoodMeal;\n  editTimestamp?: number;\n}\n\nfunction initialChoice(selection: IFoodSelection): IServingChoice {\n  return { optionIndex: 0, amountText: `${Food_defaultAmount(selection.servings[0])}` };\n}\n\nexport function ScreenFoodAdd(props: IProps): JSX.Element {\n  const editing =\n    props.editTimestamp != null\n      ? Food_entries(props.stats).find((e) => e.timestamp === props.editTimestamp)\n      : undefined;\n  const [meal, setMeal] = useState<IFoodMeal>(editing?.value.meal ?? props.meal);\n  const [mode, setMode] = useState<\"pick\" | \"quick\">(\"pick\");\n  const [picked, setPicked] = useState<IFoodSelection | undefined>(() =>\n    editing ? Food_selectionForEntry(editing.value, props.library, \"edit\") : undefined\n  );\n  const [choice, setChoice] = useState<IServingChoice>({\n    optionIndex: 0,\n    amountText: editing ? `${editing.value.servings}` : \"1\",\n  });\n  const [saveToLibrary, setSaveToLibrary] = useState(false);\n  const [labelForm, setLabelForm] = useState<IFoodLabelForm | undefined>(undefined);\n  const [quick, setQuick] = useState<IFoodLabelForm>(FoodLabel_emptyForm);\n  const [eatenText, setEatenText] = useState(\"\");\n  const [quickSave, setQuickSave] = useState(false);\n\n  useNavOptions({ navTitle: editing ? \"Edit food\" : \"Add food\" });\n\n  const view = picked ? FoodPick_view(picked, { labelForm, choice }) : undefined;\n\n  const close = (): void => {\n    props.dispatch(Thunk_pullScreen());\n  };\n\n  const select = (s: IFoodSelection | undefined): void => {\n    setPicked(s);\n    if (s) {\n      setChoice(initialChoice(s));\n    }\n    setSaveToLibrary(false);\n    setLabelForm(undefined);\n  };\n\n  const startFix = (): void => {\n    if (picked) {\n      setLabelForm(FoodLabel_formFromSelection(picked));\n      setChoice({ optionIndex: 0, amountText: \"1\" });\n      setSaveToLibrary(true);\n    }\n  };\n\n  const commit = (value: IFoodEntryValue): void => {\n    if (editing) {\n      EditFood_updateEntry(props.dispatch, editing.timestamp, value);\n    } else {\n      EditFood_addEntries(props.dispatch, [value]);\n    }\n    close();\n  };\n\n  const onConfirmSelection = (): void => {\n    const result = picked\n      ? FoodPick_confirm(picked, {\n          labelForm,\n          choice,\n          saveId: saveToLibrary && !editing ? UidFactory_generateUid(8) : undefined,\n          date: props.date,\n          meal,\n          now: Date.now(),\n        })\n      : undefined;\n    if (!result) {\n      return;\n    }\n    if (result.item) {\n      EditFood_saveItem(props.dispatch, result.item);\n    }\n    commit(result.entry);\n  };\n\n  const quickLabel = FoodLabel_parse(quick);\n  const onConfirmQuick = (): void => {\n    const result = FoodLabel_quickAdd(quick, {\n      date: props.date,\n      meal,\n      eatenGrams: Food_parseNumber(eatenText),\n      saveId: quickSave ? UidFactory_generateUid(8) : undefined,\n      now: Date.now(),\n    });\n    if (!result) {\n      return;\n    }\n    if (result.item) {\n      EditFood_saveItem(props.dispatch, result.item);\n    }\n    commit(result.entry);\n  };\n\n  const onDelete = async (): Promise<void> => {\n    if (editing && (await Dialog_confirm(`Delete ${editing.value.name}?`))) {\n      EditFood_deleteEntry(props.dispatch, editing.timestamp);\n      close();\n    }\n  };\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      <Text className=\"pt-2 pb-1 text-xs text-text-secondary\">MEAL</Text>\n      <MealPicker meal={meal} onChange={setMeal} />\n\n      {view ? (\n        <View className=\"pt-2\">\n          <ServingPicker selection={view.selection} choice={view.choice} onChange={setChoice}>\n            {view.warning && (\n              <View className=\"pt-3\">\n                <Text className=\"text-sm text-text-error\">{view.warning}</Text>\n                {!labelForm && (\n                  <View className=\"flex-row pt-2\">\n                    <Chip testID=\"food-fix-label\" label=\"Fix with label\" isSelected={false} onPress={startFix} />\n                  </View>\n                )}\n              </View>\n            )}\n            {labelForm && <FoodLabelFields form={labelForm} onChange={setLabelForm} testIDPrefix=\"food-fix\" />}\n            {view.canSave && !editing && (\n              <View className=\"flex-row pt-3\">\n                <Chip\n                  testID=\"food-save-to-library\"\n                  label={saveToLibrary ? \"✓ Saving to my foods\" : \"Save to my foods\"}\n                  isSelected={saveToLibrary}\n                  onPress={() => setSaveToLibrary(!saveToLibrary)}\n                />\n              </View>\n            )}\n          </ServingPicker>\n          <View className=\"flex-row\">\n            <Button\n              kind=\"purple\"\n              buttonSize=\"lg\"\n              name=\"food-confirm\"\n              className=\"flex-1\"\n              disabled={!view.canAdd}\n              onClick={onConfirmSelection}\n            >\n              {editing ? \"Save\" : \"Add\"}\n            </Button>\n            {editing ? (\n              <Button kind=\"red\" buttonSize=\"lg\" name=\"food-delete\" className=\"ml-2\" onClick={onDelete}>\n                Delete\n              </Button>\n            ) : (\n              <Button\n                kind=\"grayv2\"\n                buttonSize=\"lg\"\n                name=\"food-change\"\n                className=\"ml-2\"\n                onClick={() => select(undefined)}\n              >\n                Back\n              </Button>\n            )}\n          </View>\n        </View>\n      ) : (\n        <View className=\"pt-2\">\n          <View className=\"flex-row pb-2\">\n            <Chip\n              testID=\"food-mode-pick\"\n              label=\"Find a food\"\n              isSelected={mode === \"pick\"}\n              onPress={() => setMode(\"pick\")}\n            />\n            <Chip\n              testID=\"food-mode-quick\"\n              label=\"Quick add\"\n              isSelected={mode === \"quick\"}\n              onPress={() => setMode(\"quick\")}\n            />\n          </View>\n          {mode === \"pick\" ? (\n            <FoodPicker\n              service={props.service}\n              library={props.library}\n              recent={Food_recentEntries(props.stats, 25)}\n              onSelect={select}\n              onBarcodeNotFound={(code) =>\n                props.dispatch(\n                  Thunk_pushScreen(\"foodItem\", {\n                    kind: \"food\",\n                    prefill: { source: \"off\", sourceId: code, name: \"\", barcode: code, servings: [] },\n                  })\n                )\n              }\n            />\n          ) : (\n            <View>\n              <FoodTextField\n                label=\"Name (optional)\"\n                value={quick.name}\n                testID=\"food-quick-name\"\n                onChange={(name) => setQuick({ ...quick, name })}\n              />\n              <FoodLabelFields form={quick} onChange={setQuick} testIDPrefix=\"food-quick\" />\n              {quickLabel?.servingGrams != null && (\n                <FoodTextField\n                  className=\"pt-2 w-40\"\n                  label=\"You ate (g)\"\n                  numeric={true}\n                  value={eatenText}\n                  testID=\"food-quick-eaten\"\n                  onChange={setEatenText}\n                />\n              )}\n              {quick.name.trim() !== \"\" && (\n                <View className=\"flex-row pt-3\">\n                  <Chip\n                    testID=\"food-quick-save\"\n                    label={quickSave ? \"✓ Saving to my foods\" : \"Save to my foods\"}\n                    isSelected={quickSave}\n                    onPress={() => setQuickSave(!quickSave)}\n                  />\n                </View>\n              )}\n              <Button\n                kind=\"purple\"\n                buttonSize=\"lg\"\n                name=\"food-quick-confirm\"\n                className=\"mt-2\"\n                disabled={!quickLabel}\n                onClick={onConfirmQuick}\n              >\n                Add\n              </Button>\n            </View>\n          )}\n        </View>\n      )}\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pullScreen } from \"../ducks/thunks\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { INutritionGoals } from \"../types\";\nimport { Food_formatAmount, Food_parseNumber } from \"../models/food\";\nimport { EditFood_setGoals } from \"../models/editFood\";\nimport { Button } from \"./button\";\nimport { FoodTextField } from \"./food/foodFields\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  goals?: INutritionGoals;\n}\n\nconst keys: { key: keyof INutritionGoals; label: string }[] = [\n  { key: \"calories\", label: \"Calories (kcal)\" },\n  { key: \"protein\", label: \"Protein (g)\" },\n  { key: \"carbs\", label: \"Carbs (g)\" },\n  { key: \"fat\", label: \"Fat (g)\" },\n  { key: \"fiber\", label: \"Fiber (g)\" },\n  { key: \"waterMl\", label: \"Water (ml)\" },\n];\n\nexport function ScreenFoodGoals(props: IProps): JSX.Element {\n  const [texts, setTexts] = useState<Record<keyof INutritionGoals, string>>(\n    keys.reduce(\n      (memo, { key }) => ({ ...memo, [key]: props.goals?.[key] != null ? `${props.goals[key]}` : \"\" }),\n      {} as Record<keyof INutritionGoals, string>\n    )\n  );\n  useNavOptions({ navTitle: \"Daily goals\" });\n\n  const parsed = keys.reduce<INutritionGoals>((memo, { key }) => {\n    const value = Food_parseNumber(texts[key]);\n    return value != null && value > 0 ? { ...memo, [key]: value } : memo;\n  }, {});\n  const macroCalories = (parsed.protein ?? 0) * 4 + (parsed.carbs ?? 0) * 4 + (parsed.fat ?? 0) * 9;\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      <Text className=\"py-2 text-sm text-text-secondary\">Leave a field empty to not track a goal for it.</Text>\n      {keys.map(({ key, label }) => (\n        <FoodTextField\n          key={key}\n          className=\"pb-2\"\n          label={label}\n          numeric={true}\n          value={texts[key]}\n          testID={`food-goal-${key}`}\n          onChange={(text) => setTexts({ ...texts, [key]: text })}\n        />\n      ))}\n      {macroCalories > 0 && (\n        <Text className=\"pb-4 text-xs text-text-secondary\">\n          Your macro goals add up to {Food_formatAmount(macroCalories)} kcal.\n        </Text>\n      )}\n      <Button\n        kind=\"purple\"\n        buttonSize=\"lg\"\n        name=\"food-goals-save\"\n        onClick={() => {\n          EditFood_setGoals(props.dispatch, parsed);\n          props.dispatch(Thunk_pullScreen());\n        }}\n      >\n        Save\n      </Button>\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { Pressable, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pullScreen } from \"../ducks/thunks\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Service } from \"../api/service\";\nimport { IFoodIngredient, IFoodItem, IStats } from \"../types\";\nimport {\n  Food_defaultAmount,\n  Food_formatAmount,\n  Food_ingredientFromSelection,\n  Food_parseNumber,\n  Food_recentEntries,\n  Food_recipeItem,\n  Food_recipePerServing,\n  Food_scaleNutrients,\n  IFoodSelection,\n} from \"../models/food\";\nimport { FoodSearch_formatServing, IFoodSearchResult } from \"../models/foodSearch\";\nimport { FoodLabel_formFromItem, FoodLabel_itemFromForm, IFoodLabelForm } from \"../models/foodLabel\";\nimport { EditFood_deleteItem, EditFood_saveItem } from \"../models/editFood\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { Dialog_confirm } from \"../utils/dialog\";\nimport { Button } from \"./button\";\nimport { FoodTextField, NutrientLine } from \"./food/foodFields\";\nimport { FoodLabelFields } from \"./food/foodLabelFields\";\nimport { FoodPicker } from \"./food/foodPicker\";\nimport { IServingChoice, ServingPicker } from \"./food/servingPicker\";\nimport { IconTrash } from \"./icons/iconTrash\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  service: Service;\n  stats: IStats;\n  library: IFoodItem[];\n  id?: string;\n  kind: \"food\" | \"recipe\";\n  prefill?: IFoodSearchResult;\n}\n\nexport function ScreenFoodItem(props: IProps): JSX.Element {\n  const existing = props.id ? props.library.find((i) => i.id === props.id) : undefined;\n  const isRecipe = props.kind === \"recipe\";\n  const [form, setForm] = useState<IFoodLabelForm>(FoodLabel_formFromItem(existing, props.prefill));\n  const [ingredients, setIngredients] = useState<IFoodIngredient[]>(existing?.ingredients ?? []);\n  const [yieldText, setYieldText] = useState(`${existing?.recipeServings ?? 1}`);\n  const [picking, setPicking] = useState(false);\n  const [selection, setSelection] = useState<IFoodSelection | undefined>(undefined);\n  const [choice, setChoice] = useState<IServingChoice>({ optionIndex: 0, amountText: \"1\" });\n  const [id] = useState(() => existing?.id ?? UidFactory_generateUid(8));\n\n  useNavOptions({\n    navTitle: existing ? `Edit ${isRecipe ? \"recipe\" : \"food\"}` : `New ${isRecipe ? \"recipe\" : \"food\"}`,\n  });\n\n  const recipeYield = Food_parseNumber(yieldText) ?? 1;\n  const barcode = existing?.barcode ?? props.prefill?.barcode;\n  const item: IFoodItem | undefined = isRecipe\n    ? Food_recipeItem({ existing, id, name: form.name, ingredients, recipeServings: recipeYield, now: Date.now() })\n    : FoodLabel_itemFromForm(form, { existing, barcode, id, now: Date.now() });\n\n  const save = (): void => {\n    if (item) {\n      EditFood_saveItem(props.dispatch, item);\n      props.dispatch(Thunk_pullScreen());\n    }\n  };\n\n  const remove = async (): Promise<void> => {\n    if (existing && (await Dialog_confirm(`Delete ${existing.name}? Logged entries stay in your history.`))) {\n      EditFood_deleteItem(props.dispatch, existing.id);\n      props.dispatch(Thunk_pullScreen());\n    }\n  };\n\n  const addIngredient = (): void => {\n    const amount = Food_parseNumber(choice.amountText);\n    if (selection && amount != null && amount > 0) {\n      setIngredients([\n        ...ingredients,\n        Food_ingredientFromSelection(selection, { optionIndex: choice.optionIndex, amount }),\n      ]);\n      setSelection(undefined);\n      setPicking(false);\n    }\n  };\n\n  const recipePerServing = Food_recipePerServing(ingredients, recipeYield);\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      <FoodTextField\n        className=\"pt-2\"\n        label=\"Name\"\n        value={form.name}\n        testID=\"food-item-name\"\n        onChange={(name) => setForm({ ...form, name })}\n      />\n      {!isRecipe && (\n        <FoodTextField\n          className=\"pt-2\"\n          label=\"Brand (optional)\"\n          value={form.brand}\n          testID=\"food-item-brand\"\n          onChange={(brand) => setForm({ ...form, brand })}\n        />\n      )}\n      {barcode && <Text className=\"pt-1 text-xs text-text-secondary\">Barcode {barcode}</Text>}\n\n      {isRecipe ? (\n        <View className=\"pt-3\">\n          <FoodTextField\n            className=\"w-40\"\n            label=\"Makes how many servings\"\n            numeric={true}\n            value={yieldText}\n            testID=\"food-recipe-yield\"\n            onChange={setYieldText}\n          />\n          <Text className=\"pt-4 pb-1 text-xs font-semibold text-text-secondary\">INGREDIENTS</Text>\n          {ingredients.map((ing, i) => (\n            <View key={i} className=\"flex-row items-center py-2 border-b border-border-neutral\">\n              <View className=\"flex-1\">\n                <Text className=\"text-sm\">{ing.name}</Text>\n                <Text className=\"text-xs text-text-secondary\">\n                  {FoodSearch_formatServing(ing.servingLabel, ing.servings)} ·{\" \"}\n                  {Food_formatAmount(Food_scaleNutrients(ing.perServing, ing.servings).calories)} kcal\n                </Text>\n              </View>\n              <Pressable\n                testID={`food-ingredient-remove-${i}`}\n                data-testid={`food-ingredient-remove-${i}`}\n                className=\"p-2\"\n                onPress={() => setIngredients(ingredients.filter((_, j) => j !== i))}\n              >\n                <IconTrash />\n              </Pressable>\n            </View>\n          ))}\n          {selection ? (\n            <View className=\"pt-2\">\n              <ServingPicker selection={selection} choice={choice} onChange={setChoice} />\n              <View className=\"flex-row\">\n                <Button\n                  kind=\"purple\"\n                  buttonSize=\"md\"\n                  name=\"food-ingredient-add\"\n                  className=\"flex-1\"\n                  onClick={addIngredient}\n                >\n                  Add ingredient\n                </Button>\n                <Button\n                  kind=\"grayv2\"\n                  buttonSize=\"md\"\n                  name=\"food-ingredient-back\"\n                  className=\"ml-2\"\n                  onClick={() => setSelection(undefined)}\n                >\n                  Back\n                </Button>\n              </View>\n            </View>\n          ) : picking ? (\n            <View className=\"pt-2\">\n              <FoodPicker\n                service={props.service}\n                library={props.library.filter((i) => i.id !== existing?.id)}\n                recent={Food_recentEntries(props.stats, 25)}\n                onSelect={(s) => {\n                  setSelection(s);\n                  setChoice({ optionIndex: 0, amountText: `${Food_defaultAmount(s.servings[0])}` });\n                }}\n                onBarcodeNotFound={() => undefined}\n              />\n            </View>\n          ) : (\n            <Button\n              kind=\"lightpurple\"\n              buttonSize=\"md\"\n              name=\"food-ingredient-pick\"\n              className=\"mt-2\"\n              onClick={() => setPicking(true)}\n            >\n              + Add ingredient\n            </Button>\n          )}\n          {ingredients.length > 0 && (\n            <View className=\"pt-3\">\n              <Text className=\"text-xs text-text-secondary\">Per serving</Text>\n              <NutrientLine nutrients={recipePerServing} />\n            </View>\n          )}\n        </View>\n      ) : (\n        <FoodLabelFields form={form} onChange={setForm} testIDPrefix=\"food-item\" />\n      )}\n\n      <View className=\"flex-row pt-6\">\n        <Button kind=\"purple\" buttonSize=\"lg\" name=\"food-item-save\" className=\"flex-1\" disabled={!item} onClick={save}>\n          Save\n        </Button>\n        {existing && (\n          <Button kind=\"red\" buttonSize=\"lg\" name=\"food-item-delete\" className=\"ml-2\" onClick={remove}>\n            Delete\n          </Button>\n        )}\n      </View>\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { Pressable, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { IFoodItem } from \"../types\";\nimport { Food_searchLibrary } from \"../models/food\";\nimport { Button } from \"./button\";\nimport { FoodTextField, NutrientLine } from \"./food/foodFields\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  library: IFoodItem[];\n}\n\nexport function ScreenFoodLibrary(props: IProps): JSX.Element {\n  const [query, setQuery] = useState(\"\");\n  const items = query.trim()\n    ? Food_searchLibrary(props.library, query)\n    : [...props.library].sort((a, b) => a.name.localeCompare(b.name));\n\n  useNavOptions({ navTitle: \"Saved foods & recipes\" });\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      <View className=\"flex-row py-2\">\n        <Button kind=\"purple\" buttonSize=\"md\" name=\"food-new-item\" className=\"flex-1 mr-2\" onClick={() => props.dispatch(Thunk_pushScreen(\"foodItem\", { kind: \"food\" }))}>\n          New food\n        </Button>\n        <Button kind=\"purple\" buttonSize=\"md\" name=\"food-new-recipe\" className=\"flex-1\" onClick={() => props.dispatch(Thunk_pushScreen(\"foodItem\", { kind: \"recipe\" }))}>\n          New recipe\n        </Button>\n      </View>\n      {props.library.length > 5 && (\n        <FoodTextField value={query} placeholder=\"Filter\" testID=\"food-library-filter\" onChange={setQuery} className=\"pb-2\" />\n      )}\n      {items.length === 0 && (\n        <Text className=\"py-6 text-center text-text-secondary\">\n          Nothing saved yet. Tap \"Save to my foods\" when logging, or create a food or recipe here.\n        </Text>\n      )}\n      {items.map((item) => (\n        <Pressable\n          key={item.id}\n          testID={`food-library-item-${item.id}`}\n          data-testid={`food-library-item-${item.id}`}\n          className=\"py-2 border-b border-border-neutral\"\n          onPress={() =>\n            props.dispatch(Thunk_pushScreen(\"foodItem\", { id: item.id, kind: item.ingredients ? \"recipe\" : \"food\" }))\n          }\n        >\n          <Text className=\"text-sm\">\n            {item.name}\n            {item.ingredients && <Text className=\"text-xs text-text-purple\">{\"  recipe\"}</Text>}\n          </Text>\n          <Text className=\"text-xs text-text-secondary\">{[item.brand, item.servingLabel].filter(Boolean).join(\" · \")}</Text>\n          <NutrientLine nutrients={item.perServing} />\n        </Pressable>\n      ))}\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { Pressable, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pullScreen } from \"../ducks/thunks\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { IFoodMeal, IMealTemplate, IStats } from \"../types\";\nimport {\n  Food_daySummary,\n  Food_entriesFromTemplate,\n  Food_mealNames,\n  Food_sortTemplates,\n  Food_templateFromEntries,\n  Food_templateTotals,\n} from \"../models/food\";\nimport { EditFood_addEntries, EditFood_deleteTemplate, EditFood_saveTemplate } from \"../models/editFood\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { Dialog_confirm } from \"../utils/dialog\";\nimport { Button } from \"./button\";\nimport { FoodTextField, NutrientLine } from \"./food/foodFields\";\nimport { IconTrash } from \"./icons/iconTrash\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  stats: IStats;\n  templates: IMealTemplate[];\n  date: string;\n  meal: IFoodMeal;\n}\n\nexport function ScreenFoodTemplates(props: IProps): JSX.Element {\n  const mealEntries = Food_daySummary(props.stats, props.date).meals.find((m) => m.meal === props.meal)?.entries || [];\n  const [name, setName] = useState(Food_mealNames[props.meal]);\n  const [isSaved, setIsSaved] = useState(false);\n  const templates = Food_sortTemplates(props.templates, props.meal);\n\n  useNavOptions({ navTitle: \"Meal templates\" });\n\n  const save = (): void => {\n    const template = Food_templateFromEntries(mealEntries, {\n      id: UidFactory_generateUid(8),\n      name: name.trim() || Food_mealNames[props.meal],\n      meal: props.meal,\n      now: Date.now(),\n    });\n    EditFood_saveTemplate(props.dispatch, template);\n    setIsSaved(true);\n  };\n\n  const log = (template: IMealTemplate): void => {\n    EditFood_addEntries(props.dispatch, Food_entriesFromTemplate(template, { date: props.date, meal: props.meal }));\n    props.dispatch(Thunk_pullScreen());\n  };\n\n  const remove = async (template: IMealTemplate): Promise<void> => {\n    if (await Dialog_confirm(`Delete template ${template.name}?`)) {\n      EditFood_deleteTemplate(props.dispatch, template.id);\n    }\n  };\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      {mealEntries.length > 0 && !isSaved && (\n        <View className=\"p-3 my-2 border rounded-lg border-border-neutral\">\n          <Text className=\"pb-2 text-sm\">\n            Save this {Food_mealNames[props.meal].toLowerCase()} ({mealEntries.length}{\" \"}\n            {mealEntries.length === 1 ? \"item\" : \"items\"}) as a template\n          </Text>\n          <FoodTextField value={name} testID=\"food-template-name\" onChange={setName} className=\"pb-2\" />\n          <Button kind=\"purple\" buttonSize=\"md\" name=\"food-template-save\" onClick={save}>\n            Save template\n          </Button>\n        </View>\n      )}\n      <Text className=\"pt-2 pb-1 text-xs text-text-secondary\">\n        Tap a template to add its items to {Food_mealNames[props.meal].toLowerCase()}.\n      </Text>\n      {templates.length === 0 && (\n        <Text className=\"py-6 text-center text-text-secondary\">\n          No templates yet. Log a meal you eat often, then save it here.\n        </Text>\n      )}\n      {templates.map((template) => (\n        <View key={template.id} className=\"flex-row items-center border-b border-border-neutral\">\n          <Pressable\n            testID={`food-template-${template.id}`}\n            data-testid={`food-template-${template.id}`}\n            className=\"flex-1 py-2\"\n            onPress={() => log(template)}\n          >\n            <Text className=\"text-sm\">\n              {template.name}\n              {template.meal && template.meal !== props.meal && (\n                <Text className=\"text-xs text-text-secondary\">{`  ${Food_mealNames[template.meal]}`}</Text>\n              )}\n            </Text>\n            <Text className=\"text-xs text-text-secondary\" numberOfLines={1}>\n              {template.items.map((i) => i.name).join(\", \")}\n            </Text>\n            <NutrientLine nutrients={Food_templateTotals(template)} />\n          </Pressable>\n          <Pressable\n            testID={`food-template-delete-${template.id}`}\n            data-testid={`food-template-delete-${template.id}`}\n            className=\"p-2\"\n            onPress={() => remove(template)}\n          >\n            <IconTrash />\n          </Pressable>\n        </View>\n      ))}\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { lb } from \"lens-shmens\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { ISettings } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_requestHealthPermissions, Thunk_syncHealthKit } from \"../ducks/thunks\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  navCommon: INavCommon;\n}\n\nexport function ScreenGoogleHealthSettings(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Google Health Connect\" });\n\n  return (\n    <View className=\"px-gutter\">\n      <MenuItemEditable\n        name=\"Sync Workouts\"\n        type=\"boolean\"\n        value={props.settings.googleHealthSyncWorkout ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"googleHealthSyncWorkout\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Google Health workouts\",\n          });\n          if (newValue === \"true\") {\n            props.dispatch(Thunk_requestHealthPermissions());\n          }\n        }}\n      />\n      <MenuItemEditable\n        name=\"Confirm each workout sync?\"\n        type=\"boolean\"\n        value={props.settings.healthConfirmation ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"healthConfirmation\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Health workout confirmation\",\n          });\n        }}\n      />\n      <MenuItemEditable\n        name=\"Sync Measurements\"\n        type=\"boolean\"\n        value={props.settings.googleHealthSyncMeasurements ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"googleHealthSyncMeasurements\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Google Health measurements\",\n          });\n          if (newValue === \"true\") {\n            props.dispatch(Thunk_requestHealthPermissions());\n          }\n        }}\n      />\n      <MenuItemEditable\n        name=\"Sync Sleep & Nutrition\"\n        type=\"boolean\"\n        value={props.settings.googleHealthSyncSleepNutrition ? \"true\" : \"false\"}\n        onChange={(newValue?: string) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"googleHealthSyncSleepNutrition\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle Google Health sleep & nutrition\",\n          });\n          if (newValue === \"true\") {\n            props.dispatch(Thunk_syncHealthKit());\n          }\n        }}\n      />\n    </View>\n  );\n}\n","import { JSX, useMemo, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { ActiveGraphContext, IActiveGraphContext } from \"./activeGraphContext\";\nimport { Text } from \"./primitives/text\";\nimport { GraphExercise } from \"./graphExercise\";\nimport { History_getGraphsAggregates } from \"../models/history\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { IScreenMuscle } from \"../types\";\nimport { getLengthDataForGraph, getPercentageDataForGraph, getWeightDataForGraph, GraphStats } from \"./graphStats\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { IconFilter } from \"./icons/iconFilter\";\nimport { GraphMuscleGroup } from \"./graphMuscleGroup\";\nimport { GraphNutrition } from \"./graphNutrition\";\nimport { Exercise_fromKey } from \"../models/exercise\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { useProgressiveItems } from \"../utils/useProgressiveItems\";\nimport { useTrackedState, useTrackedDispatch, untrack } from \"../navigation/TrackedStateContext\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { useTimedMemo } from \"../utils/useTimedMemo\";\n\nconst navRightButtons = [\n  <Pressable\n    key=\"filter\"\n    data-testid=\"graphs-modify\"\n    testID=\"graphs-modify\"\n    className=\"p-2 nm-graphs-navbar-filter\"\n    onPress={() => navigateToModal(\"graphsModal\")}\n  >\n    <IconFilter />\n  </Pressable>,\n];\n\nexport function ScreenGraphs(): JSX.Element {\n  usePerfRenderCount(\"ScreenGraphs\");\n  const trackedState = useTrackedState();\n  const dispatch = useTrackedDispatch();\n\n  // Subscribe to the three state slices we need; untrack so useMemo deps see stable refs.\n  const settings = untrack(trackedState.storage.settings);\n  const stats = untrack(trackedState.storage.stats);\n  const history = untrack(trackedState.storage.history);\n\n  const { isWithBodyweight, isSameXAxis, isWithOneRm, isWithProgramLines } = settings.graphsSettings;\n  const hasBodyweight = settings.graphs.graphs.some((g) => g.id === \"weight\");\n\n  const { muscleGroupsData, programChangeTimes } = useTimedMemo(\n    \"screenGraphs.graphsAggregates\",\n    () => History_getGraphsAggregates(history, settings),\n    [history, settings]\n  );\n\n  const bodyweightData = useTimedMemo<[number, number][]>(\n    \"screenGraphs.bodyweightData\",\n    () => {\n      if (hasBodyweight && isWithBodyweight) {\n        return getWeightDataForGraph(stats.weight.weight || [], settings);\n      }\n      return [];\n    },\n    [hasBodyweight, isWithBodyweight, stats.weight.weight, settings]\n  );\n\n  const { minX, maxX } = useTimedMemo(\n    \"screenGraphs.minMaxX\",\n    () => {\n      let max = 0;\n      let min = Infinity;\n      for (const hr of history) {\n        if (max < hr.startTime) {\n          max = hr.startTime;\n        }\n        if (min > hr.startTime) {\n          min = hr.startTime;\n        }\n      }\n      if (isSameXAxis) {\n        for (const key of ObjectUtils_keys(stats.weight)) {\n          for (const value of stats.weight[key] || []) {\n            if (min > value.timestamp) {\n              min = value.timestamp;\n            }\n            if (max < value.timestamp) {\n              max = value.timestamp;\n            }\n          }\n        }\n        for (const key of ObjectUtils_keys(stats.length)) {\n          for (const value of stats.length[key] || []) {\n            if (min > value.timestamp) {\n              min = value.timestamp;\n            } else if (max < value.timestamp) {\n              max = value.timestamp;\n            }\n          }\n        }\n      }\n      return { minX: min, maxX: max };\n    },\n    [history, stats.weight, stats.length, isSameXAxis]\n  );\n\n  useNavOptions({\n    navTitle: \"Graphs\",\n    navHelpKey: \"graphs\",\n    navRightButtons,\n  });\n\n  const [activeId, setActiveId] = useState<string | null>(null);\n  const activeGraphValue = useMemo<IActiveGraphContext>(() => ({ activeId, setActive: setActiveId }), [activeId]);\n\n  const visibleGraphs = useProgressiveItems(settings.graphs.graphs, {\n    initialBatch: 3,\n    batchSize: 3,\n    debugLabel: \"Graphs\",\n  });\n\n  const roundedMinX = useTimedMemo(\"screenGraphs.roundedMinX\", () => Math.round(minX / 1000), [minX]);\n  const roundedMaxX = useTimedMemo(\"screenGraphs.roundedMaxX\", () => Math.round(maxX / 1000), [maxX]);\n  const bodyweightForGraphs = hasBodyweight && isWithBodyweight ? bodyweightData : undefined;\n  const programChangeTimesForGraphs = isWithProgramLines ? programChangeTimes.changeProgramTimes : undefined;\n\n  const preparedGraphs = useTimedMemo(\n    \"screenGraphs.preparedGraphs\",\n    () => {\n      return visibleGraphs.map((graph) => {\n        if (graph.type === \"exercise\") {\n          return { graph, exercise: Exercise_fromKey(graph.id), collection: undefined };\n        }\n        if (graph.type === \"statsWeight\") {\n          return {\n            graph,\n            exercise: undefined,\n            collection: getWeightDataForGraph(stats.weight[graph.id] || [], settings),\n          };\n        }\n        if (graph.type === \"statsLength\") {\n          return {\n            graph,\n            exercise: undefined,\n            collection: getLengthDataForGraph(stats.length[graph.id] || [], settings),\n          };\n        }\n        if (graph.type === \"muscleGroup\" || graph.type === \"nutrition\") {\n          return { graph, exercise: undefined, collection: undefined };\n        }\n        return {\n          graph,\n          exercise: undefined,\n          collection: getPercentageDataForGraph(stats.percentage[graph.id] || [], settings),\n        };\n      });\n    },\n    [visibleGraphs, stats.weight, stats.length, stats.percentage, settings]\n  );\n\n  if (settings.graphs.graphs.length === 0) {\n    return (\n      <View className=\"p-8\">\n        <Text className=\"text-2xl font-bold text-center text-gray-600\">\n          Select graphs you want to display by tapping filter icon at right top corner.\n        </Text>\n      </View>\n    );\n  }\n\n  return (\n    <ActiveGraphContext.Provider value={activeGraphValue}>\n      <View className=\"pt-8 pb-4\">\n        {preparedGraphs.map((entry, i) => {\n          const { graph, exercise, collection } = entry;\n          const id = `${graph.type}-${graph.id}-${i}`;\n          if (graph.type === \"exercise\" && exercise) {\n            return (\n              <View\n                key={`${graph.id}_${isSameXAxis}_${isWithBodyweight}_${isWithOneRm}_${isWithProgramLines}`}\n                className=\"mx-4 mb-2\"\n              >\n                <GraphExercise\n                  id={id}\n                  initialType={settings.graphsSettings.defaultType}\n                  isSameXAxis={isSameXAxis}\n                  minX={roundedMinX}\n                  maxX={roundedMaxX}\n                  bodyweightData={bodyweightForGraphs}\n                  isWithOneRm={isWithOneRm}\n                  settings={settings}\n                  isWithProgramLines={isWithProgramLines}\n                  history={history}\n                  exercise={exercise}\n                  dispatch={dispatch}\n                />\n              </View>\n            );\n          } else if (graph.type === \"statsWeight\" && collection) {\n            return (\n              <View key={`${graph.id}_${isSameXAxis}`} className=\"mx-4 mb-2\">\n                <GraphStats\n                  id={id}\n                  isSameXAxis={isSameXAxis}\n                  minX={roundedMinX}\n                  maxX={roundedMaxX}\n                  units={settings.units}\n                  settings={settings}\n                  collection={collection}\n                  statsKey={graph.id}\n                />\n              </View>\n            );\n          } else if (graph.type === \"statsLength\" && collection) {\n            return (\n              <View key={graph.id} className=\"mx-4 mb-2\">\n                <GraphStats\n                  id={id}\n                  isSameXAxis={isSameXAxis}\n                  minX={roundedMinX}\n                  maxX={roundedMaxX}\n                  units={settings.lengthUnits}\n                  settings={settings}\n                  collection={collection}\n                  statsKey={graph.id}\n                />\n              </View>\n            );\n          } else if (graph.type === \"muscleGroup\") {\n            const muscleGroup = graph.id as IScreenMuscle | \"total\";\n            return (\n              <View key={graph.id} className=\"mx-4 mb-2\">\n                <GraphMuscleGroup\n                  key={graph.id}\n                  id={id}\n                  initialType={settings.graphsSettings.defaultMuscleGroupType}\n                  programChangeTimes={programChangeTimesForGraphs}\n                  data={muscleGroupsData[muscleGroup] ?? [[], [], []]}\n                  muscleGroup={muscleGroup}\n                  settings={settings}\n                />\n              </View>\n            );\n          } else if (graph.type === \"nutrition\") {\n            return (\n              <View key={`${graph.id}_${isSameXAxis}`} className=\"mx-4 mb-2\">\n                <GraphNutrition\n                  id={id}\n                  graphId={graph.id}\n                  stats={stats}\n                  units={settings.units}\n                  isSameXAxis={isSameXAxis}\n                  minX={roundedMinX}\n                  maxX={roundedMaxX}\n                />\n              </View>\n            );\n          } else if (collection) {\n            return (\n              <View key={graph.id} className=\"mx-4 mb-2\">\n                <GraphStats\n                  id={id}\n                  isSameXAxis={isSameXAxis}\n                  minX={roundedMinX}\n                  maxX={roundedMaxX}\n                  units=\"%\"\n                  settings={settings}\n                  collection={collection}\n                  statsKey={graph.id}\n                />\n              </View>\n            );\n          } else {\n            return null;\n          }\n        })}\n      </View>\n    </ActiveGraphContext.Provider>\n  );\n}\n","import { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IEquipment, IGym, ISettings } from \"../types\";\nimport { INavCommon, IState, updateState } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { MenuItem } from \"./menuItem\";\nimport { StringUtils_nextName, StringUtils_dashcase } from \"../utils/string\";\nimport { IconDuplicate2 } from \"./icons/iconDuplicate2\";\nimport { IconEditSquare } from \"./icons/iconEditSquare\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { lb } from \"lens-shmens\";\nimport { CollectionUtils_removeBy } from \"../utils/collection\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { ObjectUtils_clone } from \"../utils/object\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { LinkButton } from \"./linkButton\";\nimport { Dialog_confirm } from \"../utils/dialog\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  expandedEquipment?: IEquipment;\n  navCommon: INavCommon;\n}\n\nexport function ScreenGyms(props: IProps): JSX.Element {\n  const gyms = props.settings.gyms;\n  useNavOptions({ navTitle: \"Gyms\" });\n\n  return (\n    <View className=\"px-gutter\">\n      {gyms.map((gym) => {\n        return (\n          <MenuItem\n            key={gym.id}\n            name={gym.name}\n            addons={\n              gym.id === props.settings.currentGymId ? (\n                <View className=\"pb-1\" style={{ marginTop: -8 }}>\n                  <Text className=\"text-xs text-text-secondary\">current</Text>\n                </View>\n              ) : undefined\n            }\n            value={\n              <View className=\"flex-row\">\n                <Pressable\n                  testID=\"edit-gym\"\n                  data-testid=\"edit-gym\"\n                  className=\"px-2\"\n                  onPress={() => {\n                    updateState(props.dispatch, [lb<IState>().p(\"selectedGymId\").record(gym.id)], \"Select gym to edit\");\n                    props.dispatch(Thunk_pushScreen(\"plates\"));\n                  }}\n                >\n                  <IconEditSquare />\n                </Pressable>\n                <Pressable\n                  className=\"px-2\"\n                  onPress={() => {\n                    updateState(\n                      props.dispatch,\n                      [\n                        lb<IState>()\n                          .p(\"storage\")\n                          .p(\"settings\")\n                          .p(\"gyms\")\n                          .recordModify((g) => {\n                            const newGym: IGym = {\n                              ...gym,\n                              name: StringUtils_nextName(gym.name),\n                              id: UidFactory_generateUid(8),\n                              equipment: ObjectUtils_clone(gym.equipment),\n                            };\n                            return [...g, newGym];\n                          }),\n                      ],\n                      \"Duplicate gym\"\n                    );\n                  }}\n                >\n                  <IconDuplicate2 />\n                </Pressable>\n                {props.settings.gyms.length > 1 && (\n                  <Pressable\n                    testID={`menu-item-delete-${StringUtils_dashcase(gym.name)}`}\n                    data-testid={`menu-item-delete-${StringUtils_dashcase(gym.name)}`}\n                    className=\"px-2\"\n                    onPress={async () => {\n                      if (await Dialog_confirm(\"Are you sure you want to delete this gym?\")) {\n                        updateState(\n                          props.dispatch,\n                          [\n                            lb<IState>()\n                              .p(\"storage\")\n                              .p(\"settings\")\n                              .recordModify((settings) => {\n                                const newGyms = CollectionUtils_removeBy(settings.gyms, \"id\", gym.id);\n                                const currentGym = newGyms.find((aGym) => aGym.id === props.settings.currentGymId);\n                                if (currentGym == null) {\n                                  settings = { ...settings, currentGymId: newGyms[0].id };\n                                }\n                                return { ...settings, gyms: newGyms };\n                              }),\n                          ],\n                          \"Delete gym\"\n                        );\n                      }\n                    }}\n                  >\n                    <IconTrash />\n                  </Pressable>\n                )}\n              </View>\n            }\n          />\n        );\n      })}\n      <View className=\"mt-1\">\n        <LinkButton name=\"new-gym\" onClick={() => navigateToModal(\"newGymModal\")}>\n          Add Gym\n        </LinkButton>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { HearAboutUsSurvey } from \"./hearAboutUs/hearAboutUsSurvey\";\nimport {\n  HearAboutUs_selectSource,\n  HearAboutUs_updatePartial,\n  HearAboutUs_finalize,\n  HearAboutUs_logShown,\n  HearAboutUs_skip,\n  HearAboutUs_markDone,\n} from \"../models/hearAboutUs\";\n\ninterface IProps {\n  dispatch: IDispatch;\n}\n\nexport function ScreenHearAboutUs(props: IProps): JSX.Element {\n  const { dispatch } = props;\n  const insets = useSafeAreaInsets();\n\n  useEffect(() => {\n    HearAboutUs_logShown(dispatch);\n  }, [dispatch]);\n\n  return (\n    <View className=\"flex-1 bg-background-default\" style={{ paddingBottom: insets.bottom }}>\n      <HearAboutUsSurvey\n        context=\"onboarding\"\n        variant=\"screen\"\n        onSelectSource={(s) => HearAboutUs_selectSource(dispatch, s)}\n        onChange={(p) => HearAboutUs_updatePartial(dispatch, p)}\n        onComplete={(payload) => {\n          HearAboutUs_finalize(dispatch, payload);\n          dispatch(Thunk_pushScreen(\"programselect\"));\n        }}\n        onSkip={() => {\n          HearAboutUs_skip(dispatch);\n          // Explicit skip = done: don't re-ask via the backfill modal later either.\n          HearAboutUs_markDone(dispatch);\n          dispatch(Thunk_pushScreen(\"programselect\"));\n        }}\n      />\n    </View>\n  );\n}\n","import { JSX, useMemo, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { LegendList } from \"@legendapp/list\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_applyImport, Thunk_pushScreen } from \"../ducks/thunks\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { IImportPreview, IState, updateState } from \"../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IImportRowError, ImportUtils_customExercisesForRecords, ImportUtils_summarize } from \"../utils/importTypes\";\nimport { HistoryRecordView } from \"./historyRecord\";\nimport { LinkButton } from \"./linkButton\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { CollectionUtils_sortBy } from \"../utils/collection\";\nimport { Button } from \"./button\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  preview: IImportPreview;\n  history: IHistoryRecord[];\n  settings: ISettings;\n}\n\nfunction ExpandableSection(props: { title: string; items: string[] }): JSX.Element {\n  const [isExpanded, setIsExpanded] = useState(false);\n  return (\n    <View className=\"pt-1\">\n      <Text className=\"text-sm text-text-secondary\">\n        ⚠ {props.title}{\" \"}\n        <LinkButton className=\"text-sm\" onPress={() => setIsExpanded(!isExpanded)} name=\"expand-section-import-preview\">\n          {isExpanded ? \"Hide\" : \"Show\"}\n        </LinkButton>\n      </Text>\n      {isExpanded && (\n        <View className=\"pl-4\">\n          {props.items.map((item, i) => (\n            <Text key={i} className=\"text-xs text-text-secondary\">\n              {item}\n            </Text>\n          ))}\n        </View>\n      )}\n    </View>\n  );\n}\n\nfunction formatRowError(error: IImportRowError): string {\n  return `Row ${error.row}: ${error.message}`;\n}\n\nexport function ScreenImportPreview(props: IProps): JSX.Element {\n  const { result, source } = props.preview;\n  // Duplicate detection runs over ALL parsed records (against existing history).\n  const summary = useMemo(() => ImportUtils_summarize(result, props.history), [result, props.history]);\n  // The created custom exercises aren't in settings until the import is applied, so merge them in\n  // for rendering - otherwise their cards fall back to a wrong builtin exercise. Existing exercises\n  // win over imported ones (matching apply behavior: a locally-renamed exercise keeps its name).\n  const previewSettings = useMemo(\n    () => ({ ...props.settings, exercises: { ...result.customExercises, ...props.settings.exercises } }),\n    [props.settings, result.customExercises]\n  );\n  const [shouldSkipDuplicates, setShouldSkipDuplicates] = useState(true);\n  const sortedRecords = useMemo(\n    () => CollectionUtils_sortBy(result.historyRecords, \"startTime\", true),\n    [result.historyRecords]\n  );\n  const recordsToImport = useMemo(\n    () =>\n      shouldSkipDuplicates && summary.duplicateIds.size > 0\n        ? result.historyRecords.filter((r) => !summary.duplicateIds.has(r.id))\n        : result.historyRecords,\n    [shouldSkipDuplicates, summary.duplicateIds, result.historyRecords]\n  );\n  // Counts/date-range/custom-exercise list reflect what will ACTUALLY be imported (duplicates are\n  // skipped by default), not every parsed record.\n  const importSummary = useMemo(\n    () =>\n      ImportUtils_summarize(\n        {\n          ...result,\n          historyRecords: recordsToImport,\n          customExercises: ImportUtils_customExercisesForRecords(recordsToImport, result.customExercises),\n        },\n        props.history\n      ),\n    [result, recordsToImport, props.history]\n  );\n\n  const onImport = (): void => {\n    const count = recordsToImport.length;\n    const customExercises = ImportUtils_customExercisesForRecords(recordsToImport, result.customExercises);\n    props.dispatch(Thunk_applyImport(recordsToImport, customExercises, source));\n    updateState(props.dispatch, [lb<IState>().p(\"importPreview\").record(undefined)], \"Close import preview\");\n    props.dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n    Dialog_alert(`Successfully imported ${count} ${StringUtils_pluralize(\"workout\", count)}.`);\n  };\n\n  useNavOptions({\n    navTitle: \"Import Preview\",\n    navRightButtons: [\n      <Button\n        kind=\"purple\"\n        buttonSize=\"md\"\n        key=\"import\"\n        name=\"import-preview-confirm\"\n        disabled={recordsToImport.length === 0}\n        onClick={onImport}\n      >\n        Import\n      </Button>,\n    ],\n  });\n\n  return (\n    <View className=\"flex-1\">\n      <LegendList\n        data={sortedRecords}\n        keyExtractor={(record) => `${record.id}`}\n        estimatedItemSize={300}\n        style={{ flex: 1 }}\n        renderItem={({ item }) => (\n          <View className=\"px-gutter mb-6\" pointerEvents=\"none\">\n            <HistoryRecordView\n              historyRecord={item}\n              showTitle={true}\n              isOngoing={false}\n              settings={previewSettings}\n              dispatch={props.dispatch}\n            />\n          </View>\n        )}\n        ListHeaderComponent={\n          <View className=\"px-gutter pb-4\">\n            <Text className=\"text-base font-semibold\">\n              Import {importSummary.workoutCount} {StringUtils_pluralize(\"workout\", importSummary.workoutCount)}\n            </Text>\n            {importSummary.minStartTime != null && importSummary.maxStartTime != null && (\n              <Text className=\"text-sm text-text-secondary\">\n                {DateUtils_format(importSummary.minStartTime)} - {DateUtils_format(importSummary.maxStartTime)}\n              </Text>\n            )}\n            {importSummary.customExerciseNames.length > 0 && (\n              <ExpandableSection\n                title={`${importSummary.customExerciseNames.length} ${StringUtils_pluralize(\n                  \"exercise\",\n                  importSummary.customExerciseNames.length\n                )} will be created as custom`}\n                items={importSummary.customExerciseNames}\n              />\n            )}\n            {result.errors.length > 0 && (\n              <ExpandableSection\n                title={`${result.errors.length} ${StringUtils_pluralize(\n                  \"row\",\n                  result.errors.length\n                )} skipped because they couldn't be parsed`}\n                items={result.errors.map(formatRowError)}\n              />\n            )}\n            {result.warnings.length > 0 && (\n              <ExpandableSection\n                title={`${result.warnings.length} ${\n                  result.warnings.length === 1 ? \"value looks\" : \"values look\"\n                } suspicious`}\n                items={result.warnings.map(formatRowError)}\n              />\n            )}\n            {summary.duplicateIds.size > 0 && (\n              <View className=\"pt-1\">\n                <Pressable>\n                  <Text className=\"text-sm text-text-secondary\">\n                    ⚠ {summary.duplicateIds.size} {summary.duplicateIds.size === 1 ? \"workout looks\" : \"workouts look\"}{\" \"}\n                    like duplicates of existing history{\" \"}\n                    <LinkButton\n                      name=\"toggle-duplicate-import-preview\"\n                      className=\"text-sm\"\n                      onPress={() => setShouldSkipDuplicates(!shouldSkipDuplicates)}\n                    >\n                      {shouldSkipDuplicates ? \"Skipped - Include?\" : \"Included - Skip?\"}\n                    </LinkButton>\n                  </Text>\n                </Pressable>\n              </View>\n            )}\n          </View>\n        }\n      />\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { IStats, ISettings, ISubscription, IStatsKey } from \"../types\";\nimport { IDispatch } from \"../ducks/types\";\nimport { StatsList } from \"./statsList\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  subscription: ISubscription;\n  stats: IStats;\n  navCommon: INavCommon;\n  initialKey?: IStatsKey;\n}\n\nexport function ScreenMeasurements(props: IProps): JSX.Element {\n  const { settings, stats, dispatch } = props;\n  const initialKey = props.initialKey;\n\n  useNavOptions({ navTitle: \"Measurements\", navHelpKey: \"measurements\" });\n\n  return (\n    <>\n      <StatsList\n        initialKey={initialKey}\n        subscription={props.subscription}\n        stats={stats}\n        settings={settings}\n        dispatch={dispatch}\n      />\n    </>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { ISettings } from \"../types\";\nimport { IDispatch } from \"../ducks/types\";\nimport { INavCommon, updateSettings } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { MuscleGroupsContent } from \"./muscleGroupsContent\";\nimport { lb } from \"lens-shmens\";\nimport {\n  Muscle_createMuscleGroup,\n  Muscle_deleteMuscleGroup,\n  Muscle_updateMuscleGroup,\n  Muscle_restoreMuscleGroup,\n} from \"../models/muscle\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  navCommon: INavCommon;\n}\n\nexport function ScreenMuscleGroups(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Muscle Groups\" });\n\n  return (\n    <View className=\"px-gutter\">\n      <MuscleGroupsContent\n        onCreate={(name) => {\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>()\n              .p(\"muscleGroups\")\n              .recordModify((muscleGroups) => {\n                return Muscle_createMuscleGroup(muscleGroups, name);\n              }),\n            \"Create Muscle Group\"\n          );\n        }}\n        onDelete={(muscleGroup) => {\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>()\n              .p(\"muscleGroups\")\n              .recordModify((muscleGroups) => {\n                return Muscle_deleteMuscleGroup(muscleGroups, muscleGroup);\n              }),\n            \"Toggle Muscle Group\"\n          );\n        }}\n        onUpdate={(muscleGroup, muscles) => {\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>()\n              .p(\"muscleGroups\")\n              .recordModify((muscleGroups) => {\n                return Muscle_updateMuscleGroup(muscleGroups, muscleGroup, muscles);\n              }),\n            \"Update Muscle Group\"\n          );\n        }}\n        onRestore={(muscleGroup) => {\n          updateSettings(\n            props.dispatch,\n            lb<ISettings>()\n              .p(\"muscleGroups\")\n              .recordModify((muscleGroups) => {\n                return Muscle_restoreMuscleGroup(muscleGroups, muscleGroup);\n              }),\n            \"Restore Muscle Group\"\n          );\n        }}\n        settings={props.settings}\n      />\n    </View>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IProgram, ISettings, ISubscription } from \"../types\";\nimport { INavCommon, IState, updateState } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { ProgramPreview } from \"./programPreview\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { lb } from \"lens-shmens\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  programs: IProgram[];\n  selectedProgramId: string;\n  subscription: ISubscription;\n  navCommon: INavCommon;\n}\n\nexport function ScreenProgramPreview(props: IProps): JSX.Element {\n  const program = props.programs.filter((p) => p.id === props.selectedProgramId)[0];\n\n  useNavOptions({ navTitle: \"Program Preview\" });\n\n  const { dispatch, programs, selectedProgramId } = props;\n  const programValues = useMemo(() => programs.map((p): [string, string] => [p.id, p.name]), [programs]);\n  const topHeader = useMemo(\n    () => (\n      <View className=\"px-gutter\" pointerEvents=\"box-none\">\n        <MenuItemEditable\n          type=\"select\"\n          name=\"Program\"\n          value={selectedProgramId}\n          values={programValues}\n          onChange={(value) => {\n            if (value != null) {\n              updateState(\n                dispatch,\n                [lb<IState>().pi(\"previewProgram\").p(\"id\").record(value)],\n                \"Select preview program\"\n              );\n            }\n          }}\n        />\n      </View>\n    ),\n    [selectedProgramId, programValues, dispatch]\n  );\n\n  return (\n    <ProgramPreview\n      headerContent={topHeader}\n      hasNavbar={false}\n      key={props.selectedProgramId}\n      isMobile={true}\n      dispatch={props.dispatch}\n      settings={props.settings}\n      program={program}\n      subscription={props.subscription}\n      stats={props.navCommon.stats}\n      useNavModals={true}\n    />\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { View, Pressable, Image } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { Path } from \"./primitives/svg\";\nimport { IconSvg } from \"./icons/iconSvg\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ISettings } from \"../types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { IconEditSquare } from \"./icons/iconEditSquare\";\nimport { IconLink } from \"./icons/iconLink\";\nimport { emptyProgramId, Program_selectProgramAndGoHome } from \"../models/program\";\nimport { IconEquipmentKettlebell } from \"./icons/iconEquipmentKettlebell\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { ImagePreloader_uri } from \"../utils/imagePreloader\";\nimport { useTrackClick } from \"../utils/clickTracking\";\n\ninterface IScreenProgramSelectProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n}\n\ninterface IOption {\n  key: string;\n  icon: ReactNode;\n  title: string;\n  description: string;\n  onClick: () => void;\n}\n\nexport function ScreenProgramSelect(props: IScreenProgramSelectProps): JSX.Element {\n  useNavOptions({ navHidden: true });\n  const insets = useSafeAreaInsets();\n  const trackClick = useTrackClick();\n\n  const options: IOption[] = [\n    {\n      key: \"builtin\",\n      icon: <IconDoc width={24} height={24} />,\n      title: \"Pick a built-in program\",\n      description: \"Choose from popular routines like 5/3/1, GZCLP, and more\",\n      onClick: () => props.dispatch(Thunk_pushScreen(\"programs\")),\n    },\n    {\n      key: \"create\",\n      icon: <IconEditSquare />,\n      title: \"Create a program\",\n      description: \"Build your own custom routine from scratch\",\n      onClick: () => navigateToModal(\"createProgramModal\"),\n    },\n    {\n      key: \"import\",\n      icon: <IconLink size={24} />,\n      title: \"Import from link\",\n      description: \"Paste a link from the program web editor\",\n      onClick: () => navigateToModal(\"importFromLinkModal\"),\n    },\n    {\n      key: \"adhoc\",\n      icon: <IconEquipmentKettlebell size={24} />,\n      title: \"Go without program\",\n      description: \"You can run adhoc workouts, and build the program along the way\",\n      onClick: () => Program_selectProgramAndGoHome(props.dispatch, emptyProgramId),\n    },\n  ];\n\n  return (\n    <View\n      className=\"flex flex-col flex-1 bg-background-default\"\n      style={{ paddingTop: insets.top, paddingBottom: insets.bottom }}\n    >\n      <View className=\"flex-1 px-gutter pt-8 pb-4\">\n        <View className=\"items-center p-4\">\n          <Image\n            source={{ uri: ImagePreloader_uri(\"/images/dinoprogramselect.png\") }}\n            style={{ width: 208, height: 208 }}\n            resizeMode=\"cover\"\n          />\n        </View>\n        <View className=\"px-2 -mt-1\">\n          <Text className=\"mb-2 text-xl font-bold text-center text-text-primary\">Choose your program</Text>\n          <Text className=\"mb-6 text-sm text-center text-text-secondary\">\n            How would you like to set up your training?\n          </Text>\n\n          <View className=\"gap-3\">\n            {options.map((opt) => (\n              <Pressable\n                key={opt.key}\n                className=\"flex-row items-center w-full gap-3 px-4 py-4 border rounded-xl bg-background-subtlecardpurple border-border-cardpurple nm-program-select\"\n                data-testid={`program-select-${opt.key}`}\n                testID={`program-select-${opt.key}`}\n                onPress={() => {\n                  trackClick(`program-select-${opt.key}`, `ls-onboarding-program-${opt.key}`);\n                  opt.onClick();\n                }}\n              >\n                <View>{opt.icon}</View>\n                <View className=\"flex-1\">\n                  <Text className=\"text-sm font-semibold\">{opt.title}</Text>\n                  <Text className=\"text-xs text-text-secondary\">{opt.description}</Text>\n                </View>\n                <View>\n                  <IconSvg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\">\n                    <Path\n                      d=\"M6 4l4 4-4 4\"\n                      stroke={Tailwind_semantic().icon.neutral}\n                      strokeWidth=\"2\"\n                      strokeLinecap=\"round\"\n                      strokeLinejoin=\"round\"\n                    />\n                  </IconSvg>\n                </View>\n              </Pressable>\n            ))}\n          </View>\n        </View>\n      </View>\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_undoImport } from \"../ducks/thunks\";\nimport { IImportSession } from \"../types\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { LinkButton } from \"./linkButton\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  importSessions?: IImportSession[];\n}\n\nexport function ScreenRecentImports(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Recent Imports\" });\n  const importSessions = [...(props.importSessions ?? [])].reverse();\n\n  return (\n    <View className=\"px-gutter\">\n      {importSessions.length === 0 ? (\n        <Text className=\"py-8 text-center text-text-secondary\">No recent imports</Text>\n      ) : (\n        importSessions.map((session) => (\n          <View key={session.id} className=\"flex-row items-center py-3 border-b border-border-neutral\">\n            <View className=\"flex-1\">\n              <Text className=\"text-base text-text-primary\">\n                {session.source === \"hevy\" ? \"Hevy\" : \"CSV\"} · {DateUtils_format(session.timestamp)}\n              </Text>\n              <Text className=\"text-sm text-text-secondary\">\n                {session.workoutCount} {StringUtils_pluralize(\"workout\", session.workoutCount)}\n                {session.customExerciseIds.length > 0\n                  ? `, ${session.customExerciseIds.length} new ${StringUtils_pluralize(\n                      \"exercise\",\n                      session.customExerciseIds.length\n                    )}`\n                  : \"\"}\n              </Text>\n            </View>\n            <LinkButton name={`undo-import-${session.id}`} onClick={() => props.dispatch(Thunk_undoImport(session.id))}>\n              Undo\n            </LinkButton>\n          </View>\n        ))\n      )}\n    </View>\n  );\n}\n","import { JSX, memo, useEffect, useState } from \"react\";\nimport { View, Pressable, Linking, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { MenuItem, MenuItemWrapper } from \"./menuItem\";\nimport {\n  Thunk_pushScreen,\n  Thunk_exportStorage,\n  Thunk_exportHistoryToCSV,\n  Thunk_exportProgramsToText,\n} from \"../ducks/thunks\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { lb } from \"lens-shmens\";\nimport { InternalLink } from \"../internalLink\";\nimport { IUser } from \"../models/user\";\nimport { ClipboardUtils_copy } from \"../utils/clipboard\";\nimport { Share_generateProfileLink } from \"../models/share\";\nimport { IImportSession, ILengthUnit, ISettings, IStats, ISubscription, IUnit } from \"../types\";\nimport { WhatsNew_showWhatsNew } from \"../models/whatsnewUtils\";\nimport { ImporterStorage } from \"./importerStorage\";\nimport { ImporterProgram } from \"./importerProgram\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { StringUtils_truncate } from \"../utils/string\";\nimport { IconDiscord } from \"./icons/iconDiscord\";\nimport { IconSpeaker } from \"./icons/iconSpeaker\";\nimport { ImporterLiftosaurCsv } from \"./importerLiftosaurCsv\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { HealthSync_eligibleForAppleHealth, HealthSync_eligibleForGoogleHealth } from \"../lib/healthSync\";\nimport { INavCommon } from \"../models/state\";\nimport { Stats_getCurrentBodyweight, Stats_getCurrentBodyfat } from \"../models/stats\";\nimport { Weight_print } from \"../models/weight\";\nimport { Settings_getTextSize, TEXT_SIZE_MIN, TEXT_SIZE_MAX, TEXT_SIZE_STEP } from \"../models/settings\";\nimport { TextSize_apply } from \"../utils/textSize\";\nimport { useOsFontScale } from \"../utils/fontScale\";\nimport { LinkButton } from \"./linkButton\";\nimport { Features_isEnabled } from \"../utils/features\";\nimport { Slider } from \"./primitives/slider\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  tempUserId?: string;\n  stats: IStats;\n  user?: IUser;\n  currentProgramName?: string;\n  settings: ISettings;\n  importSessions?: IImportSession[];\n  navCommon: INavCommon;\n}\n\nfunction openExternal(url: string): void {\n  Linking.openURL(url).catch(() => undefined);\n}\n\nfunction ScreenSettingsInner(props: IProps): JSX.Element {\n  usePerfRenderCount(\"ScreenSettings\");\n  const [isCopied, setIsCopied] = useState<boolean>(false);\n  const osFontScale = useOsFontScale();\n  // This screen reads settings via `untrack`, so it doesn't re-render when `theme` changes.\n  // Track the choice locally so the select shows the tap instead of snapping back.\n  const [theme, setTheme] = useState<\"dark\" | \"light\" | undefined>(props.settings.theme);\n  useEffect(() => {\n    setTheme(props.settings.theme);\n  }, [props.settings]);\n  const currentBodyweight = Stats_getCurrentBodyweight(props.stats);\n  const currentBodyfat = Stats_getCurrentBodyfat(props.stats);\n\n  useNavOptions({ navTitle: \"Me\", navHelpKey: \"settings\" });\n\n  return (\n    <View className=\"px-gutter\">\n      <MenuItem\n        shouldShowRightArrow={true}\n        name=\"Program\"\n        value={props.currentProgramName}\n        onClick={() => {\n          props.dispatch(Thunk_pushScreen(\"programs\"));\n        }}\n      />\n      <GroupHeader name=\"Account\" topPadding={true} />\n      <MenuItem\n        name=\"Account\"\n        value={\n          props.user?.email == null ? (\n            <Text className=\"text-text-error\">Not signed in</Text>\n          ) : props.user?.email === \"noemail@example.com\" ? (\n            \"Signed In\"\n          ) : (\n            StringUtils_truncate(props.user?.email || \"\", 30)\n          )\n        }\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"account\"))}\n      />\n      <MenuItemEditable\n        type=\"text\"\n        name=\"Nickname\"\n        value={props.settings.nickname || \"\"}\n        nextLine={\n          <View className=\"pb-1\" style={{ marginTop: -8 }}>\n            <Text className=\"text-xs text-text-secondary\">Used for profile page if you have an account</Text>\n          </View>\n        }\n        onChange={(newValue) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"nickname\")\n              .record(newValue ? newValue : undefined),\n            desc: \"Update nickname\",\n          });\n        }}\n      />\n      {props.user && (\n        <MenuItemEditable\n          type=\"boolean\"\n          name=\"Is Profile Page Public?\"\n          value={props.settings.isPublicProfile ? \"true\" : \"false\"}\n          nextLine={\n            props.user?.id && props.settings.isPublicProfile ? (\n              <View className=\"pb-1\" style={{ marginTop: -8 }}>\n                <View className=\"flex-row\">\n                  <Pressable\n                    className=\"mr-auto\"\n                    onPress={() => {\n                      const text = Share_generateProfileLink(props.user!.id);\n                      if (text != null) {\n                        ClipboardUtils_copy(text);\n                        setIsCopied(true);\n                      }\n                    }}\n                  >\n                    <Text className=\"text-xs underline text-text-link\">Copy Link To Clipboard</Text>\n                  </Pressable>\n                  <View className=\"ml-4\">\n                    <InternalLink\n                      name=\"public-profile-page\"\n                      href={`/profile/${props.user.id}`}\n                      className=\"text-xs underline text-text-link\"\n                    >\n                      Open Public Profile Page\n                    </InternalLink>\n                  </View>\n                </View>\n                {isCopied && <Text className=\"text-xs italic text-text-success\">Copied!</Text>}\n              </View>\n            ) : undefined\n          }\n          onChange={(newValue) => {\n            if (props.user != null) {\n              props.dispatch({\n                type: \"UpdateSettings\",\n                lensRecording: lb<ISettings>()\n                  .p(\"isPublicProfile\")\n                  .record(newValue === \"true\"),\n                desc: \"Toggle public profile\",\n              });\n            }\n          }}\n        />\n      )}\n\n      <MenuItem\n        name=\"API Keys\"\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"apiKeys\"))}\n      />\n\n      <GroupHeader name=\"My Measurements\" topPadding={true} />\n      {currentBodyweight && (\n        <MenuItem\n          name=\"Bodyweight\"\n          value={Weight_print(currentBodyweight)}\n          shouldShowRightArrow={true}\n          onClick={() => props.dispatch(Thunk_pushScreen(\"measurements\", { key: \"weight\" }))}\n        />\n      )}\n      {currentBodyfat && (\n        <MenuItem\n          name=\"Bodyfat\"\n          value={Weight_print(currentBodyfat)}\n          shouldShowRightArrow={true}\n          onClick={() => props.dispatch(Thunk_pushScreen(\"measurements\", { key: \"bodyfat\" }))}\n        />\n      )}\n      <MenuItem\n        name=\"Measurements\"\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"measurements\"))}\n      />\n      <MenuItem\n        name=\"Sleep & Nutrition\"\n        shouldShowRightArrow={true}\n        onClick={() => props.dispatch(Thunk_pushScreen(\"sleepNutrition\"))}\n      />\n\n      <GroupHeader name=\"Workout\" topPadding={true} />\n      <MenuItem\n        name=\"Exercises\"\n        onClick={() => props.dispatch(Thunk_pushScreen(\"exercises\"))}\n        shouldShowRightArrow={true}\n      />\n      <MenuItem\n        name=\"Muscle Groups\"\n        onClick={() => props.dispatch(Thunk_pushScreen(\"muscleGroups\"))}\n        shouldShowRightArrow={true}\n      />\n      <MenuItem name=\"Timers\" onClick={() => props.dispatch(Thunk_pushScreen(\"timers\"))} shouldShowRightArrow={true} />\n      {props.settings.gyms.length > 1 && (\n        <MenuItemEditable\n          type=\"select\"\n          name=\"Current Gym\"\n          value={props.settings.currentGymId ?? props.settings.gyms[0].id}\n          values={props.settings.gyms.map((g) => [g.id, g.name])}\n          onChange={(newValue) => {\n            if (newValue != null) {\n              props.dispatch({\n                type: \"UpdateSettings\",\n                lensRecording: lb<ISettings>().p(\"currentGymId\").record(newValue),\n                desc: \"Change current gym\",\n              });\n            }\n          }}\n        />\n      )}\n      <MenuItem\n        shouldShowRightArrow={true}\n        name=\"Available Equipment\"\n        onClick={() => {\n          if (props.settings.gyms.length > 1) {\n            props.dispatch(Thunk_pushScreen(\"gyms\"));\n          } else {\n            props.dispatch(Thunk_pushScreen(\"plates\"));\n          }\n        }}\n      />\n      <MenuItemEditable\n        type=\"select\"\n        name=\"Weight Units\"\n        value={props.settings.units}\n        values={[\n          [\"kg\", \"kg\"],\n          [\"lb\", \"lb\"],\n        ]}\n        onChange={(newValue) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"units\")\n              .record(newValue as IUnit),\n            desc: \"Change weight units\",\n          });\n        }}\n      />\n      <MenuItemEditable\n        type=\"select\"\n        name=\"Length Units\"\n        value={props.settings.lengthUnits}\n        values={[\n          [\"cm\", \"cm\"],\n          [\"in\", \"in\"],\n        ]}\n        onChange={(newValue) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"lengthUnits\")\n              .record(newValue as ILengthUnit),\n            desc: \"Change length units\",\n          });\n        }}\n      />\n      <MenuItemEditable\n        type=\"select\"\n        name=\"Week starts from:\"\n        value={props.settings.startWeekFromMonday ? \"true\" : \"false\"}\n        values={[\n          [\"false\", \"Sunday\"],\n          [\"true\", \"Monday\"],\n        ]}\n        onChange={(newValue) => {\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>()\n              .p(\"startWeekFromMonday\")\n              .record(newValue === \"true\"),\n            desc: \"Toggle week start day\",\n          });\n        }}\n      />\n      {(Platform.OS === \"ios\" || Platform.OS === \"android\") && (\n        <MenuItemEditable\n          type=\"boolean\"\n          name=\"Always On Display\"\n          value={props.settings.alwaysOnDisplay ? \"true\" : \"false\"}\n          onChange={(newValue) => {\n            props.dispatch({\n              type: \"UpdateSettings\",\n              lensRecording: lb<ISettings>()\n                .p(\"alwaysOnDisplay\")\n                .record(newValue === \"true\"),\n              desc: \"Toggle always-on display\",\n            });\n          }}\n        />\n      )}\n      {(Platform.OS === \"ios\" || Platform.OS === \"android\") && (\n        <View>\n          <GroupHeader name=\"Sound\" topPadding={true} />\n          <MenuItemEditable\n            type=\"boolean\"\n            name=\"Vibration\"\n            value={props.settings.vibration ? \"true\" : \"false\"}\n            onChange={(newValue) => {\n              props.dispatch({\n                type: \"UpdateSettings\",\n                lensRecording: lb<ISettings>()\n                  .p(\"vibration\")\n                  .record(newValue === \"true\"),\n                desc: \"Toggle vibration\",\n              });\n            }}\n          />\n          <MenuItemWrapper name=\"volume\">\n            <View className=\"flex-row items-center py-2\">\n              <View className=\"mr-2\">\n                <IconSpeaker />\n              </View>\n              <View className=\"flex-row flex-1\">\n                <Slider\n                  value={props.settings.volume}\n                  min={0}\n                  max={1}\n                  step={0.01}\n                  onChange={(value) => {\n                    props.dispatch({\n                      type: \"UpdateSettings\",\n                      lensRecording: lb<ISettings>().p(\"volume\").record(value),\n                      desc: \"Change volume\",\n                    });\n                  }}\n                />\n              </View>\n            </View>\n          </MenuItemWrapper>\n          {Subscriptions_hasSubscription(props.subscription) && Platform.OS === \"android\" && (\n            <MenuItemEditable\n              type=\"boolean\"\n              name=\"Ignore Do Not Disturb\"\n              value={props.settings.ignoreDoNotDisturb ? \"true\" : \"false\"}\n              nextLine={\n                <View className=\"mb-2\" style={{ marginTop: -8 }}>\n                  <Text className=\"text-xs text-text-secondary\">\n                    Push notification will make a sound even in Silent or Do Not Disturb mode\n                  </Text>\n                </View>\n              }\n              onChange={(newValue) => {\n                props.dispatch({\n                  type: \"UpdateSettings\",\n                  lensRecording: lb<ISettings>()\n                    .p(\"ignoreDoNotDisturb\")\n                    .record(newValue === \"true\"),\n                  desc: \"Toggle ignore DND\",\n                });\n              }}\n            />\n          )}\n        </View>\n      )}\n      {(HealthSync_eligibleForAppleHealth() || HealthSync_eligibleForGoogleHealth()) && (\n        <>\n          <GroupHeader name=\"Sync\" topPadding={true} />\n          {HealthSync_eligibleForGoogleHealth() && (\n            <MenuItem\n              shouldShowRightArrow={true}\n              name=\"Google Health Connect\"\n              onClick={() => props.dispatch(Thunk_pushScreen(\"googleHealth\"))}\n            />\n          )}\n          {HealthSync_eligibleForAppleHealth() && (\n            <MenuItem\n              shouldShowRightArrow={true}\n              name=\"Apple Health\"\n              onClick={() => props.dispatch(Thunk_pushScreen(\"appleHealth\"))}\n            />\n          )}\n        </>\n      )}\n      <GroupHeader name=\"Appearance\" topPadding={true} />\n      <MenuItemWrapper name=\"text-size\">\n        <View className=\"py-2\">\n          <View className=\"flex-row items-center\">\n            <View className=\"flex-row items-baseline mr-2\">\n              <Text className=\"text-xs\">A</Text>\n              <Text className=\"text-lg\">A</Text>\n            </View>\n            <View className=\"flex-row flex-1\">\n              <Slider\n                value={Settings_getTextSize(props.settings, osFontScale)}\n                min={TEXT_SIZE_MIN}\n                max={TEXT_SIZE_MAX}\n                step={TEXT_SIZE_STEP}\n                onChange={(value) => {\n                  TextSize_apply(value);\n                  props.dispatch({\n                    type: \"UpdateSettings\",\n                    lensRecording: lb<ISettings>().p(\"textSize\").record(value),\n                    desc: \"Change text size\",\n                  });\n                }}\n              />\n            </View>\n          </View>\n          <View className=\"flex-row items-center justify-between mt-1\">\n            <Text className=\"text-xs text-text-secondary\">\n              {props.settings.textSize == null ? \"Matching your device text size\" : \"Set in the app\"}\n            </Text>\n            {props.settings.textSize != null && (\n              <LinkButton\n                name=\"text-size-reset\"\n                className=\"text-xs font-normal\"\n                onClick={() => {\n                  TextSize_apply(Settings_getTextSize({ ...props.settings, textSize: undefined }, osFontScale));\n                  props.dispatch({\n                    type: \"UpdateSettings\",\n                    lensRecording: lb<ISettings>().p(\"textSize\").record(undefined),\n                    desc: \"Follow device text size\",\n                  });\n                }}\n              >\n                Use device size\n              </LinkButton>\n            )}\n          </View>\n        </View>\n      </MenuItemWrapper>\n      <MenuItemEditable\n        type=\"select\"\n        name=\"Theme\"\n        value={theme ?? \"system\"}\n        values={[\n          [\"system\", \"System\"],\n          [\"light\", \"Light\"],\n          [\"dark\", \"Dark\"],\n        ]}\n        onChange={(newValue) => {\n          const newTheme = newValue === \"dark\" || newValue === \"light\" ? newValue : undefined;\n          setTheme(newTheme);\n          props.dispatch({\n            type: \"UpdateSettings\",\n            lensRecording: lb<ISettings>().p(\"theme\").record(newTheme),\n            desc: \"Change theme\",\n          });\n        }}\n      />\n      {Features_isEnabled(\"affiliates\", props.user?.id ?? props.tempUserId) && (\n        <>\n          <GroupHeader name=\"Earn money with Liftosaur\" topPadding={true} />\n          <MenuItem\n            expandName={true}\n            name=\"Affiliate Program\"\n            onClick={() => navigateToModal(\"affiliateModal\")}\n            value={props.settings.affiliateEnabled ? \"On\" : \"Off\"}\n            shouldShowRightArrow={true}\n          />\n        </>\n      )}\n      <GroupHeader name=\"Import / Export\" topPadding={true} />\n      <MenuItemWrapper name=\"Export data to JSON file\" onClick={() => props.dispatch(Thunk_exportStorage())}>\n        <View className=\"py-3\">\n          <Text className=\"text-base text-text-primary\">Export data to JSON file</Text>\n        </View>\n      </MenuItemWrapper>\n      <MenuItemWrapper name=\"Export history to CSV file\" onClick={() => props.dispatch(Thunk_exportHistoryToCSV())}>\n        <View className=\"py-3\">\n          <Text className=\"text-base text-text-primary\">Export history to CSV file</Text>\n        </View>\n      </MenuItemWrapper>\n      <MenuItemWrapper\n        name=\"Export all programs to text file\"\n        onClick={() => props.dispatch(Thunk_exportProgramsToText())}\n      >\n        <View className=\"py-3\">\n          <Text className=\"text-base text-text-primary\">Export all programs to text file</Text>\n        </View>\n      </MenuItemWrapper>\n      <ImporterLiftosaurCsv dispatch={props.dispatch} />\n      <ImporterStorage dispatch={props.dispatch} />\n      <ImporterProgram dispatch={props.dispatch} />\n      <MenuItemWrapper\n        name=\"Import history from other apps\"\n        onClick={() => navigateToModal(\"importFromOtherAppsModal\")}\n      >\n        <View className=\"py-3\">\n          <Text className=\"text-base text-text-primary\">Import history from other apps</Text>\n        </View>\n      </MenuItemWrapper>\n      {(props.importSessions ?? []).length > 0 && (\n        <MenuItem\n          shouldShowRightArrow={true}\n          name=\"Recent imports\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"recentImports\"))}\n        />\n      )}\n\n      <GroupHeader name=\"Miscellaneous\" topPadding={true} />\n      <MenuItem name=\"Changelog\" onClick={() => WhatsNew_showWhatsNew(props.dispatch)} />\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"mailto:info@liftosaur.com\")}\n      >\n        <Text className=\"text-base text-text-primary\">Contact Us</Text>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://discord.com/invite/AAh3cvdBRs\")}\n      >\n        <View className=\"flex-row items-center\">\n          <View className=\"pr-2\">\n            <IconDiscord />\n          </View>\n          <Text className=\"text-base text-text-primary\">Discord Server</Text>\n        </View>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://www.liftosaur.com/privacy.html\")}\n      >\n        <Text className=\"text-base text-text-primary\">Privacy Policy</Text>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://www.liftosaur.com/terms.html\")}\n      >\n        <Text className=\"text-base text-text-primary\">Terms & Conditions</Text>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://www.liftosaur.com/licenses.html\")}\n      >\n        <Text className=\"text-base text-text-primary\">Licenses</Text>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://www.liftosaur.com/doc\")}\n      >\n        <Text className=\"text-base text-text-primary\">Documentation</Text>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://github.com/astashov/liftosaur\")}\n      >\n        <Text className=\"text-base text-text-primary\">Source Code on Github</Text>\n      </Pressable>\n      <Pressable\n        className=\"py-3 border-b border-border-neutral\"\n        onPress={() => openExternal(\"https://github.com/astashov/liftosaur/discussions\")}\n      >\n        <Text className=\"text-base text-text-primary\">📍 Roadmap</Text>\n      </Pressable>\n    </View>\n  );\n}\n\nexport const ScreenSettings = memo(ScreenSettingsInner);\n","import { JSX, Fragment, ReactNode, useMemo, useState } from \"react\";\nimport { View, Image, ScrollView, Pressable, Platform, LayoutAnimation } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { Switch } from \"./primitives/switch\";\nimport { LinkButton } from \"./linkButton\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IAllEquipment, ISettings, IStats } from \"../types\";\nimport { INavCommon, IState } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { Button } from \"./button\";\nimport { EquipmentRowBody, EquipmentRowHeader, equipmentToIcon } from \"./equipmentSettings\";\nimport { Equipment_getCurrentGym, Equipment_getEquipmentData, Equipment_getEquipmentOfGym } from \"../models/equipment\";\nimport { equipmentName } from \"../models/exercise\";\nimport { ILensRecordingPayload, lb } from \"lens-shmens\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { ImagePreloader_uri } from \"../utils/imagePreloader\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { ILensDispatch } from \"../utils/useLensReducer\";\nimport { navigateToModal } from \"../navigation/navigationService\";\n\nfunction getFooterShadowStyle(): Record<string, unknown> {\n  const semantic = Tailwind_semantic();\n  const colors = Tailwind_colors();\n  return Platform.select({\n    ios: {\n      shadowColor: semantic.background.default === colors.black ? colors.white : colors.black,\n      shadowOffset: { width: 0, height: -2 },\n      shadowOpacity: 0.1,\n      shadowRadius: 4,\n    },\n    android: { elevation: 4 },\n    default: { boxShadow: \"0 0 4px 0 rgba(0, 0, 0, 0.2)\" },\n  }) as Record<string, unknown>;\n}\n\nfunction buildLensDispatch(originalDispatch: IDispatch): ILensDispatch<IState> {\n  return (lensRecording: ILensRecordingPayload<IState>[] | ILensRecordingPayload<IState>, desc: string) => {\n    originalDispatch({\n      type: \"UpdateState\",\n      lensRecording: Array.isArray(lensRecording) ? lensRecording : [lensRecording],\n      desc,\n    });\n  };\n}\n\ninterface IScreenSetupEquipmentProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  selectedGymId?: string;\n  stats: IStats;\n  navCommon: INavCommon;\n}\n\nexport function ScreenSetupEquipment(props: IScreenSetupEquipmentProps): JSX.Element {\n  const currentGym = Equipment_getCurrentGym(props.settings);\n  const allEquipment = Equipment_getEquipmentOfGym(props.settings, props.selectedGymId);\n  const insets = useSafeAreaInsets();\n\n  useNavOptions({ navHidden: true });\n\n  return (\n    <View className=\"flex flex-col flex-1 bg-background-default\" style={{ paddingTop: insets.top }}>\n      <ScrollView className=\"flex-1\" contentContainerClassName=\"px-4 pt-8 pb-4\">\n        <View className=\"items-center p-4\">\n          <Image\n            source={{ uri: ImagePreloader_uri(\"/images/dinoequipment.png\") }}\n            className=\"h-60\"\n            style={{ width: 240, height: 240 }}\n            resizeMode=\"contain\"\n          />\n        </View>\n        <View className=\"px-2 -mt-1\">\n          <Text className=\"mb-2 text-xl font-bold text-center text-text-primary\">What equipment do you have?</Text>\n          <Text className=\"mb-4 text-sm text-center text-text-secondary\">\n            Toggle on the equipment available at your gym. This helps the app round weights to what you can actually\n            load.\n          </Text>\n\n          <View style={{ gap: 8 }}>\n            {ObjectUtils_keys(allEquipment).map((eqid) => {\n              const equipmentData = Equipment_getEquipmentData(props.settings, eqid);\n              const isEnabled = equipmentData && !equipmentData.isDeleted;\n              const name = equipmentName(eqid, allEquipment);\n              const icon = equipmentToIcon[eqid] ? equipmentToIcon[eqid]() : null;\n              return (\n                <Pressable\n                  key={eqid}\n                  testID={`equipment-toggle-${eqid}`}\n                  data-testid={`equipment-toggle-${eqid}`}\n                  className={`flex-row items-center px-4 py-3 border rounded-xl ${\n                    isEnabled\n                      ? \"bg-background-subtlecardpurple border-border-cardpurple\"\n                      : \"bg-background-default border-border-neutral\"\n                  }`}\n                  style={{ gap: 12 }}\n                  onPress={() => {\n                    props.dispatch({\n                      type: \"UpdateState\",\n                      lensRecording: [\n                        lb<IState>()\n                          .p(\"storage\")\n                          .p(\"settings\")\n                          .p(\"gyms\")\n                          .findBy(\"id\", currentGym.id)\n                          .p(\"equipment\")\n                          .pi(eqid)\n                          .p(\"isDeleted\")\n                          .record(!isEnabled ? false : true),\n                      ],\n                      desc: `Toggle equipment ${eqid}`,\n                    });\n                  }}\n                >\n                  {icon && <View>{icon}</View>}\n                  <Text className=\"flex-1 text-sm font-semibold\">{name}</Text>\n                  <Switch\n                    value={!!isEnabled}\n                    onValueChange={() => {\n                      props.dispatch({\n                        type: \"UpdateState\",\n                        lensRecording: [\n                          lb<IState>()\n                            .p(\"storage\")\n                            .p(\"settings\")\n                            .p(\"gyms\")\n                            .findBy(\"id\", currentGym.id)\n                            .p(\"equipment\")\n                            .pi(eqid)\n                            .p(\"isDeleted\")\n                            .record(!isEnabled ? false : true),\n                        ],\n                        desc: `Toggle equipment ${eqid}`,\n                      });\n                    }}\n                  />\n                </Pressable>\n              );\n            })}\n          </View>\n        </View>\n      </ScrollView>\n      <View className=\"bg-background-default\" style={[{ paddingBottom: insets.bottom || 8 }, getFooterShadowStyle()]}>\n        <View className=\"flex-row px-gutter pt-2 pb-2\" style={{ gap: 8 }}>\n          <Button\n            className=\"flex-1 ls-onboarding-equipment-skip\"\n            name=\"setup-equipment-skip\"\n            kind=\"lightgrayv3\"\n            buttonSize=\"lg\"\n            data-testid=\"setup-equipment-skip\"\n            testID=\"setup-equipment-skip\"\n            onClick={() => props.dispatch(Thunk_pushScreen(\"hearaboutus\"))}\n          >\n            Skip\n          </Button>\n          <Button\n            className=\"flex-1 ls-onboarding-equipment-setup\"\n            name=\"setup-equipment-continue\"\n            kind=\"purple\"\n            buttonSize=\"lg\"\n            data-testid=\"setup-equipment-continue\"\n            testID=\"setup-equipment-continue\"\n            onClick={() => props.dispatch(Thunk_pushScreen(\"setupplates\"))}\n          >\n            Set up plates\n          </Button>\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IScreenSetupPlatesProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  stats: IStats;\n  navCommon: INavCommon;\n}\n\nexport function ScreenSetupPlates(props: IScreenSetupPlatesProps): JSX.Element {\n  const currentGym = Equipment_getCurrentGym(props.settings);\n  const insets = useSafeAreaInsets();\n\n  useNavOptions({ navTitle: \"Set Up Plates\" });\n\n  const [expandedMap, setExpandedMap] = useState<Record<string, boolean>>({});\n\n  const lensDispatch = useMemo(() => buildLensDispatch(props.dispatch), [props.dispatch]);\n  const lensPrefix = useMemo(\n    () => lb<IState>().p(\"storage\").p(\"settings\").p(\"gyms\").findBy(\"id\", currentGym.id).p(\"equipment\").get(),\n    [currentGym.id]\n  );\n\n  const toggleExpanded = (key: string): void => {\n    LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);\n    setExpandedMap((m) => ({ ...m, [key]: !m[key] }));\n  };\n\n  const allEquipment = currentGym.equipment;\n  const visibleKeys = ObjectUtils_keys(allEquipment).filter((e) => !allEquipment[e]?.isDeleted);\n  const hiddenEquipment = ObjectUtils_keys(allEquipment).filter((e) => {\n    const eq = allEquipment[e];\n    return !eq?.name && eq?.isDeleted;\n  });\n\n  const children: ReactNode[] = [];\n  const stickyIndices: number[] = [];\n\n  children.push(\n    <View key=\"image\" className=\"items-center p-4\">\n      <Image\n        source={{ uri: ImagePreloader_uri(\"/images/dinoplates.png\") }}\n        style={{ width: 220, height: 208 }}\n        resizeMode=\"contain\"\n      />\n    </View>\n  );\n\n  children.push(\n    <View key=\"intro\" className=\"px-gutter pb-4\">\n      <Text className=\"mb-2 text-xl font-bold text-center text-text-primary\">Set up your plates</Text>\n      <Text className=\"text-sm text-center text-text-secondary\">\n        Configure the <Text className=\"text-sm font-bold text-text-secondary\">bar weight</Text> and{\" \"}\n        <Text className=\"text-sm font-bold text-text-secondary\">plates</Text> you have for each equipment type. The app\n        uses this to round program weights to what you can actually load.\n      </Text>\n    </View>\n  );\n\n  visibleKeys.forEach((key) => {\n    const equipmentData = allEquipment[key];\n    if (!equipmentData) {\n      return;\n    }\n    const isExpanded = !!expandedMap[key];\n    const headerIndex = children.length;\n    stickyIndices.push(headerIndex);\n    children.push(\n      <View key={`${key}-header`} className={`mx-2 ${isExpanded ? \"\" : \"mb-6\"}`}>\n        <EquipmentRowHeader\n          lensPrefix={lensPrefix}\n          lensDispatch={lensDispatch}\n          equipment={key}\n          equipmentData={equipmentData}\n          allEquipment={allEquipment}\n          settings={props.settings}\n          isExpanded={isExpanded}\n          onToggle={() => toggleExpanded(key)}\n        />\n      </View>\n    );\n    if (isExpanded) {\n      children.push(\n        <View key={`${key}-body`} className=\"mx-2 mb-6\">\n          <EquipmentRowBody\n            lensPrefix={lensPrefix}\n            lensDispatch={lensDispatch}\n            dispatch={props.dispatch}\n            equipment={key}\n            equipmentData={equipmentData}\n            allEquipment={allEquipment}\n            settings={props.settings}\n            stats={props.stats}\n          />\n        </View>\n      );\n    }\n  });\n\n  return (\n    <View className=\"flex flex-col flex-1 bg-background-default\" style={{ paddingTop: insets.top }}>\n      <ScrollView\n        className=\"flex-1 bg-background-default\"\n        contentContainerStyle={{ paddingBottom: 80 + insets.bottom }}\n        automaticallyAdjustKeyboardInsets\n        keyboardShouldPersistTaps=\"never\"\n        keyboardDismissMode=\"interactive\"\n        stickyHeaderIndices={stickyIndices}\n      >\n        {children}\n        {hiddenEquipment.length > 0 && (\n          <View className=\"flex-row flex-wrap mx-4 my-2\">\n            <Text className=\"text-xs\">Hidden Equipment: </Text>\n            {hiddenEquipment.map((e, i) => (\n              <Fragment key={e}>\n                {i !== 0 && <Text className=\"text-xs\">, </Text>}\n                <LinkButton\n                  className=\"text-xs\"\n                  name={`show-equipment-${e}`}\n                  onClick={() => {\n                    const lensRecording = lensPrefix.then(lb<IAllEquipment>().pi(e).p(\"isDeleted\").get()).record(false);\n                    lensDispatch(lensRecording, `Show equipment ${e}`);\n                  }}\n                >\n                  {equipmentName(e, allEquipment)}\n                </LinkButton>\n              </Fragment>\n            ))}\n          </View>\n        )}\n        <View className=\"m-4\">\n          <LinkButton className=\"text-sm\" name=\"add-new-equipment\" onClick={() => navigateToModal(\"newEquipmentModal\")}>\n            Add New Equipment Type\n          </LinkButton>\n        </View>\n      </ScrollView>\n      <View\n        className=\"absolute bottom-0 left-0 right-0 px-4 pt-4 bg-background-default\"\n        style={[{ paddingBottom: insets.bottom || 16 }, getFooterShadowStyle()]}\n      >\n        <Button\n          className=\"w-full ls-onboarding-plates\"\n          name=\"setup-plates-continue\"\n          kind=\"purple\"\n          buttonSize=\"lg\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"hearaboutus\"))}\n          data-testid=\"setup-plates-continue\"\n          testID=\"setup-plates-continue\"\n        >\n          Continue\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useCallback, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { EditStats_setHealthStatHidden } from \"../models/editStats\";\nimport { Stats_name } from \"../models/stats\";\nimport { ISettings, IStats, IStatsHealthKey, ISubscription, statsHealthDef } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { MenuItem } from \"./menuItem\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { IconUndo } from \"./icons/iconUndo\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { ScrollableTabs } from \"./scrollableTabs\";\nimport { GraphStats, getHealthDataForGraph } from \"./graphStats\";\nimport { Locker } from \"./locker\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  stats: IStats;\n  settings: ISettings;\n  subscription: ISubscription;\n  navCommon: INavCommon;\n}\n\ninterface IHealthValue {\n  timestamp: number;\n  value: number;\n}\n\nfunction unitForMetric(key: IStatsHealthKey): string {\n  return key === \"sleep\" ? \"h\" : key === \"calories\" ? \"kcal\" : \"g\";\n}\n\nfunction formatHealthValue(key: IStatsHealthKey, value: number): string {\n  if (key === \"sleep\") {\n    const hours = Math.floor(value / 60);\n    const minutes = Math.round(value % 60);\n    return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;\n  }\n  if (key === \"calories\") {\n    return `${Math.round(value)} kcal`;\n  }\n  return `${value} g`;\n}\n\nexport function ScreenSleepNutrition(props: IProps): JSX.Element {\n  useNavOptions({ navTitle: \"Sleep & Nutrition\" });\n\n  const keysWithData = statsHealthDef.filter((key) => (props.stats.health?.[key] || []).length > 0);\n\n  if (keysWithData.length === 0) {\n    return (\n      <View className=\"px-gutter\">\n        <Text className=\"py-16 text-center text-text-secondary\">\n          No sleep or nutrition data yet. Enable syncing in your Apple Health or Google Health settings, and it will\n          appear here as it's imported.\n        </Text>\n      </View>\n    );\n  }\n\n  const defaultIndex = Math.max(0, statsHealthDef.indexOf(keysWithData[0]));\n\n  return (\n    <ScrollableTabs\n      color=\"purple\"\n      defaultIndex={defaultIndex}\n      tabs={statsHealthDef.map((key) => ({\n        label: Stats_name(key),\n        children: () => (\n          <HealthMetricList\n            statsKey={key}\n            stats={props.stats}\n            settings={props.settings}\n            subscription={props.subscription}\n            dispatch={props.dispatch}\n          />\n        ),\n      }))}\n    />\n  );\n}\n\ninterface IHealthMetricListProps {\n  statsKey: IStatsHealthKey;\n  stats: IStats;\n  settings: ISettings;\n  subscription: ISubscription;\n  dispatch: IDispatch;\n}\n\nfunction HealthMetricList(props: IHealthMetricListProps): JSX.Element {\n  const { statsKey, stats, settings, subscription, dispatch } = props;\n  const [showHidden, setShowHidden] = useState(false);\n  const all = stats.health?.[statsKey] || [];\n\n  if (all.length === 0) {\n    return (\n      <View className=\"px-gutter\">\n        <Text className=\"py-12 text-center text-text-secondary\">No {Stats_name(statsKey)} data yet</Text>\n      </View>\n    );\n  }\n\n  const byTimestampDesc = (a: IHealthValue, b: IHealthValue): number => b.timestamp - a.timestamp;\n  const visible: IHealthValue[] = all.filter((v) => !v.hidden).map((v) => ({ timestamp: v.timestamp, value: v.value }));\n  const hidden: IHealthValue[] = all.filter((v) => v.hidden).map((v) => ({ timestamp: v.timestamp, value: v.value }));\n  visible.sort(byTimestampDesc);\n  hidden.sort(byTimestampDesc);\n\n  const graphPoints = getHealthDataForGraph(\n    all.filter((v) => !v.hidden),\n    statsKey\n  );\n\n  return (\n    <View className=\"px-gutter pb-8\">\n      <View className=\"relative\">\n        {graphPoints.length > 2 && (\n          <>\n            <GraphStats\n              key={statsKey}\n              title={null}\n              isSameXAxis={false}\n              minX={graphPoints[0][0]}\n              maxX={graphPoints[graphPoints.length - 1][0]}\n              units={unitForMetric(statsKey)}\n              settings={settings}\n              collection={graphPoints}\n              statsKey={statsKey}\n              isInteractive={Subscriptions_hasSubscription(subscription)}\n            />\n            <Locker topic=\"Graphs\" dispatch={dispatch} blur={8} subscription={subscription} />\n          </>\n        )}\n      </View>\n      {visible.length === 0 ? (\n        <Text className=\"py-8 text-center text-text-secondary\">All {Stats_name(statsKey)} records are hidden</Text>\n      ) : (\n        visible.map((value) => (\n          <HealthMetricRow\n            key={`${statsKey}-${value.timestamp}`}\n            statsKey={statsKey}\n            value={value}\n            isHidden={false}\n            dispatch={dispatch}\n          />\n        ))\n      )}\n      {hidden.length > 0 && (\n        <>\n          <Pressable\n            className=\"py-3\"\n            data-testid=\"toggle-hidden-health\"\n            testID=\"toggle-hidden-health\"\n            onPress={() => setShowHidden((s) => !s)}\n          >\n            <Text className=\"text-center text-text-link\">\n              {showHidden ? \"Hide\" : \"Show\"} {hidden.length} hidden {hidden.length === 1 ? \"record\" : \"records\"}\n            </Text>\n          </Pressable>\n          {showHidden &&\n            hidden.map((value) => (\n              <HealthMetricRow\n                key={`${statsKey}-hidden-${value.timestamp}`}\n                statsKey={statsKey}\n                value={value}\n                isHidden={true}\n                dispatch={dispatch}\n              />\n            ))}\n        </>\n      )}\n    </View>\n  );\n}\n\ninterface IHealthMetricRowProps {\n  statsKey: IStatsHealthKey;\n  value: IHealthValue;\n  isHidden: boolean;\n  dispatch: IDispatch;\n}\n\nfunction HealthMetricRow(props: IHealthMetricRowProps): JSX.Element {\n  const { statsKey, value, isHidden, dispatch } = props;\n\n  const onToggle = useCallback(() => {\n    EditStats_setHealthStatHidden(dispatch, statsKey, value.timestamp, !isHidden);\n  }, [dispatch, statsKey, value.timestamp, isHidden]);\n\n  const valueNode = (\n    <View className=\"flex-row items-center\">\n      <Text className={`font-semibold ${isHidden ? \"text-text-secondary\" : \"text-text-primary\"}`}>\n        {formatHealthValue(statsKey, value.value)}\n      </Text>\n      <Pressable\n        className={isHidden ? \"p-3 nm-unhide-health-stat\" : \"p-3 nm-hide-health-stat\"}\n        data-testid={isHidden ? \"unhide-health-stat\" : \"hide-health-stat\"}\n        testID={isHidden ? \"unhide-health-stat\" : \"hide-health-stat\"}\n        onPress={onToggle}\n      >\n        {isHidden ? <IconUndo /> : <IconTrash />}\n      </Pressable>\n    </View>\n  );\n\n  return <MenuItem name={DateUtils_format(value.timestamp)} value={valueNode} />;\n}\n","import { JSX, ReactNode, useRef, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pullScreen, Thunk_saveMeasurementsToHealth } from \"../ducks/thunks\";\nimport {\n  ISettings,\n  IUnit,\n  ILengthUnit,\n  IStats,\n  IWeight,\n  ILength,\n  IStatsWeight,\n  IStatsLength,\n  IStatsPercentage,\n  IPercentage,\n  IPercentageUnit,\n  IStatsKey,\n} from \"../types\";\nimport { Button } from \"./button\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { Weight_convertTo, Weight_build } from \"../models/weight\";\nimport { Length_convertTo, Length_build } from \"../models/length\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { EditStats_addWeightStats, EditStats_addLengthStats, EditStats_addPercentageStats } from \"../models/editStats\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Input } from \"./input\";\nimport { IconFilter } from \"./icons/iconFilter\";\nimport { HealthSync_eligibleForAppleHealth, HealthSync_eligibleForGoogleHealth } from \"../lib/healthSync\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { DatePicker } from \"./datePicker\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n  stats: IStats;\n  navCommon: INavCommon;\n}\n\ninterface IUpdates {\n  bodyfat?: IPercentage;\n  weight?: IWeight;\n  waist?: ILength;\n}\n\ntype IValuesRef = React.MutableRefObject<Partial<Record<IStatsKey, string>>>;\n\nexport function ScreenStats(props: IProps): JSX.Element {\n  const { statsEnabled, lengthUnits, units } = props.settings;\n  const [cleared, setCleared] = useState(false);\n  const lastWeightStats: Partial<Record<keyof IStatsWeight, IWeight>> = cleared\n    ? {}\n    : ObjectUtils_keys(props.stats.weight).reduce<Partial<Record<keyof IStatsWeight, IWeight>>>((acc, key) => {\n        const value = (props.stats.weight[key] || [])[0]?.value;\n        if (value != null) {\n          acc[key] = Weight_convertTo(value, props.settings.units);\n        }\n        return acc;\n      }, {});\n  const lastLengthStats: Partial<Record<keyof IStatsLength, ILength>> = cleared\n    ? {}\n    : ObjectUtils_keys(props.stats.length).reduce<Partial<Record<keyof IStatsLength, ILength>>>((acc, key) => {\n        const value = (props.stats.length[key] || [])[0]?.value;\n        if (value != null) {\n          acc[key] = Length_convertTo(value, props.settings.lengthUnits);\n        }\n        return acc;\n      }, {});\n  const lastPercentageStats: Partial<Record<keyof IStatsPercentage, IPercentage>> = cleared\n    ? {}\n    : ObjectUtils_keys(props.stats.percentage).reduce<Partial<Record<keyof IStatsPercentage, IPercentage>>>(\n        (acc, key) => {\n          const value = (props.stats.percentage[key] || [])[0]?.value;\n          if (value != null) {\n            acc[key] = value;\n          }\n          return acc;\n        },\n        {}\n      );\n  const [syncToAppleHealth, setSyncToAppleHealth] = useState(!!props.settings.appleHealthSyncMeasurements);\n  const [syncToGoogleHealth, setSyncToGoogleHealth] = useState(!!props.settings.googleHealthSyncMeasurements);\n  const [clearKey, setClearKey] = useState(0);\n  const [pickedTimestamp, setPickedTimestamp] = useState<number | undefined>(undefined);\n\n  const initialValues: Partial<Record<IStatsKey, string>> = {};\n  for (const key of ObjectUtils_keys(lastWeightStats)) {\n    const value = lastWeightStats[key];\n    if (value != null) {\n      initialValues[key] = String(value.value);\n    }\n  }\n  for (const key of ObjectUtils_keys(lastLengthStats)) {\n    const value = lastLengthStats[key];\n    if (value != null) {\n      initialValues[key] = String(value.value);\n    }\n  }\n  for (const key of ObjectUtils_keys(lastPercentageStats)) {\n    const value = lastPercentageStats[key];\n    if (value != null) {\n      initialValues[key] = String(value.value);\n    }\n  }\n  const valuesRef: IValuesRef = useRef<Partial<Record<IStatsKey, string>>>(initialValues);\n\n  function saveWeight(timestamp: number): Partial<Record<keyof IStatsWeight, IWeight>> {\n    const payload = ObjectUtils_keys(statsEnabled.weight).reduce<Partial<Record<keyof IStatsWeight, IWeight>>>(\n      (acc, key) => {\n        const isEnabled = statsEnabled.weight[key];\n        if (isEnabled) {\n          const stringValue = valuesRef.current[key];\n          if (stringValue) {\n            const value = parseFloat(stringValue);\n            if (!isNaN(value)) {\n              acc[key] = Weight_build(value, units);\n            }\n          }\n        }\n        return acc;\n      },\n      {}\n    );\n    EditStats_addWeightStats(props.dispatch, payload, timestamp);\n    return payload;\n  }\n\n  function saveLength(timestamp: number): Partial<Record<keyof IStatsLength, ILength>> {\n    const payload = ObjectUtils_keys(statsEnabled.length).reduce<Partial<Record<keyof IStatsLength, ILength>>>(\n      (acc, key) => {\n        const isEnabled = statsEnabled.length[key];\n        if (isEnabled) {\n          const stringValue = valuesRef.current[key];\n          if (stringValue) {\n            const value = parseFloat(stringValue);\n            if (!isNaN(value)) {\n              acc[key] = Length_build(value, lengthUnits);\n            }\n          }\n        }\n        return acc;\n      },\n      {}\n    );\n    EditStats_addLengthStats(props.dispatch, payload, timestamp);\n    return payload;\n  }\n\n  function savePercentage(timestamp: number): Partial<Record<keyof IStatsPercentage, IPercentage>> {\n    const payload = ObjectUtils_keys(statsEnabled.percentage).reduce<\n      Partial<Record<keyof IStatsPercentage, IPercentage>>\n    >((acc, key) => {\n      const isEnabled = statsEnabled.percentage[key];\n      if (isEnabled) {\n        const stringValue = valuesRef.current[key];\n        if (stringValue) {\n          const value = parseFloat(stringValue);\n          if (!isNaN(value)) {\n            acc[key] = { value, unit: \"%\" };\n          }\n        }\n      }\n      return acc;\n    }, {});\n    EditStats_addPercentageStats(props.dispatch, payload, timestamp);\n    return payload;\n  }\n\n  function save(): void {\n    const timestamp = pickedTimestamp ?? Date.now();\n    let updates: IUpdates = { ...saveWeight(timestamp) };\n    updates = { ...updates, ...saveLength(timestamp) };\n    updates = { ...updates, ...savePercentage(timestamp) };\n    if (\n      (HealthSync_eligibleForAppleHealth() && syncToAppleHealth) ||\n      (HealthSync_eligibleForGoogleHealth() && syncToGoogleHealth)\n    ) {\n      props.dispatch(\n        Thunk_saveMeasurementsToHealth({\n          bodyweight: updates.weight,\n          bodyfat: updates.bodyfat,\n          waist: updates.waist,\n          timestamp,\n        })\n      );\n    }\n    props.dispatch(Thunk_pullScreen());\n  }\n\n  useNavOptions({\n    navTitle: \"Add Measurements\",\n    navHelpKey: \"stats\",\n    navRightButtons: [\n      <Pressable\n        key=\"filter\"\n        className=\"p-2 nm-modify-stats\"\n        data-testid=\"modify-stats\"\n        testID=\"modify-stats\"\n        onPress={() => navigateToModal(\"statsSettingsModal\")}\n      >\n        <IconFilter />\n      </Pressable>,\n    ],\n  });\n\n  return (\n    <View className=\"px-gutter\">\n      <Text className=\"py-2 text-sm text-text-secondary\">\n        All fields are optional, input only the fields you want this time. Empty fields won't be added.\n      </Text>\n      <View className=\"items-center\">\n        <Button\n          data-testid=\"clear-stats-fields\"\n          testID=\"clear-stats-fields\"\n          name=\"clear-stats-fields\"\n          kind=\"grayv2\"\n          onClick={() => {\n            valuesRef.current = {};\n            setCleared(true);\n            setClearKey((k) => k + 1);\n          }}\n        >\n          Clear All Fields\n        </Button>\n      </View>\n      <View className=\"flex-row items-center justify-center my-2\">\n        <Text className=\"mr-2 text-xs text-text-secondary\">Date</Text>\n        <DatePicker testID=\"input-stats-add-date\" value={pickedTimestamp ?? Date.now()} onChange={setPickedTimestamp} />\n      </View>\n      {statsEnabled.length.neck && (\n        <SingleLine>\n          <StatInput\n            name=\"neck\"\n            label=\"Neck\"\n            defaultValue={lastLengthStats.neck?.value}\n            unit={lengthUnits}\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {statsEnabled.weight && (\n        <SingleLine>\n          <StatInput\n            name=\"weight\"\n            label=\"Bodyweight\"\n            defaultValue={lastWeightStats.weight?.value}\n            unit={units}\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {statsEnabled.percentage.bodyfat && (\n        <SingleLine>\n          <StatInput\n            name=\"bodyfat\"\n            label=\"Bodyfat\"\n            defaultValue={lastPercentageStats.bodyfat?.value}\n            unit=\"%\"\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {statsEnabled.length.shoulders && (\n        <SingleLine>\n          <StatInput\n            name=\"shoulders\"\n            label=\"Shoulders\"\n            defaultValue={lastLengthStats.shoulders?.value}\n            unit={lengthUnits}\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {(statsEnabled.length.bicepLeft || statsEnabled.length.bicepRight) && (\n        <DoubleLine\n          first={\n            statsEnabled.length.bicepLeft && (\n              <StatInput\n                name=\"bicepLeft\"\n                label=\"Bicep Left\"\n                defaultValue={lastLengthStats.bicepLeft?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n          second={\n            statsEnabled.length.bicepRight && (\n              <StatInput\n                name=\"bicepRight\"\n                label=\"Bicep Right\"\n                defaultValue={lastLengthStats.bicepRight?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n        />\n      )}\n      {(statsEnabled.length.forearmLeft || statsEnabled.length.forearmRight) && (\n        <DoubleLine\n          first={\n            statsEnabled.length.forearmLeft && (\n              <StatInput\n                name=\"forearmLeft\"\n                label=\"Forearm Left\"\n                defaultValue={lastLengthStats.forearmLeft?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n          second={\n            statsEnabled.length.forearmRight && (\n              <StatInput\n                name=\"forearmRight\"\n                label=\"Forearm Right\"\n                defaultValue={lastLengthStats.forearmRight?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n        />\n      )}\n      {statsEnabled.length.chest && (\n        <SingleLine>\n          <StatInput\n            name=\"chest\"\n            label=\"Chest\"\n            defaultValue={lastLengthStats.chest?.value}\n            unit={lengthUnits}\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {statsEnabled.length.waist && (\n        <SingleLine>\n          <StatInput\n            name=\"waist\"\n            label=\"Waist\"\n            defaultValue={lastLengthStats.waist?.value}\n            unit={lengthUnits}\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {statsEnabled.length.hips && (\n        <SingleLine>\n          <StatInput\n            name=\"hips\"\n            label=\"Hips\"\n            defaultValue={lastLengthStats.hips?.value}\n            unit={lengthUnits}\n            clearKey={clearKey}\n            valuesRef={valuesRef}\n          />\n        </SingleLine>\n      )}\n      {(statsEnabled.length.thighLeft || statsEnabled.length.thighRight) && (\n        <DoubleLine\n          first={\n            statsEnabled.length.thighLeft && (\n              <StatInput\n                name=\"thighLeft\"\n                label=\"Thigh Left\"\n                defaultValue={lastLengthStats.thighLeft?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n          second={\n            statsEnabled.length.thighRight && (\n              <StatInput\n                name=\"thighRight\"\n                label=\"Thigh Right\"\n                defaultValue={lastLengthStats.thighRight?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n        />\n      )}\n      {(statsEnabled.length.calfLeft || statsEnabled.length.calfRight) && (\n        <DoubleLine\n          first={\n            statsEnabled.length.calfLeft && (\n              <StatInput\n                name=\"calfLeft\"\n                label=\"Calf Left\"\n                defaultValue={lastLengthStats.calfLeft?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n          second={\n            statsEnabled.length.calfRight && (\n              <StatInput\n                name=\"calfRight\"\n                label=\"Calf Right\"\n                defaultValue={lastLengthStats.calfRight?.value}\n                unit={lengthUnits}\n                clearKey={clearKey}\n                valuesRef={valuesRef}\n              />\n            )\n          }\n        />\n      )}\n      {HealthSync_eligibleForAppleHealth() && (\n        <View>\n          <MenuItemEditable\n            name=\"Sync to Apple Health\"\n            type=\"boolean\"\n            value={syncToAppleHealth ? \"true\" : \"false\"}\n            onChange={(newValue?: string) => {\n              setSyncToAppleHealth(newValue === \"true\");\n            }}\n          />\n        </View>\n      )}\n      {HealthSync_eligibleForGoogleHealth() && (\n        <View>\n          <MenuItemEditable\n            name=\"Sync to Google Health Connect\"\n            type=\"boolean\"\n            value={syncToGoogleHealth ? \"true\" : \"false\"}\n            onChange={(newValue?: string) => {\n              setSyncToGoogleHealth(newValue === \"true\");\n            }}\n          />\n        </View>\n      )}\n      <View className=\"items-center py-4 mb-2\">\n        <Button\n          name=\"add-stats\"\n          tabIndex={1}\n          className=\"ls-add-stats\"\n          data-testid=\"add-stats\"\n          testID=\"add-stats\"\n          kind=\"purple\"\n          onClick={save}\n        >\n          Done\n        </Button>\n      </View>\n    </View>\n  );\n}\n\ninterface IStatInputProps {\n  name: IStatsKey;\n  label: string;\n  defaultValue?: number | string;\n  unit: IUnit | ILengthUnit | IPercentageUnit;\n  clearKey: number;\n  valuesRef: IValuesRef;\n}\n\ninterface ISingleLineProps {\n  children: ReactNode;\n}\n\nfunction SingleLine(props: ISingleLineProps): JSX.Element {\n  return (\n    <View className=\"my-2\">\n      <View className=\"w-48 mx-auto\">{props.children}</View>\n    </View>\n  );\n}\n\ninterface IDoubleLineProps {\n  first: ReactNode;\n  second: ReactNode;\n}\n\nfunction DoubleLine(props: IDoubleLineProps): JSX.Element {\n  return (\n    <View className=\"flex-row my-2\">\n      <View className=\"flex-1 mr-1\">{props.first}</View>\n      <View className=\"flex-1 ml-1\">{props.second}</View>\n    </View>\n  );\n}\n\nfunction StatInput(props: IStatInputProps): JSX.Element {\n  const testName = StringUtils_dashcase(props.label.toLowerCase());\n  return (\n    <Input\n      key={`${props.name}-${props.clearKey}`}\n      label={`${props.label} (${props.unit})`}\n      labelSize=\"xs\"\n      defaultValue={props.defaultValue}\n      type={\"number\"}\n      placeholder=\"e.g. 10\"\n      min={0}\n      step=\"0.01\"\n      changeType=\"oninput\"\n      tabIndex={1}\n      data-testid={`input-stats-${testName}`}\n      testID={`input-stats-${testName}`}\n      identifier={`input-stats-${testName}`}\n      changeHandler={(e) => {\n        props.valuesRef.current[props.name] = e.success ? e.data : \"\";\n      }}\n    />\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { View, Pressable, Platform, Image, AppState } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { NavScreenContent } from \"../navigation/NavScreenContent\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { IAppleOffer, IGoogleOffer, INavCommon, IOfferData, ISubscriptionLoading } from \"../models/state\";\nimport { IconBarbell } from \"./icons/iconBarbell\";\nimport { IconGraphs } from \"./icons/iconGraphs\";\nimport { Button } from \"./button\";\nimport { LinkButton } from \"./linkButton\";\nimport { IconBell } from \"./icons/iconBell\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { IHistoryRecord, ISubscription } from \"../types\";\nimport {\n  Thunk_claimkey,\n  Thunk_subscribeMonthly,\n  Thunk_subscribeYearly,\n  Thunk_buyLifetime,\n  Thunk_restorePurchases,\n  Thunk_redeemCouponIOS,\n  Thunk_switchSubscription,\n  Thunk_openManageSubscriptions,\n  Thunk_iapRefreshActiveSubscriptions,\n  Thunk_iapClearStuckLoadingOnForeground,\n} from \"../ducks/thunks\";\nimport { IconClose } from \"./icons/iconClose\";\nimport { navigateToModal, goBack } from \"../navigation/navigationService\";\nimport { ObjectUtils_entries, ObjectUtils_keys } from \"../utils/object\";\nimport { lg } from \"../utils/posthog\";\nimport { IconWatch } from \"./icons/iconWatch\";\nimport { IconLink } from \"./icons/iconLink\";\nimport { IconDinoSunglasses } from \"./icons/iconDinoSunglasses\";\nimport { ImagePreloader_uri, ImagePreloader_preload } from \"../utils/imagePreloader\";\nimport { ISubscriptionInfoType, SubscriptionInfoImages_allPaths } from \"./subscriptionInfoImages\";\nimport { InternalLink } from \"../internalLink\";\nimport { IIapActiveSubscription } from \"../utils/iapAdapter\";\nimport { SubscriptionPlan_derive, ISubscriptionPlanKind, IDerivedSubscriptionPlan } from \"../utils/subscriptionPlan\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { IconFire } from \"./icons/iconFire\";\nimport { StoreRuntime_isIos, StoreRuntime_isNative, StoreRuntime_storeName } from \"../utils/storeRuntime\";\n\ninterface IProps {\n  prices?: Partial<Record<string, string>>;\n  offers?: Partial<Record<string, IOfferData[]>>;\n  subscription: ISubscription;\n  appleOffer?: IAppleOffer;\n  googleOffer?: IGoogleOffer;\n  subscriptionLoading?: ISubscriptionLoading;\n  subscriptionStatus?: IIapActiveSubscription[];\n  ownedLifetime?: boolean;\n  history: IHistoryRecord[];\n  dispatch: IDispatch;\n  navCommon: INavCommon;\n}\n\ninterface IFeatureDef {\n  key: string;\n  icon: JSX.Element;\n  title: string;\n  description: string;\n  infoType?: ISubscriptionInfoType;\n  iosOnly?: boolean;\n}\n\nfunction getFeatures(): IFeatureDef[] {\n  return [\n    {\n      key: \"plates\",\n      icon: <IconBarbell />,\n      title: \"Plates Calculator\",\n      description: \"shows exactly which plates to load on the bar.\",\n      infoType: \"platesCalculator\",\n    },\n    {\n      key: \"graphs\",\n      icon: <IconGraphs />,\n      title: \"Graphs\",\n      description: \"visualize your progress over time.\",\n      infoType: \"graphs\",\n    },\n    {\n      key: \"notifications\",\n      icon: <IconBell />,\n      title: \"Rest Timer Notifications\",\n      description: \"get push notifications when it's time for your next set.\",\n      infoType: \"notifications\",\n    },\n    {\n      key: \"weekinsights\",\n      icon: <IconFire />,\n      title: \"Week Insights\",\n      description: \"personalized performance stats.\",\n      infoType: \"weekInsights\",\n    },\n    {\n      key: \"watch\",\n      icon: <IconWatch />,\n      title: \"Apple Watch App\",\n      description: \"track workouts directly from your wrist\",\n      infoType: \"watch\",\n      iosOnly: true,\n    },\n    {\n      key: \"api\",\n      icon: <IconLink />,\n      title: \"API & MCP\",\n      description:\n        \"give Claude/ChatGPT/Gemini access to your workouts and programs. Or build your custom integrations.\",\n      infoType: \"mcp\",\n    },\n  ];\n}\n\nfunction planLabel(plan?: ISubscriptionPlanKind): string {\n  return plan === \"yearly\" ? \"Yearly\" : plan === \"monthly\" ? \"Monthly\" : \"Premium\";\n}\n\nexport function ScreenSubscription(props: IProps): JSX.Element {\n  const insets = useSafeAreaInsets();\n  const isIos = StoreRuntime_isIos();\n  const isNative = StoreRuntime_isNative();\n\n  useEffect(() => {\n    for (const path of SubscriptionInfoImages_allPaths()) {\n      ImagePreloader_preload(path);\n    }\n  }, []);\n\n  useEffect(() => {\n    props.dispatch(Thunk_iapRefreshActiveSubscriptions());\n    // Re-check on foreground so a cancel/change made in the system subscription manager\n    // (App Store / Google Play) is reflected when the user comes back to the app.\n    const sub = AppState.addEventListener(\"change\", (state) => {\n      if (state === \"active\") {\n        props.dispatch(Thunk_iapRefreshActiveSubscriptions());\n        // Give a genuine purchase event a moment to arrive and clear its own spinner first; if the\n        // spinner is still up after that, the Android billing sheet was dismissed without buying.\n        setTimeout(() => props.dispatch(Thunk_iapClearStuckLoadingOnForeground()), 1000);\n      }\n    });\n    return () => sub.remove();\n  }, []);\n\n  const plan = SubscriptionPlan_derive({\n    subscription: props.subscription,\n    status: props.subscriptionStatus,\n    ownedLifetime: props.ownedLifetime,\n    isNative,\n    isIos,\n  });\n\n  const monthlyPrice =\n    ObjectUtils_entries(props.prices || {}).filter(([k]) => k.indexOf(\"mont\") !== -1)?.[0]?.[1] ?? \"$4.99\";\n  const yearlyPrice =\n    ObjectUtils_entries(props.prices || {}).filter(([k]) => k.indexOf(\"year\") !== -1)?.[0]?.[1] ?? \"$39.99\";\n  const lifetimePrice =\n    ObjectUtils_entries(props.prices || {}).filter(([k]) => k.indexOf(\"lifetime\") !== -1)?.[0]?.[1] ?? \"$99.99\";\n  let monthlyOffer: IOfferData | undefined = undefined;\n  let yearlyOffer: IOfferData | undefined = undefined;\n  for (const productId of ObjectUtils_keys(props.offers || {})) {\n    monthlyOffer =\n      monthlyOffer ||\n      props.offers?.[productId]?.find((o) => {\n        return o.offerId === props.appleOffer?.monthly?.offerId || o.offerId === props.googleOffer?.monthly?.offerId;\n      });\n    yearlyOffer =\n      yearlyOffer ||\n      props.offers?.[productId]?.find((o) => {\n        return o.offerId === props.appleOffer?.yearly?.offerId || o.offerId === props.googleOffer?.yearly?.offerId;\n      });\n  }\n  const hasOffer = !!(monthlyOffer || yearlyOffer);\n  const supportsLifetime = Platform.OS === \"ios\" || Platform.OS === \"android\";\n\n  useNavOptions({ navHidden: true });\n\n  const isUnclaimed = props.subscription.key === \"unclaimed\";\n\n  if (plan.state === \"loading\" && !isUnclaimed) {\n    return (\n      <NavScreenContent>\n        <SubscriptionHero />\n        <View className=\"flex-1 items-center justify-center px-gutter\" style={{ paddingBottom: insets.bottom + 16 }}>\n          <IconSpinner width={24} height={24} />\n          <Text className=\"mt-3 text-sm text-text-secondary\">Checking your subscription…</Text>\n        </View>\n      </NavScreenContent>\n    );\n  }\n\n  const isPitch = (plan.state === \"none\" || plan.state === \"premium\") && !isUnclaimed;\n  const showManagement = plan.state === \"subscriber\" || plan.state === \"cancelled\" || plan.state === \"premium\";\n  // Lifetime/free-access users already own everything, so a coupon would be a no-op for them.\n  const hasFullAccess = plan.state === \"lifetime\" || plan.state === \"freeaccess\" || plan.state === \"otherstore\";\n\n  return (\n    <NavScreenContent>\n      <SubscriptionHero />\n      <View className=\"flex-1 px-gutter\" style={{ paddingBottom: insets.bottom + 16 }}>\n        {isPitch || isUnclaimed ? <PitchHeader /> : <StatusHeader plan={plan} />}\n        <FeatureList isIos={isIos} />\n        <View>\n          {isUnclaimed ? (\n            <ClaimFreeAccess dispatch={props.dispatch} />\n          ) : plan.state === \"none\" ? (\n            <PurchaseCards\n              dispatch={props.dispatch}\n              appleOffer={props.appleOffer}\n              googleOffer={props.googleOffer}\n              subscriptionLoading={props.subscriptionLoading}\n              monthlyPrice={monthlyPrice}\n              yearlyPrice={yearlyPrice}\n              lifetimePrice={lifetimePrice}\n              monthlyOffer={monthlyOffer}\n              yearlyOffer={yearlyOffer}\n              hasOffer={hasOffer}\n              supportsLifetime={supportsLifetime}\n            />\n          ) : showManagement ? (\n            <ManagementActions\n              dispatch={props.dispatch}\n              plan={plan}\n              subscriptionLoading={props.subscriptionLoading}\n              lifetimePrice={lifetimePrice}\n              supportsLifetime={supportsLifetime}\n              isNative={isNative}\n            />\n          ) : null}\n        </View>\n        <View className=\"flex-row py-2 items-center justify-between gap-4\">\n          {isNative && !hasFullAccess ? (\n            <View className=\"flex-row items-center justify-center\">\n              <LinkButton\n                name=\"redeem-coupon\"\n                onPress={() => {\n                  if (Platform.OS === \"ios\") {\n                    props.dispatch(Thunk_redeemCouponIOS());\n                  } else {\n                    navigateToModal(\"couponModal\");\n                  }\n                }}\n                className=\"text-sm font-bold\"\n              >\n                Redeem coupon\n              </LinkButton>\n            </View>\n          ) : (\n            <View />\n          )}\n          <View className=\"flex-row items-center justify-between\">\n            {plan.state === \"none\" && isNative ? (\n              <LinkButton\n                name=\"restore-subscriptions\"\n                className=\"text-sm font-bold\"\n                onPress={() => {\n                  props.dispatch(Thunk_restorePurchases({ interactive: true }));\n                }}\n              >\n                Restore Subscription\n              </LinkButton>\n            ) : (\n              <InternalLink\n                name=\"terms-of-use\"\n                href=\"/terms.html\"\n                className=\"text-sm font-bold underline text-text-link\"\n              >\n                Terms of use\n              </InternalLink>\n            )}\n          </View>\n        </View>\n        {isPitch && (\n          <>\n            <Text className=\"mt-2 mb-4 text-xs text-text-secondary\">\n              You can get monthly or yearly subscription (and you'll be charged for a month or year every month or year\n              {!hasOffer ? \" after initial 14 days free trial period\" : \"\"}) or lifetime - one-time payment, that gives\n              access to those features without recurring charges in the future.\n            </Text>\n            <Text className=\"mb-4 text-xs text-text-secondary\">\n              You can cancel subscriptions any time via {StoreRuntime_storeName()} subscriptions management.\n            </Text>\n          </>\n        )}\n        {plan.state === \"none\" && isNative && (\n          <View className=\"flex-row\">\n            <View className=\"items-center justify-center flex-1\">\n              <InternalLink\n                name=\"terms-of-use\"\n                href=\"/terms.html\"\n                className=\"text-sm font-bold text-center underline text-text-link\"\n              >\n                Terms of use\n              </InternalLink>\n            </View>\n          </View>\n        )}\n      </View>\n    </NavScreenContent>\n  );\n}\n\nfunction SubscriptionHero(): JSX.Element {\n  const insets = useSafeAreaInsets();\n  return (\n    <View className=\"bg-background-cardpurple w-full\" style={{ paddingTop: insets.top, height: 280 }}>\n      <Pressable\n        className=\"absolute z-10 p-2\"\n        style={{ top: insets.top + 4, right: 8 }}\n        data-testid=\"subscription-close\"\n        testID=\"subscription-close\"\n        onPress={() => goBack()}\n      >\n        <IconClose size={20} color={Tailwind_semantic().icon.neutral} />\n      </Pressable>\n      <Image\n        className=\"absolute bottom-4 left-4\"\n        source={{ uri: ImagePreloader_uri(\"/images/subscriptionhero.png\") }}\n        style={{ width: \"80%\", aspectRatio: 879 / 516 }}\n        resizeMode=\"contain\"\n        accessibilityLabel=\"Liftosaur Premium features\"\n      />\n      <View className=\"absolute right-4 bottom-0\">\n        <IconDinoSunglasses width={102} height={136} />\n      </View>\n    </View>\n  );\n}\n\nfunction PitchHeader(): JSX.Element {\n  return (\n    <View className=\"py-4\">\n      <Text className=\"text-lg font-semibold\">Upgrade your workout routine with Liftosaur Premium:</Text>\n    </View>\n  );\n}\n\nfunction StatusHeader(props: { plan: IDerivedSubscriptionPlan }): JSX.Element {\n  const { plan } = props;\n  const dateStr = plan.expirationDate ? DateUtils_format(plan.expirationDate, true) : undefined;\n\n  let title: string;\n  let subtitle: string | undefined;\n  if (plan.state === \"lifetime\") {\n    title = \"🎉 Lifetime Premium\";\n    subtitle = \"All Premium features unlocked forever.\";\n  } else if (plan.state === \"freeaccess\") {\n    title = \"Free access\";\n    subtitle = \"All Premium features unlocked.\";\n  } else if (plan.state === \"cancelled\") {\n    title = `${planLabel(plan.plan)} — won't renew`;\n    subtitle = dateStr ? `Your access ends on ${dateStr}.` : \"Your access ends at the end of the current period.\";\n  } else if (plan.state === \"subscriber\") {\n    title = `✓ Premium — ${planLabel(plan.plan)}`;\n    subtitle = dateStr ? `Renews on ${dateStr}.` : undefined;\n  } else if (plan.state === \"otherstore\") {\n    title = \"✓ Premium\";\n    subtitle =\n      plan.managedOn === \"apple\"\n        ? \"You bought this subscription on the App Store. Manage or cancel it from an Apple device.\"\n        : StoreRuntime_isIos()\n          ? \"You bought this subscription on another device. Manage or cancel it from that device.\"\n          : \"You bought this subscription on Google Play. Manage or cancel it from an Android device.\";\n  } else {\n    title = \"✓ Premium\";\n    subtitle = \"Manage your subscription from the mobile app.\";\n  }\n\n  return (\n    <View className=\"pt-2 pb-4\">\n      <Text className=\"text-2xl font-bold\" data-testid=\"subscription-status-title\">\n        {title}\n      </Text>\n      {subtitle && <Text className=\"mt-1 text-sm text-text-secondary\">{subtitle}</Text>}\n    </View>\n  );\n}\n\nfunction FeatureList(props: { isIos: boolean }): JSX.Element {\n  const features = getFeatures().filter((f) => !f.iosOnly || props.isIos);\n  return (\n    <View className=\"mb-4\">\n      {features.map((f) => {\n        const infoType = f.infoType;\n        return (\n          <Feature\n            key={f.key}\n            icon={f.icon}\n            title={f.title}\n            description={f.description}\n            onPress={infoType ? () => navigateToModal(\"subscriptionInfoModal\", { type: infoType }) : undefined}\n          />\n        );\n      })}\n    </View>\n  );\n}\n\nfunction ClaimFreeAccess(props: { dispatch: IDispatch }): JSX.Element {\n  return (\n    <View className=\"flex-row items-center px-2\">\n      <View className=\"flex-1\">\n        <Text className=\"text-xs text-text-secondary\">\n          You were granted the <Text className=\"font-bold\">free access</Text> to Liftosaur!\n        </Text>\n      </View>\n      <View>\n        <Button\n          name=\"subscription-free\"\n          onPress={() => props.dispatch(Thunk_claimkey())}\n          kind=\"purple\"\n          testID=\"button-subscription-free\"\n          buttonSize=\"lg\"\n        >\n          Get it!\n        </Button>\n      </View>\n    </View>\n  );\n}\n\ninterface IPurchaseCardsProps {\n  dispatch: IDispatch;\n  appleOffer?: IAppleOffer;\n  googleOffer?: IGoogleOffer;\n  subscriptionLoading?: ISubscriptionLoading;\n  monthlyPrice: string;\n  yearlyPrice: string;\n  lifetimePrice: string;\n  monthlyOffer?: IOfferData;\n  yearlyOffer?: IOfferData;\n  hasOffer: boolean;\n  supportsLifetime: boolean;\n}\n\nfunction PurchaseCards(props: IPurchaseCardsProps): JSX.Element {\n  const trialNote = !props.hasOffer ? \"Free 14-day trial\" : undefined;\n  return (\n    <View>\n      <PlanCard\n        testID=\"button-subscription-yearly\"\n        highlighted={true}\n        title=\"Start with Yearly\"\n        subtitle={trialNote}\n        price={props.yearlyOffer ? props.yearlyOffer.formattedPrice : props.yearlyPrice}\n        oldPrice={props.yearlyOffer ? props.yearlyPrice : undefined}\n        period=\"/year\"\n        badge=\"Save 33%\"\n        loading={!!props.subscriptionLoading?.yearly}\n        onPress={() => {\n          if (StoreRuntime_isNative()) {\n            lg(\"start-subscription-yearly\");\n            props.dispatch(\n              Thunk_subscribeYearly({ applePromo: props.appleOffer?.yearly, googlePromo: props.googleOffer?.yearly })\n            );\n          } else {\n            webAlert();\n          }\n        }}\n      />\n      <PlanCard\n        testID=\"button-subscription-monthly\"\n        title=\"Start with Monthly\"\n        subtitle={trialNote}\n        price={props.monthlyOffer ? props.monthlyOffer.formattedPrice : props.monthlyPrice}\n        oldPrice={props.monthlyOffer ? props.monthlyPrice : undefined}\n        period=\"/month\"\n        loading={!!props.subscriptionLoading?.monthly}\n        onPress={() => {\n          if (StoreRuntime_isNative()) {\n            lg(\"start-subscription-monthly\");\n            props.dispatch(\n              Thunk_subscribeMonthly({ applePromo: props.appleOffer?.monthly, googlePromo: props.googleOffer?.monthly })\n            );\n          } else {\n            webAlert();\n          }\n        }}\n      />\n      {props.supportsLifetime && (\n        <PlanCard\n          testID=\"button-subscription-lifetime\"\n          title=\"Lifetime\"\n          subtitle=\"One-time payment\"\n          price={props.lifetimePrice}\n          loading={!!props.subscriptionLoading?.lifetime}\n          onPress={() => {\n            if (StoreRuntime_isNative()) {\n              lg(\"start-subscription-lifetime\");\n              props.dispatch(Thunk_buyLifetime());\n            } else {\n              webAlert();\n            }\n          }}\n        />\n      )}\n      {props.hasOffer && (\n        <Text className=\"pt-1 text-xs text-center text-text-secondary\">Discount applies for the first year</Text>\n      )}\n    </View>\n  );\n}\n\ninterface IManagementActionsProps {\n  dispatch: IDispatch;\n  plan: IDerivedSubscriptionPlan;\n  subscriptionLoading?: ISubscriptionLoading;\n  lifetimePrice: string;\n  supportsLifetime: boolean;\n  isNative: boolean;\n}\n\nfunction ManagementActions(props: IManagementActionsProps): JSX.Element {\n  const { plan } = props;\n  const isAndroid = StoreRuntime_isNative() && !StoreRuntime_isIos();\n\n  if (plan.state === \"premium\") {\n    return (\n      <View>\n        <Text className=\"text-xs text-center text-text-secondary\">\n          Manage your subscription from the Liftosaur mobile app, or your {StoreRuntime_storeName()} account.\n        </Text>\n      </View>\n    );\n  }\n\n  const currentPlan = plan.plan;\n  const targetPlan: ISubscriptionPlanKind | undefined =\n    plan.plan === \"yearly\" ? \"monthly\" : plan.plan === \"monthly\" ? \"yearly\" : undefined;\n  const switchLoading =\n    targetPlan === \"yearly\" ? props.subscriptionLoading?.yearly : props.subscriptionLoading?.monthly;\n  const keepLoading = currentPlan ? props.subscriptionLoading?.[currentPlan] : undefined;\n  const switchSubtext =\n    targetPlan === \"yearly\"\n      ? \"Starts at your next renewal.\"\n      : \"You'll be credited for the time remaining on your yearly plan.\";\n\n  const lifetimeDisabledReason =\n    plan.state === \"subscriber\"\n      ? \"Cancel your subscription first\"\n      : plan.expirationDate\n        ? `Available after ${DateUtils_format(plan.expirationDate, true)}`\n        : \"Available after your subscription expires\";\n\n  return (\n    <View>\n      {plan.state === \"subscriber\" && plan.pendingPlan ? (\n        <View\n          className=\"justify-center px-4 py-2 mb-2 border min-h-scaled-16 rounded-xl bg-background-cardpurple border-border-cardpurple\"\n          style={{ borderRadius: 16 }}\n          data-testid=\"subscription-pending-switch\"\n        >\n          <Text className=\"text-base font-bold text-text-primary\">Switching to {planLabel(plan.pendingPlan)}</Text>\n          <Text className=\"text-xs text-text-secondary\">\n            {plan.expirationDate\n              ? `Takes effect on ${DateUtils_format(plan.expirationDate, true)}.`\n              : \"Takes effect at your next renewal.\"}\n          </Text>\n          {isAndroid && (\n            // Google Play has no API to cancel a queued deferred plan change, and re-purchasing the\n            // current product is rejected as a no-op replacement. The only way to revert is from the\n            // Play subscription manager.\n            <Text className=\"text-xs text-text-secondary\">To cancel the switch, manage it in Google Play.</Text>\n          )}\n          {currentPlan && (\n            <View className=\"pt-2\">\n              {keepLoading && !isAndroid ? (\n                <IconSpinner width={16} height={16} />\n              ) : (\n                <LinkButton\n                  name=\"keep-current-plan\"\n                  testID=\"button-keep-current-plan\"\n                  className=\"text-sm font-bold\"\n                  onPress={() => {\n                    lg(`keep-subscription-${currentPlan}`);\n                    if (isAndroid) {\n                      props.dispatch(Thunk_openManageSubscriptions());\n                    } else {\n                      props.dispatch(Thunk_switchSubscription(currentPlan));\n                    }\n                  }}\n                >\n                  {isAndroid ? \"Manage in Google Play\" : `Keep ${planLabel(currentPlan)}`}\n                </LinkButton>\n              )}\n            </View>\n          )}\n        </View>\n      ) : plan.state === \"subscriber\" && targetPlan ? (\n        <PlanCard\n          testID={`button-switch-${targetPlan}`}\n          highlighted={true}\n          title={`Switch to ${planLabel(targetPlan)}`}\n          subtitle={switchSubtext}\n          loading={!!switchLoading}\n          onPress={() => {\n            lg(`switch-subscription-${targetPlan}`);\n            props.dispatch(Thunk_switchSubscription(targetPlan));\n          }}\n        />\n      ) : null}\n      {props.supportsLifetime && (\n        <PlanCard\n          testID=\"button-subscription-lifetime\"\n          title=\"Lifetime\"\n          subtitle={lifetimeDisabledReason}\n          price={props.lifetimePrice}\n          disabled={true}\n          onPress={() => {}}\n        />\n      )}\n      {plan.state === \"cancelled\" && (\n        <View className=\"pt-2\">\n          <Button\n            name=\"subscription-resubscribe\"\n            kind=\"purple\"\n            className=\"w-full\"\n            testID=\"button-subscription-resubscribe\"\n            onPress={() => props.dispatch(Thunk_openManageSubscriptions())}\n          >\n            Resubscribe\n          </Button>\n        </View>\n      )}\n      {plan.state === \"subscriber\" && (\n        <View className=\"pt-2\">\n          <LinkButton\n            name=\"cancel-subscription\"\n            className=\"text-sm text-center text-text-error\"\n            testID=\"button-cancel-subscription\"\n            onPress={() => props.dispatch(Thunk_openManageSubscriptions())}\n          >\n            Cancel subscription\n          </LinkButton>\n        </View>\n      )}\n    </View>\n  );\n}\n\ninterface IPlanCardProps {\n  testID: string;\n  title: string;\n  subtitle?: string;\n  price?: string;\n  oldPrice?: string;\n  period?: string;\n  badge?: string;\n  highlighted?: boolean;\n  disabled?: boolean;\n  loading?: boolean;\n  onPress: () => void;\n}\n\nfunction PlanCard(props: IPlanCardProps): JSX.Element {\n  const bg = props.highlighted ? \"bg-icon-purple\" : \"bg-background-cardpurple\";\n  const borderColor = props.highlighted ? \"\" : \"border border-border-cardpurple\";\n  const titleColor = props.highlighted ? \"text-text-alwayswhite\" : \"text-text-primary\";\n  const subColor = props.highlighted ? \"text-text-alwayswhite\" : \"text-text-secondary\";\n  return (\n    <Pressable\n      className={`flex-row items-center min-h-scaled-16 px-4 py-2 mb-2 rounded-xl ${bg} ${borderColor} ${props.disabled ? \"opacity-50\" : \"\"}`}\n      style={{ borderRadius: 16 }}\n      data-testid={props.testID}\n      testID={props.testID}\n      disabled={props.disabled || props.loading}\n      onPress={props.onPress}\n    >\n      {props.loading ? (\n        <View className=\"items-center flex-1\">\n          <IconSpinner color={props.highlighted ? \"white\" : undefined} width={20} height={20} />\n        </View>\n      ) : (\n        <>\n          <View className=\"flex-1\">\n            <Text className={`text-base font-bold ${titleColor}`}>{props.title}</Text>\n            {props.subtitle && <Text className={`text-xs ${subColor}`}>{props.subtitle}</Text>}\n          </View>\n          <View className=\"items-end\">\n            <View className=\"flex-row items-baseline\">\n              {props.oldPrice && <Text className={`mr-1 text-xs line-through ${subColor}`}>{props.oldPrice}</Text>}\n              {props.price && (\n                <Text className={`text-base font-bold ${titleColor}`}>\n                  {props.price}\n                  {props.period ? <Text className={`text-xs font-normal ${titleColor}`}>{props.period}</Text> : null}\n                </Text>\n              )}\n            </View>\n            {props.badge && <Text className={`text-xs ${subColor}`}>{props.badge}</Text>}\n          </View>\n        </>\n      )}\n    </Pressable>\n  );\n}\n\nfunction webAlert(): void {\n  Dialog_alert(\n    \"You can only subscribe from an iOS or Android Liftosaur app. Install Liftosaur from Google Play or App Store, subscribe there, then log in in Liftosaur, and use the same login method on the web. That will unlock the premium features on the web.\"\n  );\n}\n\ninterface IFeatureProps {\n  icon: JSX.Element;\n  title: string;\n  description: string;\n  onPress?: () => void;\n}\n\nfunction Feature(props: IFeatureProps): JSX.Element {\n  return (\n    <Pressable className=\"flex-row mb-6\" onPress={props.onPress}>\n      <View className=\"items-center w-scaled-6 pt-1 mr-3\">{props.icon}</View>\n      <View className=\"flex-1\">\n        <Text className=\"text-base\">\n          <Text className={props.onPress ? \"font-bold underline text-text-link\" : \"font-bold\"}>{props.title}</Text>\n          <Text className=\"text-sm text-text-primary\"> - {props.description}</Text>\n        </Text>\n      </View>\n    </Pressable>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Lens, lb } from \"lens-shmens\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { ISettingsTimers, ISettings } from \"../types\";\nimport { INavCommon } from \"../models/state\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { RestTimerAlertRow } from \"./restTimerAlertRow\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  timers: ISettingsTimers;\n  navCommon: INavCommon;\n}\n\nexport function ScreenTimers(props: IProps): JSX.Element {\n  const onChange = (key: keyof ISettingsTimers) => {\n    return (newValue?: string) => {\n      const v = newValue != null && newValue !== \"\" ? parseInt(newValue, 10) : undefined;\n      if (v != null && isNaN(v)) {\n        return;\n      }\n      const lensRecording = Lens.buildLensRecording(lb<ISettings>().p(\"timers\").p(key), v);\n      props.dispatch({ type: \"UpdateSettings\", lensRecording, desc: `Update ${key} timer` });\n    };\n  };\n\n  useNavOptions({ navTitle: \"Rest Timers\", navHelpKey: \"timers\" });\n\n  return (\n    <View className=\"px-gutter\">\n      <GroupHeader name=\"Rest Timers between sets\" />\n      <MenuItemEditable\n        name=\"Warmup\"\n        type=\"number\"\n        value={props.timers.warmup?.toString() || undefined}\n        valueUnits=\"sec\"\n        onChange={onChange(\"warmup\")}\n      />\n      <MenuItemEditable\n        name=\"Workout\"\n        type=\"number\"\n        value={props.timers.workout?.toString() || undefined}\n        valueUnits=\"sec\"\n        onChange={onChange(\"workout\")}\n      />\n      <MenuItemEditable\n        name=\"Superset\"\n        type=\"number\"\n        value={props.timers.superset?.toString()}\n        valueUnits=\"sec\"\n        onChange={onChange(\"superset\")}\n      />\n      {Platform.OS === \"web\" && <RestTimerAlertRow />}\n      <GroupHeader name=\"Timed sets\" topPadding={true} />\n      <MenuItemEditable\n        name=\"Get ready\"\n        type=\"number\"\n        value={props.timers.getReady?.toString()}\n        valueUnits=\"sec\"\n        onChange={onChange(\"getReady\")}\n      />\n      {(Platform.OS === \"ios\" || Platform.OS === \"android\") && (\n        <>\n          <GroupHeader name=\"Reminders\" topPadding={true} />\n          <MenuItemEditable\n            name=\"About ongoing workout\"\n            type=\"number\"\n            value={props.timers.reminder?.toString() || undefined}\n            valueUnits=\"sec\"\n            onChange={onChange(\"reminder\")}\n          />\n        </>\n      )}\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, Pressable, Image } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Button } from \"./button\";\nimport { updateSettings } from \"../models/state\";\nimport { ISettings } from \"../types\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { lb } from \"lens-shmens\";\nimport { ImagePreloader_uri } from \"../utils/imagePreloader\";\n\ninterface IProps {\n  dispatch: IDispatch;\n  settings: ISettings;\n}\n\nexport function ScreenUnitSelector(props: IProps): JSX.Element {\n  const selectedButtonCls = \"bg-button-primarybackground border-button-primarybackground\";\n  const unselectedButtonCls = \"bg-background-default border-border-neutral\";\n\n  useNavOptions({ navHidden: true });\n\n  return (\n    <View className=\"flex flex-col flex-1 bg-background-default\">\n      <View className=\"flex-1 px-gutter pt-16 pb-4\">\n        <View className=\"w-full h-full border border-border-cardyellow rounded-2xl bg-background-cardyellow\">\n          <View className=\"items-center p-4\">\n            <Image\n              source={{ uri: ImagePreloader_uri(\"/images/dinounit.png\") }}\n              style={{ width: 240, height: 192 }}\n              resizeMode=\"contain\"\n            />\n          </View>\n          <Text className=\"px-6 pt-4 text-2xl font-semibold text-center\">Pick your units</Text>\n          <Text className=\"px-6 py-4 text-base text-center\">\n            Your chosen units will be the default, but you can override them or change them in{\" \"}\n            <Text className=\"font-bold\">Settings</Text> or <Text className=\"font-bold\">per equipment</Text> anytime.\n          </Text>\n          <View className=\"flex-row px-6\">\n            <Pressable\n              className={`flex-1 px-2 py-3 border rounded-tl-lg rounded-bl-lg ${props.settings.units === \"lb\" ? selectedButtonCls : unselectedButtonCls}`}\n              onPress={() => {\n                updateSettings(props.dispatch, lb<ISettings>().p(\"units\").record(\"lb\"), \"Set units to pounds\");\n              }}\n            >\n              <Text\n                className={`text-sm font-semibold text-center ${props.settings.units === \"lb\" ? \"text-text-alwayswhite\" : \"text-text-purple\"}`}\n              >\n                Pounds (lb)\n              </Text>\n            </Pressable>\n            <Pressable\n              className={`flex-1 px-2 py-3 border rounded-tr-lg rounded-br-lg ${props.settings.units === \"kg\" ? selectedButtonCls : unselectedButtonCls}`}\n              onPress={() => {\n                updateSettings(props.dispatch, lb<ISettings>().p(\"units\").record(\"kg\"), \"Set units to kilograms\");\n              }}\n            >\n              <Text\n                className={`text-sm font-semibold text-center ${props.settings.units === \"kg\" ? \"text-text-alwayswhite\" : \"text-text-purple\"}`}\n              >\n                Kilograms (kg)\n              </Text>\n            </Pressable>\n          </View>\n        </View>\n      </View>\n      <View className=\"pb-16 mx-4 mb-2\">\n        <Button\n          className=\"w-full ls-onboarding-units\"\n          name=\"see-how-it-works\"\n          kind=\"purple\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"setupequipment\"))}\n        >\n          Continue\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, memo, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { Platform, InteractionManager, View } from \"react-native\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { IHistoryRecord, IProgram, ISettings, IStats, ISubscription } from \"../types\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Program_evaluate, Program_getProgramDay } from \"../models/program\";\nimport { History_workoutTime, History_isPaused } from \"../models/history\";\nimport { Progress_lbProgress, Progress_isCurrent, Progress_getActiveSetTimer } from \"../models/progress\";\nimport { INavCommon, updateState } from \"../models/state\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { TimeUtils_formatHHMM } from \"../utils/time\";\nimport { useNavOptions } from \"../navigation/useNavOptions\";\nimport { Timer } from \"./timer\";\nimport { WorkoutHeartRate } from \"./workoutHeartRate\";\nimport { Workout } from \"./workout\";\nimport { WorkoutFinishButton } from \"./workoutFinishButton\";\nimport { WorkoutMenu } from \"./workoutMenu\";\nimport { Thunk_updateLiveActivity, Thunk_deleteProgress, Thunk_pauseWorkout } from \"../ducks/thunks\";\nimport { Reps_findNextSetIndex } from \"../models/set\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { navigateToModal, getCurrentRouteName } from \"../navigation/navigationService\";\nimport { Dialog_confirm } from \"../utils/dialog\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { IWorkoutProgressView, WorkoutProgressView_next } from \"../utils/workoutProgressView\";\n\ninterface IScreenWorkoutProps {\n  progress: IHistoryRecord;\n  history: IHistoryRecord[];\n  program?: IProgram;\n  currentProgram?: IProgram;\n  stats: IStats;\n  allPrograms: IProgram[];\n  settings: ISettings;\n  userId?: string;\n  helps: string[];\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  navCommon: INavCommon;\n}\n\nfunction ScreenWorkoutInner(props: IScreenWorkoutProps): JSX.Element | null {\n  usePerfRenderCount(\"ScreenWorkout\");\n  const progress = props.progress;\n  const program = props.program;\n  const settings = props.settings;\n  const evaluatedProgram = useMemo(\n    () => (program ? Program_evaluate(program, settings) : undefined),\n    [program, settings]\n  );\n  const programDay = evaluatedProgram ? Program_getProgramDay(evaluatedProgram, progress.day) : undefined;\n\n  useEffect(() => {\n    if (progress.entries.length === 0) {\n      updateState(\n        props.dispatch,\n        [\n          Progress_lbProgress(progress.id)\n            .pi(\"ui\", {})\n            .p(\"exercisePicker\")\n            .record({\n              state: {\n                mode: \"workout\",\n                screenStack: [\"exercisePicker\"],\n                sort: \"name_asc\",\n                filters: {},\n                selectedExercises: [],\n              },\n            }),\n        ],\n        \"Open exercise picker on workout start\"\n      );\n    }\n  }, []);\n\n  const amrapModal = progress.amrapModal;\n  const prevAmrapNonce = useRef<number | undefined>(undefined);\n  useEffect(() => {\n    if (amrapModal && amrapModal.nonce !== prevAmrapNonce.current) {\n      prevAmrapNonce.current = amrapModal.nonce;\n      navigateToModal(\"amrapModal\", { ...amrapModal, context: \"workout\", progressId: progress.id });\n    }\n  }, [amrapModal]);\n\n  const exercisePickerState = progress.ui?.exercisePicker?.state;\n  // Track the last state we navigated for by identity (not a truthy edge), which self-heals reopening even if a stale\n  // flag lingers (e.g. an app kill left it persisted, or a deferred open below was cancelled) where a `!last` edge\n  // would deadlock. The picker writes live UI (search/filters/selection) back into `state`, so its identity also\n  // changes on every keystroke — gate the actual navigation on the current route so those mutations don't re-push the\n  // modal while it's already open (same approach as the editProgram picker).\n  const navigatedExercisePickerState = useRef<typeof exercisePickerState>(undefined);\n  useEffect(() => {\n    const changed = navigatedExercisePickerState.current !== exercisePickerState;\n    navigatedExercisePickerState.current = exercisePickerState;\n    if (!exercisePickerState || !changed || getCurrentRouteName() === \"exercisePickerModal\") {\n      return undefined;\n    }\n    const progressId = progress.id;\n    if (Platform.OS === \"web\") {\n      navigateToModal(\"exercisePickerModal\", { progressId });\n      return undefined;\n    }\n    const handle = InteractionManager.runAfterInteractions(() => {\n      if (getCurrentRouteName() !== \"exercisePickerModal\") {\n        navigateToModal(\"exercisePickerModal\", { progressId });\n      }\n    });\n    return () => handle.cancel();\n  }, [exercisePickerState, progress.id]);\n\n  const editSetModal = progress.ui?.editSetModal;\n  const prevEditSetModal = useRef<typeof editSetModal>(undefined);\n  useEffect(() => {\n    if (editSetModal && !prevEditSetModal.current) {\n      navigateToModal(\"editSetTargetModal\", { context: \"workout\", progressId: progress.id });\n    }\n    prevEditSetModal.current = editSetModal;\n  }, [editSetModal]);\n\n  const setTimerModal = Progress_getActiveSetTimer(progress);\n  const prevSetTimerNonce = useRef<number | undefined>(undefined);\n  useEffect(() => {\n    if (setTimerModal && setTimerModal.nonce !== prevSetTimerNonce.current) {\n      prevSetTimerNonce.current = setTimerModal.nonce;\n      navigateToModal(\"setTimerModal\", { context: \"workout\", progressId: progress.id });\n    }\n  }, [setTimerModal, progress.id]);\n\n  const setTimerEditModal = progress.ui?.setTimerEditModal;\n  const prevSetTimerEditModal = useRef<typeof setTimerEditModal>(undefined);\n  useEffect(() => {\n    if (setTimerEditModal && !prevSetTimerEditModal.current) {\n      navigateToModal(\"setTimerEditModal\", { context: \"workout\", progressId: progress.id });\n    }\n    prevSetTimerEditModal.current = setTimerEditModal;\n  }, [setTimerEditModal, progress.id]);\n\n  const roundingModal = progress.ui?.roundingModal;\n  const prevRoundingModal = useRef<typeof roundingModal>(undefined);\n  useEffect(() => {\n    if (roundingModal && !prevRoundingModal.current) {\n      navigateToModal(\"roundingInfoModal\", { context: \"workout\", progressId: progress.id });\n    }\n    prevRoundingModal.current = roundingModal;\n  }, [roundingModal, progress.id]);\n\n  const dispatch = props.dispatch;\n  const trackClick = useTrackClick();\n  const isCurrent = Progress_isCurrent(progress);\n  const onDeletePress = useCallback(async (): Promise<void> => {\n    const confirmed = await Dialog_confirm(\n      `Are you sure you want to delete this ${isCurrent ? \"ONGOING\" : \"PAST\"} workout?`\n    );\n    if (confirmed) {\n      dispatch(Thunk_deleteProgress(progress.id));\n    }\n  }, [dispatch, isCurrent, progress.id]);\n\n  const onDeletePressHandler = useCallback(() => {\n    trackClick(\"workout-delete\");\n    onDeletePress().catch(() => undefined);\n  }, [onDeletePress, trackClick]);\n\n  const onTitleClick = useCallback(() => {\n    trackClick(\"workout-change-date\");\n    dispatch({\n      type: \"ChangeDate\",\n      id: progress.id,\n      date: progress.date,\n      time: History_workoutTime(progress),\n    });\n    navigateToModal(\"dateModal\", { progressId: progress.id });\n  }, [dispatch, progress, trackClick]);\n\n  const onPauseResume = useCallback(() => {\n    trackClick(History_isPaused(props.progress.intervals) ? \"workout-resume\" : \"workout-pause\");\n    if (History_isPaused(props.progress.intervals)) {\n      dispatch({\n        type: \"ResumeWorkoutAction\",\n        isPlayground: false,\n        hasSubscription: Subscriptions_hasSubscription(props.subscription),\n      });\n      const currentEntryIndex = props.progress.currentEntryIndex || 0;\n      const currentEntry = props.progress.entries[currentEntryIndex];\n      const setIndex = currentEntry ? Reps_findNextSetIndex(currentEntry) : 0;\n      dispatch(Thunk_updateLiveActivity(currentEntryIndex, setIndex, props.progress.timer, props.progress.timerSince));\n    } else {\n      dispatch(Thunk_pauseWorkout());\n    }\n  }, [dispatch, props.progress, props.settings, props.subscription, trackClick]);\n\n  const progressStartTime = progress.startTime;\n  const progressEndTime = progress.endTime;\n  const progressIntervals = progress.intervals;\n  const navSubtitle = useMemo(() => {\n    return !isCurrent && progressEndTime ? (\n      TimeUtils_formatHHMM(\n        History_workoutTime({ startTime: progressStartTime, endTime: progressEndTime, intervals: progressIntervals })\n      )\n    ) : (\n      <View className=\"flex-row items-center\">\n        <Timer\n          startTime={progressStartTime}\n          endTime={progressEndTime}\n          intervals={progressIntervals}\n          onPauseResume={onPauseResume}\n        />\n        <WorkoutHeartRate />\n      </View>\n    );\n  }, [isCurrent, progressStartTime, progressEndTime, progressIntervals, onPauseResume]);\n\n  const progressId = progress.id;\n  const onShare = useCallback(() => {\n    if (!isCurrent) {\n      navigateToModal(\"workoutShareModal\", { progressId });\n    }\n  }, [isCurrent, progressId]);\n  const onConvertToProgram = useCallback(() => {\n    navigateToModal(\"dayFromAdhocModal\", { progressId });\n  }, [progressId]);\n\n  // A ref, so these elements survive a set completion. A new element re-renders the navbar header.\n  const progressRef = useRef(progress);\n  progressRef.current = progress;\n  const navRightButtons = useMemo(\n    () => [\n      <WorkoutFinishButton\n        key=\"finish\"\n        progressRef={progressRef}\n        isCurrent={isCurrent}\n        settings={props.settings}\n        dispatch={dispatch}\n      />,\n    ],\n    [isCurrent, props.settings, dispatch]\n  );\n  const renderHeaderMenu = useCallback(\n    (onOpenChange: (isOpen: boolean) => void) => (\n      <WorkoutMenu\n        progress={progressRef.current}\n        program={evaluatedProgram}\n        allPrograms={props.allPrograms}\n        settings={settings}\n        dispatch={dispatch}\n        onShare={onShare}\n        onConvertToProgram={onConvertToProgram}\n        onDelete={onDeletePressHandler}\n        onOpenChange={onOpenChange}\n      />\n    ),\n    [settings, dispatch, evaluatedProgram, props.allPrograms, onShare, onConvertToProgram, onDeletePressHandler]\n  );\n  const progressViewRef = useRef<IWorkoutProgressView | undefined>(undefined);\n  const progressView = WorkoutProgressView_next(progressViewRef.current, progress);\n  progressViewRef.current = progressView;\n\n  useNavOptions({\n    navTitle: isCurrent ? \"Ongoing workout\" : `${DateUtils_format(progress.date)}`,\n    navOnTitleClick: !isCurrent ? onTitleClick : undefined,\n    navSubtitle,\n    navRightButtons,\n  });\n\n  if (progress != null) {\n    return (\n      <Workout\n        stats={props.navCommon.stats}\n        allPrograms={props.allPrograms}\n        subscription={props.subscription}\n        history={props.history}\n        helps={props.helps}\n        settings={props.settings}\n        program={evaluatedProgram}\n        isTimerShown={true}\n        programDay={programDay}\n        progress={progressView}\n        dispatch={props.dispatch}\n        renderHeaderMenu={renderHeaderMenu}\n      />\n    );\n  } else {\n    return null;\n  }\n}\n\nexport const ScreenWorkout = memo(ScreenWorkoutInner);\n","import { JSX, useEffect, useRef } from \"react\";\nimport { StringUtils_dashcase, StringUtils_truncate } from \"../utils/string\";\n\ninterface IProps {\n  isExpanded: boolean;\n  values: [string, string][];\n  defaultSelectedValue: string | null | undefined;\n  numberOfVisibleItems: number;\n  itemHeight: number;\n  onSelect: (value: string) => void;\n}\n\nexport function ScrollBarrell(props: IProps): JSX.Element {\n  const height = props.itemHeight * props.numberOfVisibleItems;\n  const numberOfDummyItems = Math.floor(props.numberOfVisibleItems / 2);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const barrelRef = useRef<HTMLDivElement>(null);\n  const timer = useRef<number | undefined>(undefined);\n  const isDefaultSet = useRef<boolean>(false);\n  const isTurnedOn = useRef<boolean>(props.isExpanded);\n  const isExpanded = useRef<boolean>(props.isExpanded);\n  isExpanded.current = props.isExpanded;\n\n  function setDefaultIndex(): void {\n    if (!isDefaultSet.current) {\n      const barrel = barrelRef.current;\n      if (barrel) {\n        let defaultSelectedIndex = props.values.findIndex(([value, key]) => value === props.defaultSelectedValue);\n        defaultSelectedIndex = defaultSelectedIndex === -1 ? 0 : defaultSelectedIndex;\n        barrel.scrollTop = defaultSelectedIndex * props.itemHeight;\n        isDefaultSet.current = true;\n      }\n    }\n  }\n\n  useEffect(() => {\n    setDefaultIndex();\n  }, []);\n\n  useEffect(() => {\n    const container = containerRef.current;\n    if (container) {\n      container.addEventListener(\"transitionend\", (e) => {\n        isTurnedOn.current = isExpanded.current;\n      });\n    }\n  }, []);\n\n  useEffect(() => {\n    const barrel = barrelRef.current;\n    if (barrel) {\n      barrel.addEventListener(\"scroll\", (e) => {\n        if (!isTurnedOn.current) {\n          return;\n        }\n        const target = e.target as HTMLDivElement;\n        if (timer.current) {\n          clearTimeout(timer.current);\n        }\n        timer.current = window.setTimeout(() => {\n          if (props.isExpanded) {\n            timer.current = undefined;\n            const offset = target.scrollTop;\n            const index = Math.round(offset / props.itemHeight);\n            const selected = props.values[index];\n            if (selected != null) {\n              const value = selected[0];\n              props.onSelect(value);\n            }\n          }\n        }, 150);\n      });\n    }\n  }, [props.isExpanded, props.values, props.defaultSelectedValue, props.itemHeight]);\n\n  return (\n    <div\n      className=\"relative overflow-hidden border-t border-border-neutral\"\n      ref={containerRef}\n      style={{\n        transition: \"height 150ms ease-in-out, visibility 150ms linear\",\n        visibility: props.isExpanded ? \"inherit\" : \"hidden\",\n        height: props.isExpanded ? `${height}px` : 0,\n      }}\n    >\n      <div\n        className=\"absolute w-full scroll-barrell-selected bg-background-subtle\"\n        style={{\n          height: `${props.itemHeight}px`,\n          top: \"50%\",\n          left: 0,\n          marginTop: `-${Math.round(props.itemHeight / 2)}px`,\n        }}\n      />\n      <div\n        className=\"relative w-full h-full overflow-scroll\"\n        ref={barrelRef}\n        style={{ WebkitOverflowScrolling: \"touch\", scrollSnapType: \"y mandatory\" }}\n      >\n        {Array.apply(null, Array(numberOfDummyItems)).map((_, i) => (\n          <div\n            key={`top-${i}`}\n            className=\"flex items-center justify-center w-full\"\n            style={{ minHeight: `${props.itemHeight}px`, scrollSnapAlign: \"start\" }}\n          />\n        ))}\n        {props.values.map(([value, label], index) => (\n          <button\n            key={value}\n            data-testid={`scroll-barrel-item-${StringUtils_dashcase(label)}`}\n            className=\"flex items-center justify-center w-full cursor-pointer scroll-barrel-item\"\n            style={{ minHeight: `${props.itemHeight}px`, scrollSnapAlign: \"start\" }}\n            onClick={() => {\n              props.onSelect(value);\n              barrelRef.current?.scrollTo({ top: index * props.itemHeight, behavior: \"smooth\" });\n            }}\n          >\n            {StringUtils_truncate(label, 35)}\n          </button>\n        ))}\n        {Array.apply(null, Array(numberOfDummyItems)).map((_, i) => (\n          <div\n            key={`bottom-${i}`}\n            className=\"flex items-center justify-center w-full\"\n            style={{ minHeight: `${props.itemHeight}px`, scrollSnapAlign: \"start\" }}\n          />\n        ))}\n      </div>\n      <div className=\"absolute inset-0 pointer-events-none barrel-bg\" />\n    </div>\n  );\n}\n","import { JSX, ReactNode, useState } from \"react\";\nimport { View, ScrollView, Platform, LayoutChangeEvent } from \"react-native\";\nimport { Pressable } from \"./primitives/pressable\";\nimport { Text } from \"./primitives/text\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { Scroller } from \"./scroller\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\nexport interface IScrollableTabsProps {\n  tabs: {\n    label: string;\n    children: () => ReactNode;\n    isInvalid?: boolean;\n  }[];\n  color?: \"orange\" | \"purple\";\n  defaultIndex?: number;\n  className?: string;\n  type?: \"tabs\" | \"squares\";\n  shouldNotExpand?: boolean;\n  offsetY?: string;\n  topPadding?: string;\n  nonSticky?: boolean;\n  zIndex?: number;\n  fillHeight?: boolean;\n  onChange?: (index: number) => void;\n  headerContent?: ReactNode;\n}\n\nexport function ScrollableTabs(props: IScrollableTabsProps): JSX.Element {\n  const { tabs } = props;\n  const [selectedIndex, setSelectedIndex] = useState<number>(props.defaultIndex || 0);\n  const [barWidth, setBarWidth] = useState<number>(0);\n  const color = props.color || \"orange\";\n\n  const onBarLayout = (e: LayoutChangeEvent): void => {\n    setBarWidth(e.nativeEvent.layout.width);\n  };\n\n  const tabsRow =\n    tabs.length > 1 ? (\n      <View\n        className={`flex-row ${props.topPadding == null ? \"pt-6\" : \"\"} pb-2 ${props.className || \"\"}`}\n        style={{\n          ...(props.topPadding != null ? { paddingTop: parseFloat(props.topPadding) || 0 } : null),\n          minWidth: barWidth || undefined,\n        }}\n      >\n        {tabs.map(({ label, isInvalid }, index) => {\n          const nameClass = `tab-${StringUtils_dashcase(label.toLowerCase())}`;\n\n          if (props.type === \"squares\") {\n            const isSelected = selectedIndex === index;\n            return (\n              <Pressable\n                key={label}\n                className={`px-3 py-2 rounded mr-2 ${\n                  isSelected\n                    ? \"bg-background-default border border-button-primarybackground\"\n                    : \"bg-background-subtle border border-background-default\"\n                }`}\n                data-testid={nameClass}\n                testID={nameClass}\n                onPress={() => {\n                  props.onChange?.(index);\n                  setSelectedIndex(index);\n                }}\n              >\n                <Text className={`text-sm ${isSelected ? \"text-text-purple\" : \"text-text-secondary\"}`}>{label}</Text>\n              </Pressable>\n            );\n          }\n\n          const isSelected = selectedIndex === index;\n          const activeColor =\n            color === \"orange\" ? Tailwind_semantic().icon.yellow : Tailwind_semantic().button.secondarystroke;\n          const activeTextColor = color === \"orange\" ? \"text-icon-yellow\" : \"text-text-purple\";\n\n          return (\n            <View\n              key={label}\n              className=\"items-center border-b border-border-neutral\"\n              style={{ flexGrow: 1, flexShrink: 0, flexBasis: \"auto\" }}\n            >\n              <Pressable\n                className=\"px-4 pb-1\"\n                style={isSelected ? { borderBottomWidth: 2, borderBottomColor: activeColor } : undefined}\n                data-testid={nameClass}\n                testID={nameClass}\n                onPress={() => {\n                  props.onChange?.(index);\n                  setSelectedIndex(index);\n                }}\n              >\n                <Text\n                  numberOfLines={1}\n                  className={`text-base ${isSelected ? activeTextColor : \"\"} ${isInvalid ? \"text-text-error\" : \"\"}`}\n                >\n                  {isInvalid ? \"⚠️\" : \"\"}\n                  {label}\n                </Text>\n              </Pressable>\n            </View>\n          );\n        })}\n      </View>\n    ) : null;\n  const tabBar =\n    tabsRow != null ? (\n      <View className=\"bg-background-default\" onLayout={onBarLayout}>\n        <Scroller>{tabsRow}</Scroller>\n      </View>\n    ) : null;\n\n  const content = (\n    <View className={props.fillHeight ? \"flex-1\" : \"\"}>{tabs[selectedIndex]?.children() || tabs[0]?.children()}</View>\n  );\n\n  if (props.headerContent != null) {\n    return (\n      <ScrollView\n        stickyHeaderIndices={tabBar ? [1] : undefined}\n        style={{ flex: 1 }}\n        contentContainerStyle={{ flexGrow: 1 }}\n        className=\"bg-background-default\"\n      >\n        <View>{props.headerContent}</View>\n        {tabBar || <View />}\n        {content}\n      </ScrollView>\n    );\n  }\n\n  const stickyStyle =\n    !props.nonSticky && Platform.OS === \"web\"\n      ? ({ position: \"sticky\", top: props.offsetY || 0, zIndex: props.zIndex ?? 10 } as Record<string, unknown>)\n      : undefined;\n\n  return (\n    <View className={props.fillHeight ? \"flex-1\" : \"\"}>\n      {tabBar && (\n        <View style={stickyStyle} className=\"bg-background-default\">\n          {tabBar}\n        </View>\n      )}\n      {content}\n    </View>\n  );\n}\n","import { JSX, ReactNode, Ref, RefObject, forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from \"react\";\nimport { View, ScrollView, Platform, ScrollViewProps } from \"react-native\";\nimport {\n  HorizontalScroll_edges,\n  HorizontalScroll_fadeMask,\n  HorizontalScroll_wheelDelta,\n} from \"../utils/horizontalScroll\";\n\nconst EDGE_FADE_PX = 24;\n\ninterface IProps {\n  children: ReactNode;\n  arrowYOffsetPct?: number;\n  scrollOffset?: number;\n  scrollViewRef?: RefObject<ScrollView | null>;\n  viewportRef?: RefObject<View | null>;\n  onScroll?: ScrollViewProps[\"onScroll\"];\n  onContentSizeChange?: ScrollViewProps[\"onContentSizeChange\"];\n  onLayout?: ScrollViewProps[\"onLayout\"];\n}\n\nexport interface IScrollerHandle {\n  scrollToEnd: () => void;\n  scrollTo: (x: number) => void;\n}\n\nexport const Scroller = forwardRef(function Scroller(props: IProps, ref: Ref<IScrollerHandle>): JSX.Element {\n  const ownScrollRef = useRef<ScrollView>(null);\n  const scrollRef = props.scrollViewRef ?? ownScrollRef;\n  const isWeb = Platform.OS === \"web\";\n  const scrollProps = {\n    onScroll: props.onScroll,\n    onContentSizeChange: props.onContentSizeChange,\n    onLayout: props.onLayout,\n    scrollEventThrottle: props.onScroll ? 16 : undefined,\n  };\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      scrollToEnd: () => scrollRef.current?.scrollToEnd({ animated: true }),\n      scrollTo: (x: number) => scrollRef.current?.scrollTo({ x, animated: true }),\n    }),\n    []\n  );\n\n  const scrollableNode = useCallback((): HTMLElement | undefined => {\n    const node: unknown = scrollRef.current?.getScrollableNode();\n    return typeof HTMLElement !== \"undefined\" && node instanceof HTMLElement ? node : undefined;\n  }, [scrollRef]);\n\n  const updateFade = useCallback(() => {\n    const node = scrollableNode();\n    if (node == null) {\n      return;\n    }\n    const edges = HorizontalScroll_edges(node.scrollLeft, node.scrollWidth, node.clientWidth);\n    const mask = HorizontalScroll_fadeMask(edges, EDGE_FADE_PX) ?? \"\";\n    node.style.maskImage = mask;\n    node.style.webkitMaskImage = mask;\n  }, [scrollableNode]);\n\n  useEffect(() => {\n    const node = isWeb ? scrollableNode() : undefined;\n    if (node == null) {\n      return;\n    }\n    const onWheel = (e: WheelEvent): void => {\n      const delta = HorizontalScroll_wheelDelta({\n        deltaX: e.deltaX,\n        deltaY: e.deltaY,\n        deltaMode: e.deltaMode,\n        offset: node.scrollLeft,\n        maxOffset: node.scrollWidth - node.clientWidth,\n        viewportWidth: node.clientWidth,\n      });\n      if (delta != null) {\n        e.preventDefault();\n        node.scrollLeft += delta;\n      }\n    };\n    node.addEventListener(\"wheel\", onWheel, { passive: false });\n    updateFade();\n    return () => node.removeEventListener(\"wheel\", onWheel);\n  }, [isWeb, scrollableNode, updateFade]);\n\n  if (!isWeb) {\n    return (\n      <View ref={props.viewportRef} collapsable={false}>\n        <ScrollView\n          ref={scrollRef}\n          horizontal\n          showsHorizontalScrollIndicator={false}\n          removeClippedSubviews={false}\n          {...scrollProps}\n        >\n          {props.children}\n        </ScrollView>\n      </View>\n    );\n  }\n\n  return (\n    <View ref={props.viewportRef} className=\"relative flex-1 min-w-0\">\n      <ScrollView\n        ref={scrollRef}\n        horizontal\n        showsHorizontalScrollIndicator={false}\n        className=\"scrollbar-hide\"\n        scrollEventThrottle={16}\n        onScroll={(e) => {\n          props.onScroll?.(e);\n          updateFade();\n        }}\n        onContentSizeChange={(width, height) => {\n          props.onContentSizeChange?.(width, height);\n          updateFade();\n        }}\n        onLayout={(e) => {\n          props.onLayout?.(e);\n          updateFade();\n        }}\n      >\n        {props.children}\n      </ScrollView>\n    </View>\n  );\n});\n","import { JSX, useState } from \"react\";\nimport { ActionSheetIOS, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { useIsModalAvailable, useModal } from \"../navigation/ModalStateContext\";\nimport { DropdownMenu, DropdownMenuItem } from \"./dropdownMenu\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface ISelectLinkProps<T extends string | number> {\n  values: Record<T, string>;\n  name: string;\n  onChange: (value?: T) => void;\n  className?: string;\n  emptyLabel?: string;\n  value?: T;\n}\n\nexport function SelectLink<T extends string | number>(props: ISelectLinkProps<T>): JSX.Element {\n  const selectedOption = props.value ? props.values[props.value] : undefined;\n  const keys = ObjectUtils_keys(props.values);\n  const hasModal = useIsModalAvailable();\n  const [showOptions, setShowOptions] = useState(false);\n\n  const openModal = useModal(\"inputSelectModal\", (value) => {\n    props.onChange(value === \"\" ? undefined : (value as T));\n  });\n\n  const onPress = (): void => {\n    if (Platform.OS === \"ios\") {\n      const labels: string[] = [];\n      const keyMap: (T | undefined)[] = [];\n      if (props.emptyLabel != null) {\n        labels.push(props.emptyLabel);\n        keyMap.push(undefined);\n      }\n      for (const key of keys) {\n        labels.push(props.values[key]);\n        keyMap.push(key);\n      }\n      labels.push(\"Cancel\");\n      ActionSheetIOS.showActionSheetWithOptions(\n        { options: labels, cancelButtonIndex: labels.length - 1 },\n        (buttonIndex) => {\n          if (buttonIndex < keyMap.length) {\n            props.onChange(keyMap[buttonIndex]);\n          }\n        }\n      );\n    } else if (!hasModal) {\n      setShowOptions((s) => !s);\n    } else {\n      const values: [string, string][] = keys.map((key) => [String(key), props.values[key]]);\n      openModal({\n        name: props.name,\n        values,\n        selectedValue: props.value != null ? String(props.value) : undefined,\n        emptyLabel: props.emptyLabel,\n      });\n    }\n  };\n\n  const label = (\n    <Text\n      onPress={onPress}\n      data-testid={props.name}\n      testID={props.name}\n      className={`text-text-purple ${props.className || \"\"}`}\n      style={{ textDecorationLine: \"underline\", textDecorationStyle: \"dotted\" }}\n    >\n      {selectedOption ?? props.emptyLabel}\n    </Text>\n  );\n\n  if (hasModal) {\n    return label;\n  }\n\n  return (\n    <span style={{ position: \"relative\", display: \"inline-block\" }}>\n      {label}\n      {showOptions && (\n        <DropdownMenu\n          leftOffset=\"0\"\n          topOffset=\"calc(100% + 8px)\"\n          maxWidth=\"16rem\"\n          bgColor={Tailwind_semantic().background.default}\n          tipClassName=\"add-tip-up\"\n          textAlign=\"left\"\n          onClose={() => setShowOptions(false)}\n        >\n          {props.emptyLabel != null && (\n            <DropdownMenuItem\n              isTop={true}\n              className={`text-left hover:bg-background-subtle ${props.value == null ? \"font-bold text-text-purple\" : \"\"}`}\n              onClick={() => {\n                props.onChange(undefined);\n                setShowOptions(false);\n              }}\n            >\n              {props.emptyLabel}\n            </DropdownMenuItem>\n          )}\n          {keys.map((key, i) => {\n            const value = props.values[key];\n            return (\n              <DropdownMenuItem\n                key={key}\n                isTop={i === 0 && props.emptyLabel == null}\n                className={`text-left hover:bg-background-subtle ${props.value === key ? \"font-bold text-text-purple\" : \"\"}`}\n                onClick={() => {\n                  props.onChange(key);\n                  setShowOptions(false);\n                }}\n              >\n                {value}\n              </DropdownMenuItem>\n            );\n          })}\n        </DropdownMenu>\n      )}\n    </span>\n  );\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { Platform, Pressable, View } from \"react-native\";\nimport { Text, TextRaw, Text_resolveFontFamily } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Svg, Path } from \"./primitives/svg\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IExerciseType, IHistoryRecord, IProgramState, ISettings } from \"../types\";\nimport { TimeUtils_formatMMSS } from \"../utils/time\";\nimport { WorkoutExerciseSetTarget } from \"./workoutExerciseSetFields\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { Exercise_get, Exercise_nameWithEquipment } from \"../models/exercise\";\nimport {\n  Thunk_recordSetTimer,\n  Thunk_checkSetTimer,\n  Thunk_playGetReadyCue,\n  Thunk_startSetTimerWork,\n} from \"../ducks/thunks\";\nimport { Progress_isSetTimerCheckDue, IActiveSetTimer } from \"../models/progress\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\n\n// Re-renders the clock every 250ms and calls onTick so `auto` circuits advance/complete on time. All the\n// advance/complete/rest logic lives in the model (Progress_checkSetTimer) — this just provides the clock tick.\nfunction useSetTimerTick(isActive: boolean, onTick: () => void): void {\n  const [, setTick] = useState(0);\n  const onTickRef = useRef(onTick);\n  onTickRef.current = onTick;\n  useEffect(() => {\n    if (!isActive) {\n      return undefined;\n    }\n    const intervalId = setInterval(() => {\n      setTick((t) => t + 1);\n      onTickRef.current();\n    }, 250);\n    return () => clearInterval(intervalId);\n  }, [isActive]);\n}\n\ninterface ISetTimerBannerContentProps {\n  progress: IHistoryRecord;\n  settings: ISettings;\n  setTimerModal: IActiveSetTimer;\n  dispatch: IDispatch;\n  onClose: () => void;\n  // In the playground the progress isn't in global state, so the record/tick thunks can't resolve it.\n  // Dispatch the underlying card actions directly instead, mirroring how ModalAmrap handles the playground.\n  isPlayground?: boolean;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n}\n\nexport function SetTimerBannerContent(props: ISetTimerBannerContentProps): JSX.Element | null {\n  const { progress, dispatch, setTimerModal, settings, onClose, isPlayground } = props;\n  const { entryIndex, setIndex, startedAt } = setTimerModal;\n  const sideLabel =\n    setTimerModal.side === \"left\" ? \"Left side\" : setTimerModal.side === \"right\" ? \"Right side\" : undefined;\n  const isGetReady = setTimerModal.phase === \"getReady\";\n  const entry = progress.entries[entryIndex];\n  const set = entry?.sets[setIndex];\n\n  useSetTimerTick(set != null, () => {\n    if (isPlayground) {\n      // The thunk gates on this internally; the playground dispatches the card action directly, so gate here\n      // too — otherwise every 250ms tick writes playground state even when no transition is due.\n      if (Progress_isSetTimerCheckDue(progress, Date.now())) {\n        dispatch({\n          type: \"CheckSetTimerAction\",\n          programExercise: props.programExercise,\n          otherStates: props.otherStates,\n          isPlayground: true,\n        });\n      }\n    } else {\n      dispatch(Thunk_checkSetTimer());\n    }\n  });\n\n  const target = set?.setTimer ?? 0;\n  const elapsedMs = isGetReady ? 0 : Math.max(0, Date.now() - startedAt);\n  const getReadyTotal = setTimerModal.phase === \"getReady\" ? setTimerModal.getReady : 0;\n  const getReadyLeft = isGetReady\n    ? Math.max(0, Math.ceil((getReadyTotal * 1000 - (Date.now() - startedAt)) / 1000))\n    : 0;\n\n  const lastCueRef = useRef<number | undefined>(undefined);\n  useEffect(() => {\n    if (!isGetReady || isPlayground) {\n      lastCueRef.current = undefined;\n      return;\n    }\n    if (getReadyLeft > 0 && getReadyLeft <= MAX_HAPTIC_CUE_SECONDS && lastCueRef.current !== getReadyLeft) {\n      lastCueRef.current = getReadyLeft;\n      dispatch(Thunk_playGetReadyCue());\n    }\n  }, [isGetReady, isPlayground, getReadyLeft, dispatch]);\n\n  // For a timed AMRAP set the amrap modal stacks on top while this modal stays mounted underneath (see\n  // Progress_proceedAfterTimedSet). Hide the clock so it isn't visible behind the amrap sheet.\n  if (set == null || entry == null || progress.amrapModal != null) {\n    return null;\n  }\n\n  const pct = target > 0 ? Math.min(1, elapsedMs / (target * 1000)) : 0;\n  const elapsedLabel = TimeUtils_formatMMSS(elapsedMs);\n\n  function recordSetTimer(keepTiming: boolean): void {\n    if (isPlayground) {\n      dispatch({\n        type: \"CompleteSetAction\",\n        entryIndex,\n        setIndex,\n        mode: \"workout\",\n        programExercise: props.programExercise,\n        otherStates: props.otherStates,\n        forceUpdateEntryIndex: false,\n        isExternal: false,\n        isPlayground: true,\n        keepSetTimerRunning: keepTiming,\n      });\n    } else {\n      dispatch(Thunk_recordSetTimer(entryIndex, setIndex, keepTiming));\n    }\n  }\n\n  function onStopAndRecord(): void {\n    recordSetTimer(false);\n  }\n\n  function onLogKeepTiming(): void {\n    recordSetTimer(true);\n  }\n\n  const isLeft = setTimerModal.side === \"left\";\n  const recordedThisSide = isLeft ? set.completedSetTimerLeft != null : set.completedSetTimer != null;\n  const isCompleted = isLeft ? recordedThisSide : !!set.isCompleted;\n  const stopLabel = recordedThisSide && isLeft ? \"Next side\" : `Stop & record · ${elapsedLabel}`;\n\n  function onStartNow(): void {\n    if (isPlayground) {\n      dispatch({ type: \"StartSetTimerWorkAction\" });\n    } else {\n      dispatch(Thunk_startSetTimerWork());\n    }\n  }\n\n  if (isGetReady) {\n    return (\n      <View className=\"px-4 pt-2 pb-6\">\n        <BannerHeader\n          exerciseType={entry.exercise}\n          settings={settings}\n          subtitle={\n            <View className=\"flex-row items-center flex-wrap\">\n              <Text className=\"text-text-secondary text-sm\">\n                Set {setIndex + 1} of {entry.sets.length}\n              </Text>\n              {sideLabel != null && (\n                <Text\n                  className=\"text-sm font-semibold text-text-cardyellow\"\n                  data-testid=\"set-timer-side\"\n                  testID=\"set-timer-side\"\n                >\n                  {\" · \"}\n                  {sideLabel}\n                </Text>\n              )}\n            </View>\n          }\n        />\n        <GetReadyRing secondsLeft={getReadyLeft} total={getReadyTotal} target={target} onPress={onStartNow} />\n        <View className=\"mt-6 gap-2\">\n          <Button name=\"set-timer-start-now\" data-testid=\"set-timer-start-now\" kind=\"purple\" onPress={onStartNow}>\n            Start now\n          </Button>\n          <Button name=\"set-timer-discard\" data-testid=\"set-timer-discard\" kind=\"transparent-purple\" onPress={onClose}>\n            Discard &amp; close\n          </Button>\n        </View>\n      </View>\n    );\n  }\n\n  return (\n    <View className=\"px-4 pt-2 pb-6\">\n      <BannerHeader\n        exerciseType={entry.exercise}\n        settings={settings}\n        subtitle={\n          <View className=\"flex-row items-center flex-wrap\">\n            <Text className=\"text-text-secondary text-sm\">\n              Set {setIndex + 1} of {entry.sets.length}\n              {\" - \"}\n            </Text>\n            <WorkoutExerciseSetTarget set={set} setType=\"program\" />\n            {sideLabel != null && (\n              <Text\n                className=\"text-sm font-semibold text-text-cardyellow\"\n                data-testid=\"set-timer-side\"\n                testID=\"set-timer-side\"\n              >\n                {\" · \"}\n                {sideLabel}\n              </Text>\n            )}\n          </View>\n        }\n      />\n      <View className=\"items-center my-6\">\n        <Text\n          className=\"font-bold text-text-primary\"\n          style={{ fontSize: 64, lineHeight: 72 }}\n          data-testid=\"set-timer-current\"\n          testID=\"set-timer-current\"\n        >\n          {elapsedLabel}\n        </Text>\n        <Text className=\"text-text-secondary\">\n          of <Text className=\"font-semibold text-syntax-timer\">{TimeUtils_formatMMSS(target * 1000)}</Text> target\n        </Text>\n      </View>\n      <ProgressBar pct={pct} />\n      <View className=\"flex-row justify-between mt-1\">\n        <Text className=\"text-xs text-text-secondary\">0:00</Text>\n        <Text className=\"text-xs text-text-secondary\">{TimeUtils_formatMMSS(target * 1000)}</Text>\n      </View>\n      <View className=\"mt-6 gap-2\">\n        {(!isCompleted || (isLeft && recordedThisSide)) && (\n          <Button\n            name=\"set-timer-stop-record\"\n            data-testid=\"set-timer-stop-record\"\n            kind=\"purple\"\n            onPress={onStopAndRecord}\n          >\n            {stopLabel}\n          </Button>\n        )}\n        {!isCompleted && (\n          <Button\n            name=\"set-timer-log-keep\"\n            data-testid=\"set-timer-log-keep\"\n            kind=\"lightpurple\"\n            onPress={onLogKeepTiming}\n          >\n            Log {elapsedLabel}, keep timing\n          </Button>\n        )}\n        <Button name=\"set-timer-discard\" data-testid=\"set-timer-discard\" kind=\"transparent-purple\" onPress={onClose}>\n          Discard &amp; close\n        </Button>\n      </View>\n    </View>\n  );\n}\n\n// A long countdown would otherwise buzz every second the whole way down.\nconst MAX_HAPTIC_CUE_SECONDS = 5;\n\nconst RING_SIZE = 200;\nconst RING_RADIUS = 78;\nconst RING_VISIBLE_GAP_PX = 9;\n// Past this the per-second ticks are too thin to read, so the ring falls back to one draining arc.\nconst MAX_RING_SEGMENTS = 12;\n\nfunction polar(center: number, radius: number, angle: number): { x: number; y: number } {\n  const radians = ((angle - 90) * Math.PI) / 180;\n  return { x: center + radius * Math.cos(radians), y: center + radius * Math.sin(radians) };\n}\n\nfunction arcPath(center: number, radius: number, fromAngle: number, toAngle: number): string {\n  const start = polar(center, radius, fromAngle);\n  const end = polar(center, radius, toAngle);\n  const largeArc = toAngle - fromAngle > 180 ? 1 : 0;\n  return `M ${start.x.toFixed(2)} ${start.y.toFixed(2)} A ${radius} ${radius} 0 ${largeArc} 1 ${end.x.toFixed(\n    2\n  )} ${end.y.toFixed(2)}`;\n}\n\nfunction GetReadyRing(props: { secondsLeft: number; total: number; target: number; onPress: () => void }): JSX.Element {\n  const { secondsLeft, total, target } = props;\n  const semantic = Tailwind_semantic();\n  const stroke = 10;\n  const center = RING_SIZE / 2;\n  const segments = Math.min(total, MAX_RING_SEGMENTS);\n  const paths: { d: string; isSpent: boolean }[] = [];\n  if (total > 0 && total <= MAX_RING_SEGMENTS) {\n    const segAngle = 360 / segments;\n    // strokeLinecap=\"round\" bulges each segment by half the stroke at both ends, so the gap has to\n    // cover a whole stroke width on top of the gap you want to see, or the caps close it up.\n    const gapArcPx = RING_VISIBLE_GAP_PX + stroke;\n    const gap = Math.min(segAngle * 0.5, (gapArcPx / (2 * Math.PI * RING_RADIUS)) * 360);\n    for (let i = 0; i < segments; i += 1) {\n      paths.push({\n        d: arcPath(center, RING_RADIUS, i * segAngle + gap / 2, (i + 1) * segAngle - gap / 2),\n        isSpent: i >= secondsLeft,\n      });\n    }\n  } else if (total > 0) {\n    paths.push({ d: arcPath(center, RING_RADIUS, 0, 359.99), isSpent: true });\n    const sweep = Math.max(0.01, Math.min(359.99, (secondsLeft / total) * 360));\n    paths.push({ d: arcPath(center, RING_RADIUS, 0, sweep), isSpent: false });\n  }\n\n  return (\n    <View className=\"items-center px-4 py-6 mt-4 border rounded-2xl bg-background-cardyellow border-border-cardyellow\">\n      <Pressable\n        onPress={props.onPress}\n        style={{ width: RING_SIZE, height: RING_SIZE }}\n        data-testid=\"set-timer-get-ready-ring\"\n        testID=\"set-timer-get-ready-ring\"\n      >\n        <Svg width={RING_SIZE} height={RING_SIZE} viewBox={`0 0 ${RING_SIZE} ${RING_SIZE}`}>\n          {paths.map((p, i) => (\n            <Path\n              key={i}\n              d={p.d}\n              fill=\"none\"\n              stroke={p.isSpent ? semantic.border.cardyellow : semantic.button.orangebackground}\n              strokeWidth={stroke}\n              strokeLinecap=\"round\"\n            />\n          ))}\n        </Svg>\n        <View className=\"absolute inset-0 items-center justify-center\">\n          {/* TextRaw, not Text: Text injects text-base whenever the className carries no size token, and an\n              arbitrary `text-[96px]` never reaches the stylesheet, so on web the digit rendered at 16px.\n              No lineHeight either - anything under Poppins' natural line height clips the glyph on iOS. */}\n          <TextRaw\n            style={{\n              fontFamily: Text_resolveFontFamily(\"font-bold\"),\n              fontWeight: Platform.OS === \"android\" ? undefined : \"bold\",\n              fontSize: 96,\n              color: semantic.text.cardyellow,\n              width: \"100%\",\n              textAlign: \"center\",\n              includeFontPadding: false,\n            }}\n            data-testid=\"set-timer-get-ready-current\"\n            testID=\"set-timer-get-ready-current\"\n          >\n            {secondsLeft}\n          </TextRaw>\n        </View>\n      </Pressable>\n      <Text className=\"text-lg font-bold text-text-cardyellow\">Get Ready</Text>\n      {target > 0 && <Text className=\"text-sm text-text-secondary\">then {TimeUtils_formatMMSS(target * 1000)}</Text>}\n    </View>\n  );\n}\n\nfunction BannerHeader(props: { exerciseType: IExerciseType; settings: ISettings; subtitle: JSX.Element }): JSX.Element {\n  const exercise = Exercise_get(props.exerciseType, props.settings.exercises);\n  return (\n    <View className=\"flex-row items-center\">\n      <View className=\"self-start rounded-lg bg-background-image\">\n        <ExerciseImage settings={props.settings} width={48} exerciseType={props.exerciseType} size=\"small\" />\n      </View>\n      <View className=\"flex-1 min-w-0 ml-2\">\n        <Text className=\"text-xl font-bold text-text-primary\">\n          {Exercise_nameWithEquipment(exercise, props.settings)}\n        </Text>\n        {props.subtitle}\n      </View>\n    </View>\n  );\n}\n\nfunction ProgressBar(props: { pct: number }): JSX.Element {\n  return (\n    <View className=\"h-2 overflow-hidden rounded-full bg-background-neutral\">\n      <View\n        className=\"h-full rounded-full bg-button-primarybackground\"\n        style={{ width: `${Math.round(props.pct * 100)}%` }}\n      />\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { lb } from \"lens-shmens\";\nimport { Text } from \"./primitives/text\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { updateProgress } from \"../models/state\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IHistoryRecord, ISet } from \"../types\";\nimport { MathUtils_clamp } from \"../utils/math\";\nimport { StringUtils_pad } from \"../utils/string\";\n\ninterface ISetTimerEditContentProps {\n  set: ISet;\n  entryIndex: number;\n  setIndex: number;\n  isUnilateral: boolean;\n  dispatch: IDispatch;\n}\n\nexport function SetTimerEditContent(props: ISetTimerEditContentProps): JSX.Element {\n  const { set, entryIndex, setIndex, isUnilateral, dispatch } = props;\n  const initialSeconds = set.completedSetTimer ?? set.setTimer ?? 0;\n  const initialLeftSeconds = set.completedSetTimerLeft ?? set.setTimer ?? 0;\n\n  const [minutesValue, setMinutesValue] = useState(Math.floor(initialSeconds / 60).toString());\n  const [secondsValue, setSecondsValue] = useState(StringUtils_pad((initialSeconds % 60).toString(), 2));\n  const [leftMinutesValue, setLeftMinutesValue] = useState(Math.floor(initialLeftSeconds / 60).toString());\n  const [leftSecondsValue, setLeftSecondsValue] = useState(StringUtils_pad((initialLeftSeconds % 60).toString(), 2));\n\n  const lbSet = lb<IHistoryRecord>().p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex);\n  const lbModal = lb<IHistoryRecord>().pi(\"ui\", {}).p(\"setTimerEditModal\");\n\n  // Write the value and clear the modal flag in a SINGLE dispatch. The web playground's dispatch applies each\n  // action to a progress snapshot captured at render, so a second dispatch (e.g. a separate onClose) would read\n  // the stale snapshot and clobber this write. Clearing the flag here is what closes the modal (unmount on web,\n  // shouldGoBack pop on native) — no separate onClose() call needed.\n  const onClear = (): void => {\n    updateProgress(\n      dispatch,\n      [\n        lbSet.p(\"completedSetTimer\").record(undefined),\n        lbSet.p(\"completedSetTimerLeft\").record(undefined),\n        lbModal.record(undefined),\n      ],\n      \"clear-set-timer\"\n    );\n  };\n\n  const toSeconds = (minutes: string, seconds: string, fallback: number): number => {\n    const m = Number(minutes);\n    const s = Number(seconds);\n    return isNaN(m) || isNaN(s) ? fallback : MathUtils_clamp(m, 0, 999) * 60 + MathUtils_clamp(s, 0, 59);\n  };\n\n  const onSave = (): void => {\n    const newSeconds = toSeconds(minutesValue, secondsValue, initialSeconds);\n    updateProgress(\n      dispatch,\n      [\n        lbSet.p(\"completedSetTimer\").record(newSeconds),\n        ...(isUnilateral\n          ? [lbSet.p(\"completedSetTimerLeft\").record(toSeconds(leftMinutesValue, leftSecondsValue, initialLeftSeconds))]\n          : []),\n        lbModal.record(undefined),\n      ],\n      \"edit-set-timer\"\n    );\n  };\n\n  const durationRow = (\n    label: string | undefined,\n    minutes: string,\n    onMinutes: (v: string) => void,\n    seconds: string,\n    onSeconds: (v: string) => void,\n    identifierPrefix: string\n  ): JSX.Element => (\n    <View className=\"flex-row items-center\">\n      {label != null && (\n        <View className=\"justify-center\" style={{ width: 20 }}>\n          <Text className=\"text-xs text-text-secondary\">{label}</Text>\n        </View>\n      )}\n      <View className=\"flex-1\">\n        <Input\n          type=\"tel\"\n          placeholder=\"00\"\n          value={minutes}\n          inputSize=\"sm\"\n          labelSize=\"xs\"\n          changeType=\"oninput\"\n          identifier={`${identifierPrefix}-minutes`}\n          changeHandler={(e) => {\n            if (e.success) {\n              onMinutes(e.data);\n            }\n          }}\n        />\n      </View>\n      <View className=\"items-center justify-center\" style={{ width: 16, height: 40 }}>\n        <Text>:</Text>\n      </View>\n      <View className=\"flex-1\">\n        <Input\n          type=\"tel\"\n          placeholder=\"00\"\n          value={seconds}\n          inputSize=\"sm\"\n          labelSize=\"xs\"\n          changeType=\"oninput\"\n          identifier={`${identifierPrefix}-seconds`}\n          changeHandler={(e) => {\n            if (e.success) {\n              onSeconds(e.data);\n            }\n          }}\n        />\n      </View>\n    </View>\n  );\n\n  return (\n    <View>\n      <Text className=\"pb-2 font-bold\">Edit recorded time</Text>\n      <Text className=\"pb-2 text-xs text-text-secondary\">(in mm:ss)</Text>\n      {isUnilateral && (\n        <View className=\"pb-2\">\n          {durationRow(\n            \"L\",\n            leftMinutesValue,\n            setLeftMinutesValue,\n            leftSecondsValue,\n            setLeftSecondsValue,\n            \"set-timer-edit-left\"\n          )}\n        </View>\n      )}\n      {durationRow(\n        isUnilateral ? \"R\" : undefined,\n        minutesValue,\n        setMinutesValue,\n        secondsValue,\n        setSecondsValue,\n        \"set-timer-edit\"\n      )}\n      <View className=\"flex-row justify-between mt-4\">\n        <Button\n          name=\"set-timer-edit-clear\"\n          data-testid=\"set-timer-edit-clear\"\n          kind=\"grayv2\"\n          className=\"mr-3\"\n          onClick={onClear}\n        >\n          Clear\n        </Button>\n        <Button name=\"set-timer-edit-submit\" data-testid=\"set-timer-edit-submit\" kind=\"purple\" onClick={onSave}>\n          Save\n        </Button>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { ScrollView, View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport MarkdownIt from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport { Link } from \"./link\";\nimport { InternalLink } from \"../internalLink\";\nimport { IconDiscord } from \"./icons/iconDiscord\";\nimport { IconDoc } from \"./icons/iconDoc\";\nimport { IconSwap } from \"./icons/iconSwap\";\nimport { IconHelp } from \"./icons/iconHelp\";\nimport { IconEdit2 } from \"./icons/iconEdit2\";\nimport { IconPreview } from \"./icons/iconPreview\";\nimport { IconReorder } from \"./icons/iconReorder\";\nimport { IconUiMode } from \"./icons/iconUiMode\";\nimport { IconDayTextMode } from \"./icons/iconDayTextMode\";\nimport { IconFullTextMode } from \"./icons/iconFullTextMode\";\nimport { PlannerCodeBlock } from \"../pages/planner/components/plannerCodeBlock\";\n\nconst md = new MarkdownIt({ html: false, linkify: true });\n\nconst ICON_RE = /::icon-(discord|doc|swap|help|edit2|preview|reorder|ui-mode|day-text-mode|full-text-mode)::/g;\n\ninterface IProps {\n  value: string;\n  className?: string;\n}\n\nexport function SimpleMarkdown(props: IProps): JSX.Element {\n  const rendered = useMemo(() => {\n    const tokens = md.parse(props.value, {});\n    return renderBlocks(tokens, 0, tokens.length).elements;\n  }, [props.value]);\n  return <View className={props.className}>{rendered}</View>;\n}\n\ninterface IBlockResult {\n  elements: JSX.Element[];\n  next: number;\n}\n\nfunction renderBlocks(tokens: Token[], start: number, end: number, depth = 0): IBlockResult {\n  const elements: JSX.Element[] = [];\n  let i = start;\n  while (i < end) {\n    const token = tokens[i];\n    if (token.type === \"paragraph_open\") {\n      const inline = tokens[i + 1];\n      elements.push(\n        <Text key={i} className=\"mb-2 text-sm\">\n          {inline?.children ? renderInline(inline.children) : null}\n        </Text>\n      );\n      i += 3;\n    } else if (token.type === \"heading_open\") {\n      const level = parseInt(token.tag.replace(\"h\", \"\"), 10);\n      const inline = tokens[i + 1];\n      const sizeClass = level <= 2 ? \"text-lg\" : level <= 4 ? \"text-base\" : \"text-sm\";\n      elements.push(\n        <Text key={i} className={`${sizeClass} font-bold mb-1`}>\n          {inline?.children ? renderInline(inline.children) : null}\n        </Text>\n      );\n      i += 3;\n    } else if (token.type === \"bullet_list_open\" || token.type === \"ordered_list_open\") {\n      const ordered = token.type === \"ordered_list_open\";\n      const closeType = ordered ? \"ordered_list_close\" : \"bullet_list_close\";\n      const listEnd = findMatchingClose(tokens, i, token.type, closeType);\n      const items = renderListItems(tokens, i + 1, listEnd, ordered, depth);\n      elements.push(\n        <View key={i} className={depth > 0 ? \"pl-4\" : \"\"}>\n          {items}\n        </View>\n      );\n      i = listEnd + 1;\n    } else if (token.type === \"fence\" || token.type === \"code_block\") {\n      if (token.info && token.info.trim() === \"liftoscript\") {\n        elements.push(\n          <ScrollView key={i} horizontal className=\"mb-2\" showsHorizontalScrollIndicator={false}>\n            <PlannerCodeBlock className=\"text-sm\" script={token.content.replace(/\\n+$/, \"\")} />\n          </ScrollView>\n        );\n      } else {\n        elements.push(\n          <View key={i} className=\"p-2 mb-2 rounded bg-background-subtle\">\n            <Text className=\"font-mono text-xs\">{token.content}</Text>\n          </View>\n        );\n      }\n      i += 1;\n    } else if (token.type === \"hr\") {\n      elements.push(<View key={i} className=\"my-2 border-b border-border-neutral\" />);\n      i += 1;\n    } else {\n      i += 1;\n    }\n  }\n  return { elements, next: i };\n}\n\nfunction renderListItems(tokens: Token[], start: number, end: number, ordered: boolean, depth: number): JSX.Element[] {\n  const items: JSX.Element[] = [];\n  let i = start;\n  let orderIndex = 1;\n  while (i < end) {\n    if (tokens[i].type !== \"list_item_open\") {\n      i += 1;\n      continue;\n    }\n    const itemEnd = findMatchingClose(tokens, i, \"list_item_open\", \"list_item_close\");\n    const bullet = ordered ? `${orderIndex}. ` : \"• \";\n    const inner = renderBlocks(tokens, i + 1, itemEnd, depth + 1).elements;\n    items.push(\n      <View key={i} className=\"flex-row pl-2 mb-1\">\n        <Text className=\"text-sm\">{bullet}</Text>\n        <View className=\"flex-1\">{inner}</View>\n      </View>\n    );\n    orderIndex += 1;\n    i = itemEnd + 1;\n  }\n  return items;\n}\n\nfunction findMatchingClose(tokens: Token[], start: number, openType: string, closeType: string): number {\n  let depth = 0;\n  for (let i = start; i < tokens.length; i += 1) {\n    if (tokens[i].type === openType) {\n      depth += 1;\n    } else if (tokens[i].type === closeType) {\n      depth -= 1;\n      if (depth === 0) {\n        return i;\n      }\n    }\n  }\n  return tokens.length;\n}\n\nfunction renderInline(tokens: Token[]): (JSX.Element | string)[] {\n  const elements: (JSX.Element | string)[] = [];\n  let i = 0;\n  while (i < tokens.length) {\n    const token = tokens[i];\n    if (token.type === \"text\") {\n      pushTextWithIcons(elements, token.content, `t${i}`);\n      i += 1;\n    } else if (token.type === \"softbreak\") {\n      elements.push(\" \");\n      i += 1;\n    } else if (token.type === \"hardbreak\") {\n      elements.push(\"\\n\");\n      i += 1;\n    } else if (token.type === \"code_inline\") {\n      elements.push(\n        <Text key={i} className=\"px-1 font-mono text-xs rounded bg-background-subtle\">\n          {token.content}\n        </Text>\n      );\n      i += 1;\n    } else if (token.type === \"strong_open\") {\n      const content = collectInlineUntil(tokens, i + 1, \"strong_close\");\n      elements.push(\n        <Text key={i} className=\"text-sm font-bold\">\n          {renderInline(content.tokens)}\n        </Text>\n      );\n      i = content.endIndex + 1;\n    } else if (token.type === \"em_open\") {\n      const content = collectInlineUntil(tokens, i + 1, \"em_close\");\n      elements.push(\n        <Text key={i} className=\"text-sm italic\">\n          {renderInline(content.tokens)}\n        </Text>\n      );\n      i = content.endIndex + 1;\n    } else if (token.type === \"link_open\") {\n      const href = token.attrGet(\"href\") || \"\";\n      const content = collectInlineUntil(tokens, i + 1, \"link_close\");\n      if (href) {\n        if (href.startsWith(\"internal:\")) {\n          const internalHref = href.slice(\"internal:\".length);\n          elements.push(\n            <InternalLink\n              key={i}\n              name=\"markdown-internal\"\n              className=\"text-sm underline text-text-link\"\n              href={internalHref}\n            >\n              {renderInline(content.tokens)}\n            </InternalLink>\n          );\n        } else {\n          elements.push(\n            <Link key={i} className=\"text-sm underline text-text-link\" href={href}>\n              {renderInline(content.tokens)}\n            </Link>\n          );\n        }\n      }\n      i = content.endIndex + 1;\n    } else {\n      i += 1;\n    }\n  }\n  return elements;\n}\n\nfunction pushTextWithIcons(out: (JSX.Element | string)[], text: string, keyPrefix: string): void {\n  ICON_RE.lastIndex = 0;\n  let lastIndex = 0;\n  let match: RegExpExecArray | null;\n  let part = 0;\n  while ((match = ICON_RE.exec(text)) !== null) {\n    if (match.index > lastIndex) {\n      out.push(text.slice(lastIndex, match.index));\n    }\n    const name = match[1];\n    out.push(renderIcon(name, `${keyPrefix}-i${part}`));\n    lastIndex = match.index + match[0].length;\n    part += 1;\n  }\n  if (lastIndex < text.length) {\n    out.push(text.slice(lastIndex));\n  }\n}\n\nfunction renderIcon(name: string, key: string): JSX.Element {\n  const size = 14;\n  const className = \"inline-block\";\n  switch (name) {\n    case \"discord\":\n      return <IconDiscord key={key} size={size} className={className} />;\n    case \"doc\":\n      return <IconDoc key={key} width={size} height={size} className={className} />;\n    case \"swap\":\n      return <IconSwap key={key} size={size} className={className} />;\n    case \"help\":\n      return <IconHelp key={key} size={size} className={className} />;\n    case \"edit2\":\n      return <IconEdit2 key={key} size={size} className={className} />;\n    case \"preview\":\n      return <IconPreview key={key} size={size} className={className} />;\n    // The editor's four mode buttons, named after the mode rather than after the drawing, so an\n    // entry pointing at one still points at it after the icon is redrawn.\n    case \"reorder\":\n      return <IconReorder key={key} size={size} className={className} />;\n    case \"ui-mode\":\n      return <IconUiMode key={key} size={size} className={className} />;\n    case \"day-text-mode\":\n      return <IconDayTextMode key={key} size={size} className={className} />;\n    case \"full-text-mode\":\n      return <IconFullTextMode key={key} size={size} className={className} />;\n    default:\n      return <Text key={key}>{`::icon-${name}::`}</Text>;\n  }\n}\n\nfunction collectInlineUntil(\n  tokens: Token[],\n  startIndex: number,\n  closeType: string\n): { tokens: Token[]; endIndex: number } {\n  const collected: Token[] = [];\n  let i = startIndex;\n  while (i < tokens.length && tokens[i].type !== closeType) {\n    collected.push(tokens[i]);\n    i += 1;\n  }\n  return { tokens: collected, endIndex: i };\n}\n","import { JSX, memo as reactMemo, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { View, Pressable, Image, Platform } from \"react-native\";\nimport { TextInput } from \"./primitives/textInput\";\nimport { NavScreenScrollContext } from \"../navigation/NavScreenContent\";\nimport { useScrollProgressiveList } from \"../utils/useScrollProgressiveList\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  EditStats_changeStatWeightTimestamp,\n  EditStats_changeStatPercentageTimestamp,\n  EditStats_changeStatLengthTimestamp,\n  EditStats_changeStatWeightValue,\n  EditStats_changeStatPercentageValue,\n  EditStats_changeStatLengthValue,\n  EditStats_deleteWeightStat,\n  EditStats_deletePercentageStat,\n  EditStats_deleteLengthStat,\n} from \"../models/editStats\";\nimport { Length_is, Length_convertTo, Length_build } from \"../models/length\";\nimport { Stats_name } from \"../models/stats\";\nimport { Weight_is, Weight_convertTo, Weight_build } from \"../models/weight\";\nimport { ILength, IPercentage, ISettings, IStats, IStatsKey, ISubscription, IWeight } from \"../types\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { MenuItemWrapper } from \"./menuItem\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { MenuItemEditable } from \"./menuItemEditable\";\nimport { GraphStats, getWeightDataForGraph, getLengthDataForGraph, getPercentageDataForGraph } from \"./graphStats\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { Locker } from \"./locker\";\nimport { Button } from \"./button\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { updateSettings } from \"../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { ImagePreloader_dynoflex } from \"../utils/imagePreloader\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\nimport { BundledImages_svgXml } from \"../utils/bundledImages\";\nimport { SvgXml } from \"./primitives/svg\";\nimport { Dialog_confirm } from \"../utils/dialog\";\nimport { DatePicker } from \"./datePicker\";\n\ninterface IProps {\n  stats: IStats;\n  settings: ISettings;\n  subscription: ISubscription;\n  initialKey?: IStatsKey;\n  dispatch: IDispatch;\n}\n\ninterface IValue {\n  timestamp: number;\n  value: IWeight | ILength | IPercentage;\n  index: number;\n}\n\nfunction getValues(stats: IStats, key: IStatsKey): IValue[] {\n  if (key === \"weight\") {\n    const subset = stats.weight[key] || [];\n    return subset.reduce<IValue[]>((memo, stat, index) => {\n      memo.push({ timestamp: stat.timestamp, value: stat.value, index });\n      return memo;\n    }, []);\n  } else if (key === \"bodyfat\") {\n    const subset = stats.percentage[key] || [];\n    return subset.reduce<IValue[]>((memo, stat, index) => {\n      memo.push({ timestamp: stat.timestamp, value: stat.value, index });\n      return memo;\n    }, []);\n  } else {\n    const subset = stats.length[key] || [];\n    return subset.reduce<IValue[]>((memo, stat, index) => {\n      memo.push({ timestamp: stat.timestamp, value: stat.value, index });\n      return memo;\n    }, []);\n  }\n}\n\nexport function StatsList(props: IProps): JSX.Element {\n  const statsKeys: IStatsKey[] = [\n    ...ObjectUtils_keys(props.stats.weight).filter((k) => (props.stats.weight[k] || []).length > 0),\n    ...ObjectUtils_keys(props.stats.percentage).filter((k) => (props.stats.percentage[k] || []).length > 0),\n    ...ObjectUtils_keys(props.stats.length).filter((k) => (props.stats.length[k] || []).length > 0),\n  ];\n  const [selectedKey, setSelectedKey] = useState<IStatsKey>(props.initialKey || statsKeys[0] || \"weight\");\n  const movingAverageWindowSize = props.settings.graphOptions[selectedKey]?.movingAverageWindowSize;\n  const values = useMemo(() => getValues(props.stats, selectedKey), [props.stats, selectedKey]);\n  const { visibleItems: visibleValues, onScroll: onProgressiveScroll } = useScrollProgressiveList(values, {\n    batchSize: 10,\n  });\n  const navScrollCtx = useContext(NavScreenScrollContext);\n  useEffect(() => {\n    if (!navScrollCtx) {\n      return;\n    }\n    return navScrollCtx.addScrollListener(onProgressiveScroll);\n  }, [navScrollCtx, onProgressiveScroll]);\n\n  if (statsKeys.length === 0) {\n    return (\n      <View>\n        <View className=\"flex-row items-center justify-center pt-16\">\n          {Platform.OS === \"web\" ? (\n            <Image\n              source={{ uri: HostConfig_resolveUrl(ImagePreloader_dynoflex) }}\n              style={{ width: 180, height: 232 }}\n            />\n          ) : (\n            <SvgXml xml={BundledImages_svgXml(ImagePreloader_dynoflex) ?? \"\"} width={180} height={232} />\n          )}\n        </View>\n        <Text className=\"pt-4 pb-6 text-sm text-center text-text-secondary\">No measurements added yet</Text>\n        <View className=\"items-center\">\n          <Button\n            name=\"add-measurements\"\n            data-testid=\"add-measurements\"\n            testID=\"add-measurements\"\n            kind=\"purple\"\n            onClick={() => props.dispatch(Thunk_pushScreen(\"stats\"))}\n          >\n            Add measurements\n          </Button>\n        </View>\n      </View>\n    );\n  }\n  const units =\n    selectedKey === \"weight\" ? props.settings.units : selectedKey === \"bodyfat\" ? \"%\" : props.settings.lengthUnits;\n  const graphPoints =\n    selectedKey === \"weight\"\n      ? getWeightDataForGraph(props.stats.weight[selectedKey] || [], props.settings)\n      : selectedKey === \"bodyfat\"\n        ? getPercentageDataForGraph(props.stats.percentage[selectedKey] || [], props.settings)\n        : getLengthDataForGraph(props.stats.length[selectedKey] || [], props.settings);\n\n  const graphUnit =\n    selectedKey === \"weight\" ? props.settings.units : selectedKey === \"bodyfat\" ? \"%\" : props.settings.lengthUnits;\n\n  return (\n    <View className=\"px-4\" data-testid={`stats-list-${selectedKey}`} testID={`stats-list-${selectedKey}`}>\n      <View className=\"items-center pb-2\">\n        <Button\n          name=\"add-measurements\"\n          data-testid=\"add-measurements\"\n          testID=\"add-measurements\"\n          kind=\"purple\"\n          onClick={() => props.dispatch(Thunk_pushScreen(\"stats\"))}\n        >\n          Add measurements\n        </Button>\n      </View>\n      <GroupHeader name=\"Selected Measurement Type\" />\n      <MenuItemEditable\n        type=\"select\"\n        name=\"Type\"\n        value={selectedKey}\n        values={statsKeys.map((key) => [key, Stats_name(key)])}\n        onChange={(value) => {\n          setSelectedKey(value as IStatsKey);\n        }}\n      />\n      {Subscriptions_hasSubscription(props.subscription) && (\n        <MenuItemEditable\n          name=\"Moving Average Window Size\"\n          type=\"select\"\n          value={movingAverageWindowSize?.toString() ?? \"\"}\n          values={[\n            [\"\", \"Off\"],\n            [\"2\", \"2\"],\n            [\"3\", \"3\"],\n            [\"4\", \"4\"],\n            [\"5\", \"5\"],\n          ]}\n          onChange={(value) => {\n            updateSettings(\n              props.dispatch,\n              lb<ISettings>()\n                .p(\"graphOptions\")\n                .p(selectedKey)\n                .recordModify((opts) => ({\n                  ...opts,\n                  movingAverageWindowSize: value ? parseInt(value, 10) : undefined,\n                })),\n              \"Update moving average\"\n            );\n          }}\n        />\n      )}\n      <View className=\"relative\">\n        {graphPoints.length > 2 && (\n          <>\n            <GraphStats\n              title={null}\n              isSameXAxis={false}\n              minX={graphPoints[0][0]}\n              maxX={graphPoints[graphPoints.length - 1][0]}\n              units={graphUnit}\n              key={`${selectedKey}_${movingAverageWindowSize}`}\n              settings={props.settings}\n              collection={graphPoints}\n              statsKey={selectedKey}\n              movingAverageWindowSize={movingAverageWindowSize}\n              isInteractive={Subscriptions_hasSubscription(props.subscription)}\n            />\n            <Locker topic=\"Graphs\" dispatch={props.dispatch} blur={8} subscription={props.subscription} />\n          </>\n        )}\n      </View>\n      {values.length === 0 ? (\n        <Text className=\"py-12 text-xl text-center text-text-secondary\">\n          No {Stats_name(selectedKey)} measurements added yet\n        </Text>\n      ) : (\n        <>\n          <GroupHeader name=\"List of measurements\" topPadding={false} />\n          {visibleValues.map((value) => (\n            <MeasurementRow\n              key={`${selectedKey}-${value.timestamp}`}\n              value={value}\n              selectedKey={selectedKey}\n              settings={props.settings}\n              units={units}\n              dispatch={props.dispatch}\n            />\n          ))}\n        </>\n      )}\n    </View>\n  );\n}\n\ninterface IMeasurementRowProps {\n  value: IValue;\n  selectedKey: IStatsKey;\n  settings: ISettings;\n  units: string;\n  dispatch: IDispatch;\n}\n\nconst MeasurementRow = reactMemo(function MeasurementRow(props: IMeasurementRowProps): JSX.Element {\n  const { value, selectedKey, settings, units, dispatch } = props;\n  const convertedValue = useMemo(() => {\n    return Weight_is(value.value)\n      ? Weight_convertTo(value.value, settings.units)\n      : Length_is(value.value)\n        ? Length_convertTo(value.value, settings.lengthUnits)\n        : value.value;\n  }, [value.value, settings.units, settings.lengthUnits]);\n\n  const onChangeTimestamp = useCallback(\n    (ts: number): void => {\n      if (selectedKey === \"weight\") {\n        EditStats_changeStatWeightTimestamp(dispatch, selectedKey, value.index, ts);\n      } else if (selectedKey === \"bodyfat\") {\n        EditStats_changeStatPercentageTimestamp(dispatch, selectedKey, value.index, ts);\n      } else {\n        EditStats_changeStatLengthTimestamp(dispatch, selectedKey, value.index, ts);\n      }\n    },\n    [dispatch, selectedKey, value.index]\n  );\n\n  const onChangeValue = useCallback(\n    (str: string): void => {\n      const num = parseFloat(str);\n      if (isNaN(num)) {\n        return;\n      }\n      if (selectedKey === \"weight\") {\n        EditStats_changeStatWeightValue(dispatch, selectedKey, value.index, Weight_build(num, settings.units));\n      } else if (selectedKey === \"bodyfat\") {\n        EditStats_changeStatPercentageValue(dispatch, selectedKey, value.index, { value: num, unit: \"%\" });\n      } else {\n        EditStats_changeStatLengthValue(dispatch, selectedKey, value.index, Length_build(num, settings.lengthUnits));\n      }\n    },\n    [dispatch, selectedKey, value.index, settings.units, settings.lengthUnits]\n  );\n\n  const onDelete = useCallback(async (): Promise<void> => {\n    if (await Dialog_confirm(\"Are you sure?\")) {\n      if (selectedKey === \"weight\") {\n        EditStats_deleteWeightStat(dispatch, selectedKey, value.index, value.timestamp);\n      } else if (selectedKey === \"bodyfat\") {\n        EditStats_deletePercentageStat(dispatch, selectedKey, value.index, value.timestamp);\n      } else {\n        EditStats_deleteLengthStat(dispatch, selectedKey, value.index, value.timestamp);\n      }\n    }\n  }, [dispatch, selectedKey, value.index, value.timestamp]);\n\n  return (\n    <MenuItemWrapper name={`${selectedKey}-${value.timestamp}`}>\n      <View className=\"flex-row items-center\">\n        <View className=\"flex-1\">\n          <DatePicker testID=\"input-stats-date\" value={value.timestamp} onChange={onChangeTimestamp} />\n        </View>\n        <View className=\"flex-row flex-1 items-center\">\n          <StatValueInput value={+convertedValue.value.toFixed(2)} onChange={onChangeValue} />\n          <Text className=\"py-3 pl-1\" data-testid=\"input-stats-unit\">\n            {units}\n          </Text>\n        </View>\n        <Pressable className=\"p-3 nm-delete-stat\" data-testid=\"delete-stat\" testID=\"delete-stat\" onPress={onDelete}>\n          <IconTrash />\n        </Pressable>\n      </View>\n    </MenuItemWrapper>\n  );\n});\n\ninterface IStatValueInputProps {\n  value: number;\n  onChange: (str: string) => void;\n}\n\nfunction StatValueInput(props: IStatValueInputProps): JSX.Element {\n  const [text, setText] = useState(String(props.value));\n\n  useEffect(() => {\n    setText(String(props.value));\n  }, [props.value]);\n\n  return (\n    <TextInput\n      data-testid=\"input-stats-value\"\n      testID=\"input-stats-value\"\n      className=\"flex-1 w-0 min-w-0 p-2 text-right text-text-link bg-background-default\"\n      keyboardType=\"numeric\"\n      value={text}\n      onChangeText={setText}\n      onBlur={() => props.onChange(text)}\n      selectTextOnFocus={Platform.OS === \"ios\"}\n    />\n  );\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable, Animated, Easing } from \"react-native\";\n\ninterface IStorySliderProps {\n  slides: JSX.Element[];\n  duration?: number;\n}\n\nexport default function StorySlider({ slides, duration = 5000 }: IStorySliderProps): JSX.Element {\n  const [currentIndex, setCurrentIndex] = useState(0);\n  const progressAnim = useRef(new Animated.Value(0)).current;\n  const animationRef = useRef<Animated.CompositeAnimation | null>(null);\n\n  const goToNext = (): void => {\n    setCurrentIndex((prev) => (prev + 1) % slides.length);\n  };\n\n  const goToPrevious = (): void => {\n    setCurrentIndex((prev) => (prev === 0 ? slides.length - 1 : prev - 1));\n  };\n\n  useEffect(() => {\n    progressAnim.setValue(0);\n    const animation = Animated.timing(progressAnim, {\n      toValue: 1,\n      duration,\n      easing: Easing.linear,\n      useNativeDriver: false,\n    });\n    animationRef.current = animation;\n    animation.start(({ finished }) => {\n      if (finished) {\n        goToNext();\n      }\n    });\n    return () => {\n      animation.stop();\n    };\n  }, [currentIndex, duration]);\n\n  const animatedWidth = progressAnim.interpolate({\n    inputRange: [0, 1],\n    outputRange: [\"0%\", \"100%\"],\n  });\n\n  return (\n    <View className=\"relative w-full h-full overflow-hidden\">\n      <View className=\"absolute top-0 left-0 right-0 z-10 flex-row gap-1 px-4 pt-4\">\n        {slides.map((_, i) => {\n          const fillWidth = i < currentIndex ? \"100%\" : i > currentIndex ? \"0%\" : undefined;\n          return (\n            <View key={i} className=\"flex-1 h-1 overflow-hidden rounded bg-white/30\">\n              {i === currentIndex ? (\n                <Animated.View style={{ height: \"100%\", backgroundColor: \"white\", width: animatedWidth }} />\n              ) : (\n                <View className=\"h-full bg-white\" style={{ width: fillWidth }} />\n              )}\n            </View>\n          );\n        })}\n      </View>\n\n      <View className=\"w-full h-full\">{slides[currentIndex]}</View>\n\n      <Pressable className=\"absolute top-0 left-0 z-20 w-1/2 h-full\" onPress={goToPrevious} />\n      <Pressable className=\"absolute top-0 right-0 z-20 w-1/2 h-full\" onPress={goToNext} />\n    </View>\n  );\n}\n","import { Platform } from \"react-native\";\n\nexport type ISubscriptionInfoType = \"platesCalculator\" | \"graphs\" | \"notifications\" | \"weekInsights\" | \"watch\" | \"mcp\";\n\nexport interface ISubscriptionInfoImage {\n  uri: string;\n  aspect: number;\n}\n\nexport function SubscriptionInfoImages_get(type: ISubscriptionInfoType): ISubscriptionInfoImage {\n  switch (type) {\n    case \"platesCalculator\":\n      return { uri: \"/images/plates_calculator_subs.png\", aspect: 732 / 937 };\n    case \"graphs\":\n      return { uri: \"/images/graphs_subs.png\", aspect: 724 / 974 };\n    case \"notifications\":\n      return Platform.OS === \"android\"\n        ? { uri: \"/images/notifs_subs_android.jpg\", aspect: 750 / 1069 }\n        : { uri: \"/images/notifs_subs_ios.jpg\", aspect: 750 / 1069 };\n    case \"weekInsights\":\n      return { uri: \"/images/week_insights_subs.png\", aspect: 732 / 962 };\n    case \"watch\":\n      return { uri: \"/images/watch_subs_ios.png\", aspect: 750 / 1070 };\n    case \"mcp\":\n      return { uri: \"/images/mcp_subs.png\", aspect: 750 / 1070 };\n  }\n}\n\nexport function SubscriptionInfoImages_allPaths(): string[] {\n  const types: ISubscriptionInfoType[] = [\n    \"platesCalculator\",\n    \"graphs\",\n    \"notifications\",\n    \"weekInsights\",\n    \"watch\",\n    \"mcp\",\n  ];\n  return types.map((t) => SubscriptionInfoImages_get(t).uri);\n}\n","import { JSX, RefObject } from \"react\";\nimport { LayoutChangeEvent, Platform, ScrollView, StatusBar, TextInput, View } from \"react-native\";\nimport { useSystemKeyboardHeight } from \"../utils/useSystemKeyboardHeight\";\n\nconst REVEAL_MARGIN = 16;\n\n// Android has no automaticallyAdjustKeyboardInsets, and under edge-to-edge the window doesn't\n// shrink for the IME either — so without this the content can't be scrolled past the keyboard\n// at all, and anything trying to reveal a focused line just hits the end of the scroll range.\n// Its own component so opening the keyboard re-renders the spacer, not the whole screen.\nexport function SystemKeyboardSpacer(props: { scrollRef?: RefObject<ScrollView | null> }): JSX.Element {\n  const height = useSystemKeyboardHeight();\n  const scrollRef = props.scrollRef;\n  const onLayout =\n    scrollRef != null\n      ? (e: LayoutChangeEvent) => {\n          if (e.nativeEvent.layout.height > 0 && scrollRef.current != null) {\n            revealFocusedInput(scrollRef.current);\n          }\n        }\n      : undefined;\n  return <View style={{ height }} onLayout={onLayout} />;\n}\n\n// RN's helper assumes the scroll view starts at the top of the screen, so the sheet's own window\n// offset goes into the extra offset. Android's keyboard event reports the IME top in screen\n// coordinates while measureInWindow is measured below the status bar (verified on API 36, both\n// numbers 52dp apart), so the status bar height goes in as well.\nfunction revealFocusedInput(scrollView: ScrollView): void {\n  const input = TextInput.State.currentlyFocusedInput();\n  const viewport = scrollView.getNativeScrollRef();\n  if (input == null || viewport == null) {\n    return;\n  }\n  const statusBarHeight = Platform.OS === \"android\" ? (StatusBar.currentHeight ?? 0) : 0;\n  viewport.measureInWindow((_x, viewportY) => {\n    scrollView\n      .getScrollResponder()\n      .scrollResponderScrollNativeHandleToKeyboard(input, viewportY + statusBarHeight + REVEAL_MARGIN, true);\n  });\n}\n","import { JSX, ReactNode, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\ninterface IProps {\n  tabs: [string, ReactNode][];\n  defaultIndex?: number;\n  onChange?: (index: number, newValue: string) => void;\n}\n\nexport function Tabs2(props: IProps): JSX.Element {\n  const { tabs, onChange } = props;\n  const [selectedIndex, setSelectedIndex] = useState<number>(props.defaultIndex || 0);\n  return (\n    <View>\n      <View className=\"flex-row\">\n        {tabs.map(([name], index) => {\n          const nameClass = `tab-${StringUtils_dashcase(name.toLowerCase())}`;\n\n          return (\n            <View key={name} className=\"flex-1 items-center border-b border-border-neutral\">\n              <Pressable\n                className=\"px-4 pb-1\"\n                style={\n                  selectedIndex === index\n                    ? { borderBottomWidth: 2, borderBottomColor: Tailwind_semantic().icon.yellow }\n                    : undefined\n                }\n                data-testid={nameClass}\n                testID={nameClass}\n                onPress={() => {\n                  if (onChange) {\n                    onChange(index, name);\n                  }\n                  setSelectedIndex(index);\n                }}\n              >\n                <Text className={`text-base ${selectedIndex === index ? \"text-icon-yellow\" : \"\"}`}>{name}</Text>\n              </Pressable>\n            </View>\n          );\n        })}\n      </View>\n      {tabs[selectedIndex][1]}\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { Input, IInputHandle, IValidationError } from \"./input\";\nimport { Button } from \"./button\";\nimport { IEither } from \"../utils/types\";\nimport type { ITextInputModalData } from \"../navigation/ModalStateContext\";\n\ninterface ITextInputModalContentProps {\n  data: ITextInputModalData;\n  onSubmit: (value: string) => void;\n  onClose: () => void;\n}\n\nexport function TextInputModalContent(props: ITextInputModalContentProps): JSX.Element {\n  const { data } = props;\n  const [result, setResult] = useState<IEither<string, Set<IValidationError>>>();\n  const inputHandle = useRef<IInputHandle>(null);\n\n  const onSubmit = (): void => {\n    if (result?.success) {\n      const value = result.data.trim();\n      if (!value) {\n        inputHandle.current?.touch();\n        return;\n      }\n      props.onSubmit(value);\n    } else {\n      inputHandle.current?.touch();\n    }\n  };\n\n  return (\n    <>\n      <GroupHeader size=\"large\" name={data.title} />\n      <Input\n        identifier={data.dataCyPrefix}\n        label={data.inputLabel}\n        required\n        requiredMessage={`${data.inputLabel} cannot be empty`}\n        type=\"text\"\n        placeholder={data.placeholder}\n        maxLength={data.maxLength}\n        pattern={data.pattern}\n        patternMessage={data.patternMessage}\n        changeType=\"oninput\"\n        changeHandler={setResult}\n        handleRef={inputHandle}\n      />\n      <View className=\"flex-row items-center justify-between gap-4 mt-4\">\n        <Button\n          name={`${data.dataCyPrefix}-cancel`}\n          data-testid={`${data.dataCyPrefix}-cancel`}\n          testID={`${data.dataCyPrefix}-cancel`}\n          type=\"button\"\n          kind=\"grayv2\"\n          className=\"mr-3\"\n          onClick={props.onClose}\n        >\n          Cancel\n        </Button>\n        <Button\n          kind=\"purple\"\n          name={`${data.dataCyPrefix}-submit`}\n          data-testid={`${data.dataCyPrefix}-submit`}\n          testID={`${data.dataCyPrefix}-submit`}\n          type=\"submit\"\n          onClick={onSubmit}\n        >\n          {data.submitLabel}\n        </Button>\n      </View>\n    </>\n  );\n}\n","import React, { JSX, useEffect, useMemo, useRef, useState } from \"react\";\nimport { debounce } from \"../utils/throttler\";\n\ninterface IProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n  onChangeText?: (text: string) => void;\n  debounceMs?: number;\n  testID?: string;\n}\n\nexport function TextareaAutogrow(props: IProps): JSX.Element {\n  const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n  const [value, setValue] = useState(props.value);\n\n  const debouncedOnChangeText = useMemo(() => {\n    if (props.onChangeText && props.debounceMs) {\n      return debounce(props.onChangeText, props.debounceMs);\n    }\n    return props.onChangeText;\n  }, [props.onChangeText, props.debounceMs]);\n\n  useEffect(() => {\n    if (textareaRef.current) {\n      textareaRef.current.style.height = \"auto\";\n      textareaRef.current.style.height = value ? `${textareaRef.current.scrollHeight}px` : \"1rem\";\n    }\n  }, [value]);\n\n  const handleChange = (event: React.FormEvent<HTMLTextAreaElement>): void => {\n    const target = event.target as HTMLTextAreaElement;\n    setValue(target.value);\n    if (debouncedOnChangeText) {\n      debouncedOnChangeText(target.value);\n    }\n  };\n\n  const { onChangeText, debounceMs, className, value: _value, testID, ...otherProps } = props;\n\n  return (\n    <textarea\n      ref={textareaRef}\n      value={value}\n      onInput={handleChange}\n      className={`w-full text-sm bg-transparent border-none resize-none outline-none placeholder-gray-500 ${props.className}`}\n      {...otherProps}\n      style={{\n        height: \"auto\", // Ensures it's dynamically set\n        minHeight: \"1.5rem\", // This is the height of one line of text based on 16px font size\n      }}\n    />\n  );\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable, Animated, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { TimeUtils_formatHH, TimeUtils_formatMM } from \"../utils/time\";\nimport { IconPlay } from \"./icons/iconPlay\";\nimport { IconPause } from \"./icons/iconPause\";\nimport { IIntervals } from \"../types\";\nimport { History_workoutTime, History_isPaused } from \"../models/history\";\n\ninterface IProps {\n  startTime: number;\n  endTime?: number;\n  intervals?: IIntervals;\n  onPauseResume: () => void;\n}\n\nexport function Timer(props: IProps): JSX.Element {\n  const intervalId = useRef<ReturnType<typeof setInterval> | undefined>(undefined);\n  const [, setTick] = useState<number>(0);\n  const blinkOpacity = useRef(new Animated.Value(1)).current;\n\n  useEffect(() => {\n    if (intervalId.current != null) {\n      clearInterval(intervalId.current);\n    }\n    intervalId.current = setInterval(() => {\n      setTick((t) => t + 1);\n    }, 1000);\n    return () => {\n      if (intervalId.current != null) {\n        clearInterval(intervalId.current);\n      }\n    };\n  }, []);\n\n  const workoutTime = History_workoutTime({\n    startTime: props.startTime,\n    endTime: props.endTime,\n    intervals: props.intervals,\n  });\n  const isPaused = History_isPaused(props.intervals);\n\n  useEffect(() => {\n    if (isPaused) {\n      blinkOpacity.setValue(1);\n      return;\n    }\n    const animation = Animated.loop(\n      Animated.sequence([\n        Animated.timing(blinkOpacity, { toValue: 0.3, duration: 500, useNativeDriver: Platform.OS !== \"web\" }),\n        Animated.timing(blinkOpacity, { toValue: 1, duration: 500, useNativeDriver: Platform.OS !== \"web\" }),\n      ])\n    );\n    animation.start();\n    return () => animation.stop();\n  }, [isPaused, blinkOpacity]);\n\n  return (\n    <View className=\"flex-row items-center\" style={{ marginLeft: -8 }}>\n      <Pressable className=\"px-1\" onPress={props.onPauseResume}>\n        {isPaused ? <IconPlay color=\"#607284\" size={16} /> : <IconPause color=\"#607284\" size={16} />}\n      </Pressable>\n      <Text className={`text-sm font-semibold ${isPaused ? \"text-text-error\" : \"text-text-success\"}`}>\n        {TimeUtils_formatHH(workoutTime)}\n        <Animated.Text style={{ opacity: blinkOpacity }}>:</Animated.Text>\n        {TimeUtils_formatMM(workoutTime)} h\n      </Text>\n    </View>\n  );\n}\n","import { JSX, useCallback, useEffect, useRef } from \"react\";\nimport { Animated, Pressable, Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { lb } from \"lens-shmens\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState, updateState } from \"../models/state\";\n\ninterface IProps {\n  toast?: string;\n  dispatch: IDispatch;\n}\n\n// App-level transient toast, driven by state.toast. Auto-dismisses; pointerEvents none so it never\n// blocks taps. Rendered at the app root so it survives the navigation that follows the action.\nexport function Toast(props: IProps): JSX.Element | null {\n  const { toast, dispatch } = props;\n  const insets = useSafeAreaInsets();\n  const opacity = useRef(new Animated.Value(0)).current;\n  const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const useNativeDriver = Platform.OS !== \"web\";\n\n  const dismiss = useCallback(() => {\n    if (timerRef.current != null) {\n      clearTimeout(timerRef.current);\n      timerRef.current = undefined;\n    }\n    Animated.timing(opacity, { toValue: 0, duration: 250, useNativeDriver }).start(() => {\n      updateState(dispatch, [lb<IState>().p(\"toast\").record(undefined)], \"Dismiss toast\");\n    });\n  }, [opacity, dispatch, useNativeDriver]);\n\n  useEffect(() => {\n    if (toast == null) {\n      return;\n    }\n    opacity.setValue(0);\n    Animated.timing(opacity, { toValue: 1, duration: 200, useNativeDriver }).start();\n    timerRef.current = setTimeout(dismiss, 2500);\n    return () => {\n      if (timerRef.current != null) {\n        clearTimeout(timerRef.current);\n      }\n    };\n  }, [toast, opacity, useNativeDriver, dismiss]);\n\n  if (toast == null) {\n    return null;\n  }\n\n  return (\n    // box-none: the full-width container passes taps through to the screen behind, but the pill\n    // itself is tappable to dismiss immediately.\n    <Animated.View\n      pointerEvents=\"box-none\"\n      style={{\n        position: \"absolute\",\n        left: 0,\n        right: 0,\n        bottom: (insets.bottom || 12) + 16,\n        alignItems: \"center\",\n        opacity,\n      }}\n    >\n      <Pressable\n        className=\"px-4 py-3 rounded-xl bg-background-darkgray min-h-scaled-16 flex-row items-center justify-center opacity-95\"\n        style={{ width: \"90%\" }}\n        data-testid=\"toast\"\n        testID=\"toast\"\n        onPress={dismiss}\n      >\n        <Text className=\"text-sm font-semibold text-center text-text-alwayswhite\" numberOfLines={2}>\n          {toast}\n        </Text>\n      </Pressable>\n    </Animated.View>\n  );\n}\n","import { View } from \"react-native\";\nimport { TextRaw as Text } from \"../primitives/text\";\nimport { ITourConfig } from \"./tourTypes\";\nimport { IPlannerProgram } from \"../../types\";\nimport { IconDayTextMode } from \"../icons/iconDayTextMode\";\nimport { Link } from \"../link\";\nimport { PlannerCodeBlock } from \"../../pages/planner/components/plannerCodeBlock\";\nimport { IconEdit2 } from \"../icons/iconEdit2\";\nimport { IconUiMode } from \"../icons/iconUiMode\";\nimport { getCurrentScreenData } from \"../../navigation/navigationService\";\nimport { IState } from \"../../models/state\";\n\nconst paraCn = \"text-sm leading-relaxed text-text-secondary\";\n\nfunction getPlannerFromState(state: IState): IPlannerProgram | undefined {\n  const screenData = state.tour?.screenData ?? getCurrentScreenData();\n  const programId = screenData?.name === \"editProgram\" ? screenData.params?.programId : undefined;\n  if (!programId) {\n    return undefined;\n  }\n  const editProgramState = state.editProgramStates[programId];\n  return editProgramState?.current?.program?.planner;\n}\n\nfunction isProgramEmpty(state: Parameters<NonNullable<ITourConfig[\"shouldStart\"]>>[0]): boolean {\n  const planner = getPlannerFromState(state);\n  if (!planner) {\n    return true;\n  }\n  return planner.weeks.every((week) => week.days.every((day) => !day.exerciseText.trim()));\n}\n\nexport const programTourConfig: ITourConfig = {\n  id: \"program\",\n  shouldStart: (state) => {\n    return getCurrentScreenData()?.name === \"editProgram\" && state.storage.history.length < 4;\n  },\n  steps: [\n    {\n      id: \"structure\",\n      title: \"Program structure\",\n      dino: \"programtourstructure.png\",\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            Programs consist of <Text className=\"font-bold\">weeks</Text> (or just 1 week for simple programs). Each week\n            has <Text className=\"font-bold\">days</Text> (workouts). Each day has{\" \"}\n            <Text className=\"font-bold\">exercises</Text>.\n          </Text>\n          <Text className={`mb-2 ${paraCn}`}>\n            For periodized programs, you can have multiple weeks with different rep schemes that cycle through.\n          </Text>\n          <Text className={paraCn}>\n            When you finish last week and day, it <Text className=\"font-bold\">loops back</Text> to the beginning -\n            keeping all your progress and weight increases.\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"updates\",\n      title: \"How programs update\",\n      dino: \"programtourupdate.png\",\n      content: () => (\n        <Text className={paraCn}>\n          After you finish a workout, the program <Text className=\"font-bold\">updates itself</Text> based on program's\n          progression logic and your performance and moves to the next day.\n        </Text>\n      ),\n    },\n    {\n      id: \"text\",\n      title: \"Programs are text\",\n      dino: \"programtourtext.png\",\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            Under the hood, programs are just text using a special syntax called{\" \"}\n            <Text className=\"font-bold\">Liftoscript</Text>.\n          </Text>\n          <View className=\"flex-row flex-wrap items-center\">\n            <Text className={paraCn}>You can use the UI to create and edit them, or use the </Text>\n            <View className=\"mx-1\">\n              <IconDayTextMode />\n            </View>\n            <Text className={`${paraCn} font-bold`}>mode</Text>\n            <Text className={paraCn}> to edit that </Text>\n            <Text className={`${paraCn} font-bold`}>Liftoscript</Text>\n            <Text className={paraCn}> text on a phone, or edit the text in the </Text>\n            <Text className={`${paraCn} font-bold`}>web editor</Text>\n            <Text className={paraCn}> on your laptop for more control.</Text>\n          </View>\n        </>\n      ),\n    },\n    {\n      id: \"liftoscript\",\n      title: \"Liftoscript\",\n      dino: \"programtourliftoscript.png\",\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            <Text className=\"font-bold\">Liftoscript</Text> is a simple declarative language that controls your program\n            logic - progression, deloads, rep schemes, and more.\n          </Text>\n          <Text className={`mb-2 ${paraCn}`}>A simple example:</Text>\n          <View className=\"p-2 mb-2 rounded bg-background-cardsecondary\">\n            <PlannerCodeBlock script={\"Squat / 3x8 100lb / progress: lp(5lb)\"} />\n          </View>\n          <Text className={`mb-2 ${paraCn}`}>\n            This defines Squat for 3 sets of 8 reps at 100lb, with linear progression adding 5lb when you hit all reps.\n          </Text>\n          <Text className={paraCn}>\n            <Link href=\"https://www.liftosaur.com/doc/liftoscript\">Read the full Liftoscript docs</Link> to learn more.\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"addExercise\",\n      title: \"Adding exercises\",\n      dino: \"programtouradd.png\",\n      condition: (state) => isProgramEmpty(state),\n      content: () => (\n        <View className=\"flex-row flex-wrap items-center\">\n          <Text className={paraCn}>To add your first exercise - switch to </Text>\n          <Text className={`${paraCn} font-bold`}>Edit</Text>\n          <Text className={paraCn}>, then to </Text>\n          <View className=\"mx-1\">\n            <IconUiMode />\n          </View>\n          <Text className={paraCn}> (UI Mode) and tap </Text>\n          <Text className={`${paraCn} font-bold`}>\"Add Exercise\"</Text>\n          <Text className={paraCn}> and search for one - like </Text>\n          <Text className={`${paraCn} font-bold`}>Bench Press</Text>\n          <Text className={paraCn}>.</Text>\n        </View>\n      ),\n    },\n    {\n      id: \"editExercise\",\n      title: \"Editing exercises\",\n      dino: \"programtouredit.png\",\n      condition: (state) => !isProgramEmpty(state),\n      content: () => (\n        <View className=\"flex-row flex-wrap items-center\">\n          <Text className={paraCn}>To edit an exercise in UI Mode, tap the </Text>\n          <Text className={`${paraCn} font-bold`}>Edit</Text>\n          <Text className={paraCn}>, then </Text>\n          <View className=\"mx-1\">\n            <IconUiMode />\n          </View>\n          <Text className={paraCn}> (UI Mode), and then - </Text>\n          <View className=\"mx-1\">\n            <IconEdit2 />\n          </View>\n          <Text className={paraCn}> on the right pane of the exercise.</Text>\n        </View>\n      ),\n    },\n    {\n      id: \"playground\",\n      title: \"Playground\",\n      dino: \"programtourplayground.png\",\n      condition: (state) => !isProgramEmpty(state),\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            Use the <Text className=\"font-bold\">Playground</Text> tab to test your program before you start training.\n            You can simulate finishing workouts and see how reps, weights, and sets change over time.\n          </Text>\n          <Text className={paraCn}>\n            Everything in the Playground is <Text className=\"font-bold\">ephemeral</Text> - it doesn't affect your real\n            workouts, settings, or program. It's a safe sandbox to verify your progressions work as planned.\n          </Text>\n        </>\n      ),\n    },\n  ],\n};\n","import { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { IState, ITourId, updateState } from \"../../models/state\";\nimport { getCurrentScreenData } from \"../../navigation/navigationService\";\nimport { Tour_stepHelpFlag } from \"./tourTypes\";\nimport { workoutTourConfig } from \"./workoutTourConfig\";\nimport { programTourConfig } from \"./programTourConfig\";\n\nexport const tourConfigs: Record<ITourId, import(\"./tourTypes\").ITourConfig> = {\n  workout: workoutTourConfig,\n  program: programTourConfig,\n};\n\nexport function Tour_start(dispatch: IDispatch, tourId: ITourId): void {\n  updateState(\n    dispatch,\n    [lb<IState>().p(\"tour\").record({ id: tourId, enforced: true, screenData: getCurrentScreenData() })],\n    \"Start tour from navbar\"\n  );\n}\n\nexport function TourConfigs_findTourId(state: IState, checkSeen?: boolean): ITourId | undefined {\n  for (const config of Object.values(tourConfigs)) {\n    if (config.shouldStart?.(state)) {\n      for (const step of config.steps) {\n        const helpId = Tour_stepHelpFlag(config.id, step.id);\n        const alreadySeen = state.storage.helps.includes(helpId);\n        if ((!checkSeen || !alreadySeen) && (!step.condition || step.condition(state))) {\n          return config.id;\n        }\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function TourConfigs_imagesForCurrentScreen(state: IState): string[] {\n  const tourId = TourConfigs_findTourId(state, true);\n  if (!tourId) {\n    return [];\n  }\n  return tourConfigs[tourId].steps.map((s) => `/images/${s.dino}`);\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, Pressable, Image } from \"react-native\";\nimport { TextRaw as Text } from \"../primitives/text\";\nimport { SvgUri } from \"react-native-svg\";\nimport { Svg, Path, SvgXml } from \"../primitives/svg\";\nimport { Tour_stepHelpFlag } from \"./tourTypes\";\nimport { Button } from \"../button\";\nimport { IState, IStateTour } from \"../../models/state\";\nimport { IconCloseCircleOutline } from \"../icons/iconCloseCircleOutline\";\nimport { tourConfigs } from \"./tourConfigs\";\nimport { ImagePreloader_preload, ImagePreloader_uri } from \"../../utils/imagePreloader\";\nimport { HostConfig_resolveUrl } from \"../../utils/hostConfig\";\nimport { BundledImages_svgXml } from \"../../utils/bundledImages\";\n\ninterface ITourModalProps {\n  stateTour: IStateTour;\n  state: IState;\n  onClose: () => void;\n  onStepSeen: (stepId: string) => void;\n}\n\nfunction isStepActive(\n  stateTour: IStateTour,\n  step: (typeof tourConfigs)[keyof typeof tourConfigs][\"steps\"][number],\n  helps: string[],\n  state: IState\n): boolean {\n  const conditionMet = !step.condition || step.condition(state);\n  const alreadySeen = helps.includes(Tour_stepHelpFlag(stateTour.id, step.id));\n  return conditionMet && (stateTour.enforced || !alreadySeen);\n}\n\nfunction DinoImage({ filename, height }: { filename: string; height: number }): JSX.Element {\n  const path = `/images/${filename}`;\n  if (filename.endsWith(\".svg\")) {\n    const bundledXml = BundledImages_svgXml(path);\n    if (bundledXml) {\n      return <SvgXml xml={bundledXml} width={200} height={height} />;\n    }\n    return <SvgUri uri={HostConfig_resolveUrl(path)} width={200} height={height} />;\n  }\n  return <Image source={{ uri: ImagePreloader_uri(path) }} style={{ height, width: 200, resizeMode: \"contain\" }} />;\n}\n\nexport function TourModalContent(props: ITourModalProps): JSX.Element | null {\n  const { state, onClose, onStepSeen } = props;\n  const { id, enforced } = props.stateTour;\n  const config = tourConfigs[id];\n  const [helps] = useState(state.storage.helps);\n  const activeSteps = enforced\n    ? config.steps\n    : config.steps.filter((step) => isStepActive(props.stateTour, step, helps, state));\n  const [currentIndex, setCurrentIndex] = useState(0);\n  const [isPaused, setIsPaused] = useState(false);\n  const seenRef = useRef<Set<string>>(new Set());\n\n  const currentStep = activeSteps[currentIndex];\n  const isFirstStep = currentIndex === 0;\n  const isLastStep = currentIndex === activeSteps.length - 1;\n  const canProceed = !currentStep?.waitFor || currentStep.waitFor(state);\n\n  useEffect(() => {\n    for (const step of config.steps) {\n      ImagePreloader_preload(`/images/${step.dino}`);\n    }\n  }, []);\n\n  useEffect(() => {\n    if (currentStep && !seenRef.current.has(currentStep.id)) {\n      seenRef.current.add(currentStep.id);\n      const flag = Tour_stepHelpFlag(config.id, currentStep.id);\n      onStepSeen(flag);\n    }\n  }, [currentStep?.id]);\n\n  const handleClose = (): void => {\n    for (const step of activeSteps) {\n      if (!seenRef.current.has(step.id)) {\n        seenRef.current.add(step.id);\n        onStepSeen(Tour_stepHelpFlag(config.id, step.id));\n      }\n    }\n    onClose();\n  };\n\n  const handleNext = (): void => {\n    if (config.waitForNextTrigger?.(currentStep.id, state)) {\n      setIsPaused(true);\n      return;\n    }\n\n    if (isLastStep) {\n      onClose();\n    } else {\n      setCurrentIndex((i) => i + 1);\n    }\n  };\n\n  const handlePrev = (): void => {\n    if (!isFirstStep) {\n      setCurrentIndex((i) => i - 1);\n    }\n  };\n\n  useEffect(() => {\n    if (!isPaused && !currentStep) {\n      handleClose();\n    }\n  }, [currentStep, isPaused]);\n\n  if (isPaused || !currentStep) {\n    return null;\n  }\n\n  return (\n    <View>\n      <View className=\"relative pb-6 bg-background-cardyellow\">\n        {activeSteps.length > 1 ? (\n          <View className=\"flex-row gap-1.5 pl-4 pt-5 pb-3 pr-12\">\n            {activeSteps.map((_, i) => (\n              <View\n                key={i}\n                className={`h-2 flex-1 rounded-full ${i <= currentIndex ? \"bg-background-yellowdark\" : \"bg-color-yellow300\"}`}\n              />\n            ))}\n          </View>\n        ) : (\n          <View className=\"h-10\" />\n        )}\n\n        <Pressable\n          className=\"absolute z-10 p-1 nm-tour-close\"\n          testID=\"tour-close\"\n          style={{ top: 8, right: 8 }}\n          onPress={handleClose}\n        >\n          <IconCloseCircleOutline size={24} />\n        </Pressable>\n\n        <View className=\"flex-row items-center justify-center px-8\" style={{ height: 120 }}>\n          <DinoImage filename={currentStep.dino} height={120} />\n        </View>\n\n        <Svg\n          style={{ position: \"absolute\", bottom: 0, left: 0, width: \"100%\", height: 24 }}\n          viewBox=\"0 0 340 24\"\n          fill=\"none\"\n          preserveAspectRatio=\"none\"\n        >\n          <Path d=\"M0 24 C85 0, 255 0, 340 24 L340 24 L0 24 Z\" className=\"fill-background-default\" />\n        </Svg>\n      </View>\n\n      <View className=\"px-6 pb-6 bg-background-default\">\n        <Text className=\"mb-3 text-xl font-bold text-center text-text-primary\">{currentStep.title}</Text>\n\n        <View className=\"mb-5\">{currentStep.content(state)}</View>\n\n        <View className=\"flex-row gap-3\">\n          {activeSteps.length > 1 && (\n            <Button\n              name=\"tour-prev\"\n              kind=\"lightgrayv3\"\n              buttonSize=\"lg2\"\n              className=\"flex-1\"\n              onClick={handlePrev}\n              disabled={isFirstStep}\n            >\n              {\"← Back\"}\n            </Button>\n          )}\n          <Button\n            name=\"tour-next\"\n            kind=\"orange\"\n            buttonSize=\"lg2\"\n            className=\"flex-1\"\n            onClick={handleNext}\n            disabled={!canProceed}\n          >\n            {isLastStep ? \"Done\" : \"Next →\"}\n          </Button>\n        </View>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { IState, ITourId } from \"../../models/state\";\n\nexport interface ITourStep {\n  id: string;\n  title: string;\n  content: (state: IState) => JSX.Element;\n  dino: string;\n  condition?: (state: IState) => boolean;\n  waitFor?: (state: IState) => boolean;\n}\n\nexport interface ITourConfig {\n  id: ITourId;\n  steps: ITourStep[];\n  shouldStart?: (state: IState) => boolean;\n  waitForNextTrigger?: (stepId: string, state: IState) => boolean;\n}\n\nexport function Tour_stepHelpFlag(configId: string, stepId: string): string {\n  return `${configId}.${stepId}`;\n}\n","import { View } from \"react-native\";\nimport { TextRaw as Text } from \"../primitives/text\";\nimport { ITourConfig } from \"./tourTypes\";\nimport {\n  Program_isEmpty,\n  Program_uses1RM,\n  Program_usesRPE,\n  Program_runExerciseFinishDayScript,\n  Program_getProgramExerciseForKeyAndDay,\n  Program_getDiffState,\n  Program_getDiffVars,\n  Program_getEvaluatedProgramFromState,\n} from \"../../models/program\";\nimport { Progress_getCurrentProgress } from \"../../models/progress\";\nimport { getCurrentScreenData } from \"../../navigation/navigationService\";\nimport { Weight_eqNull } from \"../../models/weight\";\nimport { IconCog2 } from \"../icons/iconCog2\";\nimport { Reps_isFinished } from \"../../models/set\";\nimport { PlannerProgramExercise_getState } from \"../../pages/planner/models/plannerProgramExercise\";\nimport { ObjectUtils_isNotEmpty } from \"../../utils/object\";\n\nconst paraCn = \"text-sm leading-relaxed text-text-secondary\";\n\nexport const workoutTourConfig: ITourConfig = {\n  id: \"workout\",\n  shouldStart: (state) => {\n    const screen = getCurrentScreenData()?.name;\n    if (screen !== \"progress\") {\n      return false;\n    }\n    if (state.storage.history.length >= 4) {\n      return false;\n    }\n    const progress = Progress_getCurrentProgress(state);\n    if (!progress || progress.entries.length === 0) {\n      return false;\n    }\n    const evaluatedProgram = Program_getEvaluatedProgramFromState(state);\n    return evaluatedProgram != null && !Program_isEmpty(evaluatedProgram);\n  },\n  steps: [\n    {\n      id: \"howItWorks\",\n      title: \"How Liftosaur works\",\n      dino: \"dinocoach.svg\",\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            Your <Text className=\"font-bold\">program</Text> is the plan - it decides your exercises, sets, reps, and\n            weights.\n          </Text>\n          <Text className={`mb-2 ${paraCn}`}>\n            Each <Text className=\"font-bold\">workout</Text> is generated from that program. When you{\" \"}\n            <Text className=\"font-bold\">finish</Text>, the app runs the program's logic to update the program - like\n            bumping weights if you hit all your reps.\n          </Text>\n          <Text className={paraCn}>\n            Changes you make during a workout (e.g. going heavier or less reps) are just for today - they don't change\n            the program.\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"completingSets\",\n      title: \"Completing sets\",\n      dino: \"firstworkouttoursets.png\",\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            Each set has a <Text className=\"font-bold\">target</Text> prescribed by the program (reps and weight), and\n            what you actually <Text className=\"font-bold\">complete</Text>. Set what you completed in the reps / weight\n            fields. If what you completed = what's prefilled in the fields, just tap the checkmark button.\n          </Text>\n          <Text className={`mb-2 ${paraCn}`}>\n            <Text className=\"font-bold text-text-success\">Green</Text> = you hit the target. But green doesn't\n            necessarily mean the program will progress - that depends on the program's logic.\n          </Text>\n          <Text className={paraCn}>\n            Based on what was the target and what you complete, programs decide how to{\" \"}\n            <Text className=\"font-bold\">adjust</Text> - e.g. increase weight, change reps, or keep things the same.\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"swipeSets\",\n      title: \"Adjusting sets\",\n      dino: \"firstworkouttourswipe.png\",\n      condition: (state) => state.storage.history.length >= 1,\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            <Text className=\"font-bold\">Tap a set</Text> to expand it, then tap the{\" \"}\n            <Text className=\"font-bold\">pencil</Text> to change its <Text className=\"font-bold\">target</Text> reps and\n            weight, or to delete it.\n          </Text>\n          <Text className={paraCn}>\n            These changes only affect <Text className=\"font-bold\">this workout</Text> - they won't modify your program.\n            To change the program itself, use <Text className=\"font-bold\">\"Edit Program Exercise\"</Text> from the\n            exercise menu.\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"whatIs1RM\",\n      title: \"What is 1RM?\",\n      dino: \"firstworkouttour1rm.png\",\n      condition: (state) => {\n        const evaluatedProgram = Program_getEvaluatedProgramFromState(state);\n        return evaluatedProgram != null && Program_uses1RM(evaluatedProgram);\n      },\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            This program uses <Text className=\"font-bold\">percentage-based weights</Text>. That means the weights are\n            calculated as a percentage of your <Text className=\"font-bold\">1 Rep Max (1RM)</Text> - the heaviest weight\n            you can lift once.\n          </Text>\n          <Text className={paraCn}>\n            You can set your 1RMs by tapping on <Text className=\"font-bold\">1RM</Text> under the exercise name\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"whatIsRPE\",\n      title: \"What is RPE?\",\n      dino: \"firstworkouttourrpe.png\",\n      condition: (state) => {\n        const evaluatedProgram = Program_getEvaluatedProgramFromState(state);\n        return evaluatedProgram != null && Program_usesRPE(evaluatedProgram);\n      },\n      content: () => (\n        <>\n          <Text className={`mb-2 ${paraCn}`}>\n            This program uses <Text className=\"font-bold\">RPE (Rate of Perceived Exertion)</Text> - a 1-10 scale of how\n            hard a set feels.\n          </Text>\n          <Text className={paraCn}>\n            RPE 10 = absolute max effort, nothing left. RPE 8 = you could do 2 more reps. Some programs may also ask\n            what was your \"completed\" RPE - and the difference could be used for progression logic.\n          </Text>\n        </>\n      ),\n    },\n    {\n      id: \"equipment\",\n      title: \"Equipment & rounding\",\n      dino: \"firstworkouttourequipment.png\",\n      condition: (state) => {\n        const progress = Progress_getCurrentProgress(state);\n        const currentEntry = progress?.entries[progress.currentEntryIndex ?? 0];\n        return currentEntry?.sets.some((w) => !Weight_eqNull(w.originalWeight, w.weight)) || false;\n      },\n      content: () => (\n        <Text className={paraCn}>\n          If you have a <Text className=\"line-through\">crossed-out weight</Text> in your target - that's{\" \"}\n          <Text className=\"font-bold\">rounding</Text>. The app adjusts the program's exact weight to match what you can\n          actually load with your equipment. You can fine-tune this in <Text className=\"font-bold\">Equipment</Text>{\" \"}\n          settings.\n        </Text>\n      ),\n    },\n    {\n      id: \"editingProgram\",\n      title: \"Editing program exercise\",\n      dino: \"firstworkouttouredit.png\",\n      content: () => (\n        <View className=\"flex-row flex-wrap items-center\">\n          <View>\n            <Text className={paraCn}>Want to tweak the exercise in the program? Tap the </Text>\n          </View>\n          <View className=\"inline-block mx-1\">\n            <IconCog2 size={18} />\n          </View>\n          <Text className={`${paraCn} font-bold`}>menu</Text>\n          <Text className={paraCn}> and select </Text>\n          <Text className={`${paraCn} font-bold`}>\"Edit Program Exercise\"</Text>\n          <Text className={paraCn}> to change sets, reps, weights, or progression rules for the program exercise.</Text>\n        </View>\n      ),\n    },\n    {\n      id: \"progressionPreview\",\n      title: \"Progression preview\",\n      dino: \"firstworkouttourprogress.png\",\n      condition: (state) => {\n        const progress = Progress_getCurrentProgress(state);\n        if (!progress || progress.entries.length === 0) {\n          return false;\n        }\n        const program = Program_getEvaluatedProgramFromState(state);\n        if (!program) {\n          return false;\n        }\n        const entry = progress.entries[progress.currentEntryIndex ?? 0];\n        const isFinished = Reps_isFinished(entry.sets);\n        if (!isFinished) {\n          return false;\n        }\n        const programExercise = entry.programExerciseId\n          ? Program_getProgramExerciseForKeyAndDay(program, progress.day, entry.programExerciseId)\n          : undefined;\n        if (!programExercise) {\n          return false;\n        }\n        const dayData = programExercise.dayData;\n        const settings = state.storage.settings;\n        const stateVars = PlannerProgramExercise_getState(programExercise);\n        const { units } = settings;\n        const userPromptedStateVars = progress.userPromptedStateVars?.[programExercise.key];\n        const result = Program_runExerciseFinishDayScript(\n          entry,\n          dayData,\n          settings,\n          stateVars,\n          program.states,\n          programExercise,\n          state.storage.stats,\n          userPromptedStateVars\n        );\n        if (result.success) {\n          const { state: newState, updates, bindings } = result.data;\n          const diffState = Program_getDiffState(stateVars, newState, units);\n          const diffVars = Program_getDiffVars(entry, updates, bindings, settings);\n          const prints = result.data.prints;\n\n          if (ObjectUtils_isNotEmpty(diffState) || ObjectUtils_isNotEmpty(diffVars) || prints.length > 0) {\n            return true;\n          }\n        }\n        return false;\n      },\n      content: () => (\n        <Text className={paraCn}>\n          When you finished all the sets, if the program exercise has progression, you'll see the{\" \"}\n          <Text className=\"font-bold\">progression preview</Text> under the sets. It shows how this program exercise will\n          adjust when you finish a workout.\n        </Text>\n      ),\n    },\n  ],\n};\n","import { JSX, useCallback, useEffect, useRef } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IHistoryRecord } from \"../types\";\nimport { DateUtils_formatYYYYMMDD } from \"../utils/date\";\nimport { History_getDateToHistory } from \"../models/history\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Progress_isCurrent } from \"../models/progress\";\nimport { IWeekCalendarPagerHandle, WeekCalendarPager } from \"./weekCalendarPager\";\n\ninterface IWeekCalendarProps {\n  firstDayOfWeeks: number[];\n  firstDayOfWeekToHistoryRecord: Partial<Record<number, IHistoryRecord>>;\n  selectedFirstDayOfWeek: number;\n  selectedWeekCalendarFirstDayOfWeek: number;\n  isLoading: boolean;\n  startWeekFromMonday?: boolean;\n  onSelectFirstDayOfWeek: (week: number) => void;\n  onClick: () => void;\n  history: IHistoryRecord[];\n}\n\nexport function WeekCalendar(props: IWeekCalendarProps): JSX.Element {\n  const pagerRef = useRef<IWeekCalendarPagerHandle>(null);\n  const dateToHistory = History_getDateToHistory(props.history);\n  const selectedIndex = props.firstDayOfWeeks.findIndex((date) => date === props.selectedFirstDayOfWeek);\n  const selectedWeekCalendarIndex = props.firstDayOfWeeks.findIndex(\n    (date) => date === props.selectedWeekCalendarFirstDayOfWeek\n  );\n\n  const firstDayOfWeeksRef = useRef(props.firstDayOfWeeks);\n  firstDayOfWeeksRef.current = props.firstDayOfWeeks;\n  const onSelectFirstDayOfWeekRef = useRef(props.onSelectFirstDayOfWeek);\n  onSelectFirstDayOfWeekRef.current = props.onSelectFirstDayOfWeek;\n\n  useEffect(() => {\n    if (selectedIndex >= 0) {\n      pagerRef.current?.scrollToIndex(selectedIndex, false);\n    }\n  }, [selectedIndex]);\n\n  const handlePageChange = useCallback((index: number) => {\n    const firstDayOfWeek = firstDayOfWeeksRef.current[index];\n    if (firstDayOfWeek != null) {\n      onSelectFirstDayOfWeekRef.current(firstDayOfWeek);\n    }\n  }, []);\n\n  const renderPage = useCallback(\n    (firstDayOfWeek: number) => (\n      <Pressable onPress={props.onClick}>\n        <View className=\"flex-row justify-around w-full\">\n          {getWeekDays(firstDayOfWeek, dateToHistory, props.startWeekFromMonday).map((day, idx) => (\n            <View key={idx} className=\"items-center justify-center\">\n              <Text className=\"text-xs text-text-secondary\">{day.dayName}</Text>\n              <View\n                className={`items-center justify-center w-scaled-8 h-scaled-8 rounded-full ${\n                  day.record && !Progress_isCurrent(day.record) ? \"bg-background-error\" : \"\"\n                } ${day.isToday ? \"border border-button-primarybackground\" : \"\"}`}\n              >\n                <Text\n                  className={`text-sm ${\n                    day.record && !Progress_isCurrent(day.record) ? \"text-text-alwayswhite\" : \"text-text-primary\"\n                  } ${day.isToday ? \"font-bold\" : \"\"}`}\n                >\n                  {day.dayNumber}\n                </Text>\n              </View>\n            </View>\n          ))}\n        </View>\n      </Pressable>\n    ),\n    [dateToHistory, props.startWeekFromMonday, props.onClick]\n  );\n\n  return (\n    <View className=\"relative flex-row items-center justify-center w-full bg-background-default\">\n      {props.isLoading ? (\n        <View className=\"absolute\" style={{ left: 8, top: 28 }}>\n          <IconSpinner width={12} height={12} />\n        </View>\n      ) : null}\n      {selectedWeekCalendarIndex > 0 && (\n        <View className=\"absolute top-0 left-0 z-10\">\n          <Pressable\n            className=\"p-3\"\n            onPress={() => pagerRef.current?.scrollToIndex(selectedWeekCalendarIndex - 1, true)}\n          >\n            <View style={{ transform: [{ rotate: \"180deg\" }] }}>\n              <IconArrowRight width={5} height={9} />\n            </View>\n          </Pressable>\n        </View>\n      )}\n      {selectedWeekCalendarIndex < props.firstDayOfWeeks.length - 1 && (\n        <View className=\"absolute top-0 right-0 z-10\">\n          <Pressable\n            className=\"p-2\"\n            onPress={() => pagerRef.current?.scrollToIndex(selectedWeekCalendarIndex + 1, true)}\n          >\n            <IconArrowRight width={5} height={9} />\n          </Pressable>\n        </View>\n      )}\n      <View className=\"flex-1\">\n        <View className=\"py-2 mx-4\">\n          <WeekCalendarPager\n            ref={pagerRef}\n            data={props.firstDayOfWeeks}\n            initialIndex={selectedIndex >= 0 ? selectedIndex : 0}\n            onPageChange={handlePageChange}\n            renderPage={renderPage}\n          />\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IWeekDay {\n  record?: IHistoryRecord;\n  date: Date;\n  isToday: boolean;\n  dayNumber: number;\n  dayName: string;\n}\n\nconst getWeekDays = (\n  startDate: number,\n  dateToHistory: Partial<Record<string, IHistoryRecord>>,\n  startWeekFromMonday?: boolean\n): IWeekDay[] => {\n  const days = [];\n  const dayNames = startWeekFromMonday ? [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"] : [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"];\n  for (let i = 0; i < 7; i++) {\n    const date = new Date(startDate);\n    date.setDate(date.getDate() + i);\n    const formatted = DateUtils_formatYYYYMMDD(date);\n    days.push({\n      record: dateToHistory[formatted],\n      date,\n      isToday: DateUtils_formatYYYYMMDD(date) === DateUtils_formatYYYYMMDD(new Date()),\n      dayNumber: date.getDate(),\n      dayName: dayNames[i],\n    });\n  }\n  return days;\n};\n","import { JSX, forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from \"react\";\nimport { View, LayoutChangeEvent, StyleProp, ViewStyle } from \"react-native\";\n\nexport interface IWeekCalendarPagerHandle {\n  scrollToIndex: (index: number, animated?: boolean) => void;\n}\n\nexport interface IWeekCalendarPagerProps {\n  data: number[];\n  initialIndex: number;\n  onPageChange: (index: number) => void;\n  renderPage: (firstDayOfWeek: number) => JSX.Element;\n}\n\nconst containerStyle = {\n  flexDirection: \"row\",\n  overflowX: \"auto\",\n  overflowY: \"hidden\",\n  scrollSnapType: \"x mandatory\",\n  WebkitOverflowScrolling: \"touch\",\n} as unknown as StyleProp<ViewStyle>;\n\nconst pageWrapperBaseStyle = {\n  flexShrink: 0,\n  scrollSnapAlign: \"center\",\n  scrollSnapStop: \"always\",\n};\n\nexport const WeekCalendarPager = forwardRef<IWeekCalendarPagerHandle, IWeekCalendarPagerProps>(\n  function WeekCalendarPager(props, ref) {\n    const { data, initialIndex, onPageChange, renderPage } = props;\n    const [pageWidth, setPageWidth] = useState(0);\n    const [node, setNode] = useState<HTMLElement | null>(null);\n    const pageWidthRef = useRef(0);\n    pageWidthRef.current = pageWidth;\n    const lastEmittedIndexRef = useRef<number>(-1);\n    const initialIndexRef = useRef(initialIndex);\n    initialIndexRef.current = initialIndex;\n    const onPageChangeRef = useRef(onPageChange);\n    onPageChangeRef.current = onPageChange;\n    const programmaticScrollUntilRef = useRef(0);\n\n    const setContainerRef = useCallback((el: View | null) => {\n      setNode((el as unknown as HTMLElement | null) ?? null);\n    }, []);\n\n    const performScroll = useCallback(\n      (index: number, animated: boolean): void => {\n        const el = node;\n        const width = pageWidthRef.current;\n        if (!el || width <= 0 || index < 0) {\n          return;\n        }\n        programmaticScrollUntilRef.current = Date.now() + (animated ? 600 : 120);\n        lastEmittedIndexRef.current = index;\n        try {\n          el.scrollTo({ left: index * width, behavior: animated ? \"smooth\" : \"auto\" });\n        } catch {\n          el.scrollLeft = index * width;\n        }\n      },\n      [node]\n    );\n\n    useImperativeHandle(\n      ref,\n      () => ({\n        scrollToIndex: (index, animated = false) => {\n          if (index === lastEmittedIndexRef.current) {\n            return;\n          }\n          performScroll(index, animated);\n        },\n      }),\n      [performScroll]\n    );\n\n    const handleLayout = useCallback((event: LayoutChangeEvent) => {\n      const width = event.nativeEvent.layout.width;\n      if (width > 0 && width !== pageWidthRef.current) {\n        setPageWidth(width);\n      }\n    }, []);\n\n    useLayoutEffect(() => {\n      if (!node || pageWidth <= 0) {\n        return;\n      }\n      const idx = lastEmittedIndexRef.current >= 0 ? lastEmittedIndexRef.current : initialIndexRef.current;\n      if (idx < 0) {\n        return;\n      }\n      programmaticScrollUntilRef.current = Date.now() + 120;\n      lastEmittedIndexRef.current = idx;\n      node.scrollLeft = idx * pageWidth;\n    }, [node, pageWidth]);\n\n    useEffect(() => {\n      if (!node) {\n        return;\n      }\n      const onScroll = (): void => {\n        const width = pageWidthRef.current;\n        if (width <= 0) {\n          return;\n        }\n        if (Date.now() < programmaticScrollUntilRef.current) {\n          return;\n        }\n        const idx = Math.round(node.scrollLeft / width);\n        if (idx !== lastEmittedIndexRef.current) {\n          lastEmittedIndexRef.current = idx;\n          onPageChangeRef.current(idx);\n        }\n      };\n      node.addEventListener(\"scroll\", onScroll, { passive: true });\n      return () => node.removeEventListener(\"scroll\", onScroll);\n    }, [node]);\n\n    return (\n      <View ref={setContainerRef} onLayout={handleLayout} style={containerStyle}>\n        {pageWidth > 0 &&\n          data.map((firstDayOfWeek) => (\n            <View\n              key={firstDayOfWeek}\n              style={{ ...pageWrapperBaseStyle, width: pageWidth } as unknown as StyleProp<ViewStyle>}\n            >\n              {renderPage(firstDayOfWeek)}\n            </View>\n          ))}\n      </View>\n    );\n  }\n);\n","import { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IHistoryRecord, ISettings, ISubscription } from \"../types\";\nimport { WeekInsightsUtils_calculateSetResults } from \"../utils/weekInsightsUtils\";\nimport { IconFire } from \"./icons/iconFire\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { LinkButton } from \"./linkButton\";\nimport { IPersonalRecords, History_getNumberOfPersonalRecords } from \"../models/history\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { ISetResults } from \"../pages/planner/models/types\";\nimport { PlannerWeekMuscles } from \"../pages/planner/components/plannerWeekMuscles\";\nimport { colorPctValue, PlannerSetSplit } from \"../pages/planner/components/plannerStats\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { PersonalRecords } from \"./personalRecords\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { IconCrown } from \"./icons/iconCrown\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { DateUtils_firstDayOfWeekTimestamp, DateUtils_formatRange } from \"../utils/date\";\nimport { Muscle_getMuscleGroupName } from \"../models/muscle\";\nimport { navigateToModal } from \"../navigation/navigationService\";\n\ninterface IWeekInsightsProps {\n  prs: IPersonalRecords;\n  thisWeekHistory: IHistoryRecord[];\n  lastWeekHistory: IHistoryRecord[];\n  selectedFirstDayOfWeek: number;\n  settings: ISettings;\n  subscription: ISubscription;\n  dispatch: IDispatch;\n}\n\nexport function WeekInsights(props: IWeekInsightsProps): JSX.Element {\n  const isCurrentWeek =\n    DateUtils_firstDayOfWeekTimestamp(new Date(), props.settings.startWeekFromMonday) === props.selectedFirstDayOfWeek;\n\n  const setResults = WeekInsightsUtils_calculateSetResults(props.thisWeekHistory, props.settings);\n  const lastSetResults = WeekInsightsUtils_calculateSetResults(props.lastWeekHistory, props.settings);\n  const numberOfPrs = History_getNumberOfPersonalRecords(props.thisWeekHistory, props.prs);\n  const historyRecord = props.thisWeekHistory[0];\n  if (!historyRecord) {\n    return <View />;\n  }\n\n  if (!Subscriptions_hasSubscription(props.subscription)) {\n    return (\n      <Pressable\n        className=\"w-full px-3 py-2 border border-border-cardyellow bg-background-cardyellow rounded-b-xl\"\n        onPress={() => {\n          props.dispatch(Thunk_pushScreen(\"subscription\"));\n        }}\n      >\n        <View className=\"flex-row items-center h-scaled-8 gap-1\" style={{ marginBottom: 3 }}>\n          <IconCrown size={16} color={Tailwind_colors().yellow[600]} />\n          <Text className=\"text-sm font-semibold text-icon-yellow\" style={{ marginTop: 3 }}>\n            See Week Insights\n          </Text>\n        </View>\n      </Pressable>\n    );\n  }\n\n  const startTs = props.selectedFirstDayOfWeek;\n  const endRange = new Date(startTs);\n  endRange.setDate(endRange.getDate() + 6);\n  const formattedRange = DateUtils_formatRange(startTs, endRange);\n\n  return (\n    <View className=\"w-full py-2 border border-border-cardyellow bg-background-cardyellow rounded-b-xl\">\n      <View className=\"px-3\">\n        <View className=\"flex-row gap-4\">\n          <View className=\"flex-row items-center gap-1\">\n            <IconFire size={16} color={Tailwind_colors().yellow[600]} />\n            <Text className=\"text-sm font-semibold\" style={{ marginTop: 3 }}>\n              {formattedRange}\n            </Text>\n          </View>\n          <View className=\"ml-auto\">\n            <LinkButton\n              name=\"toggle-week-insights\"\n              className=\"text-sm\"\n              onPress={() =>\n                navigateToModal(\"weekInsightsDetailsModal\", {\n                  selectedFirstDayOfWeek: props.selectedFirstDayOfWeek,\n                })\n              }\n            >\n              Show More\n            </LinkButton>\n          </View>\n        </View>\n        <View className=\"flex-row justify-between mt-1\" style={{ marginLeft: 2 }}>\n          <WeekInsightsProperty\n            value={Math.round(setResults.volume.value)}\n            unit={setResults.volume.unit}\n            increment={!isCurrentWeek ? Math.round(setResults.volume.value - lastSetResults.volume.value) : undefined}\n          />\n          <WeekInsightsProperty\n            value={setResults.total}\n            hasPadding={true}\n            unit={StringUtils_pluralize(\"set\", setResults.total)}\n            increment={!isCurrentWeek ? setResults.total - lastSetResults.total : undefined}\n          />\n          <WeekInsightsProperty\n            icon={<Text>{\"\\u{1F3C6}\"} </Text>}\n            hasPadding={true}\n            value={numberOfPrs}\n            unit={StringUtils_pluralize(\"PR\", numberOfPrs)}\n          />\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IWeekInsightsPropertyProps {\n  icon?: JSX.Element;\n  value: string | number;\n  hasPadding?: boolean;\n  increment?: number;\n  unit?: string;\n}\n\nfunction WeekInsightsProperty(props: IWeekInsightsPropertyProps): JSX.Element {\n  return (\n    <Text>\n      {props.icon}\n      <Text className=\"text-base font-semibold\">{props.value}</Text>\n      {props.unit && (\n        <Text className={`text-xs text-text-secondary ${props.hasPadding ? \"ml-1\" : \"\"}`}>{props.unit}</Text>\n      )}\n      {props.increment && props.increment !== 0 ? (\n        <Text className={`${props.increment > 0 ? `text-text-success` : `text-text-error`} ml-1 text-xs font-semibold`}>\n          {props.increment > 0 ? \"+\" : \"\"}\n          {props.increment}\n        </Text>\n      ) : null}\n    </Text>\n  );\n}\n\nexport interface IWeekInsightsDetailsProps {\n  prs: IPersonalRecords;\n  thisWeekHistory: IHistoryRecord[];\n  setResults: ISetResults;\n  settings: ISettings;\n  onOpenPlannerSettings: () => void;\n}\n\nexport function WeekInsightsDetails(props: IWeekInsightsDetailsProps): JSX.Element {\n  const setResults = props.setResults;\n  const hasPersonalRecords = History_getNumberOfPersonalRecords(props.thisWeekHistory, props.prs) > 0;\n\n  return (\n    <View className=\"pt-2\" data-testid=\"week-insights-details\" testID=\"week-insights-details\">\n      {hasPersonalRecords && (\n        <View className=\"mb-4\">\n          <PersonalRecords historyRecords={props.thisWeekHistory} prs={props.prs} settings={props.settings} />\n        </View>\n      )}\n      <View className=\"mb-2\">\n        <Text className=\"text-sm font-semibold\">\n          {\"\\u{1F4AA}\"} {setResults.total} {StringUtils_pluralize(\"Set\", setResults.total)}\n        </Text>\n      </View>\n      <View>\n        <Text className=\"text-sm\">\n          <Text className=\"text-sm text-text-secondary\">Strength: </Text>\n          <Text\n            className={`text-sm ${colorPctValue(setResults.total, setResults.strength, props.settings.planner.strengthSetsPct)}`}\n          >\n            {setResults.strength}\n            {setResults.total > 0 ? `, ${Math.round((setResults.strength * 100) / setResults.total)}%` : \"\"}\n          </Text>\n        </Text>\n      </View>\n      <View>\n        <Text className=\"text-sm\">\n          <Text className=\"text-sm text-text-secondary\">Hypertrophy: </Text>\n          <Text\n            className={`text-sm ${colorPctValue(\n              setResults.total,\n              setResults.hypertrophy,\n              props.settings.planner.hypertrophySetsPct\n            )}`}\n          >\n            {setResults.hypertrophy}\n            {setResults.total > 0 ? `, ${Math.round((setResults.hypertrophy * 100) / setResults.total)}%` : \"\"}\n          </Text>\n        </Text>\n      </View>\n      <View className=\"flex-row mt-2\">\n        <View className=\"flex-1 gap-1\">\n          <Text className=\"text-sm\">\n            <Text className=\"text-sm text-text-secondary\">Upper:</Text>{\" \"}\n            <PlannerSetSplit\n              split={setResults.upper}\n              settings={props.settings}\n              shouldIncludeFrequency={true}\n              textSize=\"text-sm\"\n            />\n          </Text>\n          <Text className=\"text-sm\">\n            <Text className=\"text-sm text-text-secondary\">Lower:</Text>{\" \"}\n            <PlannerSetSplit\n              split={setResults.lower}\n              settings={props.settings}\n              shouldIncludeFrequency={true}\n              textSize=\"text-sm\"\n            />\n          </Text>\n          <Text className=\"text-sm\">\n            <Text className=\"text-sm text-text-secondary\">Core:</Text>{\" \"}\n            <PlannerSetSplit\n              split={setResults.core}\n              settings={props.settings}\n              shouldIncludeFrequency={true}\n              textSize=\"text-sm\"\n            />\n          </Text>\n        </View>\n        <View className=\"flex-1\">\n          <Text className=\"text-sm\">\n            <Text className=\"text-sm text-text-secondary\">Push:</Text>{\" \"}\n            <PlannerSetSplit\n              split={setResults.push}\n              settings={props.settings}\n              shouldIncludeFrequency={true}\n              textSize=\"text-sm\"\n            />\n          </Text>\n          <Text className=\"text-sm\">\n            <Text className=\"text-sm text-text-secondary\">Pull:</Text>{\" \"}\n            <PlannerSetSplit\n              split={setResults.pull}\n              settings={props.settings}\n              shouldIncludeFrequency={true}\n              textSize=\"text-sm\"\n            />\n          </Text>\n          <Text className=\"text-sm\">\n            <Text className=\"text-sm text-text-secondary\">Legs:</Text>{\" \"}\n            <PlannerSetSplit\n              split={setResults.legs}\n              settings={props.settings}\n              shouldIncludeFrequency={true}\n              textSize=\"text-sm\"\n            />\n          </Text>\n        </View>\n      </View>\n      <View className=\"flex-row items-center mt-2\">\n        <View className=\"flex-1\">\n          {ObjectUtils_keys(setResults.muscleGroup).map((muscleGroup) => {\n            return (\n              <Text key={muscleGroup} className=\"text-sm\">\n                <Text className=\"text-sm text-text-secondary\">\n                  {Muscle_getMuscleGroupName(muscleGroup, props.settings)}:\n                </Text>{\" \"}\n                <PlannerSetSplit\n                  split={setResults.muscleGroup[muscleGroup]}\n                  settings={props.settings}\n                  shouldIncludeFrequency={true}\n                  muscle={muscleGroup}\n                  textSize=\"text-sm\"\n                />\n              </Text>\n            );\n          })}\n        </View>\n        <View className=\"w-scaled-20 mb-2\">\n          <PlannerWeekMuscles settings={props.settings} data={setResults.muscleGroup} />\n        </View>\n      </View>\n      <View className=\"mt-2\">\n        <LinkButton\n          className=\"text-sm\"\n          name=\"week-insights-show-planner-settings\"\n          onPress={props.onOpenPlannerSettings}\n        >\n          Change Set Range Settings\n        </LinkButton>\n      </View>\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { ISet, ISettings, IExerciseType, IWeight } from \"../types\";\nimport { n } from \"../utils/math\";\nimport {\n  Weight_isPct,\n  Weight_display,\n  Weight_evaluateWeight,\n  Weight_convertTo,\n  Weight_calculatePlates,\n  Weight_formatOneSide,\n} from \"../models/weight\";\nimport { Exercise_onerm, Exercise_defaultRounding } from \"../models/exercise\";\nimport {\n  Equipment_getEquipmentDataForExerciseType,\n  Equipment_getEquipmentNameForExerciseType,\n  Equipment_getUnitOrDefaultForExerciseType,\n} from \"../models/equipment\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\n\ninterface IWeightRoundingInfoContentProps {\n  set: ISet;\n  exerciseType: IExerciseType;\n  settings: ISettings;\n}\n\nexport function WeightRoundingInfoContent(props: IWeightRoundingInfoContentProps): JSX.Element {\n  const { set, exerciseType, settings } = props;\n  const originalWeight = set.originalWeight;\n  const weight = set.weight;\n  const unit = Equipment_getUnitOrDefaultForExerciseType(settings, exerciseType);\n  const equipmentData = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n  const equipmentName = Equipment_getEquipmentNameForExerciseType(settings, exerciseType);\n  const evaluatedWeight =\n    originalWeight != null\n      ? Weight_convertTo(Weight_evaluateWeight(originalWeight, exerciseType, settings), unit)\n      : undefined;\n\n  return (\n    <View testID=\"weight-rounding-info\">\n      <Text className=\"pb-1 text-base font-bold\">Why is the weight adjusted?</Text>\n      {originalWeight != null && weight != null && (\n        <Text className=\"pb-3 text-lg\" testID=\"weight-rounding-headline\">\n          <Text className=\"text-lg line-through text-text-secondary\">{Weight_display(originalWeight)}</Text>\n          <Text className=\"text-lg text-text-secondary\"> → </Text>\n          <Text className=\"text-lg font-bold text-syntax-weight\">{Weight_display(weight)}</Text>\n        </Text>\n      )}\n      {Weight_isPct(originalWeight) && evaluatedWeight != null && (\n        <Text className=\"pb-2 text-sm\">\n          The program sets the target as a percentage of your 1RM:{\" \"}\n          <Text className=\"text-sm font-semibold text-syntax-weight\">{Weight_display(originalWeight)}</Text> of{\" \"}\n          <Text className=\"text-sm font-semibold text-syntax-weight\">\n            {Weight_display(Weight_convertTo(Exercise_onerm(exerciseType, settings), unit))}\n          </Text>{\" \"}\n          is <Text className=\"text-sm font-semibold text-syntax-weight\">{Weight_display(evaluatedWeight)}</Text>.\n        </Text>\n      )}\n      {!Weight_isPct(originalWeight) &&\n        originalWeight != null &&\n        originalWeight.unit !== unit &&\n        evaluatedWeight != null && (\n          <Text className=\"pb-2 text-sm\">\n            The program's weight is in <Text className=\"text-sm font-semibold\">{originalWeight.unit}</Text> — converted\n            to <Text className=\"text-sm font-semibold\">{unit}</Text> it's{\" \"}\n            <Text className=\"text-sm font-semibold text-syntax-weight\">{Weight_display(evaluatedWeight)}</Text>.\n          </Text>\n        )}\n      <Text className=\"pb-2 text-sm\">\n        The app adjusts the program's exact weight to match what you can actually load with your equipment.\n      </Text>\n      <WeightRoundingEquipmentExplanation\n        settings={settings}\n        exerciseType={exerciseType}\n        unit={unit}\n        targetWeight={evaluatedWeight ?? weight}\n        equipmentName={equipmentName}\n      />\n      {equipmentData?.isAssisting && (\n        <View className=\"p-3 mt-2 border rounded-lg border-border-cardyellow bg-background-cardyellow\">\n          <Text className=\"text-sm font-bold\">This equipment is marked as \"Is Assisting\".</Text>\n          <Text className=\"pt-1 text-sm\">\n            Added weight is <Text className=\"text-sm font-semibold\">subtracted</Text> from the total — like an assisted\n            pull-up machine, where more weight makes the exercise easier. That can make the working weight much lower\n            than the target, or even <Text className=\"text-sm font-semibold\">0</Text>. If that's not how{\" \"}\n            <Text className=\"text-sm font-bold\">{equipmentName ? `\"${equipmentName}\"` : \"this equipment\"}</Text> works,\n            turn off \"Is Assisting\" in the equipment settings.\n          </Text>\n        </View>\n      )}\n    </View>\n  );\n}\n\ninterface IWeightRoundingEquipmentExplanationProps {\n  settings: ISettings;\n  exerciseType: IExerciseType;\n  unit: IWeight[\"unit\"];\n  targetWeight?: IWeight;\n  equipmentName?: string;\n}\n\nfunction WeightRoundingEquipmentExplanation(props: IWeightRoundingEquipmentExplanationProps): JSX.Element {\n  const { settings, exerciseType, unit, targetWeight, equipmentName } = props;\n  const equipmentData = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n\n  if (equipmentData == null) {\n    const rounding = Exercise_defaultRounding(exerciseType, settings);\n    return (\n      <Text className=\"text-sm\">\n        This exercise has no equipment set up, so the weight is rounded to the nearest{\" \"}\n        <Text className=\"text-sm font-semibold text-syntax-weight\">\n          {n(rounding)}\n          {unit}\n        </Text>\n        . You can change the rounding or assign equipment in the exercise settings.\n      </Text>\n    );\n  }\n\n  const name = <Text className=\"text-sm font-bold\">{equipmentName ? `\"${equipmentName}\"` : \"This equipment\"}</Text>;\n\n  if (equipmentData.isFixed) {\n    const fixed = CollectionUtils_sort(\n      equipmentData.fixed.filter((w) => w.unit === (equipmentData.unit ?? unit)),\n      (a, b) => a.value - b.value\n    );\n    return (\n      <Text className=\"text-sm\">\n        {name} uses fixed weights\n        {fixed.length > 0 ? (\n          <>\n            : <Text className=\"text-sm font-semibold text-text-purple\">{fixed.map((w) => n(w.value)).join(\", \")}</Text>{\" \"}\n            <Text className=\"text-sm font-semibold text-text-purple\">{equipmentData.unit ?? unit}</Text>\n          </>\n        ) : (\n          \", but none are set up for your current unit\"\n        )}\n        . The app picks the heaviest one that doesn't exceed the target — or the lightest one, if they're all heavier.\n        You can edit the list in the equipment settings.\n      </Text>\n    );\n  }\n\n  const usesBodyweight = equipmentData.useBodyweightForBar && settings.currentBodyweight != null;\n  const barWeight = usesBodyweight && settings.currentBodyweight ? settings.currentBodyweight : equipmentData.bar[unit];\n  const platesResult = targetWeight ? Weight_calculatePlates(targetWeight, settings, unit, exerciseType) : undefined;\n  return (\n    <Text className=\"text-sm\">\n      {name} uses{\" \"}\n      {usesBodyweight ? (\n        <>\n          your bodyweight (<Text className=\"text-sm font-semibold text-syntax-weight\">{Weight_display(barWeight)}</Text>\n          ) as the base weight\n        </>\n      ) : (\n        <>\n          a <Text className=\"text-sm font-semibold text-syntax-weight\">{Weight_display(barWeight)}</Text> bar\n        </>\n      )}\n      {platesResult != null ? (\n        <>\n          {\" \"}\n          {equipmentData.isAssisting ? \"minus\" : \"plus\"} the plates you have available\n          {platesResult.plates.length > 0 ? (\n            <>\n              {\" \"}\n              (\n              <Text className=\"text-sm font-semibold text-text-purple\">\n                {Weight_formatOneSide(settings, platesResult.plates, exerciseType)}\n              </Text>{\" \"}\n              per side)\n            </>\n          ) : (\n            <Text className=\"text-sm text-text-purple\"> (no plates fit here)</Text>\n          )}\n          , so the closest loadable weight is{\" \"}\n          <Text className=\"text-sm font-semibold text-syntax-weight\">{Weight_display(platesResult.totalWeight)}</Text>\n        </>\n      ) : (\n        <> plus the plates you have available</>\n      )}\n      . You can edit the bar weight and available plates in the equipment settings.\n    </Text>\n  );\n}\n","import {\n  JSX,\n  ReactNode,\n  memo,\n  MutableRefObject,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport {\n  View,\n  LayoutChangeEvent,\n  Platform,\n  ScrollView,\n  useWindowDimensions,\n  Animated as RNAnimated,\n} from \"react-native\";\nimport Animated, { SharedValue, useAnimatedStyle, useSharedValue, withTiming } from \"react-native-reanimated\";\nimport { Pressable as StickyPressable } from \"./primitives/pressable\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  IHistoryEntry,\n  IHistoryRecord,\n  IHistoryRecordChange,\n  IProgram,\n  IProgramState,\n  ISettings,\n  IStats,\n  ISubscription,\n} from \"../types\";\nimport { updateProgress, updateState } from \"../models/state\";\nimport { IEvaluatedProgram, IEvaluatedProgramDay, Program_isEmpty } from \"../models/program\";\nimport { lb } from \"lens-shmens\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { TextareaAutogrow } from \"./textareaAutogrow\";\nimport {\n  Progress_lbProgress,\n  Progress_isCurrent,\n  Progress_editNotes,\n  Progress_getColorToSupersetGroup,\n  Progress_getNextSupersetEntry,\n} from \"../models/progress\";\nimport { IconPlus2 } from \"./icons/iconPlus2\";\nimport { History_buildPrevExerciseData, IPrevExerciseData } from \"../models/history\";\nimport { Exercise_get, Exercise_nameWithEquipment, Exercise_toKey } from \"../models/exercise\";\nimport {\n  IWorkoutStripLabelFadeRange,\n  WorkoutStripLabel_fadeRange,\n  WorkoutStripLabel_shadowRange,\n} from \"../utils/workoutStripLabel\";\nimport { NavScreenScrollContext } from \"../navigation/NavScreenScrollContext\";\nimport { WorkoutExercise } from \"./workoutExercise\";\nimport { WorkoutExercisePager } from \"./workoutExercisePager\";\nimport { Scroller, IScrollerHandle } from \"./scroller\";\nimport { WorkoutExerciseThumbnail } from \"./workoutExerciseThumbnail\";\nimport { WorkoutStripReveal_offset } from \"../utils/workoutStripReveal\";\nimport { Markdown } from \"./markdown\";\nimport { GridDragHandle } from \"./editProgram/editProgramGrid/gridDragHandle\";\nimport { IGridDragSession, useGridDragSession } from \"./editProgram/editProgramGrid/useGridDragSession\";\nimport { useGridDragAutoScroll } from \"./editProgram/editProgramGrid/gridDragAutoScroll\";\nimport {\n  WorkoutStripReorder_apply,\n  WorkoutStripReorder_dropIndex,\n  WorkoutStripReorder_shift,\n  WorkoutStripReorder_slots,\n} from \"../utils/workoutStripReorder\";\nimport { WorkoutHints_isLearned } from \"../utils/workoutHints\";\nimport { WorkoutHints_recordUseInState } from \"../utils/workoutHintsDispatch\";\nimport { useRem } from \"../utils/useRem\";\nimport { useEqual } from \"../utils/useEqual\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { PerfProbeSubtree } from \"../utils/perfProbeSubtree\";\nimport { NavScreenContent } from \"../navigation/NavScreenContent\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { WorkoutTabStopContext } from \"./workoutTabStopContext\";\nimport { IWorkoutProgressView } from \"../utils/workoutProgressView\";\nimport { WorkoutPagerHeightContext } from \"./workoutPagerHeightContext\";\nimport {\n  useFocusExpandedSet,\n  WorkoutCenterExpandedRow,\n  WorkoutExpandedRowsContext,\n  WorkoutFocusExpandedSetContext,\n} from \"./workoutCenterExpandedRow\";\n\ninterface IWorkoutViewProps {\n  history: IHistoryRecord[];\n  progress: IWorkoutProgressView;\n  allPrograms: IProgram[];\n  program?: IEvaluatedProgram;\n  programDay?: IEvaluatedProgramDay;\n  helps: string[];\n  stats: IStats;\n  isTimerShown: boolean;\n  subscription: ISubscription;\n  settings: ISettings;\n  dispatch: IDispatch;\n  renderHeaderMenu?: (onOpenChange: (isOpen: boolean) => void) => ReactNode;\n}\n\nfunction WorkoutInner(props: IWorkoutViewProps): JSX.Element {\n  usePerfRenderCount(\"Workout\");\n  const selectedEntry = props.progress.entries[props.progress.currentEntryIndex ?? 0];\n  const description = props.programDay?.description;\n  const forceUpdateEntryIndex = props.progress.forceUpdateEntryIndex;\n  const { width: windowWidth } = useWindowDimensions();\n  const currentEntryIndex = props.progress.currentEntryIndex ?? 0;\n  const trackClick = useTrackClick();\n\n  const [renderedIndices, setRenderedIndices] = useState<ReadonlySet<number>>(() => {\n    const s = new Set<number>();\n    for (let i = Math.max(0, currentEntryIndex - 1); i <= currentEntryIndex + 1; i++) {\n      s.add(i);\n    }\n    return s;\n  });\n  useEffect(() => {\n    setRenderedIndices((prev) => {\n      if (prev.has(currentEntryIndex - 1) && prev.has(currentEntryIndex) && prev.has(currentEntryIndex + 1)) {\n        return prev;\n      }\n      const next = new Set(prev);\n      for (let i = Math.max(0, currentEntryIndex - 1); i <= currentEntryIndex + 1; i++) {\n        next.add(i);\n      }\n      return next;\n    });\n  }, [currentEntryIndex]);\n\n  useEffect(() => {\n    if (props.program && Program_isEmpty(props.program) && props.progress.entries.length === 0) {\n      updateState(\n        props.dispatch,\n        [Progress_lbProgress(props.progress.id).pi(\"ui\", {}).p(\"exercisePicker\").record({})],\n        \"Open exercise picker on empty program\"\n      );\n    }\n  }, []);\n\n  const dispatch = props.dispatch;\n  const isExternal = props.progress.isExternal;\n\n  const onPagerIndexChange = useCallback(\n    (selectedIndex: number, isUserDriven?: boolean): void => {\n      if (selectedIndex === currentEntryIndex) {\n        return;\n      }\n      if (!isExternal || isUserDriven) {\n        updateProgress(\n          dispatch,\n          [\n            lb<IHistoryRecord>().p(\"currentEntryIndex\").record(selectedIndex),\n            lb<IHistoryRecord>().pi(\"ui\", {}).p(\"isExternal\").record(false),\n          ],\n          \"scroll-exercise-tab\"\n        );\n      } else {\n        updateProgress(\n          dispatch,\n          [\n            lb<IHistoryRecord>().pi(\"ui\", {}).p(\"isExternal\").record(false),\n            lb<IHistoryRecord>()\n              .pi(\"ui\", {})\n              .p(\"forceUpdateEntryIndex\")\n              .recordModify((v) => !v),\n          ],\n          \"scroll-exercise-tab-external\"\n        );\n      }\n    },\n    [dispatch, currentEntryIndex, isExternal]\n  );\n\n  const onClickThumbnail = useCallback(\n    (entryIndex: number) => {\n      trackClick(\"workout-tab-thumbnail\", undefined, { from: currentEntryIndex, to: entryIndex });\n      updateProgress(\n        dispatch,\n        [\n          lb<IHistoryRecord>().p(\"currentEntryIndex\").record(entryIndex),\n          lb<IHistoryRecord>()\n            .pi(\"ui\", {})\n            .p(\"forceUpdateEntryIndex\")\n            .recordModify((v) => !v),\n        ],\n        \"click-exercise-tab\"\n      );\n    },\n    [dispatch, trackClick, currentEntryIndex]\n  );\n\n  const onPagerSettled = useCallback(\n    (settledIndex: number) => {\n      trackClick(\"workout-swipe-exercise\", undefined, { to: settledIndex });\n    },\n    [trackClick]\n  );\n\n  const impressionsSeenRef = useRef<Set<string>>(new Set());\n  const [expandedRows] = useState(() => new Map<number, View>());\n  const focusExpandedSet = useFocusExpandedSet(expandedRows, currentEntryIndex);\n\n  const progressId = props.progress.id;\n  const otherStates = props.program?.states;\n  const progressEntries = props.progress.entries;\n  const supersetByEntryId = useMemo(() => {\n    const map = new Map<string, IHistoryEntry | undefined>();\n    for (const entry of progressEntries) {\n      map.set(entry.id, Progress_getNextSupersetEntry(progressEntries, entry));\n    }\n    return map;\n  }, [progressEntries]);\n  // Build the \"previous workout\" lookup for every exercise once, here, instead of letting each\n  // exercise card scan the whole history on its own mount frame (the dominant workout-screen mount\n  // jank for large histories). Keyed on history identity, so it survives set completions.\n  const { programId, day, week, dayInWeek } = props.progress;\n  const sameDay = useMemo(() => ({ programId, day, week, dayInWeek }), [programId, day, week, dayInWeek]);\n  // A string keeps its identity when a set completion rebuilds `entries` with the same exercises.\n  const exerciseKeysJoined = progressEntries.map((entry) => Exercise_toKey(entry.exercise)).join(\"\\n\");\n  const exerciseKeys = useMemo(() => new Set(exerciseKeysJoined.split(\"\\n\")), [exerciseKeysJoined]);\n  const prevExerciseData = useMemo(\n    () => History_buildPrevExerciseData(props.history, props.progress.startTime, sameDay, exerciseKeys),\n    [props.history, props.progress.startTime, sameDay, exerciseKeys]\n  );\n  const isCurrentProgress = Progress_isCurrent(props.progress);\n  const titleNodeRef = useRef<View | null>(null);\n  const [titleLayoutNonce, setTitleLayoutNonce] = useState(0);\n  const onTitleLayout = useCallback((title: View) => {\n    titleNodeRef.current = title;\n    setTitleLayoutNonce((n) => n + 1);\n  }, []);\n  const [pagerContainerTop, setPagerContainerTop] = useState(0);\n  const pagerContainerTopRef = useRef(0);\n  const onPagerContainerLayout = useCallback((e: LayoutChangeEvent) => {\n    const top = e.nativeEvent.layout.y;\n    if (pagerContainerTopRef.current === top) {\n      return;\n    }\n    pagerContainerTopRef.current = top;\n    setPagerContainerTop(top);\n    setTitleLayoutNonce((n) => n + 1);\n  }, []);\n  const selectedExerciseName =\n    selectedEntry != null\n      ? Exercise_nameWithEquipment(Exercise_get(selectedEntry.exercise, props.settings.exercises), props.settings)\n      : \"\";\n  const progressStartTime = props.progress.startTime;\n  const progressUserPromptedStateVars = props.progress.userPromptedStateVars;\n  const progressDay = props.progress.day;\n  const showReorderHint = props.progress.entries.length > 1 && !WorkoutHints_isLearned(props.helps, \"workout-reorder\");\n\n  return (\n    <WorkoutExpandedRowsContext.Provider value={expandedRows}>\n      <WorkoutFocusExpandedSetContext.Provider value={focusExpandedSet}>\n        <NavScreenContent stickyHeaderIndices={[2]}>\n          <WorkoutHeader\n            description={description}\n            progress={props.progress}\n            dispatch={props.dispatch}\n            showNotes={!!props.settings.workoutSettings.showWorkoutNotes}\n            renderMenu={props.renderHeaderMenu}\n          />\n          <View>\n            {showReorderHint && (\n              <Text className=\"px-4 pt-1 text-xs text-text-secondary\" testID=\"workout-reorder-hint\">\n                Long-tap a thumbnail to reorder\n              </Text>\n            )}\n          </View>\n          <WorkoutThumbnailsStrip\n            progress={props.progress}\n            dispatch={props.dispatch}\n            settings={props.settings}\n            subscription={props.subscription}\n            helps={props.helps}\n            onClick={onClickThumbnail}\n            label={selectedExerciseName}\n            titleNodeRef={titleNodeRef}\n            titleLayoutNonce={titleLayoutNonce}\n            pagerContainerTop={pagerContainerTop}\n          />\n          <View className=\"pb-8\" onLayout={onPagerContainerLayout}>\n            <WorkoutCenterExpandedRow\n              pageChangeToggle={forceUpdateEntryIndex}\n              entryIndex={currentEntryIndex}\n              entryId={selectedEntry?.id}\n            />\n            {selectedEntry != null && (\n              <View className=\"mt-2\">\n                <PerfProbeSubtree id=\"workout-list\">\n                  <WorkoutExercisePager\n                    currentEntryIndex={currentEntryIndex}\n                    currentEntryId={selectedEntry.id}\n                    entryCount={progressEntries.length}\n                    windowWidth={windowWidth}\n                    forceUpdateEntryIndex={forceUpdateEntryIndex}\n                    onIndexChange={onPagerIndexChange}\n                    onSettledIndex={onPagerSettled}\n                  >\n                    {progressEntries.map((entry, entryIndex) => (\n                      <WorkoutExercisePage\n                        key={entry.id}\n                        entry={entry}\n                        entryIndex={entryIndex}\n                        isCurrentPage={entryIndex === currentEntryIndex}\n                        tabStopIndex={entryIndex < currentEntryIndex ? -1 : 0}\n                        impressionsSeenRef={impressionsSeenRef}\n                        shouldRender={renderedIndices.has(entryIndex)}\n                        windowWidth={windowWidth}\n                        day={progressDay}\n                        stats={props.stats}\n                        history={props.history}\n                        otherStates={otherStates}\n                        program={props.program}\n                        programDay={props.programDay}\n                        progressId={progressId}\n                        progressStartTime={progressStartTime}\n                        userPromptedStateVars={progressUserPromptedStateVars}\n                        supersetEntry={supersetByEntryId.get(entry.id)}\n                        prevData={prevExerciseData[Exercise_toKey(entry.exercise)]}\n                        isCurrentProgress={isCurrentProgress}\n                        helps={props.helps}\n                        subscription={props.subscription}\n                        settings={props.settings}\n                        dispatch={dispatch}\n                        onTitleLayout={onTitleLayout}\n                      />\n                    ))}\n                  </WorkoutExercisePager>\n                </PerfProbeSubtree>\n              </View>\n            )}\n          </View>\n        </NavScreenContent>\n      </WorkoutFocusExpandedSetContext.Provider>\n    </WorkoutExpandedRowsContext.Provider>\n  );\n}\n\nexport const Workout = memo(WorkoutInner);\n\ninterface IWorkoutExercisePageProps {\n  entry: IHistoryEntry;\n  entryIndex: number;\n  isCurrentPage: boolean;\n  tabStopIndex: 0 | -1;\n  impressionsSeenRef: MutableRefObject<Set<string>>;\n  shouldRender: boolean;\n  windowWidth: number;\n  day: number;\n  stats: IStats;\n  history: IHistoryRecord[];\n  otherStates: IEvaluatedProgram[\"states\"] | undefined;\n  program?: IEvaluatedProgram;\n  programDay?: IEvaluatedProgramDay;\n  progressId: number;\n  progressStartTime: number;\n  userPromptedStateVars?: Partial<Record<string, IProgramState>>;\n  supersetEntry?: IHistoryEntry;\n  prevData?: IPrevExerciseData;\n  isCurrentProgress: boolean;\n  helps: string[];\n  subscription: ISubscription;\n  settings: ISettings;\n  dispatch: IDispatch;\n  onTitleLayout?: (title: View) => void;\n}\n\nfunction WorkoutExercisePageInner(props: IWorkoutExercisePageProps): JSX.Element {\n  usePerfRenderCount(\"WorkoutExercisePage\");\n  const { entryIndex } = props;\n  const reportPageHeight = useContext(WorkoutPagerHeightContext);\n  const onLayout = useCallback(\n    (e: LayoutChangeEvent) => reportPageHeight?.(entryIndex, e.nativeEvent.layout.height),\n    [entryIndex, reportPageHeight]\n  );\n  const pageStyle =\n    Platform.OS === \"web\"\n      ? ({ width: props.windowWidth, transform: \"translateZ(0)\" } as object)\n      : { width: props.windowWidth };\n  return (\n    <View style={pageStyle}>\n      <View onLayout={reportPageHeight ? onLayout : undefined}>\n        {props.shouldRender ? (\n          <WorkoutTabStopContext.Provider value={props.tabStopIndex}>\n            <WorkoutExercise\n              day={props.day}\n              stats={props.stats}\n              history={props.history}\n              otherStates={props.otherStates}\n              entryIndex={props.entryIndex}\n              isCurrentPage={props.isCurrentPage}\n              impressionsSeenRef={props.impressionsSeenRef}\n              program={props.program}\n              programDay={props.programDay}\n              progressId={props.progressId}\n              progressStartTime={props.progressStartTime}\n              userPromptedStateVars={props.userPromptedStateVars}\n              supersetEntry={props.supersetEntry}\n              prevData={props.prevData}\n              isCurrentProgress={props.isCurrentProgress}\n              showHelp={true}\n              helps={props.helps}\n              entry={props.entry}\n              subscription={props.subscription}\n              settings={props.settings}\n              dispatch={props.dispatch}\n              onTitleLayout={props.isCurrentPage ? props.onTitleLayout : undefined}\n            />\n          </WorkoutTabStopContext.Provider>\n        ) : null}\n      </View>\n    </View>\n  );\n}\n\nconst WorkoutExercisePage = memo(WorkoutExercisePageInner);\n\ninterface IWorkoutHeaderProps {\n  progress: IWorkoutProgressView;\n  dispatch: IDispatch;\n  description?: string;\n  showNotes: boolean;\n  renderMenu?: (onOpenChange: (isOpen: boolean) => void) => ReactNode;\n}\n\nfunction WorkoutHeaderInner(props: IWorkoutHeaderProps): JSX.Element {\n  usePerfRenderCount(\"WorkoutHeader\");\n  const [isMenuOpen, setIsMenuOpen] = useState(false);\n  const menu = props.renderMenu?.(setIsMenuOpen);\n  return (\n    <View className=\"px-4\" style={Platform.OS === \"web\" && isMenuOpen ? { zIndex: 50 } : undefined}>\n      <View className=\"flex-row items-center\">\n        <View className=\"flex-1\">\n          <Text className=\"text-sm font-semibold\">{props.progress?.dayName}</Text>\n          <Text data-testid=\"day-name\" testID=\"day-name\" className=\"text-sm text-text-secondary\">\n            {props.progress?.programName}\n          </Text>\n        </View>\n        {menu != null && <View className=\"-mr-2\">{menu}</View>}\n      </View>\n      {props.description && (\n        <View className={`mt-1 ${props.progress.notes ? \"border-b border-background-subtle mb-1 pb-1\" : \"\"}`}>\n          <Markdown value={props.description} />\n        </View>\n      )}\n      {props.showNotes && (\n        <View>\n          <TextareaAutogrow\n            data-testid=\"workout-notes-input\"\n            testID=\"workout-notes-input\"\n            id=\"workout-notes\"\n            debounceMs={1000}\n            maxLength={4095}\n            name=\"workout-notes\"\n            placeholder=\"Add workout notes here...\"\n            value={props.progress.notes}\n            onChangeText={(text) => {\n              Progress_editNotes(props.dispatch, props.progress.id, text);\n            }}\n            className=\"mt-1\"\n          />\n        </View>\n      )}\n    </View>\n  );\n}\n\nconst WorkoutHeader = memo(WorkoutHeaderInner);\n\ninterface IWorkoutThumbnailsStripProps {\n  progress: IWorkoutProgressView;\n  onClick: (index: number) => void;\n  dispatch: IDispatch;\n  settings: ISettings;\n  subscription: ISubscription;\n  helps: string[];\n  label: string;\n  titleNodeRef: MutableRefObject<View | null>;\n  titleLayoutNonce: number;\n  pagerContainerTop: number;\n}\n\ninterface IWorkoutStripTileProps {\n  index: number;\n  entry: IHistoryEntry;\n  colorToSupersetGroup: Partial<Record<string, IHistoryEntry[]>>;\n  isCurrent: boolean;\n  currentSuperset?: string;\n  settings: ISettings;\n  onSelect: (index: number) => void;\n  session: IGridDragSession;\n  originRef: MutableRefObject<number>;\n  slots: SharedValue<Record<string, number>>;\n  dragId: SharedValue<string>;\n  originSlot: SharedValue<number>;\n  dropSlot: SharedValue<number>;\n  dragTranslation: SharedValue<number>;\n  isSettling: SharedValue<boolean>;\n  pitch: number;\n  isDragging: boolean;\n  onMeasure: (e: LayoutChangeEvent) => void;\n}\n\nconst DRAGGING_TILE_SCALE = 1.12;\nconst TILE_MOVE_MS = 120;\n\n// Why tiles are absolutely positioned from a slot map: lambda/scripts/archdocs/workout-screen.md,\n// \"Strip reorder\".\nfunction WorkoutStripTileInner(props: IWorkoutStripTileProps): JSX.Element {\n  const { index, session, originRef, slots, dragId, originSlot, dropSlot, dragTranslation, pitch, onSelect } = props;\n  const { isSettling } = props;\n  const id = props.entry.id;\n  const onDragStart = useCallback(\n    (absolute: number) => {\n      originRef.current = index;\n      originSlot.value = index;\n      dragId.value = id;\n      session.onDragStart(absolute);\n    },\n    [index, id, session, originRef, originSlot, dragId]\n  );\n  const onTap = useCallback(() => onSelect(index), [onSelect, index]);\n  const style = useAnimatedStyle(() => {\n    const isActive = dragId.value === id;\n    const slot = slots.value[id] ?? index;\n    const rest = slot * pitch + WorkoutStripReorder_shift(slot, originSlot.value, dropSlot.value, pitch);\n    const isMoving = dragId.value !== \"\" || isSettling.value;\n    let translateX: number;\n    if (isActive) {\n      translateX = originSlot.value * pitch + dragTranslation.value;\n    } else if (isMoving) {\n      translateX = withTiming(rest, { duration: TILE_MOVE_MS }, (finished) => {\n        if (finished) {\n          isSettling.value = false;\n        }\n      });\n    } else {\n      translateX = rest;\n    }\n    return {\n      transform: [\n        { translateX },\n        { scale: withTiming(isActive ? DRAGGING_TILE_SCALE : 1, { duration: TILE_MOVE_MS }) },\n      ],\n    };\n  });\n  return (\n    <Animated.View style={[{ position: \"absolute\", left: 0, top: 0, zIndex: props.isDragging ? 10 : 0 }, style]}>\n      <GridDragHandle\n        axis=\"x\"\n        onDragStart={onDragStart}\n        onDragMove={session.onDragMove}\n        onDragEnd={session.onDragEnd}\n        onTap={onTap}\n      >\n        <View onLayout={props.onMeasure}>\n          <WorkoutExerciseThumbnail\n            colorToSupersetGroup={props.colorToSupersetGroup}\n            shouldShowProgress={true}\n            isCurrent={props.isCurrent}\n            currentSuperset={props.currentSuperset}\n            settings={props.settings}\n            entry={props.entry}\n            entryIndex={index}\n          />\n        </View>\n      </GridDragHandle>\n    </Animated.View>\n  );\n}\n\nconst WorkoutStripTile = memo(WorkoutStripTileInner);\n\nfunction WorkoutThumbnailsStripInner(props: IWorkoutThumbnailsStripProps): JSX.Element {\n  usePerfRenderCount(\"WorkoutThumbnailsStrip\");\n  const trackClick = useTrackClick();\n  const { onClick, dispatch, helps, titleNodeRef, titleLayoutNonce } = props;\n  const scrollCtx = useContext(NavScreenScrollContext);\n  const scrollAnimatedY = scrollCtx?.scrollAnimatedY;\n  const stickyHeaderHeight = scrollCtx?.stickyHeaderHeight ?? 0;\n  const currentEntryIndexForLabel = props.progress.currentEntryIndex ?? 0;\n  const [labelFadeRange, setLabelFadeRange] = useState<IWorkoutStripLabelFadeRange | undefined>(undefined);\n  useEffect(() => {\n    const title = titleNodeRef.current;\n    const viewport = scrollCtx?.viewportRef.current;\n    if (title == null || viewport == null) {\n      return;\n    }\n    title.measureInWindow((_tx, titleWindowTop, _tw, titleHeight) => {\n      viewport.measureInWindow((_vx, viewportWindowTop) => {\n        setLabelFadeRange(\n          WorkoutStripLabel_fadeRange({\n            titleWindowTop,\n            titleHeight,\n            viewportWindowTop,\n            scrollY: scrollCtx?.scrollYRef.current ?? 0,\n            stripHeight: stickyHeaderHeight,\n          })\n        );\n      });\n    });\n  }, [scrollCtx, titleNodeRef, titleLayoutNonce, currentEntryIndexForLabel, stickyHeaderHeight]);\n  const labelOpacity = useMemo(\n    () =>\n      scrollAnimatedY != null && labelFadeRange != null\n        ? scrollAnimatedY.interpolate({\n            inputRange: [labelFadeRange.start, labelFadeRange.end],\n            outputRange: [0, 1],\n            extrapolate: \"clamp\",\n          })\n        : 0,\n    [scrollAnimatedY, labelFadeRange]\n  );\n  const shadowRange = WorkoutStripLabel_shadowRange(props.pagerContainerTop, stickyHeaderHeight);\n  const shadowOpacity = useMemo(\n    () =>\n      scrollAnimatedY != null\n        ? scrollAnimatedY.interpolate({\n            inputRange: [shadowRange.start, shadowRange.end],\n            outputRange: [0, 1],\n            extrapolate: \"clamp\",\n          })\n        : 0,\n    [scrollAnimatedY, shadowRange.start, shadowRange.end]\n  );\n  const progressId = props.progress.id;\n  const colorToSupersetGroup = useEqual(\n    useMemo(() => Progress_getColorToSupersetGroup(props.progress), [props.progress])\n  );\n  const currentEntryIndex = props.progress.currentEntryIndex ?? 0;\n  const currentEntry = props.progress.entries[currentEntryIndex];\n  const currentSuperset = currentEntry?.superset;\n  const thumbScrollerRef = useRef<IScrollerHandle>(null);\n  const remValue = useRem();\n\n  const scrollViewRef = useRef<ScrollView>(null);\n  const viewportRef = useRef<View>(null);\n  const horizontalOffsetRef = useRef(0);\n  const contentWidthRef = useRef(0);\n  const viewportWidthRef = useRef(0);\n  const maxHorizontalScroll = useCallback(() => Math.max(0, contentWidthRef.current - viewportWidthRef.current), []);\n  const autoScroll = useGridDragAutoScroll({\n    horizontalRef: scrollViewRef,\n    horizontalViewportRef: viewportRef,\n    horizontalOffsetRef,\n    maxHorizontalScroll,\n  });\n  const slots = useSharedValue<Record<string, number>>({});\n  const dragId = useSharedValue(\"\");\n  const originSlot = useSharedValue(-1);\n  const dropSlot = useSharedValue(-1);\n  const dragTranslation = useSharedValue(0);\n  const isSettling = useSharedValue(false);\n  const originRef = useRef(-1);\n  const [draggingIndex, setDraggingIndex] = useState(-1);\n  const [tileBox, setTileBox] = useState<{ width: number; height: number } | undefined>(undefined);\n  const gap = Math.round(remValue / 4);\n  const pitch = (tileBox?.width ?? 4 * remValue + 2) + gap;\n  const stripHeight = tileBox?.height ?? 4 * remValue + 2;\n  const pitchRef = useRef(pitch);\n  pitchRef.current = pitch;\n  const entryIds = props.progress.entries.map((e) => e.id);\n  const entryIdsRef = useRef(entryIds);\n  entryIdsRef.current = entryIds;\n  const entryOrderKey = entryIds.join(\",\");\n  useEffect(() => {\n    slots.value = WorkoutStripReorder_slots(entryIdsRef.current);\n  }, [entryOrderKey, slots]);\n  const countRef = useRef(props.progress.entries.length);\n  countRef.current = props.progress.entries.length;\n  const onMeasureTile = useCallback((e: LayoutChangeEvent) => {\n    const { width, height } = e.nativeEvent.layout;\n    setTileBox((prev) =>\n      prev != null && prev.width === width && prev.height >= height\n        ? prev\n        : { width, height: Math.max(prev?.height ?? 0, height) }\n    );\n  }, []);\n\n  const prevEntriesLengthRef = useRef(props.progress.entries.length);\n  useEffect(() => {\n    const prev = prevEntriesLengthRef.current;\n    const curr = props.progress.entries.length;\n    if (curr > prev) {\n      thumbScrollerRef.current?.scrollToEnd();\n    }\n    prevEntriesLengthRef.current = curr;\n  }, [props.progress.entries.length]);\n\n  useEffect(() => {\n    const offset = WorkoutStripReveal_offset({\n      index: currentEntryIndex,\n      count: countRef.current,\n      pitch,\n      gap,\n      padding: remValue,\n      offset: horizontalOffsetRef.current,\n      viewportWidth: viewportWidthRef.current,\n      contentWidth: contentWidthRef.current,\n    });\n    if (offset != null) {\n      thumbScrollerRef.current?.scrollTo(offset);\n    }\n  }, [currentEntryIndex, pitch, gap, remValue]);\n\n  const onAddExercise = useCallback(() => {\n    trackClick(\"workout-add-exercise-button\");\n    updateState(\n      dispatch,\n      [\n        Progress_lbProgress(progressId)\n          .pi(\"ui\", {})\n          .p(\"exercisePicker\")\n          .record({\n            state: {\n              mode: \"workout\",\n              screenStack: [\"exercisePicker\"],\n              sort: \"name_asc\",\n              filters: {},\n              selectedExercises: [],\n            },\n          }),\n      ],\n      \"Open exercise picker\"\n    );\n  }, [dispatch, progressId, trackClick]);\n\n  const commitReorder = useCallback(\n    (startIndex: number, endIndex: number) => {\n      if (startIndex < 0 || startIndex === endIndex) {\n        return;\n      }\n      trackClick(\"workout-reorder-drag\");\n      updateProgress(\n        dispatch,\n        [\n          lb<IHistoryRecord>().recordModify((progress) => {\n            const moved = WorkoutStripReorder_apply(\n              progress.entries,\n              progress.currentEntryIndex ?? 0,\n              startIndex,\n              endIndex\n            );\n            if (moved == null) {\n              return progress;\n            }\n            const changes: IHistoryRecordChange[] = Array.from(\n              new Set([...(progress.changes || []), \"order\" as const])\n            );\n            return {\n              ...progress,\n              entries: moved.entries,\n              currentEntryIndex: moved.currentEntryIndex,\n              changes,\n              ui: { ...progress.ui, forceUpdateEntryIndex: !progress.ui?.forceUpdateEntryIndex },\n            };\n          }),\n        ],\n        \"drag-exercise-tab\"\n      );\n      WorkoutHints_recordUseInState(dispatch, helps, \"workout-reorder\");\n    },\n    [dispatch, trackClick, helps]\n  );\n  const session = useGridDragSession<number>({\n    axis: \"x\",\n    autoScroll,\n    resolve: (translation) =>\n      WorkoutStripReorder_dropIndex(originRef.current, translation, pitchRef.current, countRef.current),\n    show: (target, translation) => {\n      if (target != null) {\n        dropSlot.value = target;\n        dragTranslation.value = translation;\n      }\n    },\n    commit: (target) => {\n      slots.value = WorkoutStripReorder_slots(entryIdsRef.current, originRef.current, target);\n      commitReorder(originRef.current, target);\n    },\n    onActive: (active) => {\n      setDraggingIndex(active ? originRef.current : -1);\n      if (!active) {\n        isSettling.value = true;\n        dragId.value = \"\";\n        originSlot.value = -1;\n        dropSlot.value = -1;\n        dragTranslation.value = 0;\n      }\n    },\n  });\n  return (\n    <View collapsable={false} className=\"bg-background-default\">\n      <Scroller\n        ref={thumbScrollerRef}\n        scrollViewRef={scrollViewRef}\n        viewportRef={viewportRef}\n        onScroll={(e) => {\n          horizontalOffsetRef.current = e.nativeEvent.contentOffset.x;\n        }}\n        onContentSizeChange={(width) => {\n          contentWidthRef.current = width;\n        }}\n        onLayout={(e) => {\n          viewportWidthRef.current = e.nativeEvent.layout.width;\n        }}\n      >\n        <View className=\"flex-row items-center px-4 py-1\" style={{ gap }}>\n          <View style={{ width: Math.max(0, props.progress.entries.length * pitch - gap), height: stripHeight }}>\n            {props.progress.entries.map((entry, entryIndex) => (\n              <WorkoutStripTile\n                key={entry.id}\n                index={entryIndex}\n                entry={entry}\n                colorToSupersetGroup={colorToSupersetGroup}\n                isCurrent={entryIndex === currentEntryIndex}\n                isDragging={entryIndex === draggingIndex}\n                currentSuperset={currentSuperset}\n                settings={props.settings}\n                onSelect={onClick}\n                session={session}\n                originRef={originRef}\n                slots={slots}\n                dragId={dragId}\n                originSlot={originSlot}\n                dropSlot={dropSlot}\n                dragTranslation={dragTranslation}\n                isSettling={isSettling}\n                pitch={pitch}\n                onMeasure={onMeasureTile}\n              />\n            ))}\n          </View>\n          <StickyPressable\n            testID=\"add-exercise-button\"\n            data-testid=\"add-exercise-button\"\n            className=\"p-2\"\n            onPress={onAddExercise}\n          >\n            <IconPlus2 size={15} color={Tailwind_colors().lightgray[600]} />\n          </StickyPressable>\n        </View>\n      </Scroller>\n      <RNAnimated.View\n        pointerEvents=\"none\"\n        style={{\n          height: Math.round(1.25 * remValue) + 4,\n          paddingBottom: 4,\n          justifyContent: \"flex-start\",\n          opacity: labelOpacity,\n        }}\n      >\n        <Text numberOfLines={1} className=\"px-4 text-sm font-bold text-center\" testID=\"strip-current-exercise\">\n          {props.label}\n        </Text>\n      </RNAnimated.View>\n      <RNAnimated.View\n        pointerEvents=\"none\"\n        style={[\n          { position: \"absolute\", left: 0, right: 0, bottom: 0, height: 1, opacity: shadowOpacity },\n          Platform.select({\n            ios: {\n              backgroundColor: Tailwind_semantic().background.default,\n              shadowColor: \"#000\",\n              shadowOffset: { width: 0, height: 2 },\n              shadowRadius: 4,\n              shadowOpacity: 0.15,\n            },\n            android: { backgroundColor: Tailwind_semantic().background.default, elevation: 4 },\n            default: { boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.15)\" } as object,\n          }),\n        ]}\n      />\n    </View>\n  );\n}\n\nconst WorkoutThumbnailsStrip = memo(WorkoutThumbnailsStripInner);\n","import { createContext, RefObject, useCallback, useContext, useEffect, useRef } from \"react\";\nimport { Platform, ScrollView, View } from \"react-native\";\nimport { NavScreenScrollContext } from \"../navigation/NavScreenScrollContext\";\nimport { WorkoutCenterScroll_targetY } from \"../utils/workoutCenterScroll\";\n\nexport const WorkoutExpandedRowsContext = createContext<Map<number, View> | undefined>(undefined);\n\nexport function useExpandedRowRegistration(entryIndex: number, isExpanded: boolean): RefObject<View | null> {\n  const rowRef = useRef<View>(null);\n  const rows = useContext(WorkoutExpandedRowsContext);\n  useEffect(() => {\n    const node = rowRef.current;\n    if (!isExpanded || rows == null || node == null) {\n      return undefined;\n    }\n    rows.set(entryIndex, node);\n    return () => {\n      if (rows.get(entryIndex) === node) {\n        rows.delete(entryIndex);\n      }\n    };\n  }, [isExpanded, rows, entryIndex]);\n  return rowRef;\n}\n\nexport const WorkoutFocusExpandedSetContext = createContext<(() => void) | undefined>(undefined);\n\nexport function useFocusExpandedSet(rows: Map<number, View>, currentEntryIndex: number): () => void {\n  const currentEntryIndexRef = useRef(currentEntryIndex);\n  currentEntryIndexRef.current = currentEntryIndex;\n  return useCallback(() => {\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        const row: unknown = rows.get(currentEntryIndexRef.current);\n        const isFocusFree = document.activeElement == null || document.activeElement === document.body;\n        if (row instanceof HTMLElement && isFocusFree) {\n          row.querySelector<HTMLElement>(\"[data-tab-stop]\")?.focus();\n        }\n      });\n    });\n  }, [rows]);\n}\n\nexport function useRefocusAfterKeyboardComplete(): () => void {\n  const focusExpandedSet = useContext(WorkoutFocusExpandedSetContext);\n  return useCallback(() => {\n    if (Platform.OS !== \"web\" || focusExpandedSet == null) {\n      return;\n    }\n    const active = document.activeElement;\n    if (active instanceof HTMLElement && active.matches(\":focus-visible\")) {\n      focusExpandedSet();\n    }\n  }, [focusExpandedSet]);\n}\n\ninterface IWorkoutCenterExpandedRowProps {\n  pageChangeToggle: boolean;\n  entryIndex: number;\n  entryId: string | undefined;\n}\n\nexport function WorkoutCenterExpandedRow(props: IWorkoutCenterExpandedRowProps): null {\n  const scrollCtx = useContext(NavScreenScrollContext);\n  const rows = useContext(WorkoutExpandedRowsContext);\n  const entryIndexRef = useRef(props.entryIndex);\n  entryIndexRef.current = props.entryIndex;\n  const previousEntryIdRef = useRef(props.entryId);\n\n  useEffect(() => {\n    const isPageChange = previousEntryIdRef.current !== props.entryId;\n    if (!isPageChange || Platform.OS === \"web\" || scrollCtx == null || rows == null) {\n      return undefined;\n    }\n    const centerOnceLaidOut = (): void => {\n      const row = rows.get(entryIndexRef.current);\n      const viewport = scrollCtx.viewportRef.current;\n      const scrollNode = scrollCtx.scrollRef.current as ScrollView | null;\n      if (row == null || viewport == null || scrollNode == null) {\n        return;\n      }\n      viewport.measureInWindow((_vx, viewportTop, _vw, viewportHeight) => {\n        row.measureInWindow((_rx, rowTop, _rw, rowHeight) => {\n          const scrollY = scrollCtx.scrollYRef.current;\n          const y = WorkoutCenterScroll_targetY({\n            scrollY,\n            rowTop,\n            rowHeight,\n            viewportTop,\n            viewportHeight,\n            stickyHeaderHeight: scrollCtx.stickyHeaderHeight,\n            footerHeight: scrollCtx.footerHeight,\n            contentHeight: scrollCtx.contentSizeRef.current.height,\n          });\n          if (Math.abs(y - scrollY) >= 1) {\n            scrollNode.scrollTo({ y, animated: true });\n          }\n        });\n      });\n    };\n    let frame = requestAnimationFrame(() => {\n      frame = requestAnimationFrame(centerOnceLaidOut);\n    });\n    return () => cancelAnimationFrame(frame);\n  }, [props.pageChangeToggle]);\n  useEffect(() => {\n    previousEntryIdRef.current = props.entryId;\n  }, [props.entryId]);\n\n  return null;\n}\n","import { JSX, memo, MutableRefObject, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport Animated from \"react-native-reanimated\";\nimport { WorkoutLayoutTransition } from \"./workoutLayoutTransition\";\nimport { useWorkoutImpression } from \"../utils/useWorkoutImpression\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { ActiveGraphContext, IActiveGraphContext } from \"./activeGraphContext\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IHistoryRecord, ISettings, ISubscription, IHistoryEntry, IProgramState, IStats } from \"../types\";\nimport { updateSettings } from \"../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { Exercise_toKey } from \"../models/exercise\";\nimport {\n  History_collectAllHistoryRecordsOfExerciseType,\n  History_collectMinAndMaxTime,\n  History_collectWeightPersonalRecord,\n  History_collect1RMPersonalRecord,\n  IPrevExerciseData,\n} from \"../models/history\";\nimport { LinkButton } from \"./linkButton\";\nimport { CollectionUtils_sort } from \"../utils/collection\";\nimport { IEvaluatedProgram, IEvaluatedProgramDay } from \"../models/program\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { Collector } from \"../utils/collector\";\nimport { Locker } from \"./locker\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { GraphExercise } from \"./graphExercise\";\nimport { ExerciseAllTimePRs } from \"./exerciseAllTimePRs\";\nimport { ExerciseHistory } from \"./exerciseHistory\";\nimport { Reps_setsStatus } from \"../models/set\";\nimport { Weight_build } from \"../models/weight\";\nimport { WorkoutExerciseCard } from \"./workoutExerciseCard\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { PerfProbeSubtree } from \"../utils/perfProbeSubtree\";\n\ninterface IWorkoutExerciseProps {\n  day: number;\n  otherStates?: IByExercise<IProgramState>;\n  program?: IEvaluatedProgram;\n  programDay?: IEvaluatedProgramDay;\n  history: IHistoryRecord[];\n  progressId: number;\n  progressStartTime: number;\n  userPromptedStateVars?: Partial<Record<string, IProgramState>>;\n  supersetEntry?: IHistoryEntry;\n  prevData?: IPrevExerciseData;\n  isCurrentProgress: boolean;\n  showHelp?: boolean;\n  helps: string[];\n  stats: IStats;\n  entryIndex: number;\n  entry: IHistoryEntry;\n  isCurrentPage?: boolean;\n  impressionsSeenRef?: MutableRefObject<Set<string>>;\n  subscription: ISubscription;\n  settings: ISettings;\n  dispatch: IDispatch;\n  onTitleLayout?: (title: View) => void;\n}\n\nfunction WorkoutExerciseInner(props: IWorkoutExerciseProps): JSX.Element {\n  usePerfRenderCount(\"WorkoutExercise\");\n  // Stabilize the exercise reference by identity: props.entry.exercise gets rebuilt (value-identical,\n  // new ref) on every set completion, and it feeds GraphExercise/ExerciseHistory and their O(history)\n  // memos — so key it on the exercise key so those stay memoized across set completions regardless of\n  // any upstream reference churn.\n  const exerciseType = useMemo(() => props.entry.exercise, [Exercise_toKey(props.entry.exercise)]);\n\n  const fallbackSeenRef = useRef<Set<string>>(new Set());\n  const seenRef = props.impressionsSeenRef ?? fallbackSeenRef;\n  const isCurrentPage = props.isCurrentPage ?? false;\n  const graphImpression = useWorkoutImpression({ name: \"workout-graph\", isCurrentPage, seenRef });\n  const historyImpression = useWorkoutImpression({ name: \"workout-history\", isCurrentPage, seenRef });\n  const trackClick = useTrackClick();\n  // A ref, not a closure: a new identity per page change would re-render the memoized graph.\n  const isCurrentPageRef = useRef(isCurrentPage);\n  isCurrentPageRef.current = isCurrentPage;\n  const onGraphInteract = useCallback(\n    (reason: \"manipulate\" | \"type\") => {\n      const name = reason === \"type\" ? \"workout-graph-type\" : \"workout-graph-interact\";\n      if (!isCurrentPageRef.current || seenRef.current.has(name)) {\n        return;\n      }\n      seenRef.current.add(name);\n      trackClick(name);\n    },\n    [seenRef, trackClick]\n  );\n\n  const [isHeavyContentReady, setIsHeavyContentReady] = useState(false);\n  useEffect(() => {\n    // Defer below-the-fold heavy content (graphs/PRs + the O(history) PR math) off the first paint so\n    // the card renders immediately. Deterministic delay on purpose, NOT InteractionManager: this\n    // screen uses native-stack transitions (react-native-screens) and a gesture-driven pager, neither\n    // of which registers a JS interaction handle — runAfterInteractions would fire mid-transition, not\n    // after it. ~350ms clears the push slide so the work lands once the screen has settled.\n    if (!isCurrentPage || isHeavyContentReady) {\n      return undefined;\n    }\n    const t = setTimeout(() => setIsHeavyContentReady(true), 350);\n    return () => clearTimeout(t);\n  }, [isCurrentPage, isHeavyContentReady]);\n\n  // The \"previous workout\" values shown on first paint come from props.prevData, which the parent\n  // builds for the whole workout in a single pass — so the card mounts without scanning history here.\n  // This full per-exercise filter + sort + time range only feeds the deferred graph/PRs/history\n  // blocks below, so it's gated behind isHeavyContentReady to keep it off the mount frame (it was the\n  // dominant workout-screen mount jank for users with large histories).\n  const [history, { maxTime: maxX, minTime: minX }] = useMemo(() => {\n    if (!isHeavyContentReady) {\n      return [[], { maxTime: 0, minTime: 0 }] as [IHistoryRecord[], { maxTime: number; minTime: number }];\n    }\n    const results = Collector.build(props.history)\n      .addFn(History_collectAllHistoryRecordsOfExerciseType(exerciseType))\n      .addFn(History_collectMinAndMaxTime())\n      .run();\n    results[0] = CollectionUtils_sort(results[0], (a, b) => {\n      return props.settings.exerciseStatsSettings.ascendingSort ? a.startTime - b.startTime : b.startTime - a.startTime;\n    });\n    return results;\n  }, [isHeavyContentReady, props.history, exerciseType, props.settings.exerciseStatsSettings.ascendingSort]);\n\n  // PRs feed only the (already deferred) graphs/PRs block, and the per-record 1RM math is the\n  // expensive part — so defer it and run it over the already-filtered slice, not all history.\n  const [{ maxWeight, maxWeightHistoryRecord }, { max1RM, max1RMHistoryRecord, max1RMSet }] = useMemo(() => {\n    if (!isHeavyContentReady) {\n      const zero = Weight_build(0, props.settings.units);\n      return [\n        { maxWeight: zero, maxWeightHistoryRecord: undefined },\n        { max1RM: zero, max1RMHistoryRecord: undefined, max1RMSet: undefined },\n      ];\n    }\n    return Collector.build(history)\n      .addFn(History_collectWeightPersonalRecord(exerciseType, props.settings.units))\n      .addFn(History_collect1RMPersonalRecord(exerciseType, props.settings.units))\n      .run();\n  }, [isHeavyContentReady, history, exerciseType, props.settings.units]);\n  const showPrs = maxWeight.value > 0 || max1RM.value > 0;\n  const status = Reps_setsStatus(props.entry.sets);\n\n  const [activeGraphId, setActiveGraphId] = useState<string | null>(null);\n  const activeGraphValue = useMemo<IActiveGraphContext>(\n    () => ({ activeId: activeGraphId, setActive: setActiveGraphId }),\n    [activeGraphId]\n  );\n\n  const dispatch = props.dispatch;\n  const shouldHideGraphs = props.settings.workoutSettings.shouldHideGraphs;\n  const maxWeightProp = useMemo(\n    () => (maxWeight ? { weight: maxWeight, historyRecord: maxWeightHistoryRecord } : undefined),\n    [maxWeight, maxWeightHistoryRecord]\n  );\n  const max1RMProp = useMemo(\n    () => (max1RM ? { weight: max1RM, historyRecord: max1RMHistoryRecord, set: max1RMSet } : undefined),\n    [max1RM, max1RMHistoryRecord, max1RMSet]\n  );\n  const onToggleGraphs = useCallback(() => {\n    updateSettings(\n      dispatch,\n      lb<ISettings>().p(\"workoutSettings\").p(\"shouldHideGraphs\").record(!shouldHideGraphs),\n      \"Toggle graphs visibility\"\n    );\n  }, [dispatch, shouldHideGraphs]);\n\n  return (\n    <View data-testid={`exercise-progress-${status}`} testID={`exercise-progress-${status}`}>\n      <PerfProbeSubtree id=\"sets-grid\">\n        <WorkoutExerciseCard\n          day={props.day}\n          stats={props.stats}\n          entry={props.entry}\n          entryIndex={props.entryIndex}\n          settings={props.settings}\n          dispatch={props.dispatch}\n          prevData={props.prevData}\n          program={props.program}\n          programDay={props.programDay}\n          otherStates={props.otherStates}\n          progressId={props.progressId}\n          supersetEntry={props.supersetEntry}\n          progressUserPromptedStateVars={props.userPromptedStateVars}\n          isCurrentProgress={props.isCurrentProgress}\n          showHelp={props.showHelp}\n          helps={props.helps}\n          subscription={props.subscription}\n          onTitleLayout={props.onTitleLayout}\n        />\n      </PerfProbeSubtree>\n      <Animated.View layout={WorkoutLayoutTransition}>\n        {((props.prevData?.count ?? 0) > 1 || showPrs) && (\n          <View className=\"items-center mt-2\">\n            <LinkButton className=\"text-sm\" name=\"toggle-workout-graphs\" onClick={onToggleGraphs}>\n              {props.settings.workoutSettings.shouldHideGraphs ? \"Show Graphs and PRs\" : \"Hide Graphs and PRs\"}\n            </LinkButton>\n          </View>\n        )}\n        {!props.settings.workoutSettings.shouldHideGraphs && (\n          <>\n            {history.length > 1 && isHeavyContentReady && (\n              <View\n                data-testid=\"workout-stats-graph\"\n                testID=\"workout-stats-graph\"\n                className=\"relative mx-4 mt-2\"\n                ref={graphImpression.ref}\n                onLayout={graphImpression.onLayout}\n              >\n                <Locker topic=\"Graphs\" dispatch={props.dispatch} blur={8} subscription={props.subscription} />\n                <ActiveGraphContext.Provider value={activeGraphValue}>\n                  <PerfProbeSubtree id=\"graph\">\n                    <GraphExercise\n                      id={`workout-graph-${Exercise_toKey(exerciseType)}`}\n                      isSameXAxis={false}\n                      minX={Math.round(minX / 1000)}\n                      maxX={Math.round(maxX / 1000)}\n                      isWithOneRm={true}\n                      key={`${Exercise_toKey(exerciseType)}_${props.settings.theme}`}\n                      settings={props.settings}\n                      isWithProgramLines={true}\n                      history={props.history}\n                      exercise={exerciseType}\n                      initialType={props.settings.graphsSettings.defaultType}\n                      dispatch={props.dispatch}\n                      isInteractive={Subscriptions_hasSubscription(props.subscription)}\n                      onInteract={onGraphInteract}\n                    />\n                  </PerfProbeSubtree>\n                </ActiveGraphContext.Provider>\n              </View>\n            )}\n            {showPrs && (\n              <View className=\"mx-4 mt-2\">\n                <ExerciseAllTimePRs\n                  maxWeight={maxWeightProp}\n                  max1RM={max1RMProp}\n                  settings={props.settings}\n                  dispatch={props.dispatch}\n                />\n              </View>\n            )}\n          </>\n        )}\n        {history.length > 0 && isHeavyContentReady && (\n          <View className=\"mx-4 mt-2\">\n            <PerfProbeSubtree id=\"history\">\n              <ExerciseHistory\n                exerciseType={exerciseType}\n                settings={props.settings}\n                dispatch={props.dispatch}\n                history={history}\n                source=\"workout\"\n                firstRecordProbe={historyImpression}\n              />\n            </PerfProbeSubtree>\n          </View>\n        )}\n      </Animated.View>\n    </View>\n  );\n}\n\nexport const WorkoutExercise = memo(WorkoutExerciseInner);\n","import type { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport Animated from \"react-native-reanimated\";\nimport { WorkoutLayoutTransition } from \"./workoutLayoutTransition\";\nimport { Text } from \"./primitives/text\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  ISettings,\n  ISet,\n  IExerciseType,\n  ISubscription,\n  IProgramState,\n  IHistoryRecord,\n  ITargetType,\n  IHistoryEntry,\n  IStats,\n  IProgressMode,\n} from \"../types\";\nimport { IPrevExerciseData } from \"../models/history\";\nimport { IWorkoutExpandedSet } from \"../utils/workoutSetExpansion\";\nimport { WorkoutSetPrevious_lines } from \"../utils/workoutSetPrevious\";\nimport { WorkoutHints_isLearned } from \"../utils/workoutHints\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { updateProgress } from \"../models/state\";\nimport { lb, LensBuilder } from \"lens-shmens\";\nimport { WorkoutExerciseSet, computeSetColumnWidths } from \"./workoutExerciseSet\";\nimport { Reps_isFinishedSet, Reps_addSet } from \"../models/set\";\nimport { n } from \"../utils/math\";\nimport { TimeUtils_formatMMSS } from \"../utils/time\";\nimport { IconPlus2 } from \"./icons/iconPlus2\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { WorkoutExerciseUtils_getBgColor100 } from \"../utils/workoutExerciseUtils\";\nimport { Equipment_getUnitOrDefaultForExerciseType } from \"../models/equipment\";\nimport { IconSwapSmall } from \"./icons/iconSwapSmall\";\nimport { ProgressStateChanges, ProgressStateChangesView } from \"./progressStateChanges\";\nimport { IEvaluatedProgram } from \"../models/program\";\nimport { Exercise_getIsUnilateral } from \"../models/exercise\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { useRem } from \"../utils/useRem\";\n\ninterface IWorkoutExerciseAllSets {\n  day: number;\n  isCurrentProgress: boolean;\n  isPlayground: boolean;\n  exerciseType: IExerciseType;\n  lbWarmupSets: LensBuilder<IHistoryRecord, ISet[], {}>;\n  lbSets: LensBuilder<IHistoryRecord, ISet[], {}>;\n  entry: IHistoryEntry;\n  entryIndex: number;\n  lastSets?: ISet[];\n  helps?: string[];\n  stats: IStats;\n  expansion?: IWorkoutExerciseSetsExpansion;\n  onTargetClick?: () => void;\n  subscription?: ISubscription;\n  userPromptedStateVars?: IProgramState;\n  program?: IEvaluatedProgram;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  settings: ISettings;\n  dispatch: IDispatch;\n}\n\nexport interface IWorkoutExerciseSetsExpansion {\n  expanded: IWorkoutExpandedSet | undefined;\n  onToggle: (mode: IProgressMode, setIndex: number) => void;\n  onComplete: (mode: IProgressMode, setIndex: number) => void;\n  prevData: IPrevExerciseData | undefined;\n  isMultiweek: boolean;\n  onMenuOpenChange: (isOpen: boolean) => void;\n}\n\nfunction getTargetColumnLabel(targetType: ITargetType): string {\n  switch (targetType) {\n    case \"target\":\n      return \"Target\";\n    case \"lasttime\":\n      return \"Previous Set\";\n    case \"platescalculator\":\n      return \"Plates\";\n    case \"e1rm\":\n      return \"e1RM\";\n  }\n}\n\nfunction WorkoutExerciseAllSetsInner(props: IWorkoutExerciseAllSets): JSX.Element {\n  usePerfRenderCount(\"WorkoutExerciseAllSets\");\n  const warmupSets = props.entry.warmupSets;\n  const sets = props.entry.sets;\n  const buttonBgColor = WorkoutExerciseUtils_getBgColor100(sets, false);\n  const nextSetIndex = [...warmupSets, ...sets].findIndex((s) => !Reps_isFinishedSet(s));\n  const exerciseUnit =\n    sets[0]?.completedWeight?.unit ??\n    sets[0]?.weight?.unit ??\n    warmupSets[0]?.completedWeight?.unit ??\n    warmupSets[0]?.weight?.unit ??\n    Equipment_getUnitOrDefaultForExerciseType(props.settings, props.exerciseType);\n  const targetLabel = getTargetColumnLabel(props.settings.workoutSettings.targetType);\n  const lbEntry = useMemo(() => lb<IHistoryRecord>().p(\"entries\").i(props.entryIndex), [props.entryIndex]);\n  const isUnilateral = Exercise_getIsUnilateral(props.exerciseType, props.settings);\n  const remValue = useRem();\n  const rpeLabel = useMemo(() => {\n    const allSets = [...sets, ...warmupSets];\n    let longest = \"\";\n    for (const s of allSets) {\n      if (s.completedRpe != null) {\n        const label = `@${n(s.completedRpe)}`;\n        if (label.length > longest.length) {\n          longest = label;\n        }\n      }\n      if (s.completedSetTimer != null) {\n        const label = TimeUtils_formatMMSS(s.completedSetTimer * 1000);\n        if (label.length > longest.length) {\n          longest = label;\n        }\n      }\n    }\n    return longest;\n  }, [sets, warmupSets]);\n  const rpeColumnLabel = useMemo(() => {\n    const allSets = [...sets, ...warmupSets];\n    const hasRpe = allSets.some((s) => s.completedRpe != null);\n    const hasTime = allSets.some((s) => s.completedSetTimer != null);\n    if (hasRpe && hasTime) {\n      return \"RPE/Time\";\n    }\n    return hasTime ? \"Time\" : \"RPE\";\n  }, [sets, warmupSets]);\n  // The column must fit both the recorded values and its header, so size it by whichever is wider.\n  const rpeColumnWidthLabel =\n    rpeLabel.length === 0 ? \"\" : rpeLabel.length >= rpeColumnLabel.length ? rpeLabel : rpeColumnLabel;\n  const hasTime = rpeColumnLabel.indexOf(\"Time\") >= 0;\n  const columnWidths = useMemo(() => {\n    const widths = computeSetColumnWidths(remValue, isUnilateral, rpeColumnWidthLabel);\n    // Time values (mm:ss) and the tap target read better with a touch more room than RPE.\n    return hasTime ? { ...widths, rpe: widths.rpe + Math.round(0.75 * remValue) } : widths;\n  }, [remValue, isUnilateral, rpeColumnWidthLabel, hasTime]);\n  const lbWarmupSetByIndex = useMemo(\n    () => warmupSets.map((_, i) => props.lbWarmupSets.i(i)),\n    [props.lbWarmupSets, warmupSets.length]\n  );\n  const lbSetByIndex = useMemo(() => sets.map((_, i) => props.lbSets.i(i)), [props.lbSets, sets.length]);\n\n  const { dispatch, lbWarmupSets, lbSets, lastSets, exerciseType, settings, expansion } = props;\n  const trackClick = useTrackClick();\n  const helps = props.helps ?? [];\n  const showTargetHint = expansion != null && !WorkoutHints_isLearned(helps, \"workout-target-switch\");\n  const showExpandHint = expansion != null && !WorkoutHints_isLearned(helps, \"workout-set-expand\");\n  const expanded = expansion?.expanded;\n  const expandedSet =\n    expanded != null ? (expanded.mode === \"warmup\" ? warmupSets : sets)[expanded.setIndex] : undefined;\n  const isLastInColumn = settings.workoutSettings.targetType === \"lasttime\";\n  const previousLines = useMemo(\n    () =>\n      expansion && expanded && expandedSet\n        ? WorkoutSetPrevious_lines(\n            expanded.mode,\n            expanded.setIndex,\n            expandedSet,\n            expansion.prevData,\n            expansion.isMultiweek,\n            isLastInColumn\n          )\n        : undefined,\n    [expansion, expanded, expandedSet, isLastInColumn]\n  );\n  const onAddWarmupSet = useCallback(() => {\n    trackClick(\"workout-add-warmup-set\");\n    const unilateral = Exercise_getIsUnilateral(exerciseType, settings);\n    updateProgress(\n      dispatch,\n      [lbWarmupSets.recordModify((s) => Reps_addSet(s, unilateral, undefined, true))],\n      \"add-warmupset\"\n    );\n  }, [dispatch, exerciseType, lbWarmupSets, settings, trackClick]);\n  const onAddSet = useCallback(() => {\n    trackClick(\"workout-add-set\");\n    const unilateral = Exercise_getIsUnilateral(exerciseType, settings);\n    const unit = Equipment_getUnitOrDefaultForExerciseType(settings, exerciseType);\n    updateProgress(\n      dispatch,\n      [lbSets.recordModify((s) => Reps_addSet(s, unilateral, lastSets?.[lastSets.length - 1], false, unit))],\n      \"add-set\"\n    );\n  }, [dispatch, exerciseType, lbSets, lastSets, settings, trackClick]);\n\n  const onSuppressProgress = useCallback(\n    (isSuppressed: boolean) => {\n      updateProgress(\n        dispatch,\n        lbEntry.recordModify((e) => ({ ...e, isSuppressed })),\n        \"suppress\"\n      );\n    },\n    [dispatch, lbEntry]\n  );\n\n  return (\n    <View className=\"overflow-hidden\">\n      {props.onTargetClick && showTargetHint && (\n        <Text className=\"px-4 pb-1 text-xs text-text-secondary\" testID=\"workout-target-hint\">\n          Tap \"{targetLabel}\" to switch values\n        </Text>\n      )}\n      <View className=\"flex-row items-center pb-1 border-b border-border-neutral\">\n        <View className=\"items-center\" style={{ width: columnWidths.set }}>\n          <Text className=\"text-xs text-text-secondary\">Set</Text>\n        </View>\n        <View className=\"flex-1 flex-row\">\n          <Pressable onPress={props.onTargetClick} className=\"flex-row items-center py-2 pr-4 -my-2\" hitSlop={8}>\n            {targetLabel ? (\n              <Text className={`mr-1 text-xs text-text-secondary ${props.onTargetClick ? \"underline\" : \"\"}`}>\n                {targetLabel}\n              </Text>\n            ) : null}\n            {props.onTargetClick && <IconSwapSmall size={12} color={Tailwind_colors().lightgray[600]} />}\n          </Pressable>\n        </View>\n        <View className=\"items-center\" style={{ width: columnWidths.reps }}>\n          <Text className=\"text-xs text-text-secondary\">Reps</Text>\n        </View>\n        <View style={{ width: columnWidths.separator }} />\n        <View className=\"items-center\" style={{ width: columnWidths.weight }}>\n          <Text className=\"text-xs text-text-secondary\">{exerciseUnit}</Text>\n        </View>\n        {columnWidths.rpe > 0 ? (\n          <View className=\"items-center ml-1\" style={{ width: columnWidths.rpe }}>\n            <Text numberOfLines={1} className=\"text-xs text-center text-text-secondary\">\n              {rpeColumnLabel}\n            </Text>\n          </View>\n        ) : null}\n        <View style={{ width: columnWidths.check }} />\n      </View>\n\n      <View>\n        {warmupSets.map((set, i) => (\n          <WorkoutExerciseSet\n            isCurrentProgress={props.isCurrentProgress}\n            isPlayground={props.isPlayground}\n            type=\"warmup\"\n            key={`warmup-${set.id}-${i}`}\n            day={props.day}\n            exerciseType={props.exerciseType}\n            programExercise={props.programExercise}\n            otherStates={props.otherStates}\n            subscription={props.subscription}\n            lbSets={props.lbWarmupSets}\n            lbSet={lbWarmupSetByIndex[i]}\n            set={set}\n            entryIndex={props.entryIndex}\n            isNext={nextSetIndex === i}\n            isExpanded={expanded?.mode === \"warmup\" && expanded.setIndex === i}\n            onToggleExpand={expansion?.onToggle}\n            onCompleteExpansion={expansion?.onComplete}\n            previousLines={expanded?.mode === \"warmup\" && expanded.setIndex === i ? previousLines : undefined}\n            onMenuOpenChange={expansion?.onMenuOpenChange}\n            setIndex={i}\n            columnWidths={columnWidths}\n            settings={props.settings}\n            dispatch={props.dispatch}\n          />\n        ))}\n        {sets.map((set, i) => (\n          <WorkoutExerciseSet\n            isPlayground={props.isPlayground}\n            isCurrentProgress={props.isCurrentProgress}\n            type=\"workout\"\n            key={`workout-${set.id}-${i}`}\n            isExpanded={expanded?.mode === \"workout\" && expanded.setIndex === i}\n            onToggleExpand={expansion?.onToggle}\n            onCompleteExpansion={expansion?.onComplete}\n            previousLines={expanded?.mode === \"workout\" && expanded.setIndex === i ? previousLines : undefined}\n            onMenuOpenChange={expansion?.onMenuOpenChange}\n            isNext={nextSetIndex - warmupSets.length === i}\n            programExercise={props.programExercise}\n            day={props.day}\n            otherStates={props.otherStates}\n            exerciseType={props.exerciseType}\n            lastSet={props.lastSets?.[i]}\n            subscription={props.subscription}\n            lbSets={props.lbSets}\n            lbSet={lbSetByIndex[i]}\n            set={set}\n            entryIndex={props.entryIndex}\n            setIndex={i}\n            columnWidths={columnWidths}\n            settings={props.settings}\n            dispatch={props.dispatch}\n          />\n        ))}\n      </View>\n      <Animated.View layout={WorkoutLayoutTransition}>\n        {showExpandHint && (\n          <Text className=\"px-4 pt-1 text-xs text-text-secondary\" testID=\"workout-expand-hint\">\n            Tap a set to expand or collapse it\n          </Text>\n        )}\n\n        {props.programExercise && props.program ? (\n          <View className=\"mx-4 mt-2\">\n            <ProgressStateChanges\n              entry={props.entry}\n              settings={props.settings}\n              dayData={props.programExercise.dayData}\n              programExercise={props.programExercise}\n              stats={props.stats}\n              program={props.program}\n              userPromptedStateVars={props.userPromptedStateVars}\n              onSuppressProgress={onSuppressProgress}\n            />\n          </View>\n        ) : (\n          props.entry.progressSnapshot && (\n            <View className=\"mx-4 mt-2\">\n              <ProgressStateChangesView\n                diffState={props.entry.progressSnapshot.diffState}\n                diffVars={props.entry.progressSnapshot.diffVars}\n                prints={props.entry.progressSnapshot.prints}\n                updatePrints={props.entry.progressSnapshot.updatePrints}\n                isSuppressed={props.entry.isSuppressed}\n              />\n            </View>\n          )\n        )}\n\n        <View className=\"flex-row gap-2 px-4 mt-1 mb-2\">\n          <View className=\"flex-1\">\n            <Pressable\n              className={`${buttonBgColor} w-full py-2 rounded-md flex-row items-center justify-center`}\n              data-testid=\"add-warmup-set\"\n              testID=\"add-warmup-set\"\n              onPress={onAddWarmupSet}\n            >\n              <IconPlus2 size={10} color={Tailwind_colors().blue[400]} />\n              <Text className=\"ml-2 text-xs font-semibold text-text-link\">Add Warmup Set</Text>\n            </Pressable>\n          </View>\n          <View className=\"flex-1\">\n            <Pressable\n              className={`${buttonBgColor} w-full py-2 rounded-md flex-row items-center justify-center`}\n              data-testid=\"add-workout-set\"\n              testID=\"add-workout-set\"\n              onPress={onAddSet}\n            >\n              <IconPlus2 size={10} color={Tailwind_colors().blue[400]} />\n              <Text className=\"ml-2 text-xs font-semibold text-text-link\">Add Set</Text>\n            </Pressable>\n          </View>\n        </View>\n      </Animated.View>\n    </View>\n  );\n}\n\nexport const WorkoutExerciseAllSets = memo(WorkoutExerciseAllSetsInner);\n","import { JSX, memo, useCallback, useMemo, useRef, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport {\n  IHistoryEntry,\n  IHistoryRecord,\n  IProgramState,\n  IProgressMode,\n  ISettings,\n  IStats,\n  ISubscription,\n} from \"../types\";\nimport { updateProgress, updateSettings } from \"../models/state\";\nimport { lb } from \"lens-shmens\";\nimport {\n  Exercise_get,\n  Exercise_getNotes,\n  Exercise_onerm,\n  Exercise_nameWithEquipment,\n  Exercise_fullName,\n} from \"../models/exercise\";\nimport { IconArrowRight } from \"./icons/iconArrowRight\";\nimport { ActionSheet_show } from \"../utils/actionSheet\";\nimport { LinkButton } from \"./linkButton\";\nimport { ProgramExercise_doesUse1RM } from \"../models/programExercise\";\nimport { Weight_print } from \"../models/weight\";\nimport { Markdown } from \"./markdown\";\nimport {\n  IWorkoutSetExpansionOverride,\n  WorkoutSetExpansion_expanded,\n  WorkoutSetExpansion_shouldCollapseSetsAfterComplete,\n  WorkoutSetExpansion_toggle,\n} from \"../utils/workoutSetExpansion\";\nimport { WorkoutHints_recordUseInState } from \"../utils/workoutHintsDispatch\";\nimport { IWorkoutExerciseSetsExpansion } from \"./workoutExerciseAllSets\";\nimport { CollectionUtils_removeAt } from \"../utils/collection\";\nimport { IconCog2 } from \"./icons/iconCog2\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { Thunk_pushExerciseStatsScreen, Thunk_pushToEditProgramExercise } from \"../ducks/thunks\";\nimport { WorkoutExerciseAllSets } from \"./workoutExerciseAllSets\";\nimport {\n  WorkoutExerciseUtils_getBgColor50,\n  WorkoutExerciseUtils_getBorderColor100,\n} from \"../utils/workoutExerciseUtils\";\nimport { DropdownMenu, DropdownMenuItem } from \"./dropdownMenu\";\nimport { IconSwap } from \"./icons/iconSwap\";\nimport { IconTrash } from \"./icons/iconTrash\";\nimport { IconEdit2 } from \"./icons/iconEdit2\";\nimport { TextareaAutogrow } from \"./textareaAutogrow\";\nimport { Progress_doesUse1RM, Progress_editExerciseNotes } from \"../models/progress\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { GroupHeader } from \"./groupHeader\";\nimport { Settings_getNextTargetType } from \"../models/settings\";\nimport { IPrevExerciseData } from \"../models/history\";\nimport { DateUtils_format } from \"../utils/date\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IEvaluatedProgram, IEvaluatedProgramDay, Program_getProgramExerciseForKeyAndDay } from \"../models/program\";\nimport {\n  Equipment_getEquipmentNameForExerciseType,\n  Equipment_getEquipmentDataForExerciseType,\n} from \"../models/equipment\";\nimport { PlannerProgramExercise_currentDescription } from \"../pages/planner/models/plannerProgramExercise\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { IconReorder } from \"./icons/iconReorder\";\nimport { IconNotebook } from \"./icons/iconNotebook\";\nimport { navigateToModal } from \"../navigation/navigationService\";\nimport { Dialog_confirm } from \"../utils/dialog\";\nimport { usePerfRenderCount } from \"../utils/usePerfRenderCount\";\nimport { usePerfWhyRender } from \"../utils/usePerfWhyRender\";\n\ninterface IWorkoutExerciseCardProps {\n  entry: IHistoryEntry;\n  entryIndex: number;\n  program?: IEvaluatedProgram;\n  programDay?: IEvaluatedProgramDay;\n  day: number;\n  prevData?: IPrevExerciseData;\n  progressId: number;\n  supersetEntry?: IHistoryEntry;\n  progressUserPromptedStateVars?: Partial<Record<string, IProgramState>>;\n  isCurrentProgress: boolean;\n  stats: IStats;\n  settings: ISettings;\n  dispatch: IDispatch;\n  subscription: ISubscription;\n  showHelp?: boolean;\n  helps: string[];\n  otherStates?: IByExercise<IProgramState>;\n  onTitleLayout?: (title: View) => void;\n}\n\ntype IKebabAction = \"edit\" | \"swap\" | \"superset\" | \"notes\" | \"remove\";\n\nfunction WorkoutExerciseCardInner(props: IWorkoutExerciseCardProps): JSX.Element {\n  usePerfRenderCount(\"WorkoutExerciseCard\");\n  usePerfWhyRender(\"sets-grid\", props as unknown as Record<string, unknown>);\n  const trackClick = useTrackClick();\n  const programExerciseId = props.entry.programExerciseId;\n  const programExercise = useMemo(\n    () =>\n      props.program && programExerciseId\n        ? Program_getProgramExerciseForKeyAndDay(props.program, props.day, programExerciseId)\n        : undefined,\n    [props.program, props.day, programExerciseId]\n  );\n  const exerciseType = props.entry.exercise;\n  const settings = props.settings;\n  const exercise = Exercise_get(exerciseType, settings.exercises);\n  const currentEquipmentName = Equipment_getEquipmentNameForExerciseType(settings, exercise);\n  const currentEquipmentNotes = Equipment_getEquipmentDataForExerciseType(settings, exercise)?.notes;\n  const exerciseNotes = Exercise_getNotes(exerciseType, settings);\n  const description = programExercise\n    ? PlannerProgramExercise_currentDescription(programExercise)\n    : props.entry.descriptionSnapshot;\n  const onerm = Exercise_onerm(exercise, settings);\n  const lbSets = useMemo(() => lb<IHistoryRecord>().p(\"entries\").i(props.entryIndex).p(\"sets\"), [props.entryIndex]);\n  const lbWarmupSets = useMemo(\n    () => lb<IHistoryRecord>().p(\"entries\").i(props.entryIndex).p(\"warmupSets\"),\n    [props.entryIndex]\n  );\n  const lastHistoryEntry = props.prevData?.lastEntry;\n  const lastNote = props.prevData?.lastNote;\n  const timestamp = props.prevData?.lastNoteTimestamp;\n\n  const [isKebabMenuOpen, setIsKebabMenuOpen] = useState(false);\n  const supersetEntry = props.supersetEntry;\n  const supersetExercise = supersetEntry ? Exercise_get(supersetEntry.exercise, props.settings.exercises) : undefined;\n\n  const { dispatch, entry, entryIndex, progressId } = props;\n  const entryExercise = entry.exercise;\n  const entryId = entry.id;\n  const pickerSort = settings.workoutSettings.pickerSort;\n\n  const openEquipmentModal = useCallback((): void => {\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"equipmentModal\").record({ exerciseType: entryExercise })],\n      \"change-equipment\"\n    );\n    navigateToModal(\"equipmentModal\", { context: \"workout\", progressId });\n  }, [dispatch, entryExercise, progressId]);\n\n  const openSupersetPicker = useCallback((): void => {\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"showSupersetPicker\").record(entry)],\n      \"change-superset\"\n    );\n    navigateToModal(\"supersetPickerModal\", { progressId });\n  }, [dispatch, entry, progressId]);\n\n  const openRm1Modal = useCallback((): void => {\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"rm1Modal\").record({ exerciseType: entryExercise })],\n      \"change-rm1\"\n    );\n    navigateToModal(\"rm1Modal\", { context: \"workout\", progressId });\n  }, [dispatch, entryExercise, progressId]);\n\n  const swapExercise = useCallback((): void => {\n    updateProgress(\n      dispatch,\n      [\n        lb<IHistoryRecord>()\n          .pi(\"ui\", {})\n          .p(\"exercisePicker\")\n          .record({\n            state: {\n              mode: \"workout\",\n              screenStack: [\"exercisePicker\"],\n              sort: pickerSort ?? \"name_asc\",\n              filters: {},\n              selectedExercises: [],\n              entryIndex,\n              exerciseType: entryExercise,\n            },\n          }),\n      ],\n      \"kebab-swap-exercise\"\n    );\n  }, [dispatch, entryExercise, entryIndex, pickerSort]);\n\n  const showExerciseNotes = !!settings.workoutSettings.showExerciseNotes;\n  const toggleExerciseNotes = useCallback((): void => {\n    updateSettings(\n      dispatch,\n      lb<ISettings>().p(\"workoutSettings\").p(\"showExerciseNotes\").record(!showExerciseNotes),\n      \"toggle-exercise-notes\"\n    );\n  }, [dispatch, showExerciseNotes]);\n\n  const editSuperset = useCallback((): void => {\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"showSupersetPicker\").record(entry)],\n      \"kebab-edit-superset\"\n    );\n    navigateToModal(\"supersetPickerModal\", { progressId });\n  }, [dispatch, entry, progressId]);\n\n  const removeExercise = useCallback(async (): Promise<void> => {\n    if (!(await Dialog_confirm(\"Do you want to remove this exercise in this workout only?\"))) {\n      return;\n    }\n    updateProgress(\n      dispatch,\n      [\n        lb<IHistoryRecord>()\n          .p(\"entries\")\n          .recordModify((entries) => {\n            const newEntries = CollectionUtils_removeAt(entries, entryIndex);\n            for (const e of newEntries) {\n              if (e.superset && e.superset === entryId) {\n                e.superset = undefined;\n              }\n            }\n            return newEntries;\n          }),\n        lb<IHistoryRecord>()\n          .p(\"currentEntryIndex\")\n          .recordModify((index) => Math.max(0, (index ?? 0) - 1)),\n      ],\n      \"kebab-delete-exercise\"\n    );\n  }, [dispatch, entryIndex, entryId]);\n\n  const programIdForEdit = props.program?.id;\n  const editProgramExercise = useCallback((): void => {\n    if (programExercise) {\n      dispatch(\n        Thunk_pushToEditProgramExercise(programExercise.key, programExercise.dayData, {\n          workoutProgramId: programIdForEdit,\n        })\n      );\n    }\n  }, [dispatch, programExercise, programIdForEdit]);\n\n  const runKebabAction = useCallback(\n    (action: IKebabAction): void => {\n      trackClick(`workout-kebab-${action}`);\n      setIsKebabMenuOpen(false);\n      if (action === \"edit\") {\n        editProgramExercise();\n      } else if (action === \"swap\") {\n        swapExercise();\n      } else if (action === \"superset\") {\n        editSuperset();\n      } else if (action === \"notes\") {\n        toggleExerciseNotes();\n      } else if (action === \"remove\") {\n        removeExercise().catch(() => undefined);\n      }\n    },\n    [editProgramExercise, swapExercise, editSuperset, toggleExerciseNotes, removeExercise, trackClick]\n  );\n\n  const kebabActions = useMemo<Array<{ action: IKebabAction; label: string }>>(() => {\n    const actions: Array<{ action: IKebabAction; label: string }> = [];\n    if (programExercise && programExerciseId) {\n      actions.push({ action: \"edit\", label: \"Edit Program Exercise\" });\n    }\n    actions.push({ action: \"swap\", label: \"Swap Exercise\" });\n    actions.push({ action: \"superset\", label: \"Edit Superset\" });\n    actions.push({ action: \"notes\", label: showExerciseNotes ? \"Hide Exercise Notes\" : \"Show Exercise Notes\" });\n    actions.push({ action: \"remove\", label: \"Remove Exercise\" });\n    return actions;\n  }, [programExercise, programExerciseId, showExerciseNotes]);\n\n  const helps = props.helps;\n  const [expansionOverride, setExpansionOverride] = useState<IWorkoutSetExpansionOverride>(undefined);\n  const [isSetMenuOpen, setIsSetMenuOpen] = useState(false);\n  const shouldCollapseSets = !!settings.workoutSettings.shouldCollapseSets;\n  const expandedSetValue = WorkoutSetExpansion_expanded(entry, expansionOverride, shouldCollapseSets);\n  const expandedSet = useMemo(() => expandedSetValue, [expandedSetValue?.mode, expandedSetValue?.setIndex]);\n  // Read through a ref, so the callback survives a set completion and the other rows skip rendering.\n  const toggleInputRef = useRef({ entry, expansionOverride, helps, shouldCollapseSets, expandedSet });\n  toggleInputRef.current = { entry, expansionOverride, helps, shouldCollapseSets, expandedSet };\n  const onToggleExpand = useCallback(\n    (mode: IProgressMode, setIndex: number): void => {\n      const current = toggleInputRef.current;\n      const next = WorkoutSetExpansion_toggle(\n        current.entry,\n        current.expansionOverride,\n        current.shouldCollapseSets,\n        mode,\n        setIndex\n      );\n      setExpansionOverride(next);\n      trackClick(next?.kind === \"collapsed\" ? \"workout-set-collapse\" : \"workout-set-expand\");\n      if (next?.kind === \"expanded\") {\n        WorkoutHints_recordUseInState(dispatch, current.helps, \"workout-set-expand\");\n      }\n    },\n    [dispatch, trackClick]\n  );\n  const onCompleteSet = useCallback(\n    (mode: IProgressMode, setIndex: number): void => {\n      const current = toggleInputRef.current;\n      const next = WorkoutSetExpansion_shouldCollapseSetsAfterComplete(\n        current.entry,\n        current.expandedSet,\n        current.shouldCollapseSets,\n        mode,\n        setIndex\n      );\n      if (next !== current.shouldCollapseSets) {\n        updateSettings(\n          dispatch,\n          lb<ISettings>().p(\"workoutSettings\").p(\"shouldCollapseSets\").record(next),\n          \"toggle-collapse-sets\"\n        );\n      }\n    },\n    [dispatch]\n  );\n  const isMultiweek = (props.program?.weeks.length ?? 0) > 1;\n  const expansion = useMemo<IWorkoutExerciseSetsExpansion>(\n    () => ({\n      expanded: expandedSet,\n      onToggle: onToggleExpand,\n      onComplete: onCompleteSet,\n      prevData: props.prevData,\n      isMultiweek,\n      onMenuOpenChange: setIsSetMenuOpen,\n    }),\n    [expandedSet, onToggleExpand, onCompleteSet, props.prevData, isMultiweek]\n  );\n\n  const subscription = props.subscription;\n  const onTargetClick = useCallback((): void => {\n    trackClick(\"workout-target-type\");\n    updateSettings(\n      dispatch,\n      lb<ISettings>()\n        .p(\"workoutSettings\")\n        .p(\"targetType\")\n        .recordModify((type) =>\n          Settings_getNextTargetType(type, !Subscriptions_hasSubscription(subscription) || !currentEquipmentName)\n        ),\n      \"Change target type\"\n    );\n    WorkoutHints_recordUseInState(dispatch, helps, \"workout-target-switch\");\n  }, [dispatch, subscription, currentEquipmentName, trackClick, helps]);\n\n  const onKebabPress = useCallback((): void => {\n    trackClick(\"workout-exercise-kebab\");\n    if (Platform.OS === \"web\") {\n      setIsKebabMenuOpen(true);\n      return;\n    }\n    const labels = kebabActions.map((a) => a.label).concat(\"Cancel\");\n    ActionSheet_show(\n      {\n        options: labels,\n        cancelButtonIndex: labels.length - 1,\n        destructiveButtonIndex: kebabActions.findIndex((a) => a.action === \"remove\"),\n      },\n      (buttonIndex) => {\n        if (buttonIndex != null && buttonIndex < kebabActions.length) {\n          runKebabAction(kebabActions[buttonIndex].action);\n        }\n      }\n    );\n  }, [kebabActions, runKebabAction, trackClick]);\n\n  const titleRef = useRef<View>(null);\n  const { onTitleLayout: onTitleLayoutProp } = props;\n  const onTitleLayout = useCallback(() => {\n    if (titleRef.current != null) {\n      onTitleLayoutProp?.(titleRef.current);\n    }\n  }, [onTitleLayoutProp]);\n\n  const onPressExerciseStats = useCallback(() => {\n    trackClick(\"workout-exercise-stats\");\n    dispatch(Thunk_pushExerciseStatsScreen(entryExercise));\n  }, [dispatch, entryExercise, trackClick]);\n\n  const onChangeNotes = useCallback(\n    (text: string) => {\n      Progress_editExerciseNotes(dispatch, entryIndex, text);\n    },\n    [dispatch, entryIndex]\n  );\n\n  const onCloseKebabMenu = useCallback(() => setIsKebabMenuOpen(false), []);\n  const onKebabEdit = useCallback(() => runKebabAction(\"edit\"), [runKebabAction]);\n  const onKebabSwap = useCallback(() => runKebabAction(\"swap\"), [runKebabAction]);\n  const onKebabSuperset = useCallback(() => runKebabAction(\"superset\"), [runKebabAction]);\n  const onKebabNotes = useCallback(() => runKebabAction(\"notes\"), [runKebabAction]);\n  const onKebabRemove = useCallback(() => runKebabAction(\"remove\"), [runKebabAction]);\n\n  const kebabMenuZIndex = Platform.OS === \"web\" && (isKebabMenuOpen || isSetMenuOpen) ? { zIndex: 50 } : undefined;\n\n  return (\n    <View\n      data-testid={`entry-${StringUtils_dashcase(exercise.name)}`}\n      testID={`entry-${StringUtils_dashcase(exercise.name)}`}\n      className={`py-1 border rounded-xl ${WorkoutExerciseUtils_getBgColor50(\n        props.entry.sets,\n        false\n      )} ${WorkoutExerciseUtils_getBorderColor100(props.entry.sets, false)}`}\n      style={kebabMenuZIndex}\n    >\n      <View className=\"px-4\" style={kebabMenuZIndex}>\n        <View className=\"flex-row gap-2\" style={kebabMenuZIndex}>\n          <View className=\"flex-1 min-w-0 mt-2\">\n            <Pressable\n              ref={titleRef}\n              className=\"flex-row items-center\"\n              data-testid=\"exercise-name\"\n              testID=\"exercise-name\"\n              onPress={onPressExerciseStats}\n              onLayout={onTitleLayout}\n            >\n              <Text className=\"pr-1 text-lg font-bold\">{Exercise_nameWithEquipment(exercise, props.settings)}</Text>\n              <IconArrowRight />\n            </Pressable>\n            <View data-testid=\"exercise-equipment\" className=\"flex-row flex-wrap items-center\">\n              <Text className=\"text-sm text-text-secondary\">Equipment: </Text>\n              <LinkButton\n                name=\"exercise-equipment-picker\"\n                data-testid=\"exercise-equipment-picker\"\n                testID=\"exercise-equipment-picker\"\n                onClick={openEquipmentModal}\n                className=\"text-sm\"\n              >\n                {currentEquipmentName || \"None\"}\n              </LinkButton>\n            </View>\n            {supersetExercise && (\n              <View\n                data-testid=\"exercise-superset\"\n                testID=\"exercise-superset\"\n                className=\"flex-row flex-wrap items-center\"\n              >\n                <Text className=\"text-sm text-text-secondary\">Supersets with: </Text>\n                <LinkButton\n                  name=\"exercise-superset-picker\"\n                  data-testid=\"exercise-superset-picker\"\n                  testID=\"exercise-superset-picker\"\n                  onClick={openSupersetPicker}\n                  className=\"text-sm\"\n                >\n                  {Exercise_fullName(supersetExercise, props.settings)}\n                </LinkButton>\n              </View>\n            )}\n            {!!currentEquipmentNotes && (\n              <View className=\"mt-1\">\n                <Markdown value={currentEquipmentNotes} />\n              </View>\n            )}\n            {((programExercise && ProgramExercise_doesUse1RM(programExercise)) || Progress_doesUse1RM(props.entry)) && (\n              <View data-testid=\"exercise-rm1\" testID=\"exercise-rm1\" className=\"flex-row flex-wrap items-center\">\n                <Text className=\"text-sm text-text-secondary\">1RM: </Text>\n                <LinkButton\n                  name=\"exercise-rm1-picker\"\n                  data-testid=\"exercise-rm1-picker\"\n                  onClick={openRm1Modal}\n                  className=\"text-sm\"\n                >\n                  {Weight_print(onerm)}\n                </LinkButton>\n              </View>\n            )}\n          </View>\n          <View className=\"relative\">\n            <Pressable\n              data-testid=\"exercise-options\"\n              testID=\"exercise-options\"\n              className=\"p-4\"\n              style={{ marginRight: -12 }}\n              onPress={onKebabPress}\n              hitSlop={16}\n            >\n              <IconCog2 />\n            </Pressable>\n            {Platform.OS === \"web\" && isKebabMenuOpen && (\n              <DropdownMenu rightOffset=\"2rem\" onClose={onCloseKebabMenu} maxWidth=\"20rem\">\n                {programExercise && programExerciseId && (\n                  <DropdownMenuItem\n                    isTop={true}\n                    data-testid=\"exercise-edit-mode\"\n                    testID=\"exercise-edit-mode\"\n                    onClick={onKebabEdit}\n                  >\n                    <View className=\"flex-row items-center gap-2\">\n                      <View>\n                        <IconEdit2 size={22} />\n                      </View>\n                      <Text className=\"whitespace-nowrap\">Edit Program Exercise</Text>\n                    </View>\n                  </DropdownMenuItem>\n                )}\n                <DropdownMenuItem\n                  data-testid=\"exercise-swap\"\n                  testID=\"exercise-swap\"\n                  isTop={!programExercise || !programExerciseId}\n                  onClick={onKebabSwap}\n                >\n                  <View className=\"flex-row items-center gap-2\">\n                    <IconSwap size={18} />\n                    <Text className=\"whitespace-nowrap\">Swap Exercise</Text>\n                  </View>\n                </DropdownMenuItem>\n                <DropdownMenuItem data-testid=\"exercise-superset\" testID=\"exercise-superset\" onClick={onKebabSuperset}>\n                  <View className=\"flex-row items-center\" style={{ gap: 8 }}>\n                    <IconReorder size={18} />\n                    <Text className=\"whitespace-nowrap\">Edit Superset</Text>\n                  </View>\n                </DropdownMenuItem>\n                <DropdownMenuItem\n                  data-testid=\"exercise-notes-toggle\"\n                  testID=\"exercise-notes-toggle\"\n                  onClick={onKebabNotes}\n                >\n                  <View className=\"flex-row items-center\" style={{ gap: 8 }}>\n                    <IconNotebook size={18} />\n                    <Text className=\"whitespace-nowrap\">\n                      {showExerciseNotes ? \"Hide Exercise Notes\" : \"Show Exercise Notes\"}\n                    </Text>\n                  </View>\n                </DropdownMenuItem>\n                <DropdownMenuItem\n                  data-testid=\"edit-exercise-kebab-remove-exercise\"\n                  testID=\"edit-exercise-kebab-remove-exercise\"\n                  onClick={onKebabRemove}\n                >\n                  <View className=\"flex-row items-center\" style={{ gap: 8 }}>\n                    <IconTrash width={15} height={18} />\n                    <Text className=\"whitespace-nowrap\">Remove Exercise</Text>\n                  </View>\n                </DropdownMenuItem>\n              </DropdownMenu>\n            )}\n          </View>\n        </View>\n        {!!exerciseNotes && (\n          <View className=\"mt-1\">\n            {!!exerciseNotes && !!description && <GroupHeader name=\"Exercise Notes\" />}\n            <Markdown value={exerciseNotes} />\n          </View>\n        )}\n        {!!description && (\n          <View className=\"mt-1\">\n            {!!exerciseNotes && !!description && <GroupHeader name=\"Program Exercise Description\" />}\n            <Markdown value={description} />\n          </View>\n        )}\n        {!!lastNote && !!timestamp && (\n          <View>\n            <GroupHeader name={`Previous Note (from ${DateUtils_format(timestamp)})`} />\n            <View className=\"pl-1 mb-1 border-purplev3-300\" style={{ borderLeftWidth: 4 }}>\n              {/* An Android text selection keeps its page on screen, so the exercise pager snaps back to it */}\n              <Text className={Platform.OS === \"web\" ? \"text-sm select-text\" : \"text-sm\"}>{lastNote}</Text>\n            </View>\n          </View>\n        )}\n        {showExerciseNotes && (\n          <View>\n            <TextareaAutogrow\n              debounceMs={1000}\n              data-testid=\"exercise-notes-input\"\n              testID=\"exercise-notes-input\"\n              id=\"exercise-notes\"\n              maxLength={4095}\n              name=\"exercise-notes\"\n              placeholder=\"Add workout notes for this exercise here...\"\n              value={props.entry.notes}\n              onChangeText={onChangeNotes}\n              className=\"mt-1\"\n            />\n          </View>\n        )}\n      </View>\n      <View className=\"mt-2\">\n        <WorkoutExerciseAllSets\n          stats={props.stats}\n          isPlayground={false}\n          helps={props.helps}\n          expansion={expansion}\n          isCurrentProgress={props.isCurrentProgress}\n          day={props.day}\n          program={props.program}\n          userPromptedStateVars={\n            programExercise ? props.progressUserPromptedStateVars?.[programExercise.key] : undefined\n          }\n          programExercise={programExercise}\n          entryIndex={props.entryIndex}\n          onTargetClick={onTargetClick}\n          otherStates={props.otherStates}\n          lastSets={lastHistoryEntry?.sets}\n          lbSets={lbSets}\n          lbWarmupSets={lbWarmupSets}\n          exerciseType={exerciseType}\n          entry={props.entry}\n          settings={props.settings}\n          dispatch={props.dispatch}\n          subscription={props.subscription}\n        />\n      </View>\n    </View>\n  );\n}\n\nexport const WorkoutExerciseCard = memo(WorkoutExerciseCardInner);\n","import { Children, JSX, ReactNode, useCallback, useEffect, useRef } from \"react\";\nimport { WorkoutPagerSettle_index } from \"./workoutPagerSettle\";\nimport { WorkoutTabPrune_observe } from \"../utils/workoutTabPrune\";\n\nconst WHEEL_GESTURE_MS = 300;\n\ninterface IWorkoutExercisePagerProps {\n  currentEntryIndex: number;\n  currentEntryId: string;\n  entryCount: number;\n  windowWidth: number;\n  forceUpdateEntryIndex: boolean;\n  onIndexChange: (next: number) => void;\n  // User-driven scrolls only, and only where they came to rest.\n  onSettledIndex?: (next: number) => void;\n  children: ReactNode;\n}\n\nexport function WorkoutExercisePager(props: IWorkoutExercisePagerProps): JSX.Element {\n  const { currentEntryIndex, windowWidth, forceUpdateEntryIndex, onIndexChange, onSettledIndex } = props;\n  const scrollerRef = useRef<HTMLDivElement | null>(null);\n  const isUserScrollingRef = useRef(false);\n  const dragStartIndexRef = useRef(currentEntryIndex);\n  const currentEntryIndexRef = useRef(currentEntryIndex);\n  currentEntryIndexRef.current = currentEntryIndex;\n  const idleTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n  useEffect(() => () => clearTimeout(idleTimerRef.current), []);\n\n  useEffect(() => {\n    const root = scrollerRef.current;\n    return root ? WorkoutTabPrune_observe(root) : undefined;\n  }, []);\n\n  useEffect(() => {\n    scrollerRef.current?.scrollTo({ left: currentEntryIndex * windowWidth, behavior: \"instant\" as ScrollBehavior });\n  }, [forceUpdateEntryIndex, windowWidth]);\n\n  // An input only opens a window; the flag is set in onScroll, once the pager actually moved.\n  // Arming on the input alone would count every bubbled tap inside the card as pager intent.\n  // wheel is separate because a trackpad swipe fires no pointerdown.\n  const pointerActiveRef = useRef(false);\n  const lastWheelAtRef = useRef(0);\n\n  const onPointerStart = useCallback(() => {\n    if (!pointerActiveRef.current) {\n      dragStartIndexRef.current = currentEntryIndexRef.current;\n    }\n    pointerActiveRef.current = true;\n  }, []);\n\n  const onPointerStop = useCallback(() => {\n    pointerActiveRef.current = false;\n  }, []);\n\n  const onWheel = useCallback(() => {\n    if (Date.now() - lastWheelAtRef.current > WHEEL_GESTURE_MS) {\n      dragStartIndexRef.current = currentEntryIndexRef.current;\n    }\n    lastWheelAtRef.current = Date.now();\n  }, []);\n\n  const settle = useCallback((): void => {\n    const isUserDriven = isUserScrollingRef.current;\n    isUserScrollingRef.current = false;\n    const index = WorkoutPagerSettle_index({\n      offsetX: scrollerRef.current?.scrollLeft ?? 0,\n      windowWidth,\n      isUserDriven,\n      dragStartIndex: dragStartIndexRef.current,\n    });\n    if (index != null) {\n      onSettledIndex?.(index);\n    }\n  }, [windowWidth, onSettledIndex]);\n\n  return (\n    <div\n      ref={scrollerRef}\n      className=\"parent-scroller\"\n      onPointerDown={onPointerStart}\n      onTouchStart={onPointerStart}\n      onPointerUp={onPointerStop}\n      onPointerCancel={onPointerStop}\n      onTouchEnd={onPointerStop}\n      onTouchCancel={onPointerStop}\n      onWheel={onWheel}\n      onScroll={() => {\n        const scrollLeft = scrollerRef.current?.scrollLeft ?? 0;\n        if (windowWidth <= 0) {\n          return;\n        }\n        if (pointerActiveRef.current || Date.now() - lastWheelAtRef.current < WHEEL_GESTURE_MS) {\n          isUserScrollingRef.current = true;\n        }\n        // Safari has no scrollend, so settle on the scroll going quiet instead.\n        clearTimeout(idleTimerRef.current);\n        idleTimerRef.current = setTimeout(settle, 150);\n        const selectedIndex = Math.floor((scrollLeft + windowWidth / 2) / windowWidth);\n        if (selectedIndex !== currentEntryIndex) {\n          onIndexChange(selectedIndex);\n        }\n      }}\n      style={{\n        display: \"flex\",\n        overflowX: \"scroll\",\n        overflowY: \"hidden\",\n        WebkitOverflowScrolling: \"touch\",\n        scrollSnapType: \"x mandatory\",\n      }}\n    >\n      {Children.map(props.children, (child, index) => (\n        <div\n          key={index}\n          style={{\n            minWidth: \"100vw\",\n            height: index === currentEntryIndex ? undefined : 0,\n            alignSelf: \"flex-start\",\n            scrollSnapAlign: \"center\",\n            scrollSnapStop: \"always\",\n          }}\n        >\n          {child}\n        </div>\n      ))}\n    </div>\n  );\n}\n","import type { JSX } from \"react\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport Animated, { LayoutAnimationConfig } from \"react-native-reanimated\";\nimport { useExpandedRowRegistration, useRefocusAfterKeyboardComplete } from \"./workoutCenterExpandedRow\";\nimport { IDispatch } from \"../ducks/types\";\nimport {\n  WorkoutBodyEntering,\n  WorkoutBodyExiting,\n  WorkoutLayoutClip,\n  WorkoutLayoutTransition,\n} from \"./workoutLayoutTransition\";\nimport {\n  ISettings,\n  ISet,\n  IExerciseType,\n  ISubscription,\n  IProgramState,\n  IHistoryRecord,\n  IProgressMode,\n  IWeight,\n  IPercentage,\n} from \"../types\";\nimport { n } from \"../utils/math\";\nimport { updateProgress } from \"../models/state\";\nimport { LensBuilder, lb } from \"lens-shmens\";\nimport { WorkoutExerciseUtils_getBorderColor100 } from \"../utils/workoutExerciseUtils\";\nimport { useRem } from \"../utils/useRem\";\nimport { CollectionUtils_removeAt } from \"../utils/collection\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { EditProgressEntry_showEditSetModal } from \"../models/editProgressEntry\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { Reps_enforceCompletedSet } from \"../models/set\";\nimport { Weight_eq } from \"../models/weight\";\nimport { Exercise_getIsUnilateral } from \"../models/exercise\";\nimport { FocusedInputFlush_flush } from \"../utils/focusedInputFlush\";\nimport { IWorkoutSetPreviousLine } from \"../utils/workoutSetPrevious\";\nimport { IWorkoutSetPlatesLine, WorkoutSetPlates_line } from \"../utils/workoutSetPlates\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { IWorkoutSetType } from \"./workoutExerciseSetFields\";\nimport { WorkoutExerciseSetCompact } from \"./workoutExerciseSetCompact\";\nimport { WorkoutExerciseSetExpanded } from \"./workoutExerciseSetExpanded\";\nimport { SetCompleteHaptic_play } from \"../utils/setCompleteHaptic\";\nimport ReactNativeHapticFeedback from \"react-native-haptic-feedback\";\n\nconst HAPTIC_OPTIONS = { enableVibrateFallback: false, ignoreAndroidSystemSettings: false };\n\nexport interface ISetColumnWidths {\n  set: number;\n  reps: number;\n  separator: number;\n  weight: number;\n  rpe: number;\n  check: number;\n}\n\nfunction computeRpeColumnWidth(rpeLabel: string, remValue: number): number {\n  if (!rpeLabel) {\n    return 0;\n  }\n  let units = 0.3;\n  for (const ch of rpeLabel) {\n    if (ch === \".\") {\n      units += 0.5;\n    } else if (ch === \"@\") {\n      units += 0.5;\n    } else {\n      units += 0.42;\n    }\n  }\n  return Math.max(Math.round(units * remValue), Math.round(1.75 * remValue));\n}\n\n// The set number badge and the check button hold an icon plus constant padding, so they need a\n// fixed part and a scaling part rather than a flat rem multiple - a multiple over-reserves badly\n// at large text sizes, and every point taken here comes out of the target label's flex-1 column.\n// The reps and weight fields stay narrow on purpose: values longer than they fit shrink their own\n// font instead of widening the column (see FitText_fontSize).\nexport function computeSetColumnWidths(remValue: number, isUnilateral: boolean, rpeLabel: string): ISetColumnWidths {\n  const scale = remValue / 16;\n  const labelW = isUnilateral ? remValue : 0;\n  const rpe = computeRpeColumnWidth(rpeLabel, remValue);\n  const iconWidth = 24 * scale;\n  return {\n    set: Math.round(iconWidth + 8),\n    reps: Math.round(2.75 * remValue) + labelW,\n    separator: Math.round(remValue),\n    weight: Math.round(3.25 * remValue),\n    rpe,\n    check: Math.round(iconWidth + (rpe > 0 ? 20 : 32)),\n  };\n}\n\ninterface IWorkoutExerciseSet {\n  exerciseType: IExerciseType;\n  day: number;\n  type: IProgressMode;\n  lbSet: LensBuilder<IHistoryRecord, ISet, {}>;\n  lbSets: LensBuilder<IHistoryRecord, ISet[], {}>;\n  isCurrentProgress: boolean;\n  lastSet?: ISet;\n  set: ISet;\n  isNext?: boolean;\n  isExpanded?: boolean;\n  onToggleExpand?: (mode: IProgressMode, setIndex: number) => void;\n  onCompleteExpansion?: (mode: IProgressMode, setIndex: number) => void;\n  previousLines?: IWorkoutSetPreviousLine[];\n  onMenuOpenChange?: (isOpen: boolean) => void;\n  subscription?: ISubscription;\n  isPlayground: boolean;\n  entryIndex: number;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  setIndex: number;\n  columnWidths: ISetColumnWidths;\n  settings: ISettings;\n  dispatch: IDispatch;\n}\n\nexport interface IWorkoutExerciseSetBodyProps {\n  set: ISet;\n  type: IProgressMode;\n  setType: IWorkoutSetType;\n  setIndex: number;\n  isNext: boolean;\n  isUnilateral: boolean;\n  labelW: number;\n  repsInputWidth: number;\n  weightInputWidth: number;\n  columnWidths: ISetColumnWidths;\n  placeholderReps: string;\n  placeholderWeight?: string;\n  completedRpeValue?: number;\n  borderColor: string;\n  isRoundedWeight: boolean;\n  lastSet?: ISet;\n  previousLines?: IWorkoutSetPreviousLine[];\n  settings: ISettings;\n  exerciseType: IExerciseType;\n  subscription?: ISubscription;\n  onInputLeftReps: (value: number | undefined) => void;\n  onBlurLeftReps: (value: number | undefined) => void;\n  onInputReps: (value: number | undefined) => void;\n  onBlurReps: (value: number | undefined) => void;\n  onInputWeight: (value: IWeight | IPercentage | undefined) => void;\n  onBlurWeight: (value: IWeight | IPercentage | undefined) => void;\n  onCompleteSet: () => void;\n  onEditSetTimer?: () => void;\n  onOpenRoundingInfo: () => void;\n  onToggleExpand?: () => void;\n  onEditTarget?: () => void;\n  onLongPressSet?: () => void;\n  onDeleteSet: () => void;\n  onMenuOpenChange?: (isOpen: boolean) => void;\n  platesLine?: IWorkoutSetPlatesLine;\n  onOpenSubscription: () => void;\n}\n\nfunction WorkoutExerciseSetInner(props: IWorkoutExerciseSet): JSX.Element {\n  const trackClick = useTrackClick();\n  const set = props.set;\n  const placeholderReps = `${set.minReps != null ? `${n(set.minReps)}-` : \"\"}${set.reps != null ? n(set.reps) : \"\"}${set.reps != null && set.isAmrap ? \"+\" : \"\"}`;\n  const placeholderWeight = set.weight?.value != null ? `${n(set.weight.value)}${set.askWeight ? \"+\" : \"\"}` : undefined;\n  const completedRpeValue = set.logRpe && set.completedRpe != null ? set.completedRpe : undefined;\n  const borderColor = WorkoutExerciseUtils_getBorderColor100([props.set], false);\n  const hasEdit = props.type === \"workout\";\n  const isUnilateral = Exercise_getIsUnilateral(props.exerciseType, props.settings);\n  const remValue = useRem();\n  const labelW = isUnilateral ? remValue : 0;\n  const repsInputWidth = (props.columnWidths.reps - labelW) / remValue;\n  const weightInputWidth = props.columnWidths.weight / remValue;\n\n  const { dispatch, lbSet, lbSets, setIndex, entryIndex, programExercise, otherStates, isPlayground, type } = props;\n  const { onToggleExpand: onToggleExpandProp, onCompleteExpansion, exerciseType, settings } = props;\n\n  const onInputLeftReps = useCallback(\n    (value: number | undefined) => {\n      if (value != null && !isNaN(value) && value >= 0) {\n        updateProgress(\n          dispatch,\n          [lbSet.recordModify((s) => ({ ...s, completedRepsLeft: Math.round(value) }))],\n          \"input-left-reps\"\n        );\n      }\n    },\n    [dispatch, lbSet]\n  );\n  const onBlurLeftReps = useCallback(\n    (value: number | undefined) => {\n      updateProgress(dispatch, [lbSet.recordModify((s) => ({ ...s, completedRepsLeft: value }))], \"blur-left-reps\");\n    },\n    [dispatch, lbSet]\n  );\n  const onInputReps = useCallback(\n    (value: number | undefined) => {\n      if (value != null && !isNaN(value) && value >= 0) {\n        updateProgress(\n          dispatch,\n          [\n            lbSet.recordModify((s) => {\n              const newSet = { ...s, completedReps: Math.round(value) };\n              return Reps_enforceCompletedSet(newSet);\n            }),\n          ],\n          \"input-reps\"\n        );\n      }\n    },\n    [dispatch, lbSet]\n  );\n  const onBlurReps = useCallback(\n    (value: number | undefined) => {\n      updateProgress(\n        dispatch,\n        [\n          lbSet.recordModify((s) => {\n            const newSet = { ...s, completedReps: value };\n            return Reps_enforceCompletedSet(newSet);\n          }),\n        ],\n        \"blur-reps\"\n      );\n    },\n    [dispatch, lbSet]\n  );\n  const onBlurWeight = useCallback(\n    (value: IWeight | IPercentage | undefined) => {\n      if (value == null || value.unit !== \"%\") {\n        updateProgress(\n          dispatch,\n          [\n            lbSet.recordModify((s) => {\n              const newSet = { ...s, completedWeight: value };\n              return Reps_enforceCompletedSet(newSet);\n            }),\n          ],\n          \"blur-weight\"\n        );\n      }\n    },\n    [dispatch, lbSet]\n  );\n  const onInputWeight = useCallback(\n    (value: IWeight | IPercentage | undefined) => {\n      if (value != null && value.unit !== \"%\") {\n        updateProgress(\n          dispatch,\n          [\n            lbSet.recordModify((s) => {\n              const newSet = { ...s, completedWeight: value };\n              return Reps_enforceCompletedSet(newSet);\n            }),\n          ],\n          \"input-weight\"\n        );\n      }\n    },\n    [dispatch, lbSet]\n  );\n  const refocus = useRefocusAfterKeyboardComplete();\n  const onCompleteSet = useCallback(() => {\n    FocusedInputFlush_flush();\n    refocus();\n    if (!set.isCompleted) {\n      SetCompleteHaptic_play();\n    }\n    onCompleteExpansion?.(type, setIndex);\n    dispatch({\n      type: \"CompleteSetAction\",\n      setIndex,\n      entryIndex,\n      programExercise,\n      otherStates,\n      isPlayground,\n      mode: type,\n      forceUpdateEntryIndex: type === \"workout\" && !set.isCompleted,\n      isExternal: false,\n    });\n  }, [\n    dispatch,\n    setIndex,\n    entryIndex,\n    programExercise,\n    otherStates,\n    isPlayground,\n    type,\n    set.isCompleted,\n    refocus,\n    onCompleteExpansion,\n  ]);\n  const onEditSetTimer = useCallback(() => {\n    trackClick(\"workout-set-timer-edit-open\");\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"setTimerEditModal\").record({ entryIndex, setIndex })],\n      \"open-set-timer-edit\"\n    );\n  }, [dispatch, entryIndex, setIndex, trackClick]);\n  const onOpenRoundingInfo = useCallback(() => {\n    trackClick(\"workout-rounding-info\");\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"roundingModal\").record({ entryIndex, setIndex })],\n      \"open-rounding-info\"\n    );\n  }, [dispatch, entryIndex, setIndex, trackClick]);\n  const onToggleExpand = useCallback(() => {\n    onToggleExpandProp?.(type, setIndex);\n  }, [onToggleExpandProp, type, setIndex]);\n  const onOpenSubscription = useCallback(() => {\n    dispatch(Thunk_pushScreen(\"subscription\"));\n  }, [dispatch]);\n  const platesLine = useMemo(\n    () => (props.isExpanded ? WorkoutSetPlates_line(set, settings, exerciseType) : undefined),\n    [props.isExpanded, set, settings, exerciseType]\n  );\n  const onEditTarget = useCallback(() => {\n    trackClick(\"workout-set-edit\");\n    EditProgressEntry_showEditSetModal(\n      dispatch,\n      settings,\n      type === \"warmup\",\n      entryIndex,\n      setIndex,\n      programExercise,\n      exerciseType,\n      set\n    );\n  }, [trackClick, dispatch, settings, type, entryIndex, setIndex, programExercise, exerciseType, set]);\n  const onLongPressSet = useCallback(() => {\n    ReactNativeHapticFeedback.trigger(\"impactMedium\", HAPTIC_OPTIONS);\n    onEditTarget();\n  }, [onEditTarget]);\n  const onDeleteSet = useCallback(() => {\n    trackClick(\"workout-set-delete\");\n    updateProgress(\n      dispatch,\n      [\n        lbSets.recordModify((s) => {\n          const newSets = CollectionUtils_removeAt(s, setIndex);\n          for (let i = 0; i < newSets.length; i += 1) {\n            newSets[i].index = i;\n          }\n          return newSets;\n        }),\n      ],\n      \"delete-set\"\n    );\n  }, [trackClick, dispatch, lbSets, setIndex]);\n  const isRoundedWeight =\n    props.type !== \"warmup\" &&\n    props.settings.workoutSettings.targetType === \"target\" &&\n    set.weight != null &&\n    set.originalWeight != null &&\n    !Weight_eq(set.weight, set.originalWeight);\n  const setType: IWorkoutSetType =\n    props.type === \"warmup\" ? \"warmup\" : props.isCurrentProgress && props.programExercise == null ? \"adhoc\" : \"program\";\n\n  const body: IWorkoutExerciseSetBodyProps = {\n    set,\n    type: props.type,\n    setType,\n    setIndex,\n    isNext: !!props.isNext,\n    isUnilateral,\n    labelW,\n    repsInputWidth,\n    weightInputWidth,\n    columnWidths: props.columnWidths,\n    placeholderReps,\n    placeholderWeight,\n    completedRpeValue,\n    borderColor,\n    isRoundedWeight,\n    lastSet: props.lastSet,\n    previousLines: props.previousLines,\n    settings: props.settings,\n    exerciseType: props.exerciseType,\n    subscription: props.subscription,\n    onInputLeftReps,\n    onBlurLeftReps,\n    onInputReps,\n    onBlurReps,\n    onInputWeight,\n    onBlurWeight,\n    onCompleteSet,\n    onEditSetTimer: props.type === \"workout\" ? onEditSetTimer : undefined,\n    onOpenRoundingInfo,\n    onToggleExpand: onToggleExpandProp ? onToggleExpand : undefined,\n    onEditTarget: hasEdit ? onEditTarget : undefined,\n    onLongPressSet: hasEdit ? onLongPressSet : undefined,\n    onDeleteSet,\n    onMenuOpenChange: props.onMenuOpenChange,\n    platesLine,\n    onOpenSubscription,\n  };\n\n  const rowRef = useExpandedRowRegistration(entryIndex, !!props.isExpanded);\n  return (\n    <Animated.View ref={rowRef} layout={WorkoutLayoutTransition} style={WorkoutLayoutClip}>\n      {/* Only a swap between the two bodies fades, never the row mounting with the screen.\n          The distinct keys make the swap an unmount and a mount, which entering and exiting need. */}\n      <LayoutAnimationConfig skipEntering skipExiting>\n        {props.isExpanded ? (\n          <Animated.View key=\"expanded\" entering={WorkoutBodyEntering} exiting={WorkoutBodyExiting}>\n            <WorkoutExerciseSetExpanded {...body} />\n          </Animated.View>\n        ) : (\n          <Animated.View key=\"compact\" entering={WorkoutBodyEntering} exiting={WorkoutBodyExiting}>\n            <WorkoutExerciseSetCompact {...body} />\n          </Animated.View>\n        )}\n      </LayoutAnimationConfig>\n    </Animated.View>\n  );\n}\n\nexport const WorkoutExerciseSet = memo(WorkoutExerciseSetInner);\n","import type { JSX } from \"react\";\nimport { useContext } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { WorkoutTabStopContext } from \"./workoutTabStopContext\";\nimport { Text } from \"./primitives/text\";\nimport { IconCheckCircle } from \"./icons/iconCheckCircle\";\nimport { IconPlayCircle } from \"./icons/iconPlayCircle\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { InputNumber2 } from \"./inputNumber2\";\nimport { InputWeight2 } from \"./inputWeight2\";\nimport { WorkoutExerciseUtils_getBgColor50, WorkoutExerciseUtils_getIconColor } from \"../utils/workoutExerciseUtils\";\nimport type { IWorkoutExerciseSetBodyProps } from \"./workoutExerciseSet\";\nimport {\n  RpeWeightHint,\n  WorkoutExerciseSetRpeTime,\n  WorkoutExerciseSetTargetField,\n  WorkoutExerciseSet_dataCy,\n} from \"./workoutExerciseSetFields\";\n\nexport function WorkoutExerciseSetCompact(props: IWorkoutExerciseSetBodyProps): JSX.Element {\n  const { set, isUnilateral, labelW, columnWidths } = props;\n  const onTargetPress = props.onToggleExpand ?? (props.isRoundedWeight ? props.onOpenRoundingInfo : undefined);\n  const tabIndex = useContext(WorkoutTabStopContext);\n  return (\n    <View\n      className={`${WorkoutExerciseUtils_getBgColor50([set], props.type === \"warmup\")}`}\n      data-testid={WorkoutExerciseSet_dataCy(set)}\n      testID={WorkoutExerciseSet_dataCy(set)}\n    >\n      <View className={`flex-row items-center border-b ${props.borderColor}`}>\n        <Pressable\n          className=\"flex-row items-center flex-1\"\n          data-testid=\"workout-set-row-head\"\n          testID=\"workout-set-row-head\"\n          disabled={onTargetPress == null && props.onLongPressSet == null}\n          onPress={onTargetPress}\n          onLongPress={props.onLongPressSet}\n        >\n          <View className=\"items-center justify-center py-1\" style={{ width: columnWidths.set }}>\n            <View\n              className=\"w-scaled-6 h-scaled-6 items-center justify-center\"\n              style={{\n                borderRadius: 9999,\n                overflow: \"hidden\",\n                backgroundColor: props.isNext ? Tailwind_semantic().button.primarybackground : \"transparent\",\n              }}\n            >\n              {props.type === \"warmup\" ? (\n                <Text className={`text-xs ${props.isNext ? \"text-text-alwayswhite font-bold\" : \"\"}`}>W</Text>\n              ) : (\n                <Text className={props.isNext ? \"text-text-alwayswhite font-bold\" : \"\"}>{props.setIndex + 1}</Text>\n              )}\n            </View>\n          </View>\n          <View className=\"flex-1\" data-testid=\"workout-set-target\" testID=\"workout-set-target\">\n            <WorkoutExerciseSetTargetField\n              set={set}\n              lastSet={props.lastSet}\n              setType={props.setType}\n              settings={props.settings}\n              exerciseType={props.exerciseType}\n              underlineRounded={props.isRoundedWeight}\n            />\n          </View>\n        </Pressable>\n\n        <View className=\"items-center justify-center py-2\" style={{ width: columnWidths.reps }}>\n          {isUnilateral && (\n            <View className=\"flex-row items-center justify-center mb-1\">\n              <Text className=\"text-xs text-text-secondary\" style={{ width: labelW }}>\n                L:\n              </Text>\n              <InputNumber2\n                width={props.repsInputWidth}\n                tabIndex={tabIndex}\n                tabStop={true}\n                name=\"set-left-reps\"\n                onInput={props.onInputLeftReps}\n                onBlur={props.onBlurLeftReps}\n                placeholder={props.placeholderReps}\n                initialValue={set.reps}\n                value={set.completedRepsLeft != null ? set.completedRepsLeft : undefined}\n                min={0}\n                max={9999}\n                step={1}\n                inputCommitMode=\"blur\"\n              />\n            </View>\n          )}\n          <View className=\"flex-row items-center justify-center\">\n            {isUnilateral && (\n              <Text className=\"text-xs text-text-secondary\" style={{ width: labelW }}>\n                R:\n              </Text>\n            )}\n            <InputNumber2\n              width={props.repsInputWidth}\n              tabIndex={tabIndex}\n              tabStop={true}\n              name=\"set-reps\"\n              onInput={props.onInputReps}\n              onBlur={props.onBlurReps}\n              placeholder={props.placeholderReps}\n              initialValue={set.reps}\n              value={set.completedReps != null ? set.completedReps : undefined}\n              min={0}\n              max={9999}\n              step={1}\n              inputCommitMode=\"blur\"\n            />\n          </View>\n        </View>\n        <View className=\"items-center justify-center py-2\" style={{ width: columnWidths.separator }}>\n          <Text className=\"text-text-secondary\">×</Text>\n        </View>\n        <View className=\"items-start justify-center py-2\" style={{ width: columnWidths.weight }}>\n          <InputWeight2\n            width={props.weightInputWidth}\n            tabIndex={tabIndex}\n            tabStop={true}\n            name=\"set-weight\"\n            exerciseType={props.exerciseType}\n            inputCommitMode=\"blur\"\n            onBlur={props.onBlurWeight}\n            onInput={props.onInputWeight}\n            addOn={\n              set.rpe != null && set.reps != null\n                ? () => (\n                    <RpeWeightHint\n                      reps={set.completedReps ?? set.reps ?? 0}\n                      rpe={set.completedRpe ?? set.rpe!}\n                      settings={props.settings}\n                      exerciseType={props.exerciseType}\n                    />\n                  )\n                : undefined\n            }\n            subscription={props.subscription}\n            placeholder={props.placeholderWeight}\n            initialValue={set.weight}\n            value={set.completedWeight || undefined}\n            max={9999}\n            min={-9999}\n            settings={props.settings}\n          />\n        </View>\n\n        {columnWidths.rpe > 0 ? (\n          <WorkoutExerciseSetRpeTime\n            set={set}\n            isUnilateral={isUnilateral}\n            completedRpeValue={props.completedRpeValue}\n            width={columnWidths.rpe}\n            onEditSetTimer={props.onEditSetTimer}\n          />\n        ) : null}\n\n        <View className=\"items-end justify-center\" style={{ width: columnWidths.check }}>\n          {props.type === \"workout\" && set.setTimer != null && !set.isCompleted ? (\n            <Pressable\n              tabIndex={tabIndex}\n              dataSet={{ tabStop: \"1\" }}\n              className={columnWidths.rpe > 0 ? \"pl-1 pr-4 py-3\" : \"px-4 py-3\"}\n              data-testid=\"start-set-timer\"\n              testID=\"start-set-timer\"\n              onPress={props.onCompleteSet}\n            >\n              <IconPlayCircle size={24} color={WorkoutExerciseUtils_getIconColor([set], false)} />\n            </Pressable>\n          ) : (\n            <Pressable\n              tabIndex={tabIndex}\n              dataSet={{ tabStop: \"1\" }}\n              className={columnWidths.rpe > 0 ? \"pl-1 pr-4 py-3\" : \"px-4 py-3\"}\n              data-testid=\"complete-set\"\n              testID=\"complete-set\"\n              onPress={props.onCompleteSet}\n            >\n              <IconCheckCircle\n                size={24}\n                isChecked={true}\n                color={WorkoutExerciseUtils_getIconColor([set], props.type === \"warmup\")}\n              />\n            </Pressable>\n          )}\n        </View>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { useCallback, useContext, useMemo, useState } from \"react\";\nimport { View, Pressable, Platform } from \"react-native\";\nimport { WorkoutTabStopContext } from \"./workoutTabStopContext\";\nimport { Text } from \"./primitives/text\";\nimport { IconCheckCircle } from \"./icons/iconCheckCircle\";\nimport { IconPlayCircle } from \"./icons/iconPlayCircle\";\nimport { IconEdit2 } from \"./icons/iconEdit2\";\nimport { IconBarbellPlates } from \"./icons/iconBarbellPlates\";\nimport { PlatesBar } from \"./platesBar\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { LinkButton } from \"./linkButton\";\nimport { InputNumber2 } from \"./inputNumber2\";\nimport { InputWeight2 } from \"./inputWeight2\";\nimport { WorkoutExerciseUtils_getBgColor100, WorkoutExerciseUtils_getIconColor } from \"../utils/workoutExerciseUtils\";\nimport { DateUtils_formatDayMonth } from \"../utils/date\";\nimport { ActionMenu, IActionMenuAction } from \"./actionMenu\";\nimport type { IWorkoutExerciseSetBodyProps } from \"./workoutExerciseSet\";\nimport {\n  RpeWeightHint,\n  WorkoutExerciseLastSet,\n  WorkoutExerciseSetRpeTime,\n  WorkoutExerciseSetTargetField,\n  WorkoutExerciseSet_dataCy,\n} from \"./workoutExerciseSetFields\";\n\nconst COMPLETE_ICON_SIZE = 48;\nconst UNILATERAL_WEIGHT_FLEX = 1.4;\n\nexport function WorkoutExerciseSetExpanded(props: IWorkoutExerciseSetBodyProps): JSX.Element {\n  const { set, isUnilateral, columnWidths, onEditTarget, onLongPressSet, onDeleteSet } = props;\n  const onTargetPress = props.isRoundedWeight ? props.onOpenRoundingInfo : props.onToggleExpand;\n  const actions = useMemo<IActionMenuAction[]>(() => {\n    const list: IActionMenuAction[] = [];\n    if (onEditTarget) {\n      list.push({ label: \"Edit Target\", onPress: onEditTarget, testID: \"edit-set-target\" });\n    }\n    list.push({ label: \"Delete Set\", onPress: onDeleteSet, destructive: true, testID: \"delete-set\" });\n    return list;\n  }, [onEditTarget, onDeleteSet]);\n  const previousLines = props.previousLines ?? [];\n  const isSubscribed = props.subscription != null && Subscriptions_hasSubscription(props.subscription);\n  const [isMenuOpen, setIsMenuOpen] = useState(false);\n  const { onMenuOpenChange } = props;\n  const onOpenChange = useCallback(\n    (isOpen: boolean) => {\n      setIsMenuOpen(isOpen);\n      onMenuOpenChange?.(isOpen);\n    },\n    [onMenuOpenChange]\n  );\n  const menuZIndex = Platform.OS === \"web\" && isMenuOpen ? { zIndex: 50 } : undefined;\n  const tabIndex = useContext(WorkoutTabStopContext);\n\n  return (\n    <View\n      className={`${WorkoutExerciseUtils_getBgColor100([set], props.type === \"warmup\")}`}\n      data-testid={WorkoutExerciseSet_dataCy(set)}\n      testID={WorkoutExerciseSet_dataCy(set)}\n      style={menuZIndex}\n    >\n      <View className={`border-b ${props.borderColor} pb-2`} style={menuZIndex}>\n        <View className=\"flex-row\" style={menuZIndex}>\n          <Pressable\n            className=\"items-center justify-center\"\n            style={{ width: columnWidths.set }}\n            disabled={props.onToggleExpand == null && onLongPressSet == null}\n            onPress={props.onToggleExpand}\n            onLongPress={onLongPressSet}\n          >\n            <View\n              className=\"w-scaled-6 h-scaled-6 items-center justify-center\"\n              style={{\n                borderRadius: 9999,\n                overflow: \"hidden\",\n                backgroundColor: props.isNext ? Tailwind_semantic().button.primarybackground : \"transparent\",\n              }}\n            >\n              {props.type === \"warmup\" ? (\n                <Text className={`text-xs ${props.isNext ? \"text-text-alwayswhite font-bold\" : \"\"}`}>W</Text>\n              ) : (\n                <Text className={props.isNext ? \"text-text-alwayswhite font-bold\" : \"\"}>{props.setIndex + 1}</Text>\n              )}\n            </View>\n          </Pressable>\n          <View className=\"flex-1\" style={menuZIndex}>\n            <View className=\"flex-row items-center\" style={menuZIndex}>\n              <Pressable\n                className=\"flex-row items-center flex-1 pt-1\"\n                data-testid=\"workout-set-row-head\"\n                testID=\"workout-set-row-head\"\n                disabled={onTargetPress == null && onLongPressSet == null}\n                onPress={onTargetPress}\n                onLongPress={onLongPressSet}\n              >\n                <View className=\"flex-1\" data-testid=\"workout-set-target\" testID=\"workout-set-target\">\n                  <WorkoutExerciseSetTargetField\n                    set={set}\n                    lastSet={props.lastSet}\n                    setType={props.setType}\n                    settings={props.settings}\n                    exerciseType={props.exerciseType}\n                    underlineRounded={props.isRoundedWeight}\n                    sizeClass=\"text-lg\"\n                    dimIncomplete={false}\n                  />\n                </View>\n              </Pressable>\n              <ActionMenu\n                renderTrigger={(open) => (\n                  <Pressable\n                    data-testid=\"set-options\"\n                    testID=\"set-options\"\n                    className=\"px-4 py-2\"\n                    hitSlop={12}\n                    onPress={open}\n                  >\n                    <IconEdit2 />\n                  </Pressable>\n                )}\n                actions={actions}\n                onOpenChange={onOpenChange}\n              />\n            </View>\n\n            <View className=\"flex-row items-center gap-2 pr-4\">\n              {isUnilateral ? (\n                <>\n                  <Text className=\"text-xs text-text-secondary\">L</Text>\n                  <InputNumber2\n                    size=\"lg\"\n                    fill={true}\n                    tabIndex={tabIndex}\n                    tabStop={true}\n                    name=\"set-left-reps\"\n                    cornerLabel=\"reps\"\n                    onInput={props.onInputLeftReps}\n                    onBlur={props.onBlurLeftReps}\n                    placeholder={props.placeholderReps}\n                    initialValue={set.reps}\n                    value={set.completedRepsLeft != null ? set.completedRepsLeft : undefined}\n                    min={0}\n                    max={9999}\n                    step={1}\n                    inputCommitMode=\"blur\"\n                  />\n                  <Text className=\"text-xs text-text-secondary\">R</Text>\n                  <InputNumber2\n                    size=\"lg\"\n                    fill={true}\n                    tabIndex={tabIndex}\n                    tabStop={true}\n                    name=\"set-reps\"\n                    cornerLabel=\"reps\"\n                    onInput={props.onInputReps}\n                    onBlur={props.onBlurReps}\n                    placeholder={props.placeholderReps}\n                    initialValue={set.reps}\n                    value={set.completedReps != null ? set.completedReps : undefined}\n                    min={0}\n                    max={9999}\n                    step={1}\n                    inputCommitMode=\"blur\"\n                  />\n                </>\n              ) : (\n                <InputNumber2\n                  size=\"lg\"\n                  fill={true}\n                  tabIndex={tabIndex}\n                  tabStop={true}\n                  name=\"set-reps\"\n                  cornerLabel=\"reps\"\n                  onInput={props.onInputReps}\n                  onBlur={props.onBlurReps}\n                  placeholder={props.placeholderReps}\n                  initialValue={set.reps}\n                  value={set.completedReps != null ? set.completedReps : undefined}\n                  min={0}\n                  max={9999}\n                  step={1}\n                  inputCommitMode=\"blur\"\n                />\n              )}\n              <Text className=\"text-xl text-text-secondary\">×</Text>\n              <InputWeight2\n                size=\"lg\"\n                fill={true}\n                fillFlex={isUnilateral ? UNILATERAL_WEIGHT_FLEX : 1}\n                tabIndex={tabIndex}\n                tabStop={true}\n                name=\"set-weight\"\n                showUnitInCorner={true}\n                exerciseType={props.exerciseType}\n                inputCommitMode=\"blur\"\n                onBlur={props.onBlurWeight}\n                onInput={props.onInputWeight}\n                addOn={\n                  set.rpe != null && set.reps != null\n                    ? () => (\n                        <RpeWeightHint\n                          reps={set.completedReps ?? set.reps ?? 0}\n                          rpe={set.completedRpe ?? set.rpe!}\n                          settings={props.settings}\n                          exerciseType={props.exerciseType}\n                        />\n                      )\n                    : undefined\n                }\n                subscription={props.subscription}\n                placeholder={props.placeholderWeight}\n                initialValue={set.weight}\n                value={set.completedWeight || undefined}\n                max={9999}\n                min={-9999}\n                settings={props.settings}\n              />\n              {columnWidths.rpe > 0 ? (\n                <WorkoutExerciseSetRpeTime\n                  set={set}\n                  isUnilateral={isUnilateral}\n                  completedRpeValue={props.completedRpeValue}\n                  sizeClass=\"text-lg\"\n                  onEditSetTimer={props.onEditSetTimer}\n                />\n              ) : null}\n              {props.type === \"workout\" && set.setTimer != null && !set.isCompleted ? (\n                <Pressable\n                  tabIndex={tabIndex}\n                  dataSet={{ tabStop: \"1\" }}\n                  className=\"py-1 pl-2\"\n                  data-testid=\"start-set-timer\"\n                  testID=\"start-set-timer\"\n                  onPress={props.onCompleteSet}\n                >\n                  <IconPlayCircle size={COMPLETE_ICON_SIZE} color={WorkoutExerciseUtils_getIconColor([set], false)} />\n                </Pressable>\n              ) : (\n                <Pressable\n                  tabIndex={tabIndex}\n                  dataSet={{ tabStop: \"1\" }}\n                  className=\"py-1 pl-2\"\n                  data-testid=\"complete-set\"\n                  testID=\"complete-set\"\n                  onPress={props.onCompleteSet}\n                >\n                  <IconCheckCircle\n                    size={COMPLETE_ICON_SIZE}\n                    isChecked={true}\n                    color={WorkoutExerciseUtils_getIconColor([set], props.type === \"warmup\")}\n                  />\n                </Pressable>\n              )}\n            </View>\n\n            {props.platesLine && (\n              <Pressable\n                className=\"flex-row items-center gap-2 pr-4 mt-1\"\n                testID=\"set-plates\"\n                disabled={props.onToggleExpand == null && onLongPressSet == null}\n                onPress={props.onToggleExpand}\n                onLongPress={onLongPressSet}\n              >\n                {isSubscribed && props.platesLine.isMatch ? (\n                  <PlatesBar plates={props.platesLine.sidePlates} />\n                ) : (\n                  <IconBarbellPlates size={isSubscribed ? 24 : 17} />\n                )}\n                {isSubscribed ? (\n                  <Text\n                    className={`text-2xl font-semibold ${props.platesLine.isMatch ? \"text-text-primary\" : \"text-text-error\"}`}\n                    data-testid=\"set-plates-list\"\n                    testID=\"set-plates-list\"\n                  >\n                    {props.platesLine.plates}\n                  </Text>\n                ) : (\n                  <LinkButton name=\"see-plates-for-each-side\" className=\"text-xs\" onClick={props.onOpenSubscription}>\n                    See plates for each side\n                  </LinkButton>\n                )}\n              </Pressable>\n            )}\n\n            {previousLines.length > 0 && (\n              <Pressable\n                className=\"pr-4 mt-1\"\n                testID=\"set-previous-lines\"\n                disabled={props.onToggleExpand == null && onLongPressSet == null}\n                onPress={props.onToggleExpand}\n                onLongPress={onLongPressSet}\n              >\n                {previousLines.map((line) => (\n                  <View key={line.label} className=\"flex-row flex-wrap items-center gap-1\">\n                    <Text className=\"text-xs text-text-secondary\">{line.label}:</Text>\n                    <WorkoutExerciseLastSet set={line.set} sizeClass=\"text-xs\" />\n                    <Text className=\"text-xs text-text-secondary\">· {DateUtils_formatDayMonth(line.timestamp)}</Text>\n                  </View>\n                ))}\n              </Pressable>\n            )}\n          </View>\n        </View>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { ISettings, ISet, IExerciseType } from \"../types\";\nimport { n } from \"../utils/math\";\nimport { TimeUtils_formatMMSS } from \"../utils/time\";\nimport { FastText } from \"./primitives/fastText\";\nimport { StyledText, StyledText_cls } from \"../utils/styledText\";\nimport { useRem } from \"../utils/useRem\";\nimport { WorkoutExerciseUtils_setsStatusToTextColorValue } from \"../utils/workoutExerciseUtils\";\nimport { Reps_setsStatus, Reps_avgUnilateralCompletedReps, Reps_displayCompletedReps } from \"../models/set\";\nimport {\n  Weight_eq,\n  Weight_rpeMultiplier,\n  Weight_multiply,\n  Weight_calculatePlates,\n  Weight_formatOneSide,\n  Weight_isPct,\n  Weight_getOneRepMax,\n} from \"../models/weight\";\nimport { Exercise_onerm } from \"../models/exercise\";\n\nexport type IWorkoutSetType = \"program\" | \"warmup\" | \"adhoc\";\n\ninterface IWorkoutExerciseSetTargetProps {\n  setType: IWorkoutSetType;\n  set: ISet;\n  underlineRounded?: boolean;\n  sizeClass?: string;\n}\n\nexport function WorkoutExerciseSetTarget(props: IWorkoutExerciseSetTargetProps): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const sizeClass = props.sizeClass ?? \"text-sm\";\n  switch (props.setType) {\n    case \"warmup\": {\n      const set = props.set;\n      const builder = new StyledText();\n      if (set.reps != null) {\n        builder.add(n(Math.max(0, set.reps)), cls(\"font-semibold\"));\n      }\n      if (set.reps != null && set.weight != null) {\n        builder.add(\" × \", cls(\"text-text-secondary\"));\n      }\n      if (set.weight != null) {\n        builder.add(n(set.weight.value), cls(\"font-semibold\"));\n        builder.add(set.weight.unit, cls(\"text-xs\"));\n      }\n      const built = builder.build();\n      return (\n        <View>\n          <Text className=\"text-xs text-text-secondary\">Warmup</Text>\n          <FastText text={built.text} fragments={built.fragments} {...cls(`${sizeClass} text-text-primary`)} />\n        </View>\n      );\n    }\n    case \"adhoc\":\n    case \"program\": {\n      const aSet = props.set;\n      const isDiffWeight = aSet.weight && aSet.originalWeight && !Weight_eq(aSet.weight, aSet.originalWeight);\n      const hasTarget = aSet.reps != null || aSet.weight != null;\n      const builder = new StyledText();\n      if (aSet.reps != null) {\n        builder.add(\n          `${aSet.minReps != null ? `${n(Math.max(0, aSet.minReps))}-` : \"\"}${n(Math.max(0, aSet.reps))}${aSet.isAmrap ? \"+\" : \"\"}`,\n          cls(\"font-semibold text-syntax-reps\")\n        );\n      }\n      if (aSet.reps != null && aSet.weight != null) {\n        builder.add(\" × \", cls(\"text-text-secondary\"));\n      }\n      if (aSet.originalWeight && aSet.weight) {\n        if (isDiffWeight) {\n          builder.add(n(aSet.originalWeight.value), cls(\"line-through text-text-secondary\"));\n          builder.add(aSet.originalWeight.unit, cls(\"text-xs line-through text-text-secondary\"));\n        } else {\n          builder.add(n(aSet.originalWeight.value), cls(\"font-semibold text-syntax-weight\"));\n          builder.add(aSet.originalWeight.unit, cls(\"text-xs text-syntax-weight\"));\n        }\n      }\n      if (aSet.weight && isDiffWeight) {\n        const underline = props.underlineRounded ? \" underline\" : \"\";\n        builder.add(\" \");\n        builder.add(n(aSet.weight.value), cls(`font-semibold text-syntax-weight${underline}`));\n        builder.add(aSet.weight.unit, cls(`text-xs text-syntax-weight${underline}`));\n      }\n      builder.add(\n        `${aSet.originalWeight == null && aSet.askWeight ? \" ?\" : \"\"}${aSet.askWeight ? \"+\" : \"\"}${\n          aSet.rpe ? ` @${n(Math.max(0, aSet.rpe))}` : \"\"\n        }${aSet.rpe && aSet.logRpe ? \"+\" : \"\"}`,\n        cls(\"font-semibold text-syntax-rpe\")\n      );\n      if (aSet.setTimer != null) {\n        const overflow = aSet.isOverflowSetTimer ? \"+\" : \"\";\n        builder.add(` ${n(Math.max(0, aSet.setTimer))}`, cls(\"font-semibold text-syntax-timer\"));\n        builder.add(\"s\", cls(\"text-xs text-syntax-timer\"));\n        builder.add(`${overflow}|`, cls(\"font-semibold text-syntax-timer\"));\n        if (aSet.timer != null) {\n          builder.add(`${n(Math.max(0, aSet.timer))}`, cls(\"font-semibold text-syntax-timer\"));\n          builder.add(\"s\", cls(\"text-xs text-syntax-timer\"));\n        } else {\n          builder.add(\"?\", cls(\"font-semibold text-syntax-timer\"));\n        }\n      } else if (aSet.timer != null) {\n        builder.add(` ${n(aSet.timer)}`, cls(\"text-syntax-timer\"));\n        builder.add(\"s\", cls(\"text-xs text-syntax-timer\"));\n      }\n      if (aSet.auto) {\n        builder.add(\" auto\", cls(\"text-syntax-auto\"));\n      }\n      const built = builder.build();\n      return (\n        <View>\n          {aSet.label ? <Text className=\"text-xs text-text-secondary\">{aSet.label}</Text> : null}\n          {props.setType === \"adhoc\" && <Text className=\"text-xs text-text-secondary\">Ad-hoc</Text>}\n          {hasTarget ? (\n            <FastText text={built.text} fragments={built.fragments} {...cls(`${sizeClass} text-text-primary`)} />\n          ) : (\n            <Text className={sizeClass}>None</Text>\n          )}\n        </View>\n      );\n    }\n  }\n}\n\ninterface IWorkoutExerciseLastSetProps {\n  set?: ISet;\n  sizeClass?: string;\n}\n\nexport function WorkoutExerciseLastSet(props: IWorkoutExerciseLastSetProps): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const set = props.set;\n  if (set == null) {\n    return <Text className=\"text-xs text-text-secondary\">No last set</Text>;\n  }\n  const statusColor = WorkoutExerciseUtils_setsStatusToTextColorValue(Reps_setsStatus([set]));\n  const semibold = { ...cls(\"font-semibold\"), color: statusColor };\n  const builder = new StyledText();\n  builder.add(Reps_displayCompletedReps(set), semibold);\n  builder.add(\" × \", cls(\"text-text-secondary\"));\n  builder.add(set.completedWeight ? set.completedWeight.value.toString() : \"-\", semibold);\n  builder.add(set.completedWeight?.unit, { ...cls(\"text-xs\"), color: statusColor });\n  builder.add(\n    set.completedRpe != null\n      ? ` @${n(Math.max(0, set.completedRpe))}+`\n      : set.rpe != null\n        ? ` @${n(Math.max(0, set.rpe))}`\n        : \"\",\n    semibold\n  );\n  const built = builder.build();\n  return (\n    <View>\n      {set.label ? <Text className=\"text-xs text-text-secondary\">{set.label}</Text> : null}\n      <FastText\n        text={built.text}\n        fragments={built.fragments}\n        {...cls(`${props.sizeClass ?? \"text-sm\"} text-text-primary`)}\n      />\n    </View>\n  );\n}\n\ninterface IRpeWeightHintProps {\n  reps: number;\n  rpe: number;\n  settings: ISettings;\n  exerciseType: IExerciseType;\n}\n\nexport function RpeWeightHint(props: IRpeWeightHintProps): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const multiplier = Weight_rpeMultiplier(props.reps, props.rpe);\n  const onerm = Exercise_onerm(props.exerciseType, props.settings);\n  const weight = Weight_multiply(onerm, multiplier);\n  const builder = new StyledText();\n  builder.add(`${props.reps}`, cls(\"font-bold text-syntax-reps\"));\n  builder.add(\" × \");\n  builder.add(`@${props.rpe}`, cls(\"font-bold text-syntax-rpe\"));\n  builder.add(\" - \");\n  builder.add(`${n(multiplier * 100, 0)}%`, cls(\"font-bold text-text-primary\"));\n  builder.add(\" of 1RM - \");\n  builder.add(n(weight.value), cls(\"font-bold text-text-primary\"));\n  builder.add(weight.unit);\n  const built = builder.build();\n  return (\n    <View>\n      <FastText text={built.text} fragments={built.fragments} {...cls(\"text-xs text-text-secondary\")} />\n    </View>\n  );\n}\n\ninterface IWorkoutExerciseSetRpeTimeProps {\n  set: ISet;\n  isUnilateral: boolean;\n  completedRpeValue?: number;\n  width?: number;\n  sizeClass?: string;\n  onEditSetTimer?: () => void;\n}\n\nexport function WorkoutExerciseSetRpeTime(props: IWorkoutExerciseSetRpeTimeProps): JSX.Element {\n  const { set, isUnilateral, completedRpeValue } = props;\n  const sizeClass = props.sizeClass ?? \"text-xs\";\n  return (\n    <View\n      className=\"items-center justify-center py-2 ml-1\"\n      style={props.width != null ? { width: props.width } : undefined}\n    >\n      {completedRpeValue != null ? (\n        <Text\n          numberOfLines={1}\n          data-testid=\"rpe-value\"\n          testID=\"rpe-value\"\n          className={`${sizeClass} font-semibold text-text-success`}\n        >\n          @{n(completedRpeValue)}\n        </Text>\n      ) : null}\n      {set.completedSetTimer != null || set.completedSetTimerLeft != null ? (\n        <Pressable\n          data-testid=\"set-timer-value\"\n          testID=\"set-timer-value\"\n          hitSlop={{ top: 12, bottom: 12, left: 12, right: 12 }}\n          onPress={props.onEditSetTimer}\n        >\n          {isUnilateral && (\n            <Text\n              numberOfLines={1}\n              data-testid=\"set-timer-value-left\"\n              testID=\"set-timer-value-left\"\n              className={`${sizeClass} font-semibold text-syntax-timer`}\n            >\n              L {set.completedSetTimerLeft != null ? TimeUtils_formatMMSS(set.completedSetTimerLeft * 1000) : \"-\"}\n            </Text>\n          )}\n          <Text numberOfLines={1} className={`${sizeClass} font-semibold text-syntax-timer`}>\n            {isUnilateral ? \"R \" : \"\"}\n            {set.completedSetTimer != null ? TimeUtils_formatMMSS(set.completedSetTimer * 1000) : \"-\"}\n          </Text>\n        </Pressable>\n      ) : null}\n    </View>\n  );\n}\n\nexport function WorkoutExerciseSet_dataCy(set: ISet): string {\n  if (set.isAmrap) {\n    if (!set.isCompleted || !set.completedReps) {\n      return \"set-amrap-nonstarted\";\n    } else if (set.minReps != null && set.completedReps < set.minReps) {\n      return \"set-amrap-incompleted\";\n    } else if (set.minReps != null && set.reps != null && set.completedReps < set.reps) {\n      return \"set-amrap-in-range\";\n    } else if (set.reps != null && set.completedReps < set.reps) {\n      return \"set-amrap-incompleted\";\n    } else {\n      return \"set-amrap-completed\";\n    }\n  } else if (set.completedReps == null || !set.isCompleted) {\n    return \"set-nonstarted\";\n  } else {\n    if (set.reps == null || set.completedReps >= set.reps) {\n      return \"set-completed\";\n    } else if (set.minReps != null && set.completedReps >= set.minReps) {\n      return \"set-in-range\";\n    } else {\n      return \"set-incompleted\";\n    }\n  }\n}\n\ninterface IWorkoutExerciseSetTargetFieldProps {\n  setType: IWorkoutSetType;\n  set: ISet;\n  lastSet?: ISet;\n  settings: ISettings;\n  exerciseType: IExerciseType;\n  underlineRounded?: boolean;\n  sizeClass?: string;\n  dimIncomplete?: boolean;\n}\n\nexport function WorkoutExerciseSetTargetField(props: IWorkoutExerciseSetTargetFieldProps): JSX.Element {\n  switch (props.settings.workoutSettings.targetType) {\n    case \"target\": {\n      return (\n        <WorkoutExerciseSetTarget\n          set={props.set}\n          setType={props.setType}\n          underlineRounded={props.underlineRounded}\n          sizeClass={props.sizeClass}\n        />\n      );\n    }\n    case \"lasttime\": {\n      return <WorkoutExerciseLastSet set={props.lastSet} sizeClass={props.sizeClass} />;\n    }\n    case \"platescalculator\": {\n      return (\n        <WorkoutExercisePlatesCalculator\n          set={props.set}\n          settings={props.settings}\n          exerciseType={props.exerciseType}\n          sizeClass={props.sizeClass}\n        />\n      );\n    }\n    case \"e1rm\": {\n      return (\n        <WorkoutExerciseE1RMSet\n          set={props.set}\n          settings={props.settings}\n          sizeClass={props.sizeClass}\n          dimIncomplete={props.dimIncomplete}\n        />\n      );\n    }\n  }\n  return <View />;\n}\n\ninterface IWorkoutExercisePlatesCalculatorProps {\n  set: ISet;\n  settings: ISettings;\n  exerciseType: IExerciseType;\n  sizeClass?: string;\n}\n\nfunction WorkoutExercisePlatesCalculator(props: IWorkoutExercisePlatesCalculatorProps): JSX.Element {\n  const sizeClass = props.sizeClass ?? \"text-sm\";\n  const setWeight = props.set.weight;\n  if (setWeight == null) {\n    return (\n      <Text className={`${sizeClass} font-semibold`} data-testid=\"plates-list\" testID=\"plates-list\">\n        None\n      </Text>\n    );\n  }\n\n  const { plates, totalWeight: weight } = Weight_calculatePlates(\n    props.set.completedWeight ?? setWeight,\n    props.settings,\n    setWeight.unit,\n    props.exerciseType\n  );\n  const formattedPlates = plates.length > 0 ? Weight_formatOneSide(props.settings, plates, props.exerciseType) : \"None\";\n  return (\n    <Text\n      className={`${sizeClass} font-semibold ${Weight_eq(weight, props.set.completedWeight ?? setWeight) ? \"text-text-primary\" : \"text-text-error\"}`}\n      data-testid=\"plates-list\"\n      testID=\"plates-list\"\n    >\n      {formattedPlates}\n    </Text>\n  );\n}\n\ninterface IWorkoutExerciseE1RMSetProps {\n  set: ISet;\n  settings: ISettings;\n  sizeClass?: string;\n  dimIncomplete?: boolean;\n}\n\nfunction WorkoutExerciseE1RMSet(props: IWorkoutExerciseE1RMSetProps): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const sizeClass = props.sizeClass ?? \"text-sm\";\n  const set = props.set;\n  const isCompleted = !!set.isCompleted;\n  const weight = set.completedWeight ?? set.weight ?? set.originalWeight;\n  const reps = Reps_avgUnilateralCompletedReps(set) ?? set.reps;\n  const rpe = set.completedRpe ?? set.rpe ?? 10;\n  if (weight == null || Weight_isPct(weight) || reps == null) {\n    return <Text className={sizeClass}>Unknown</Text>;\n  }\n  const e1RM = Weight_getOneRepMax(weight, reps, rpe);\n  const built = new StyledText().add(n(e1RM.value), cls(\"font-semibold\")).add(e1RM.unit, cls(\"text-xs\")).build();\n  return (\n    <FastText\n      text={built.text}\n      fragments={built.fragments}\n      {...cls(`${sizeClass} text-text-primary`)}\n      style={isCompleted || props.dimIncomplete === false ? undefined : { opacity: 0.4 }}\n    />\n  );\n}\n","import { JSX, memo, useCallback } from \"react\";\nimport { View } from \"react-native\";\nimport { Pressable } from \"./primitives/pressable\";\nimport { FastText } from \"./primitives/fastText\";\nimport { StyledText, StyledText_cls } from \"../utils/styledText\";\nimport { useRem } from \"../utils/useRem\";\nimport { Exercise_get } from \"../models/exercise\";\nimport { Reps_setsStatus } from \"../models/set\";\nimport { IHistoryEntry, ISettings } from \"../types\";\nimport {\n  WorkoutExerciseUtils_setsStatusToBorderColor,\n  WorkoutExerciseUtils_setsStatusToColor,\n} from \"../utils/workoutExerciseUtils\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { IconCheckCircle } from \"./icons/iconCheckCircle\";\nimport { StringUtils_dashcase } from \"../utils/string\";\nimport { Tailwind_colors, Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { ObjectUtils_entries } from \"../utils/object\";\n\ninterface IWorkoutExerciseThumbnailProps {\n  onSelect?: (entryIndex: number) => void;\n  colorToSupersetGroup: Partial<Record<string, IHistoryEntry[]>>;\n  isCurrent: boolean;\n  currentSuperset?: string;\n  shouldShowProgress?: boolean;\n  entry: IHistoryEntry;\n  entryIndex: number;\n  settings: ISettings;\n}\n\nfunction WorkoutExerciseThumbnailInner(props: IWorkoutExerciseThumbnailProps): JSX.Element {\n  const { entry, entryIndex, isCurrent, currentSuperset, onSelect } = props;\n  const onPress = useCallback(() => onSelect?.(entryIndex), [onSelect, entryIndex]);\n  const hasSupersets = Object.keys(props.colorToSupersetGroup).length > 0;\n  const colorAndSupersetGroup = ObjectUtils_entries(props.colorToSupersetGroup).find(([_, entries]) => {\n    return entries && entries.some((e) => e.id === entry.id);\n  });\n  const supersetColor = colorAndSupersetGroup ? colorAndSupersetGroup[0] : undefined;\n  const setsStatus = Reps_setsStatus(entry.sets);\n  const isCurrentSuperset = currentSuperset != null && currentSuperset === entry.superset;\n  const borderColor = WorkoutExerciseUtils_setsStatusToBorderColor(setsStatus);\n  const cornerInset = isCurrent ? 0 : 1;\n  const exercise = Exercise_get(entry.exercise, props.settings.exercises);\n  const totalSetsCount = entry.sets.length;\n  const completedSetsCount = entry.sets.filter((set) => set.isCompleted).length;\n\n  const tile = (\n    <View\n      data-name={`workout-exercise-tab-${entryIndex}`}\n      testID={`workout-tab-${StringUtils_dashcase(exercise.name)}`}\n      data-testid={`workout-tab-${StringUtils_dashcase(exercise.name)}`}\n      dataSet={{ isSelected: isCurrent ? \"true\" : \"false\" }}\n      className=\"bg-background-default\"\n      style={{\n        borderWidth: 1,\n        borderRadius: 9,\n        borderColor: isCurrent ? Tailwind_semantic().border.currentoutline : \"transparent\",\n      }}\n    >\n      <View\n        className={`items-center flex-row justify-center w-scaled-16 h-scaled-16 border ${borderColor} bg-background-image rounded-lg overflow-hidden`}\n        style={\n          isCurrent\n            ? { borderWidth: 2, borderColor: Tailwind_semantic().border.current }\n            : { borderWidth: 1, padding: 1 }\n        }\n      >\n        <ExerciseImage\n          useTextForCustomExercise={true}\n          exerciseType={entry.exercise}\n          size=\"small\"\n          width={40}\n          settings={props.settings}\n        />\n        {setsStatus === \"not-finished\" ? (\n          props.shouldShowProgress && (\n            <View style={{ position: \"absolute\", bottom: cornerInset, right: cornerInset, padding: 2 }}>\n              <View className=\"absolute inset-0 rounded-md bg-lightgray-50\" style={{ opacity: 0.75 }} />\n              <View style={{ position: \"relative\", zIndex: 10 }}>\n                <SetsProgressBadge completed={completedSetsCount} total={totalSetsCount} />\n              </View>\n            </View>\n          )\n        ) : (\n          <View style={{ position: \"absolute\", bottom: 2 + cornerInset, right: 2 + cornerInset }}>\n            <IconCheckCircle\n              isChecked={true}\n              size={14}\n              color={WorkoutExerciseUtils_setsStatusToColor(setsStatus)}\n              checkColor={Tailwind_colors().white}\n            />\n          </View>\n        )}\n      </View>\n    </View>\n  );\n  return (\n    <View>\n      {onSelect ? <Pressable onPress={onPress}>{tile}</Pressable> : tile}\n      {supersetColor ? (\n        <View className=\"mx-1\">\n          <View\n            className=\"w-full\"\n            style={{\n              backgroundColor: isCurrentSuperset ? supersetColor : Tailwind_semantic().background.neutral,\n              height: 2,\n              marginTop: 5,\n            }}\n          />\n        </View>\n      ) : hasSupersets ? (\n        <View className=\"w-full\" style={{ backgroundColor: \"transparent\", height: 2, marginTop: 5 }} />\n      ) : null}\n    </View>\n  );\n}\n\nfunction SetsProgressBadge(props: { completed: number; total: number }): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const counter = cls(\"text-xs font-semibold\");\n  const built = new StyledText().add(`${props.completed}`, counter).add(\"/\").add(`${props.total}`, counter).build();\n  return <FastText text={built.text} fragments={built.fragments} {...cls(\"text-base text-black\")} />;\n}\n\nexport const WorkoutExerciseThumbnail = memo(WorkoutExerciseThumbnailInner);\n","import { JSX, memo, MutableRefObject, useState } from \"react\";\nimport { View } from \"react-native\";\nimport type RB from \"rollbar\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { Button } from \"./button\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { Tailwind_colors } from \"../utils/tailwindConfig\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { WorkoutFinish_run } from \"../utils/workoutFinish\";\n\ndeclare let Rollbar: RB | undefined;\n\ninterface IWorkoutFinishButtonProps {\n  progressRef: MutableRefObject<IHistoryRecord>;\n  isCurrent: boolean;\n  settings: ISettings;\n  dispatch: IDispatch;\n}\n\nfunction WorkoutFinishButtonInner(props: IWorkoutFinishButtonProps): JSX.Element {\n  const isCurrent = props.isCurrent;\n  const [isFinishing, setIsFinishing] = useState(false);\n  return (\n    <Button\n      name={isCurrent ? \"finish-workout\" : \"save-history-record\"}\n      kind=\"purple\"\n      buttonSize=\"md\"\n      disabled={isFinishing}\n      data-testid=\"finish-workout\"\n      testID=\"finish-workout\"\n      className={isCurrent ? \"ls-finish-workout\" : \"ls-save-history-record\"}\n      onClick={() => {\n        if (isFinishing) {\n          return;\n        }\n        WorkoutFinish_run({\n          progress: props.progressRef.current,\n          settings: props.settings,\n          dispatch: props.dispatch,\n          isCurrent,\n          setIsFinishing,\n        }).catch((error) => {\n          if (typeof Rollbar !== \"undefined\" && Rollbar != null) {\n            Rollbar.error(error instanceof Error ? error : new Error(String(error)));\n          }\n          Dialog_alert(\"Something went wrong finishing your workout. Please try again.\");\n        });\n      }}\n    >\n      {isFinishing ? (\n        <View className=\"px-2\">\n          <IconSpinner width={20} height={20} color={Tailwind_colors().white} />\n        </View>\n      ) : isCurrent ? (\n        \"Finish\"\n      ) : (\n        \"Save\"\n      )}\n    </Button>\n  );\n}\n\nexport const WorkoutFinishButton = memo(WorkoutFinishButtonInner);\n","import { JSX, useContext, useSyncExternalStore } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IconHeart } from \"./icons/iconHeart\";\nimport { AppContext } from \"./appContext\";\nimport { IHeartRateStore } from \"../utils/heartRateStore\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\n\nexport function WorkoutHeartRate(): JSX.Element | null {\n  const store = useContext(AppContext).heartRate;\n  return store != null ? <WorkoutHeartRateValue store={store} /> : null;\n}\n\nfunction WorkoutHeartRateValue(props: { store: IHeartRateStore }): JSX.Element | null {\n  const bpm = useSyncExternalStore(props.store.subscribe, props.store.getBpm);\n  if (bpm == null) {\n    return null;\n  }\n  return (\n    <View className=\"flex-row items-center ml-3\" testID=\"workout-heart-rate\">\n      <IconHeart size={14} color={Tailwind_semantic().icon.red} />\n      <Text className=\"ml-1 text-sm font-semibold\">{bpm}</Text>\n    </View>\n  );\n}\n","import { Platform } from \"react-native\";\nimport { Easing, FadeIn, FadeOut, LinearTransition } from \"react-native-reanimated\";\n\nconst DURATION_MS = 220;\n\n// Every block below a set row needs it too, or it jumps to its final place while the rows slide.\n// Native only: web renders the set menu as an inline dropdown that a clipped row would hide.\nexport const WorkoutLayoutTransition =\n  Platform.OS === \"web\" ? undefined : LinearTransition.duration(DURATION_MS).easing(Easing.linear);\n\nexport const WorkoutLayoutClip = Platform.OS === \"web\" ? undefined : ({ overflow: \"hidden\" } as const);\n\nexport const WorkoutBodyEntering =\n  Platform.OS === \"web\" ? undefined : FadeIn.duration(DURATION_MS).easing(Easing.linear);\n\nexport const WorkoutBodyExiting =\n  Platform.OS === \"web\" ? undefined : FadeOut.duration(DURATION_MS).easing(Easing.linear);\n","import { JSX, memo, useMemo } from \"react\";\nimport { Pressable } from \"react-native\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_pushScreen, Thunk_pushToEditProgramDay } from \"../ducks/thunks\";\nimport { IHistoryRecord, IProgram, ISettings } from \"../types\";\nimport { IEvaluatedProgram, Program_isEmpty } from \"../models/program\";\nimport { Progress_isCurrent } from \"../models/progress\";\nimport { IState, updateSettings, updateState } from \"../models/state\";\nimport { useTrackClick } from \"../utils/clickTracking\";\nimport { IWorkoutMenuAction, WorkoutMenuActions_list } from \"../utils/workoutMenuActions\";\nimport { ActionMenu, IActionMenuAction } from \"./actionMenu\";\nimport { IconKebab } from \"./icons/iconKebab\";\nimport { Tour_start } from \"./tour/tourConfigs\";\nimport { workoutTourConfig } from \"./tour/workoutTourConfig\";\n\ninterface IWorkoutMenuProps {\n  progress: IHistoryRecord;\n  program?: IEvaluatedProgram;\n  allPrograms: IProgram[];\n  settings: ISettings;\n  dispatch: IDispatch;\n  onShare: () => void;\n  onConvertToProgram: () => void;\n  onDelete: () => void;\n  onOpenChange?: (isOpen: boolean) => void;\n}\n\nconst labels: Record<IWorkoutMenuAction, string> = {\n  editDay: \"Edit Program Day\",\n  muscles: \"Day Muscles\",\n  notes: \"Show Workout Notes\",\n  share: \"Share\",\n  createProgramDay: \"Create Program Day\",\n  tour: \"Show Tour\",\n  delete: \"Delete Workout\",\n};\n\nfunction WorkoutMenuInner(props: IWorkoutMenuProps): JSX.Element {\n  const { progress, program, allPrograms, dispatch, onShare, onConvertToProgram, onDelete } = props;\n  const showWorkoutNotes = !!props.settings.workoutSettings.showWorkoutNotes;\n  const trackClick = useTrackClick();\n  const currentProgram = allPrograms.find((p) => p.id === program?.id);\n  const isCurrent = Progress_isCurrent(progress);\n  const actionIds = WorkoutMenuActions_list({\n    isCurrent,\n    hasNonEmptyProgram: program != null && !Program_isEmpty(program),\n    hasNonEmptyCurrentProgram: currentProgram != null && !Program_isEmpty(currentProgram),\n    isInAnyProgram: allPrograms.some((p) => p.id === progress.programId),\n  });\n\n  const handlers = useMemo<Record<IWorkoutMenuAction, () => void>>(\n    () => ({\n      editDay: () => {\n        trackClick(\"workout-edit-day\");\n        if (currentProgram) {\n          dispatch(Thunk_pushToEditProgramDay(progress.day, currentProgram.id));\n        }\n      },\n      muscles: () => {\n        trackClick(\"workout-day-muscles\");\n        if (program) {\n          updateState(\n            dispatch,\n            [lb<IState>().p(\"muscleView\").record({ type: \"day\", programId: program.id, day: progress.day })],\n            \"Show muscle view\"\n          );\n          dispatch(Thunk_pushScreen(\"muscles\"));\n        }\n      },\n      notes: () => {\n        trackClick(showWorkoutNotes ? \"workout-notes-hide\" : \"workout-notes-show\");\n        updateSettings(\n          dispatch,\n          lb<ISettings>().p(\"workoutSettings\").p(\"showWorkoutNotes\").record(!showWorkoutNotes),\n          \"toggle-workout-notes\"\n        );\n      },\n      share: () => {\n        trackClick(\"past-workout-share\");\n        onShare();\n      },\n      createProgramDay: () => {\n        trackClick(\"save-to-program\");\n        onConvertToProgram();\n      },\n      tour: () => {\n        trackClick(`navbar-tour-${workoutTourConfig.id}`);\n        Tour_start(dispatch, workoutTourConfig.id);\n      },\n      delete: () => {\n        trackClick(\"workout-delete\");\n        onDelete();\n      },\n    }),\n    [\n      trackClick,\n      currentProgram,\n      program,\n      progress.day,\n      dispatch,\n      showWorkoutNotes,\n      onShare,\n      onConvertToProgram,\n      onDelete,\n    ]\n  );\n\n  const actions = useMemo<IActionMenuAction[]>(\n    () =>\n      actionIds.map((id) => ({\n        label: id === \"notes\" && showWorkoutNotes ? \"Hide Workout Notes\" : labels[id],\n        onPress: handlers[id],\n        destructive: id === \"delete\",\n        testID: `workout-menu-${id}`,\n      })),\n    [actionIds.join(\",\"), handlers, showWorkoutNotes]\n  );\n\n  return (\n    <ActionMenu\n      renderTrigger={(open) => (\n        <Pressable\n          data-testid=\"workout-menu\"\n          testID=\"workout-menu\"\n          className=\"p-2\"\n          hitSlop={8}\n          onPress={() => {\n            trackClick(\"workout-menu\");\n            open();\n          }}\n        >\n          <IconKebab />\n        </Pressable>\n      )}\n      actions={actions}\n      onOpenChange={props.onOpenChange}\n    />\n  );\n}\n\nexport const WorkoutMenu = memo(WorkoutMenuInner);\n","import { createContext } from \"react\";\n\nexport const WorkoutPagerHeightContext = createContext<((entryIndex: number, height: number) => void) | undefined>(\n  undefined\n);\n","export interface IWorkoutPagerSettleArgs {\n  offsetX: number;\n  windowWidth: number;\n  isUserDriven: boolean;\n  // Where the gesture started, not where the pager last settled: nothing outside a gesture keeps\n  // a last-settled value current, so it drops a swipe back to a page reached by tapping.\n  dragStartIndex: number;\n}\n\nexport function WorkoutPagerSettle_index(args: IWorkoutPagerSettleArgs): number | undefined {\n  const { offsetX, windowWidth, isUserDriven, dragStartIndex } = args;\n  if (!isUserDriven || windowWidth <= 0) {\n    return undefined;\n  }\n  const index = Math.max(0, Math.floor((offsetX + windowWidth / 2) / windowWidth));\n  if (index === dragStartIndex) {\n    return undefined;\n  }\n  return index;\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { WorkoutShareOutput } from \"./workoutShareOutput\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { ImageShareUtils } from \"../utils/imageshare\";\nimport { BottomSheetItem } from \"./bottomSheetItem\";\nimport { IconPicture } from \"./icons/iconPicture\";\n\ninterface IWorkoutShareBottomSheetItemProps {\n  record?: IHistoryRecord;\n  history: IHistoryRecord[];\n  settings: ISettings;\n}\n\nexport function WorkoutShareBottomSheetItem(props: IWorkoutShareBottomSheetItemProps): JSX.Element {\n  const workoutShareRef = useRef<View>(null);\n  const [isLoading, setIsLoading] = useState<boolean>(false);\n  return (\n    <View className=\"relative overflow-hidden\">\n      <BottomSheetItem\n        name=\"share-to-image\"\n        title=\"Share Image...\"\n        description={\"\"}\n        icon={isLoading ? <IconSpinner height={24} width={24} /> : <IconPicture size={24} />}\n        onClick={async () => {\n          setIsLoading(true);\n          try {\n            const dataUrl = await ImageShareUtils.generateImageDataUrl(workoutShareRef.current!);\n            const imageShare = new ImageShareUtils(dataUrl, \"workout.png\");\n            setIsLoading(false);\n            imageShare.shareOrDownload();\n          } catch (e) {\n            console.error(e);\n            setIsLoading(false);\n            Dialog_alert(\"Couldn't share the workout image\");\n          }\n        }}\n      />\n      <View collapsable={false} className=\"absolute\" style={{ left: -9999, top: -9999 }}>\n        <View ref={workoutShareRef} collapsable={false} style={{ width: 420 }}>\n          <WorkoutShareOutput history={props.history} record={props.record} settings={props.settings} />\n        </View>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { WorkoutShareOutput } from \"./workoutShareOutput\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { ImageShareUtils } from \"../utils/imageshare\";\nimport { Dialog_alert } from \"../utils/dialog\";\n\ninterface IWorkoutShareButtonProps {\n  record?: IHistoryRecord;\n  history: IHistoryRecord[];\n  icon: JSX.Element;\n  settings: ISettings;\n}\n\nexport function WorkoutShareButton(props: IWorkoutShareButtonProps): JSX.Element {\n  const workoutShareRef = useRef<View>(null);\n  const [isLoading, setIsLoading] = useState<boolean>(false);\n  return (\n    <View className=\"relative overflow-hidden\">\n      <Pressable\n        className=\"w-scaled-10 h-scaled-10 rounded-full bg-background-subtle items-center justify-center nm-workout-share-image\"\n        onPress={async () => {\n          setIsLoading(true);\n          try {\n            const dataUrl = await ImageShareUtils.generateImageDataUrl(workoutShareRef.current!);\n            const imageShare = new ImageShareUtils(dataUrl, \"workout.png\");\n            setIsLoading(false);\n            imageShare.shareOrDownload();\n          } catch (e) {\n            console.error(e);\n            setIsLoading(false);\n            Dialog_alert(\"Couldn't share the workout image\");\n          }\n        }}\n      >\n        {isLoading ? <IconSpinner width={20} height={20} /> : props.icon}\n      </Pressable>\n      <View collapsable={false} className=\"absolute\" style={{ left: -9999, top: -9999 }}>\n        <View ref={workoutShareRef} collapsable={false} style={{ width: 420 }}>\n          <WorkoutShareOutput record={props.record} history={props.history} settings={props.settings} />\n        </View>\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View, Image } from \"react-native\";\nimport { Text } from \"./primitives/text\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { ExerciseImage } from \"./exerciseImage\";\nimport { Exercise_toKey, Exercise_get } from \"../models/exercise\";\nimport {\n  History_getPersonalRecords,\n  History_workoutTime,\n  History_totalRecordWeight,\n  History_totalRecordReps,\n  History_totalRecordSets,\n} from \"../models/history\";\nimport { TimeUtils_formatHHMM } from \"../utils/time\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { HistoryRecordSetsView } from \"./historyRecordSets\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\nimport { n } from \"../utils/math\";\n\ninterface IWorkoutShareOutputProps {\n  record?: IHistoryRecord;\n  history: IHistoryRecord[];\n  settings: ISettings;\n}\n\nexport function WorkoutShareOutput(props: IWorkoutShareOutputProps): JSX.Element {\n  const { record, settings } = props;\n  if (!record) {\n    return <View />;\n  }\n  const allPrs = History_getPersonalRecords(props.history);\n  const recordPrs = allPrs[record.id] ?? {};\n  const numberOfRecordPrs = ObjectUtils_keys(recordPrs).length;\n  const entries = record.entries.filter((e) => e.sets.filter((s) => (s.completedReps ?? 0) > 0).length > 0);\n  const time = TimeUtils_formatHHMM(History_workoutTime(record));\n  const totalWeight = History_totalRecordWeight(record, props.settings);\n  const totalReps = History_totalRecordReps(record);\n  const totalSets = History_totalRecordSets(record);\n  return (\n    <View>\n      <View className=\"flex-row items-end\">\n        <View className=\"flex-row items-start gap-2 mx-2\">\n          <Image\n            source={{ uri: HostConfig_resolveUrl(\"/images/icon512.png\") }}\n            className=\"w-scaled-6 h-scaled-6 rounded-md\"\n          />\n          <Text className=\"text-lg font-bold text-white\">Liftosaur</Text>\n        </View>\n        {numberOfRecordPrs > 0 && (\n          <View className=\"pr-2 ml-auto items-end\">\n            <Text className=\"text-xl font-bold text-yellow-600\">{`🏆 ${numberOfRecordPrs}`}</Text>\n            <Text className=\"text-sm font-bold text-yellow-600\">\n              {`Personal ${StringUtils_pluralize(\"Record\", numberOfRecordPrs)}`}\n            </Text>\n          </View>\n        )}\n      </View>\n      <View className=\"p-2 m-2 rounded-lg bg-background-default\">\n        <Text className=\"text-base font-bold\">{record.programName}</Text>\n        <Text className=\"text-base\">{record.dayName}</Text>\n        <View className=\"flex-row justify-between mt-1\">\n          <Property name=\"Time\" value={time} />\n          <Property name=\"Volume\" value={n(totalWeight.value)} unit={totalWeight.unit} />\n          <Property name=\"Sets\" value={totalSets} />\n          <Property name=\"Reps\" value={totalReps} />\n        </View>\n      </View>\n      <View className=\"flex-col gap-1 p-2 m-2 rounded-lg bg-background-default\">\n        {entries.map((entry) => {\n          const prs = recordPrs[Exercise_toKey(entry.exercise)] ?? {};\n          const hasPrs = ObjectUtils_keys(prs).length > 0;\n          const exercise = Exercise_get(entry.exercise, settings.exercises);\n          return (\n            <View key={Exercise_toKey(entry.exercise)} className=\"flex-row items-center gap-4\">\n              <View className=\"w-scaled-12 h-scaled-12\">\n                <ExerciseImage\n                  size=\"small\"\n                  className=\"w-full h-full\"\n                  suppressCustom={true}\n                  exerciseType={exercise}\n                  settings={settings}\n                />\n              </View>\n              <View className=\"flex-1\">\n                <Text className=\"font-bold\">{`${exercise.name}${hasPrs ? \" 🏆\" : \"\"}`}</Text>\n              </View>\n              <View className=\"items-end\">\n                <HistoryRecordSetsView sets={entry.sets} prs={prs} units={settings.units} isNext={false} />\n              </View>\n            </View>\n          );\n        })}\n      </View>\n    </View>\n  );\n}\n\nfunction Property(props: { name: string; value: string | number; unit?: string }): JSX.Element {\n  return (\n    <View>\n      <Text className=\"text-xs text-lightgray-600\">{props.name}</Text>\n      <View className=\"flex-row items-baseline\">\n        <Text className=\"text-xl font-bold\">{`${props.value}`}</Text>\n        {props.unit && <Text className=\"ml-1 text-sm\">{props.unit}</Text>}\n      </View>\n    </View>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View, Image } from \"react-native\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { WorkoutShareOutput } from \"./workoutShareOutput\";\n\ninterface IWorkoutShareOutputWithBgProps {\n  record?: IHistoryRecord;\n  history: IHistoryRecord[];\n  type: \"igstory\" | \"igfeed\" | \"tiktok\";\n  settings: ISettings;\n  backgroundImage?: string;\n}\n\nexport function WorkoutShareOutputWithBg(props: IWorkoutShareOutputWithBgProps): JSX.Element {\n  const width = 420;\n  const height = props.type === \"igfeed\" ? width : (width * 16) / 9;\n  const [multiplier, setMultiplier] = useState(1.0);\n\n  return (\n    <View className=\"relative bg-text-primary\" style={{ width, height }}>\n      {props.backgroundImage ? (\n        <Image\n          source={{ uri: props.backgroundImage }}\n          className=\"absolute top-0 left-0\"\n          style={{ width, height }}\n          resizeMode=\"contain\"\n        />\n      ) : null}\n      <View\n        className=\"absolute left-0\"\n        style={{\n          right: props.type === \"tiktok\" ? 60 : 0,\n          bottom: props.type === \"tiktok\" ? 82 : 0,\n        }}\n      >\n        <View\n          style={{\n            width,\n            transform: [{ translateX: 210 - multiplier * 210 }, { scale: multiplier }],\n            transformOrigin: \"bottom left\",\n          }}\n        >\n          <View\n            onLayout={(e) => {\n              const workoutHeight = e.nativeEvent.layout.height;\n              if (workoutHeight > 0) {\n                const newMultiplier = Math.min(1.0, (height * 0.9) / workoutHeight);\n                if (Math.abs(newMultiplier - multiplier) > 0.001) {\n                  setMultiplier(newMultiplier);\n                }\n              }\n            }}\n          >\n            <WorkoutShareOutput history={props.history} record={props.record} settings={props.settings} />\n          </View>\n        </View>\n      </View>\n    </View>\n  );\n}\n","import { JSX, useRef, useState } from \"react\";\nimport { View, ScrollView, Pressable, Image, Dimensions, NativeSyntheticEvent, NativeScrollEvent } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Text } from \"./primitives/text\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { Button } from \"./button\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { WorkoutShareOutput } from \"./workoutShareOutput\";\nimport { IconCamera } from \"./icons/iconCamera\";\nimport { IconSpinner } from \"./icons/iconSpinner\";\nimport { WorkoutShareOutputWithBg } from \"./workoutShareOutputWithBg\";\nimport { ImageShareUtils } from \"../utils/imageshare\";\nimport { LinkButton } from \"./linkButton\";\nimport { useModal } from \"../navigation/ModalStateContext\";\nimport { Geometry_fitRectIntoRect } from \"../utils/geometry\";\nimport { IRect } from \"../utils/types\";\nimport { HostConfig_resolveUrl } from \"../utils/hostConfig\";\n\ninterface IWorkoutShareSheetProps {\n  record?: IHistoryRecord;\n  history: IHistoryRecord[];\n  settings: ISettings;\n  type: \"igstory\" | \"igfeed\" | \"tiktok\";\n  isHidden?: boolean;\n}\n\nexport function WorkoutSocialShareSheet(props: IWorkoutShareSheetProps): JSX.Element {\n  const workoutShareRef = useRef<View>(null);\n  const [backgroundImage, setBackgroundImage] = useState<string | undefined>(undefined);\n  const [selectedFrameIndex, setSelectedFrameIndex] = useState<number>(0);\n  const [isLoading, setIsLoading] = useState<boolean>(false);\n\n  const window = Dimensions.get(\"window\");\n  const frameWidth = window.width * 0.625;\n  const sidePadding = window.width * 0.1875;\n  const carouselHeight = window.height * 0.6;\n  const insets = useSafeAreaInsets();\n\n  const openPhotoPicker = useModal(\"photoPickerModal\", (result) => {\n    if (result) {\n      setBackgroundImage(result);\n    }\n  });\n  const title =\n    props.type === \"igstory\"\n      ? \"Share workout to IG Story\"\n      : props.type === \"igfeed\"\n        ? \"Share workout to IG Feed\"\n        : \"Share workout to Tiktok\";\n\n  const onScroll = (e: NativeSyntheticEvent<NativeScrollEvent>): void => {\n    const scrollLeft = e.nativeEvent.contentOffset.x;\n    const selectedFrame = Math.floor((scrollLeft + window.width / 2) / window.width);\n    if (selectedFrameIndex !== selectedFrame) {\n      setSelectedFrameIndex(selectedFrame);\n    }\n  };\n\n  return (\n    <View\n      data-testid=\"workout-share-sheet\"\n      testID=\"workout-share-sheet\"\n      className=\"relative flex-col flex-1 overflow-hidden\"\n    >\n      <Text className=\"my-4 text-base font-bold text-center\">{title}</Text>\n      <View style={{ height: carouselHeight }}>\n        <ScrollView\n          horizontal={true}\n          showsHorizontalScrollIndicator={false}\n          snapToInterval={window.width}\n          decelerationRate=\"fast\"\n          onScroll={onScroll}\n          scrollEventThrottle={16}\n          contentContainerStyle={{ paddingHorizontal: sidePadding, gap: 32, alignItems: \"stretch\" }}\n        >\n          <View className=\"flex-col\" style={{ minWidth: frameWidth }}>\n            <View className=\"relative flex-row items-center flex-1\">\n              {!props.isHidden && (\n                <WorkoutShareImage\n                  type={props.type}\n                  history={props.history}\n                  record={props.record}\n                  settings={props.settings}\n                />\n              )}\n            </View>\n            <Text className=\"px-4 pt-2 pb-4 text-base text-center\">Default Background</Text>\n          </View>\n          <View className=\"flex-col\" style={{ minWidth: frameWidth }}>\n            <View className=\"relative flex-row items-center flex-1\">\n              {!props.isHidden && (\n                <WorkoutShareImage\n                  type={props.type}\n                  record={props.record}\n                  history={props.history}\n                  settings={props.settings}\n                  isCustomBg={true}\n                  backgroundImage={backgroundImage}\n                  onPickCustomBg={() => {\n                    openPhotoPicker({});\n                  }}\n                />\n              )}\n            </View>\n            <Text className=\"pt-2 pb-4 text-base text-center\">\n              <LinkButton\n                name=\"your-photo-bg\"\n                onClick={() => {\n                  openPhotoPicker({});\n                }}\n              >\n                Your photo as background\n              </LinkButton>\n            </Text>\n          </View>\n        </ScrollView>\n      </View>\n      <View className=\"flex-row items-center justify-center pb-4\" style={{ paddingBottom: insets.bottom + 16 }}>\n        <View className=\"mt-2\">\n          <Button\n            name=\"share-workout\"\n            kind=\"purple\"\n            disabled={isLoading}\n            className=\"w-32\"\n            onClick={async () => {\n              setIsLoading(true);\n              try {\n                const dataUrl = await ImageShareUtils.generateImageDataUrl(workoutShareRef.current!);\n                setIsLoading(false);\n                await ImageShareUtils.shareToSocial(props.type, dataUrl, {\n                  backgroundImage: selectedFrameIndex === 1 ? backgroundImage : undefined,\n                });\n              } catch (error) {\n                setIsLoading(false);\n                console.error(error);\n                Dialog_alert(\"Unknown error happened. Couldn't share the workout\");\n              }\n            }}\n          >\n            {isLoading ? <IconSpinner color=\"white\" width={16} height={16} /> : \"Share\"}\n          </Button>\n        </View>\n      </View>\n      <View collapsable={false} className=\"absolute\" style={{ left: -9999, top: -9999 }}>\n        <View ref={workoutShareRef} collapsable={false} style={{ width: 420 }}>\n          {props.type === \"igstory\" ? (\n            <WorkoutShareOutput history={props.history} record={props.record} settings={props.settings} />\n          ) : props.type === \"igfeed\" || props.type === \"tiktok\" ? (\n            <WorkoutShareOutputWithBg\n              history={props.history}\n              type={props.type}\n              record={props.record}\n              settings={props.settings}\n              backgroundImage={\n                selectedFrameIndex === 1\n                  ? backgroundImage\n                  : props.type === \"igfeed\"\n                    ? HostConfig_resolveUrl(\"/images/workoutsharesquarebg.jpg\")\n                    : HostConfig_resolveUrl(\"/images/workoutsharebg.jpg\")\n              }\n            />\n          ) : null}\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IWorkoutShareImageProps {\n  record?: IHistoryRecord;\n  history: IHistoryRecord[];\n  type: \"igstory\" | \"igfeed\" | \"tiktok\";\n  settings: ISettings;\n  isCustomBg?: boolean;\n  backgroundImage?: string;\n  onPickCustomBg?: () => void;\n}\n\nfunction WorkoutShareImage(props: IWorkoutShareImageProps): JSX.Element {\n  const [parentSize, setParentSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n  const [workoutHeight, setWorkoutHeight] = useState<number>(0);\n\n  const rect: IRect =\n    parentSize.width > 0 && parentSize.height > 0\n      ? Geometry_fitRectIntoRect(\n          { x: 0, y: 0, width: 90, height: props.type === \"igfeed\" ? 90 : 160 },\n          { x: 0, y: 0, width: parentSize.width, height: parentSize.height }\n        )\n      : { x: 0, y: 0, width: 0, height: 0 };\n\n  const width = 420;\n  const newRatio = rect.width / width;\n  const multiplier = workoutHeight > 0 ? Math.min(1.0, (rect.height * 0.9) / (workoutHeight * newRatio)) : 1;\n  const ratio = newRatio * multiplier;\n\n  const isFeed = props.type === \"igfeed\";\n  const defaultBgUri = HostConfig_resolveUrl(\n    isFeed ? \"/images/workoutsharesquarebg.jpg\" : \"/images/workoutsharebg.jpg\"\n  );\n  const effectiveBgUri = props.isCustomBg ? props.backgroundImage : defaultBgUri;\n\n  return (\n    <View\n      className=\"absolute top-0 bottom-0 left-0 right-0\"\n      onLayout={(e) => {\n        const { width: w, height: h } = e.nativeEvent.layout;\n        if ((w !== parentSize.width || h !== parentSize.height) && w > 0 && h > 0) {\n          setParentSize({ width: w, height: h });\n        }\n      }}\n    >\n      <Pressable\n        onPress={props.onPickCustomBg}\n        className=\"absolute bg-gray-500\"\n        style={{ width: rect.width, height: rect.height, left: rect.x, top: rect.y }}\n      >\n        {effectiveBgUri ? (\n          <Image\n            source={{ uri: effectiveBgUri }}\n            className=\"absolute top-0 bottom-0 left-0 right-0\"\n            resizeMode=\"cover\"\n          />\n        ) : null}\n        {props.isCustomBg && !props.backgroundImage && (\n          <View className=\"absolute items-center\" style={{ top: \"15%\", left: \"50%\", marginLeft: -25 }}>\n            <IconCamera size={51} color=\"white\" />\n          </View>\n        )}\n        <View className=\"absolute bottom-0 left-0 w-full\">\n          <View\n            style={{\n              width,\n              transform: [{ scale: ratio }],\n              transformOrigin: \"bottom left\",\n            }}\n          >\n            <View\n              collapsable={false}\n              onLayout={(e) => {\n                const h = e.nativeEvent.layout.height;\n                if (h > 0 && Math.abs(h - workoutHeight) > 0.5) {\n                  setWorkoutHeight(h);\n                }\n              }}\n            >\n              <WorkoutShareOutput record={props.record} history={props.history} settings={props.settings} />\n            </View>\n          </View>\n        </View>\n      </Pressable>\n    </View>\n  );\n}\n","import { createContext } from \"react\";\n\n// Browser tabIndex for the set fields and the check on one pager page. Pages before the current\n// one get -1, else the first Tab after the header lands on the previous exercise.\nexport const WorkoutTabStopContext = createContext<0 | -1>(0);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Reducer } from \"react\";\nimport {\n  Program_getProgram,\n  Program_nextHistoryRecord,\n  Program_evaluate,\n  Program_getDayExerciseKeys,\n} from \"../models/program\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport {\n  Progress_getProgress,\n  Progress_getProgressById,\n  Progress_completeSetAction,\n  Progress_changeAmrapAction,\n  Progress_checkSetTimer,\n  Progress_closeTimedSet,\n  Progress_startSetTimerWork,\n  Progress_setProgress,\n  Progress_finishWorkout,\n  Progress_isCurrent,\n  Progress_stop,\n  Progress_showUpdateDate,\n  Progress_changeDate,\n  Progress_stopTimer,\n  Progress_getCurrentProgress,\n  Progress_applyProgramDay,\n  Progress_runInitialUpdateScripts,\n  Progress_isSetTimerCheckDue,\n} from \"../models/progress\";\nimport {\n  Storage_get,\n  Storage_getDefault,\n  Storage_getHistoryRecord,\n  Storage_isChanged,\n  Storage_updateVersions,\n} from \"../models/storage\";\nimport { IScreen, IScreenParams } from \"../models/screen\";\nimport { ILensRecordingPayload, lb } from \"lens-shmens\";\nimport { buildState, IEnv, ILocalStorage, INotification, IState, IStateErrors, updateState } from \"../models/state\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport {\n  IStorage,\n  IWeight,\n  IProgressMode,\n  ISettings,\n  IHistoryRecord,\n  IPercentage,\n  IProgramState,\n  ISubscription,\n  IStats,\n} from \"../types\";\nimport { IndexedDBUtils_get } from \"../utils/indexeddb\";\nimport { Persistence } from \"../utils/persistence\";\nimport { basicBeginnerProgram } from \"../programs/basicBeginnerProgram\";\nimport { AdminDebug_isDebugAccountId } from \"../models/adminDebug\";\nimport { LogUtils_log } from \"../utils/log\";\nimport { Service } from \"../api/service\";\nimport { unrunMigrations } from \"../migrations/runner\";\nimport {\n  ObjectUtils_isEqual,\n  ObjectUtils_changedKeys,\n  ObjectUtils_isNotEmpty,\n  ObjectUtils_keys,\n} from \"../utils/object\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { DateUtils_formatHHMMSS } from \"../utils/date\";\nimport { IReducerOnAction } from \"./types\";\nimport { Thunk_sync2, Thunk_checkSetTimer, Thunk_saveWorkoutToHealth } from \"./thunks\";\nimport { PushRegistration_identityChanged } from \"../utils/pushRegistration\";\nimport { CollectionUtils_uniqBy, CollectionUtils_compact } from \"../utils/collection\";\nimport { Subscriptions_cleanupOutdatedGooglePurchaseTokens } from \"../utils/subscriptions\";\nimport { UndoingFlag_set } from \"../utils/undoingFlag\";\nimport { Diagnostics_getLastActions, Diagnostics_recordAction, Diagnostics_setLastState } from \"../utils/diagnostics\";\nimport { Exercise_toKey } from \"../models/exercise\";\nimport { INativeEffect, NativeEffects_withoutWatchWorkout } from \"../models/nativeEffects\";\nimport { History_resumeWorkout } from \"../models/history\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { History_deleteRecords } from \"../models/history\";\nimport { WorkoutOutcome_add, WorkoutOutcome_healthSaves } from \"../models/workoutOutcome\";\nimport { lg } from \"../utils/posthog\";\nimport { Equipment_getCurrentGym, Equipment_getEquipmentIdForExerciseType } from \"../models/equipment\";\nimport { Stats_getCurrentMovingAverageBodyweight } from \"../models/stats\";\nimport { Weight_build, Weight_eq } from \"../models/weight\";\nimport { PerfTracker_recordEvent, PerfTracker_getSessionId } from \"../utils/perfTracker\";\nimport { PerfEnabled_isEnabled, PerfEnabled_tier2 } from \"../utils/perfEnabled\";\nimport { PerfProbe_onAction } from \"../utils/perfSetCompleteProbe\";\nimport { HermesProfile_captureOnce } from \"../utils/hermesProfile\";\nimport { PerfScorecard_recordAction } from \"../utils/perfScorecard\";\n\ndeclare let __COMMIT_HASH__: string;\n\nconst isLoggingEnabled =\n  typeof window !== \"undefined\" && window?.location\n    ? !!UrlUtils_build(window.location.href).searchParams.get(\"log\")\n    : false;\n\nexport async function getIdbKey(userId?: string, isAdmin?: boolean): Promise<string> {\n  const currentAccount = await IndexedDBUtils_get(\"current_account\");\n  if (currentAccount) {\n    return `liftosaur_${currentAccount}`;\n  } else {\n    return userId != null && isAdmin ? `liftosaur_${userId}` : \"liftosaur\";\n  }\n}\n\ndeclare let __HOST__: string;\n\nexport async function getInitialState(\n  client: Window[\"fetch\"],\n  args: { url?: URL; rawStorage?: string; localStorage?: ILocalStorage; storage?: IStorage; deviceId: string }\n): Promise<IState> {\n  const url =\n    args?.url ||\n    (typeof document !== \"undefined\" ? UrlUtils_build(document.location.href) : UrlUtils_build(`${__HOST__}/app/`));\n  const messageerror = url.searchParams.get(\"messageerror\") || undefined;\n  const messagesuccess = url.searchParams.get(\"messagesuccess\") || undefined;\n  const nosync = url.searchParams.get(\"nosync\") === \"true\";\n  let storage: ILocalStorage | undefined;\n  if (args?.storage) {\n    storage = { storage: args.storage };\n  } else if (args?.localStorage != null) {\n    storage = args.localStorage;\n  } else if (args?.rawStorage != null) {\n    try {\n      storage = JSON.parse(args.rawStorage);\n    } catch (e) {\n      storage = undefined;\n    }\n  }\n  const notification: INotification | undefined =\n    messageerror || messagesuccess\n      ? {\n          type: messageerror ? (\"error\" as const) : (\"success\" as const),\n          content: messageerror || messagesuccess || \"\",\n        }\n      : undefined;\n\n  const deviceId = args.deviceId;\n  if (storage != null && storage.storage != null) {\n    const hasUnrunMigrations = unrunMigrations(storage.storage).length > 0;\n    const maybeStorage = Storage_get(storage.storage, true);\n    let finalStorage: IStorage;\n    const errors: IStateErrors = {};\n    if (maybeStorage.success) {\n      finalStorage = maybeStorage.data;\n    } else {\n      const service = new Service(client);\n      const userid = (storage.storage?.tempUserId || `missing-${UidFactory_generateUid(8)}`) as string;\n      const serverStorage = await service.getStorage(userid, undefined, undefined);\n      const maybeServerStorage = Storage_get(serverStorage.storage, false);\n      if (maybeServerStorage.success) {\n        finalStorage = maybeServerStorage.data;\n      } else {\n        errors.corruptedstorage = {\n          userid,\n          backup: await service.postDebug(userid, JSON.stringify(storage.storage), { local: \"true\" }),\n          confirmed: false,\n          local: true,\n        };\n        finalStorage = Storage_getDefault();\n      }\n    }\n\n    const lastSynced = hasUnrunMigrations ? undefined : storage.lastSynced;\n\n    // Handle migration from old localStorage format where progress was stored separately\n    // Now progress is stored in storage.progress\n    const oldProgress = (storage as { progress?: IHistoryRecord }).progress;\n    if (oldProgress != null && (finalStorage.progress == null || finalStorage.progress.length === 0)) {\n      const migratedProgress = Storage_getHistoryRecord(oldProgress as unknown as Record<string, unknown>, true);\n      if (migratedProgress.success) {\n        finalStorage = { ...finalStorage, progress: [{ ...migratedProgress.data, vtype: \"progress\" }] };\n      }\n    }\n\n    return {\n      storage: finalStorage,\n      lastSynced,\n      progress: {},\n      notification,\n      loading: { items: {} },\n      programs: [basicBeginnerProgram],\n      programsIndex: [],\n      revisions: {},\n      user: undefined,\n      freshMigrations: maybeStorage.success && hasUnrunMigrations,\n      errors,\n      nosync: nosync || AdminDebug_isDebugAccountId(finalStorage.tempUserId),\n      deviceId,\n      editProgramStates: {},\n    };\n  }\n  const newState = buildState({\n    notification,\n    nosync,\n    deviceId,\n  });\n  LogUtils_log(newState.storage.tempUserId, \"ls-initialize-user\", {}, []);\n  return newState;\n}\n\nexport type IChangeDate = {\n  type: \"ChangeDate\";\n  id: number;\n  date: string;\n  time: number;\n};\n\nexport type IConfirmDate = {\n  type: \"ConfirmDate\";\n  id: number;\n  date?: string;\n  time?: number;\n};\n\nexport type ILoginAction = {\n  type: \"Login\";\n  email: string;\n  userId: string;\n};\n\nexport type ILogoutAction = {\n  type: \"Logout\";\n};\n\nexport type IPushScreen<T extends IScreen> = {\n  type: \"PushScreen\";\n  screen: T;\n  params?: IScreenParams<T>;\n  shouldResetStack?: boolean;\n};\n\nexport type IPullScreen = {\n  type: \"PullScreen\";\n};\n\nexport type ICancelProgress = {\n  type: \"CancelProgress\";\n};\n\nexport type IDeleteProgress = {\n  type: \"DeleteProgress\";\n  id: number;\n};\n\nexport type ICompleteSetAction = {\n  type: \"CompleteSetAction\";\n  entryIndex: number;\n  setIndex: number;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  isPlayground: boolean;\n  mode: IProgressMode;\n  forceUpdateEntryIndex: boolean;\n  isExternal: boolean;\n  // Set when completing a timed set from its running clock: the elapsed seconds to record (the model\n  // otherwise derives it from setTimerModal.startedAt), and whether to keep the clock running afterwards.\n  recordedSeconds?: number;\n  keepSetTimerRunning?: boolean;\n};\n\n// Polled by any surface (banner tick, rest-timer tick, live activity, watch) to drive time-based set\n// timer transitions: auto-fire when the work timer hits its target, or auto-advance after rest expires.\n// No-op (returns the same progress) when nothing is due.\nexport type ICheckSetTimerAction = {\n  type: \"CheckSetTimerAction\";\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  now?: number;\n  // When a playground timer auto-fires at its target, the completion must stay playground-scoped — otherwise\n  // it resumes/updates the real native workout (playground records have id 0 and read as \"current\").\n  isPlayground?: boolean;\n};\n\nexport type IStartSetTimerWorkAction = {\n  type: \"StartSetTimerWorkAction\";\n  // A queued native tap can arrive long after the fact, and stamping it here would start the work clock\n  // late and silently shorten the set.\n  startedAt?: number;\n};\n\n// Discard the set timer banner (no recording); starts the deferred rest if the set was already logged.\nexport type ICloseSetTimerAction = {\n  type: \"CloseSetTimerAction\";\n  // Playground has no rest timers, so closing a logged set-timer there must not start a deferred rest.\n  isPlayground?: boolean;\n};\n\nexport type IFinishProgramDayAction = {\n  type: \"FinishProgramDayAction\";\n  id: number;\n  startTime: number;\n  healthSync: boolean;\n};\n\nexport type IStartProgramDayAction = {\n  type: \"StartProgramDayAction\";\n  programId?: string;\n};\n\nexport type IChangeAMRAPAction = {\n  type: \"ChangeAMRAPAction\";\n  setIndex: number;\n  isPlayground: boolean;\n  entryIndex: number;\n  amrapValue?: number;\n  amrapLeftValue?: number;\n  rpeValue?: number;\n  weightValue?: IWeight;\n  isAmrap?: boolean;\n  logRpe?: boolean;\n  askWeight?: boolean;\n  programExercise?: IPlannerProgramExercise;\n  otherStates?: IByExercise<IProgramState>;\n  userVars?: Record<string, number | IWeight | IPercentage>;\n};\n\nexport type IUpdateSettingsAction = {\n  type: \"UpdateSettings\";\n  lensRecording: ILensRecordingPayload<ISettings>;\n  desc: string;\n};\n\nexport type IUpdateStateAction = {\n  type: \"UpdateState\";\n  lensRecording: ILensRecordingPayload<IState>[];\n  desc: string;\n};\n\nexport type IReplaceStateAction = {\n  type: \"ReplaceState\";\n  state: IState;\n};\n\nexport type IEditHistoryRecordAction = {\n  type: \"EditHistoryRecord\";\n  historyRecord: IHistoryRecord;\n};\n\nexport type IStopTimer = {\n  type: \"StopTimer\";\n};\n\nexport type IResumeWorkoutAction = {\n  type: \"ResumeWorkoutAction\";\n  isPlayground: boolean;\n  hasSubscription: boolean;\n};\n\nexport type IApplyProgramChangesToProgress = {\n  type: \"ApplyProgramChangesToProgress\";\n  programExerciseIds?: string[];\n  // Set only where the program itself changed, which is the only place that can know what the day looked like\n  // before. Without it the pass is value-only — see `Progress_applyProgramDay`.\n  oldDayKeys?: string[];\n};\n\nexport type IUpdateProgressAction = {\n  type: \"UpdateProgress\";\n  lensRecordings: ILensRecordingPayload<IHistoryRecord>[];\n  desc: string;\n};\n\nexport type ICardsAction =\n  | ICompleteSetAction\n  | IChangeAMRAPAction\n  | IUpdateProgressAction\n  | ICheckSetTimerAction\n  | ICloseSetTimerAction\n  | IStartSetTimerWorkAction;\n\nexport type IAction =\n  | ICardsAction\n  | IStartProgramDayAction\n  | IFinishProgramDayAction\n  | IEditHistoryRecordAction\n  | ICancelProgress\n  | IDeleteProgress\n  | IPushScreen<any>\n  | IPullScreen\n  | IChangeDate\n  | IConfirmDate\n  | ILoginAction\n  | ILogoutAction\n  | IStopTimer\n  | IResumeWorkoutAction\n  | IUpdateStateAction\n  | IReplaceStateAction\n  | IUpdateSettingsAction\n  | IApplyProgramChangesToProgress;\n\nfunction isExternalStorageMerge(action: unknown): boolean {\n  return (\n    typeof action === \"object\" &&\n    action != null &&\n    \"type\" in action &&\n    action.type === \"UpdateState\" &&\n    \"desc\" in action &&\n    (action.desc === \"Merge synced storage\" ||\n      action.desc === \"Merge watch storage\" ||\n      action.desc === \"Reload storage from disk\")\n  );\n}\n\nexport function defaultOnActions(env: IEnv): IReducerOnAction[] {\n  return [\n    (dispatch, action, oldState, newState) => {\n      const isFinishDayAction = \"type\" in action && action.type === \"FinishProgramDayAction\";\n      if (!isExternalStorageMerge(action) && Storage_isChanged(oldState.storage, newState.storage)) {\n        dispatch(Thunk_sync2({ log: isFinishDayAction }));\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      const identity = PushRegistration_identityChanged(oldState, newState);\n      if (identity !== false) {\n        env.push?.setIdentity(identity);\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      // useThunkReducer re-runs these observers when a thunk resolves, so without skipping thunks and\n      // CheckSetTimerAction, Thunk_checkSetTimer's own dispatch retriggers this observer forever.\n      if (typeof action === \"function\" || action.type === \"CheckSetTimerAction\") {\n        return;\n      }\n      const progress = Progress_getCurrentProgress(newState);\n      if (progress != null && Progress_isSetTimerCheckDue(progress, Date.now())) {\n        dispatch(Thunk_checkSetTimer());\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (oldState.storage.programs !== newState.storage.programs) {\n        const newProgramIds = newState.storage.programs.map((p) => p.id);\n        if (Array.from(new Set(newProgramIds)).length !== newProgramIds.length) {\n          lg(\"program-duplicate-ids\", {\n            programIds: JSON.stringify(newProgramIds),\n            lastReducerActions: JSON.stringify(\n              Diagnostics_getLastActions().map((a) => [a.type, \"desc\" in a ? a.desc : undefined])\n            ),\n          });\n          const newPrograms = CollectionUtils_uniqBy(newState.storage.programs, \"id\");\n          updateState(\n            dispatch,\n            [lb<IState>().p(\"storage\").pi(\"programs\").record(newPrograms)],\n            \"Remove duplicate programs\"\n          );\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      // The ongoing workout, not whichever record is on screen — `ApplyProgramChangesToProgress` only ever\n      // touches that one, and a past workout open for editing has its own program and day. Reading the viewed\n      // record here would diff the wrong day and hand those keys to the live workout.\n      const progress = Progress_getCurrentProgress(newState);\n      if (progress != null) {\n        const oldProgram = Program_getProgram(oldState, progress.programId);\n        const newProgram = Program_getProgram(newState, progress.programId);\n        if (oldProgram != null && newProgram != null && !ObjectUtils_isEqual(oldProgram, newProgram)) {\n          // Exercises can only be added, removed or reordered by the planner moving, and evaluating the old\n          // program to find out what the day held isn't free — so only pay for it when the planner differs.\n          // Evaluated with the *new* settings, so the keys are comparable to the ones the handler derives.\n          const isPlannerSame =\n            oldProgram.planner != null && newProgram.planner != null\n              ? ObjectUtils_isEqual(oldProgram.planner, newProgram.planner)\n              : oldProgram.planner === newProgram.planner;\n          const oldDayKeys = isPlannerSame\n            ? undefined\n            : Program_getDayExerciseKeys(Program_evaluate(oldProgram, newState.storage.settings), progress.day);\n          dispatch({ type: \"ApplyProgramChangesToProgress\", oldDayKeys });\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (\n        oldState.storage.stats !== newState.storage.stats ||\n        ((newState.storage.stats.weight.weight ?? []).length > 0 && newState.storage.settings.currentBodyweight == null)\n      ) {\n        const oldBodyweight =\n          Stats_getCurrentMovingAverageBodyweight(oldState.storage.stats, oldState.storage.settings) ??\n          Weight_build(0, oldState.storage.settings.units);\n        const newBodyweight =\n          Stats_getCurrentMovingAverageBodyweight(newState.storage.stats, newState.storage.settings) ??\n          Weight_build(0, newState.storage.settings.units);\n        if (!Weight_eq(oldBodyweight, newBodyweight)) {\n          updateState(\n            dispatch,\n            [lb<IState>().p(\"storage\").p(\"settings\").pi(\"currentBodyweight\").record(newBodyweight)],\n            \"Update current bodyweight\"\n          );\n          dispatch({ type: \"ApplyProgramChangesToProgress\" });\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      const progress = Progress_getProgress(newState);\n      if (progress != null) {\n        const oldExerciseData = oldState.storage.settings.exerciseData;\n        const newExerciseData = newState.storage.settings.exerciseData;\n        if (\n          oldExerciseData != null &&\n          newExerciseData != null &&\n          !ObjectUtils_isEqual(oldExerciseData, newExerciseData)\n        ) {\n          const changes = ObjectUtils_changedKeys(oldExerciseData, newExerciseData);\n          if (ObjectUtils_isNotEmpty(changes)) {\n            const changedExercises = ObjectUtils_keys(changes);\n            const affectedEntries = progress.entries.filter((entry) => {\n              const key = Exercise_toKey(entry.exercise);\n              return changedExercises.indexOf(key) !== -1;\n            });\n            if (affectedEntries.length > 0) {\n              dispatch({\n                type: \"ApplyProgramChangesToProgress\",\n                programExerciseIds: CollectionUtils_compact(affectedEntries.map((e) => e.programExerciseId)),\n              });\n            }\n          }\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      const progress = Progress_getProgress(newState);\n      if (progress != null) {\n        const oldEquipment = Equipment_getCurrentGym(oldState.storage.settings).equipment;\n        const newEquipment = Equipment_getCurrentGym(newState.storage.settings).equipment;\n        if (oldEquipment != null && newEquipment != null && !ObjectUtils_isEqual(oldEquipment, newEquipment)) {\n          const changedEquipmentIds = ObjectUtils_keys(ObjectUtils_changedKeys(oldEquipment, newEquipment));\n          const settings = newState.storage.settings;\n          const affectedEntries = progress.entries.filter((entry) => {\n            const equipmentId = Equipment_getEquipmentIdForExerciseType(settings, entry.exercise);\n            return equipmentId != null && changedEquipmentIds.indexOf(equipmentId) !== -1;\n          });\n          if (affectedEntries.length > 0) {\n            dispatch({\n              type: \"ApplyProgramChangesToProgress\",\n              programExerciseIds: CollectionUtils_compact(affectedEntries.map((e) => e.programExerciseId)),\n            });\n          }\n        }\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (!ObjectUtils_isEqual(oldState.storage.subscription.google, newState.storage.subscription.google)) {\n        const userId = newState.user?.id || newState.storage.tempUserId;\n        Subscriptions_cleanupOutdatedGooglePurchaseTokens(dispatch, userId, env.service, newState.storage.subscription);\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (\"type\" in action && action.type === \"UpdateState\" && action.desc === \"stop-is-undoing\") {\n        setTimeout(() => {\n          UndoingFlag_set(false);\n        }, 200);\n      }\n    },\n    (dispatch, action, oldState, newState) => {\n      if (oldState.storage.workoutOutcomes === newState.storage.workoutOutcomes || typeof action === \"function\") {\n        return;\n      }\n      const isOwnFinish = action.type === \"FinishProgramDayAction\";\n      const isMerge =\n        action.type === \"UpdateState\" &&\n        (action.desc === \"Merge watch storage\" || action.desc === \"Merge synced storage\");\n      if (!isOwnFinish && !isMerge) {\n        return;\n      }\n      const payloads = WorkoutOutcome_healthSaves(\n        oldState.storage.workoutOutcomes,\n        newState.storage.workoutOutcomes,\n        newState.storage.history,\n        Date.now()\n      );\n      for (const payload of payloads) {\n        dispatch(Thunk_saveWorkoutToHealth({ ...payload, source: isOwnFinish ? \"finish\" : \"merge\" }));\n      }\n    },\n  ];\n}\n\nexport const reducerWrapper =\n  (\n    storeToLocalStorage: boolean,\n    persistence: Persistence,\n    applyEffects: (effects: INativeEffect[]) => void\n  ): Reducer<IState, IAction> =>\n  (state, action) => {\n    Diagnostics_setLastState(state);\n    Diagnostics_recordAction({ ...action, time: DateUtils_formatHHMMSS(Date.now(), true) });\n    const perfOn = PerfEnabled_isEnabled();\n    const perfActionType = \"type\" in action ? action.type : \"thunk\";\n    const perfActionDesc = \"type\" in action && action.type === \"UpdateState\" ? action.desc : undefined;\n    const perfSyncStart = perfOn ? Date.now() : 0;\n    const effects: INativeEffect[] = [];\n    let newState = reducer(state, action, effects);\n    applyEffects(\n      AdminDebug_isDebugAccountId(newState.storage.tempUserId) ? NativeEffects_withoutWatchWorkout(effects) : effects\n    );\n    const isMergingStorage = isExternalStorageMerge(action);\n    const isStorageChanged = !isMergingStorage && Storage_isChanged(state.storage, newState.storage);\n    if (isStorageChanged) {\n      const oldHistoryLen = state.storage.history?.length ?? 0;\n      const newHistoryLen = newState.storage.history?.length ?? 0;\n      const actionDesc = \"type\" in action && action.type === \"UpdateState\" ? action.desc : action.type;\n      if (oldHistoryLen > 0 && newHistoryLen === 0) {\n        lg(\"ls-history-deletion-critical\", {\n          oldLen: oldHistoryLen,\n          newLen: newHistoryLen,\n          action: actionDesc || \"unknown\",\n        });\n      } else if (oldHistoryLen - newHistoryLen > 5) {\n        lg(\"ls-history-deletion-warning\", {\n          oldLen: oldHistoryLen,\n          newLen: newHistoryLen,\n          action: actionDesc || \"unknown\",\n        });\n      }\n      const versions = Storage_updateVersions(state.storage, newState.storage, state.deviceId);\n      newState = { ...newState, storage: { ...newState.storage, _versions: versions } };\n    }\n\n    if (typeof window !== \"undefined\") {\n      window.tempUserId = newState.storage.tempUserId;\n      (window as any).state = newState;\n      if (storeToLocalStorage && newState.errors.corruptedstorage == null) {\n        persistence.scheduleSave(newState.user?.id || newState.storage.tempUserId, {\n          storage: newState.storage,\n          lastSynced: newState.lastSynced,\n        });\n      }\n    }\n\n    if (perfOn) {\n      const perfDurationMs = Date.now() - perfSyncStart;\n      PerfScorecard_recordAction(perfActionDesc ?? perfActionType, perfDurationMs);\n      if (\n        perfActionType === \"CompleteSetAction\" ||\n        perfActionType === \"ChangeAMRAPAction\" ||\n        perfActionType === \"UpdateProgress\"\n      ) {\n        PerfProbe_onAction(perfActionDesc ?? perfActionType, perfDurationMs);\n      }\n      if (perfActionType === \"CompleteSetAction\") {\n        HermesProfile_captureOnce(\"complete-set\");\n      }\n      if (PerfEnabled_tier2()) {\n        PerfTracker_recordEvent({\n          type: \"action\",\n          session: PerfTracker_getSessionId(),\n          action: perfActionType,\n          desc: perfActionDesc,\n          duration_ms: perfDurationMs,\n          ts: perfSyncStart,\n        });\n      }\n    }\n    return newState;\n  };\n\nexport function buildCardsReducer(\n  effects: INativeEffect[],\n  settings: ISettings,\n  stats: IStats,\n  subscription?: ISubscription\n): Reducer<IHistoryRecord, ICardsAction> {\n  return (progress, action): IHistoryRecord => {\n    switch (action.type) {\n      case \"CompleteSetAction\": {\n        const newProgress = Progress_completeSetAction(effects, settings, stats, progress, action, subscription);\n        return newProgress;\n      }\n      case \"ChangeAMRAPAction\": {\n        const newProgress = Progress_changeAmrapAction(effects, settings, stats, progress, action, subscription);\n        return newProgress;\n      }\n      case \"CheckSetTimerAction\": {\n        return Progress_checkSetTimer(\n          effects,\n          settings,\n          stats,\n          progress,\n          subscription,\n          action.programExercise,\n          action.otherStates,\n          action.now,\n          action.isPlayground\n        );\n      }\n      case \"CloseSetTimerAction\": {\n        return Progress_closeTimedSet(effects, progress, settings, subscription, action.isPlayground);\n      }\n      case \"StartSetTimerWorkAction\": {\n        return Progress_startSetTimerWork(progress, action.startedAt ?? Date.now());\n      }\n      case \"UpdateProgress\": {\n        return action.lensRecordings.reduce((memo, recording) => recording.fn(memo), progress);\n      }\n    }\n  };\n}\n\nexport type IEffectfulReducer = (state: IState, action: IAction, effects: INativeEffect[]) => IState;\n\nexport const reducer: IEffectfulReducer = (state, action, effects): IState => {\n  if (\n    action.type === \"CompleteSetAction\" ||\n    action.type === \"ChangeAMRAPAction\" ||\n    action.type === \"CheckSetTimerAction\" ||\n    action.type === \"CloseSetTimerAction\" ||\n    action.type === \"StartSetTimerWorkAction\" ||\n    action.type === \"UpdateProgress\"\n  ) {\n    const progress = Progress_getProgress(state);\n    if (progress == null) {\n      return state;\n    }\n    return Progress_setProgress(\n      state,\n      buildCardsReducer(\n        effects,\n        state.storage.settings,\n        state.storage.stats,\n        state.storage.subscription\n      )(progress, action)\n    );\n  } else if (action.type === \"StartProgramDayAction\") {\n    const progress = Progress_getProgress(state);\n    if (progress != null) {\n      return state;\n    } else if (state.storage.currentProgramId != null) {\n      const program = Program_getProgram(state, action.programId || state.storage.currentProgramId);\n      if (program != null) {\n        const newProgress = Program_nextHistoryRecord(program, state.storage.settings, state.storage.stats);\n        return {\n          ...state,\n          storage: { ...state.storage, progress: [newProgress] },\n        };\n      } else {\n        Dialog_alert(\"No currently selected program\");\n        return state;\n      }\n    } else {\n      return state;\n    }\n  } else if (action.type === \"EditHistoryRecord\") {\n    return {\n      ...state,\n      progress: { ...state.progress, [action.historyRecord.id]: { ...action.historyRecord, ui: {} } },\n    };\n  } else if (action.type === \"FinishProgramDayAction\") {\n    const progress = Progress_getProgressById(state, action.id);\n    if (progress == null || progress.startTime !== action.startTime) {\n      return state;\n    }\n    const newStorage = Progress_finishWorkout(effects, state.storage, progress, action.healthSync);\n    return {\n      ...state,\n      storage: newStorage,\n      progress: Progress_isCurrent(progress) ? state.progress : Progress_stop(state.progress, progress.id),\n    };\n  } else if (action.type === \"ChangeDate\") {\n    const progress = Progress_getProgressById(state, action.id);\n    if (progress == null) {\n      return state;\n    }\n    return Progress_setProgress(state, Progress_showUpdateDate(progress, action.date, action.time));\n  } else if (action.type === \"ConfirmDate\") {\n    const progress = Progress_getProgressById(state, action.id);\n    if (progress == null) {\n      return state;\n    }\n    return Progress_setProgress(state, Progress_changeDate(progress, action.date, action.time));\n  } else if (action.type === \"CancelProgress\") {\n    const progress = Progress_getProgress(state)!;\n    return {\n      ...state,\n      storage: Progress_isCurrent(progress) ? { ...state.storage, progress: [] } : state.storage,\n      progress: Progress_isCurrent(progress) ? state.progress : Progress_stop(state.progress, progress.id),\n    };\n  } else if (action.type === \"DeleteProgress\") {\n    const progress = Progress_getProgressById(state, action.id);\n    if (progress != null) {\n      if (Progress_isCurrent(progress)) {\n        effects.push({ type: \"stopTimer\" }, { type: \"discardWorkout\" });\n        return {\n          ...state,\n          storage: {\n            ...state.storage,\n            history: state.storage.history.filter((h) => h.id !== progress.id),\n            progress: [],\n            workoutOutcomes: WorkoutOutcome_add(state.storage.workoutOutcomes, {\n              id: progress.startTime,\n              outcome: \"discard\",\n              healthSync: false,\n              endTime: Date.now(),\n            }),\n          },\n        };\n      }\n      return {\n        ...state,\n        storage: History_deleteRecords(state.storage, [progress.id]),\n        progress: Progress_stop(state.progress, progress.id),\n      };\n    } else {\n      return state;\n    }\n  } else if (action.type === \"PushScreen\") {\n    return state;\n  } else if (action.type === \"PullScreen\") {\n    return state;\n  } else if (action.type === \"Login\") {\n    return {\n      ...state,\n      user: { email: action.email, id: action.userId },\n      storage: { ...state.storage, email: action.email },\n    };\n  } else if (action.type === \"Logout\") {\n    return { ...state, user: undefined, storage: { ...state.storage, email: undefined } };\n  } else if (action.type === \"StopTimer\") {\n    const progress = Progress_getProgress(state);\n    if (progress != null) {\n      return Progress_setProgress(state, Progress_stopTimer(effects, progress));\n    } else {\n      return state;\n    }\n  } else if (action.type === \"ResumeWorkoutAction\") {\n    const progress = Progress_getCurrentProgress(state);\n    if (progress == null) {\n      return state;\n    }\n    const intervals = History_resumeWorkout(\n      effects,\n      progress,\n      action.isPlayground,\n      state.storage.settings.timers.reminder,\n      action.hasSubscription\n    );\n    return Progress_setProgress(state, { ...progress, intervals });\n  } else if (action.type === \"UpdateSettings\") {\n    if (isLoggingEnabled) {\n      console.log(`%c-------${action.desc ? ` ${action.desc}` : \"\"}`, \"font-weight:bold\");\n    }\n    return {\n      ...state,\n      storage: {\n        ...state.storage,\n        settings: action.lensRecording.fn(state.storage.settings),\n      },\n    };\n  } else if (action.type === \"ReplaceState\") {\n    return action.state;\n  } else if (action.type === \"UpdateState\") {\n    if (isLoggingEnabled) {\n      console.log(`%c-------${action.desc ? ` ${action.desc}` : \"\"}`, \"font-weight:bold\");\n    }\n    return action.lensRecording.reduce((memo, recording) => {\n      if (isLoggingEnabled) {\n        recording.log(\"state\");\n      }\n      const newState = recording.fn(memo);\n      if (isLoggingEnabled && recording.type === \"modify\") {\n        console.log(\"New Value: \", recording.value.v);\n      }\n      return newState;\n    }, state);\n  } else if (action.type === \"ApplyProgramChangesToProgress\") {\n    const progress = Progress_getCurrentProgress(state);\n    if (progress != null) {\n      const program = Program_evaluate(Program_getProgram(state, progress.programId)!, state.storage.settings);\n      let newProgress = Progress_applyProgramDay(progress, program, progress.day, state.storage.settings, {\n        programExerciseIds: action.programExerciseIds,\n        oldDayKeys: action.oldDayKeys,\n        stats: state.storage.stats,\n      });\n      newProgress = Progress_runInitialUpdateScripts(\n        newProgress,\n        action.programExerciseIds,\n        progress.day,\n        program,\n        state.storage.settings,\n        state.storage.stats\n      );\n\n      return {\n        ...state,\n        storage: { ...state.storage, progress: [newProgress] },\n      };\n    } else {\n      return state;\n    }\n  } else {\n    return state;\n  }\n};\n","import { IThunk, IDispatch } from \"./types\";\nimport type { NavigationAction } from \"@react-navigation/native\";\nimport { IScreen, IScreenData, IScreenParams } from \"../models/screen\";\nimport type { INavigateOpts } from \"../navigation/navigationService\";\nimport type { IAllScreenParamList } from \"../navigation/types\";\n\nimport { getNavigationService } from \"../navigation/navUtils\";\nimport RB from \"rollbar\";\nimport { IGetStorageResponse, IPostSyncResponse, Service, Service_adminTarget } from \"../api/service\";\nimport { lb } from \"lens-shmens\";\nimport {\n  Program_getProgram,\n  Program_getFullProgram,\n  Program_evaluate,\n  Program_getProgramExercise,\n  Program_isEmpty,\n  Program_editAction,\n  Program_nextHistoryRecord,\n  Program_create,\n  Program_exportProgramToFile,\n  Program_exportProgramToLink,\n} from \"../models/program\";\nimport { getGoogleAccessToken } from \"../utils/googleAccessToken\";\nimport { SignIn_google, SignIn_apple, SignOut_google } from \"../utils/signIn\";\nimport { Platform } from \"react-native\";\nimport { Dialog_confirm, Dialog_alert } from \"../utils/dialog\";\nimport { InAppReview_request } from \"../utils/inAppReview\";\nimport {\n  IApplePromotionalOffer,\n  IEnv,\n  IGooglePromotionalOffer,\n  ILocalStorage,\n  IOfferData,\n  IState,\n  ISubscriptionLoading,\n  updateProgress,\n  updateState,\n} from \"../models/state\";\nimport {\n  AdminDebug_fetchStorage,\n  AdminDebug_fetchDebugSnapshotStorage,\n  AdminDebug_isDebugAccountId,\n} from \"../models/adminDebug\";\nimport {\n  IProgram,\n  IStorage,\n  IExerciseType,\n  ISettings,\n  IDayData,\n  IHistoryRecord,\n  IWeight,\n  IPercentage,\n  ILength,\n  ICustomExercise,\n  IImportSession,\n  IProgramState,\n} from \"../types\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { CollectionUtils_compact, CollectionUtils_setAt } from \"../utils/collection\";\nimport { ImportExporter_exportStorage, ImportExporter_getExportedProgram } from \"../lib/importexporter\";\nimport { Storage_mergeStorage, Storage_isChanged, Storage_get, Storage_setAffiliate } from \"../models/storage\";\nimport { History_exportAsCSV, History_pauseWorkoutState } from \"../models/history\";\nimport type { IHealthWorkoutPayload } from \"../utils/healthAdapter\";\nimport { ImportSession_apply, ImportSession_findEditedRecordIds, ImportSession_undo } from \"../models/importSession\";\nimport { ImportFileError } from \"../utils/importTypes\";\nimport { StringUtils_pluralize } from \"../utils/string\";\nimport { CSV_toString } from \"../utils/csv\";\nimport { Exporter_toFile } from \"../utils/exporter\";\nimport { DateUtils_formatYYYYMMDD, DateUtils_format } from \"../utils/date\";\nimport { getInitialState } from \"./reducer\";\nimport { IndexedDBUtils_set } from \"../utils/indexeddb\";\nimport { Account_getAll, IAccount } from \"../models/account\";\nimport { WhatsNew_updateStorage } from \"../models/whatsnewUtils\";\nimport { WatchAuthHandoff_accountId } from \"../utils/watchAuthHandoff\";\nimport { OnloadModal_getNext, OnloadModal_shouldShowHearAboutUs } from \"../models/onloadModal\";\nimport { Screen_shouldConfirmNavigation } from \"../models/screen\";\nimport {\n  Subscriptions_listOfSubscriptions,\n  Subscriptions_hasSubscription,\n  Subscriptions_verifyAppleReceipt,\n  Subscriptions_cleanupOutdatedAppleReceipts,\n  Subscriptions_setAppleReceipt,\n  Subscriptions_verifyGooglePurchaseToken,\n  Subscriptions_setGooglePurchaseToken,\n} from \"../utils/subscriptions\";\nimport { IIapPurchase, IIapPurchaseError } from \"../utils/iapAdapter\";\nimport {\n  IapHelpers_alertAlreadySubscribed,\n  IapHelpers_applePromoToAdapter,\n  IapHelpers_clearLoading,\n  IapHelpers_setLoading,\n  IapHelpers_getSkus,\n  IapHelpers_readReceiptOrJwsIOS,\n} from \"../utils/iapHelpers\";\nimport { StoreRuntime_isAndroid, StoreRuntime_isIos, StoreRuntime_storeName } from \"../utils/storeRuntime\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { ClipboardUtils_copy } from \"../utils/clipboard\";\nimport {\n  Progress_getProgress,\n  Progress_getProgressById,\n  Progress_isSetTimerCheckDue,\n  Progress_getFirstIncompleteWorkoutSet,\n  Progress_updateTimer,\n  Progress_getCurrentProgress,\n  Progress_getProgressId,\n  Progress_isCurrent,\n  Progress_stop,\n  Progress_scheduleTimerNotification,\n} from \"../models/progress\";\nimport { Reps_findNextEntryAndSetIndex } from \"../models/set\";\nimport { INativeEffect, NativeEffects_apply } from \"../models/nativeEffects\";\nimport { IImportLinkData, ImportFromLink_importFromLink } from \"../utils/importFromLink\";\nimport { getLatestMigrationVersion } from \"../migrations/migrations\";\nimport { LogUtils_log } from \"../utils/log\";\nimport { lg } from \"../utils/posthog\";\nimport { WatchStorageAccount_isOtherAccount } from \"../models/watchStorageAccount\";\nimport { RollbarUtils_config } from \"../utils/rollbar\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { ImportFromLiftosaur_convertLiftosaurCsvToHistoryRecords } from \"../utils/importFromLiftosaur\";\nimport { ImportFromHevy_convertHevyCsvToHistoryRecords } from \"../utils/importFromHevy\";\nimport { Sync_getStorageUpdate2 } from \"../utils/sync\";\nimport {\n  ISyncBaselineSource,\n  SyncBaseline_afterClean,\n  SyncBaseline_fromServer,\n  SyncBaseline_needsFetch,\n} from \"../utils/syncBaseline\";\nimport {\n  ISyncAccountMismatch,\n  SyncAccountMismatch_fromResponse,\n  SyncAccountMismatch_plan,\n} from \"../utils/syncAccountMismatch\";\nimport { runMigrations } from \"../migrations/runner\";\nimport { HistoryDelta_sortNewestFirst } from \"../utils/historyDelta\";\nimport { PerfProbe_isTarget } from \"../utils/perfSetCompleteProbe\";\nimport {\n  ObjectUtils_values,\n  ObjectUtils_filter,\n  ObjectUtils_clone,\n  ObjectUtils_omit,\n  ObjectUtils_keys,\n} from \"../utils/object\";\nimport { EditStats_uploadDailyMetrics, EditStats_uploadHealthStats } from \"../models/editStats\";\nimport { HealthSync_eligibleForAppleHealth, HealthSync_eligibleForGoogleHealth } from \"../lib/healthSync\";\nimport {\n  PlannerProgram_generateFullText,\n  PlannerProgram_hasNonSelectedWeightUnit,\n  PlannerProgram_switchToUnit,\n} from \"../pages/planner/models/plannerProgram\";\nimport { Weight_oppositeUnit } from \"../models/weight\";\nimport { ICollectionVersions } from \"../models/versionTracker\";\nimport { DeviceId_get } from \"../utils/deviceId\";\nimport {\n  LiveActivityManager_updateProgressLiveActivity,\n  LiveActivityManager_updateLiveActivityForNextEntry,\n} from \"../utils/liveActivityManager\";\nimport { IAuthToken } from \"../utils/keychain\";\nimport { Analytics_trackPurchase, Analytics_trackSignUp } from \"../utils/analytics\";\n\ndeclare let Rollbar: RB;\n\nexport class NoRetryError extends Error {\n  public noretry = true;\n}\n\nexport function Thunk_googleSignIn(cb?: (state: IState) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    if (Platform.OS !== \"web\") {\n      const result = await SignIn_google();\n      if (result?.idToken == null && result?.accessToken == null) {\n        if (cb) {\n          cb(getState());\n        }\n        return;\n      }\n      const token = result.idToken || result.accessToken!;\n      const state = getState();\n      const userId = state.user?.id || state.storage.tempUserId;\n      const loginResult = await load(dispatch, \"Logging in\", async () => {\n        return env.service.googleSignIn(token, userId, {});\n      });\n      await load(dispatch, \"Signing in\", () => {\n        return handleLogin(dispatch, loginResult, env, userId);\n      });\n      if (cb) {\n        cb(getState());\n      }\n      dispatch(Thunk_sync2());\n      return;\n    }\n    const url = UrlUtils_build(window.location.href);\n    const forcedUserEmail = url.searchParams.get(\"forceuseremail\");\n    if (forcedUserEmail == null) {\n      const accessToken = await getGoogleAccessToken();\n      if (accessToken != null) {\n        const state = getState();\n        const userId = state.user?.id || state.storage.tempUserId;\n        const result = await load(dispatch, \"Logging in\", async () => {\n          return env.service.googleSignIn(accessToken, userId, {});\n        });\n        await load(dispatch, \"Signing in\", () => {\n          return handleLogin(dispatch, result, env, userId);\n        });\n        if (cb) {\n          cb(getState());\n        }\n        dispatch(Thunk_sync2());\n      }\n    } else {\n      const state = getState();\n      const userId = state.user?.id || state.storage.tempUserId;\n      const result = await env.service.googleSignIn(forcedUserEmail, userId, { forcedUserEmail });\n      await load(dispatch, \"Logging in\", () => handleLogin(dispatch, result, env, userId));\n      if (cb) {\n        cb(getState());\n      }\n      dispatch(Thunk_sync2());\n    }\n  };\n}\n\nexport interface IEmailAuthResult {\n  error?: string;\n  providers?: string[];\n  confirmationSent?: boolean;\n}\n\nexport function Thunk_emailAuth(\n  mode: \"signin\" | \"signup\",\n  email: string,\n  password: string,\n  cb: (result: IEmailAuthResult, state: IState) => void\n): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(`email-${mode}`));\n    const state = getState();\n    const userId = state.user?.id || state.storage.tempUserId;\n    const result = await load(dispatch, \"Logging in\", () => {\n      return mode === \"signup\"\n        ? env.service.emailSignUp(email, password, userId)\n        : env.service.emailSignIn(email, password, userId);\n    });\n    if (result.type === \"success\") {\n      await load(dispatch, \"Signing in\", () => handleLogin(dispatch, result.response, env, userId));\n      dispatch(Thunk_sync2());\n      cb({}, getState());\n    } else if (result.type === \"confirmation_sent\") {\n      cb({ confirmationSent: true }, getState());\n    } else {\n      cb({ error: result.error, providers: result.providers }, getState());\n    }\n  };\n}\n\nexport function Thunk_forgotPassword(email: string, cb: (result: IEmailAuthResult) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"email-forgot-password\"));\n    const result = await load(dispatch, \"Sending email\", () => env.service.forgotPassword(email));\n    cb(result);\n  };\n}\n\nexport function Thunk_postevent(action: string, extra?: Record<string, string | number>): IThunk {\n  return async (dispatch, getState, env) => {\n    lg(action, extra, env.service, getState().user?.id || getState().storage.tempUserId);\n  };\n}\n\nexport function Thunk_appleSignIn(cb?: (state: IState) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"apple-sign-in\"));\n    let id_token: string | undefined;\n    let code: string | undefined;\n    if (Platform.OS !== \"web\") {\n      const signInResult = await SignIn_apple();\n      if (signInResult == null) {\n        if (cb) {\n          cb(getState());\n        }\n        return;\n      }\n      id_token = signInResult.idToken;\n      code = signInResult.code ?? \"\";\n    } else {\n      if (!window.AppleID?.auth) {\n        Dialog_alert(\"Apple Sign In is not available\");\n        if (cb) {\n          cb(getState());\n        }\n        return;\n      }\n      const response = await window.AppleID.auth.signIn();\n      ({ id_token, code } = response.authorization);\n    }\n    if (id_token != null) {\n      const state = getState();\n      const userId = state.user?.id || state.storage.tempUserId;\n      const result = await load(dispatch, \"Logging in\", async () =>\n        env.service.appleSignIn(code ?? \"\", id_token!, userId)\n      );\n      await load(dispatch, \"Signing in\", () => handleLogin(dispatch, result, env, userId));\n      if (cb) {\n        cb(getState());\n      }\n      dispatch(Thunk_sync2());\n    } else {\n      if (cb) {\n        cb(getState());\n      }\n    }\n  };\n}\n\nexport function Thunk_log(action: string, detail?: string): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    if (!state.nosync) {\n      LogUtils_log(\n        state.user?.id || state.storage.tempUserId,\n        action,\n        state.storage.affiliates,\n        Subscriptions_listOfSubscriptions(state.storage.subscription),\n        state.storage.referrer,\n        state.storage.landingPage,\n        detail\n      );\n    }\n  };\n}\n\nexport function Thunk_verifySubscriptionKey(): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const key = state.storage.subscription.key;\n    if (state.nosync || key == null) {\n      return;\n    }\n    const userId = state.user?.id || state.storage.tempUserId;\n    const { clear } = await env.service.verifySubscriptionKey(userId, key);\n    if (clear) {\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(undefined)],\n        \"Clear subscription key\"\n      );\n    }\n  };\n}\n\nexport function Thunk_logOut(cb?: () => void): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"log-out\"));\n    if (getState().user?.id) {\n      const isDebugAccount = AdminDebug_isDebugAccountId(getState().storage.tempUserId);\n      await env.push?.unregisterBeforeSignout();\n      await env.service.signout();\n      dispatch({ type: \"Logout\" });\n      updateState(dispatch, [lb<IState>().p(\"lastSynced\").record(undefined)], \"Clear last sync on logout\");\n      // A debug sandbox borrows the device's native auth, so logging out of it must only drop the\n      // debug session - tearing down the keychain/Google/watch auth here would wipe the admin's own\n      // real persisted login.\n      if (!isDebugAccount) {\n        try {\n          await env.keychain.clearAuthToken();\n        } catch (e) {\n          lg(\"ls-keychain-clear-auth-fail\", { error: e instanceof Error ? e.message : String(e) });\n        }\n        await SignOut_google();\n        env.watch.sendClearAuthToWatch();\n      }\n    }\n    if (cb) {\n      cb();\n    }\n  };\n}\n\nexport function Thunk_postDebug(): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const userid = state.user?.id || state.storage.tempUserId;\n    await load(dispatch, \"Debug sync\", async () => env.service.postDebug(userid, JSON.stringify(state), {}));\n  };\n}\n\nasync function _sync2(\n  dispatch: IDispatch,\n  getState: () => IState,\n  env: IEnv,\n  args?: { force: boolean },\n  signal?: AbortSignal\n): Promise<void> {\n  const state = getState();\n  type IRequestContext = { kind: \"fetch\" } | { kind: \"upload\"; sent: ISyncBaselineSource };\n  function handleResponse(result: IPostSyncResponse, context: IRequestContext): \"baseline-fetched\" | \"done\" {\n    if (result.type === \"clean\") {\n      dispatch(Thunk_postevent(\"handle-response-clean\"));\n      const baseline = getState().lastSynced;\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"lastSynced\")\n            .record(baseline && context.kind === \"upload\" ? SyncBaseline_afterClean(baseline, context.sent) : baseline),\n          lb<IState>().p(\"storage\").p(\"originalId\").record(result.new_original_id),\n          lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(result.key),\n        ],\n        \"Update sync metadata\"\n      );\n      if (getState().storage.email !== result.email || getState().user?.id !== result.user_id) {\n        dispatch({ type: \"Login\", email: result.email, userId: result.user_id });\n      }\n      return \"done\";\n    } else if (result.type === \"dirty\") {\n      result.storage.tempUserId = result.user_id;\n      if (context.kind === \"fetch\") {\n        dispatch(Thunk_postevent(\"handle-response-dirty-requested-last-storage\"));\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"lastSynced\").record(SyncBaseline_fromServer(result.storage, Date.now())),\n            lb<IState>().p(\"storage\").p(\"tempUserId\").record(result.user_id),\n          ],\n          \"Update last synced storage\"\n        );\n        return \"baseline-fetched\";\n      } else {\n        dispatch(Thunk_postevent(\"handle-response-dirty\"));\n        const currentStorage = getState().storage;\n        const currentHistoryLen = currentStorage.history?.length ?? 0;\n        const serverHistoryLen = result.storage.history?.length ?? 0;\n        const historyVersions = result.storage._versions?.history as { deleted?: Record<string, number> } | undefined;\n        const serverDeletedHistory = Object.keys(historyVersions?.deleted || {}).length;\n\n        const probeMergeTarget = PerfProbe_isTarget();\n        const probeMergeT0 = probeMergeTarget ? Date.now() : 0;\n        const merged = Storage_mergeStorage(currentStorage, result.storage, getState().deviceId);\n        const newStorage = { ...merged, history: HistoryDelta_sortNewestFirst(merged.history) };\n        if (probeMergeTarget) {\n          lg(\"perf-sync-merge\", {\n            merge_ms: Date.now() - probeMergeT0,\n            history_len: currentStorage.history?.length ?? 0,\n          });\n        }\n        const mergedHistoryLen = newStorage.history?.length ?? 0;\n\n        if (currentHistoryLen > 0 && mergedHistoryLen < currentHistoryLen) {\n          lg(\"ls-history-deletion-server-merge\", {\n            currentHistoryLen,\n            serverHistoryLen,\n            mergedHistoryLen,\n            serverDeletedHistory,\n          });\n        }\n\n        const newProgramIds = newStorage.programs.map((p) => p.id);\n        if (Array.from(new Set(newProgramIds)).length !== newProgramIds.length) {\n          lg(\"program-duplicate-ids-after-merge\", {\n            programIds: JSON.stringify(newProgramIds),\n            oldPrograms: JSON.stringify(currentStorage.programs),\n            newPrograms: JSON.stringify(result.storage.programs),\n            oldVersions: JSON.stringify(currentStorage._versions?.programs),\n            newVersions: JSON.stringify(result.storage._versions?.programs),\n          });\n        }\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"lastSynced\").record(SyncBaseline_fromServer(result.storage, Date.now())),\n            lb<IState>().p(\"storage\").record(newStorage),\n            lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(result.key),\n          ],\n          \"Merge synced storage\"\n        );\n        if (getState().storage.email !== result.email || getState().user?.id !== result.user_id) {\n          dispatch({ type: \"Login\", email: result.email, userId: result.user_id });\n        }\n      }\n      return \"done\";\n    } else if (result.type === \"error\" && result.error === \"not_authorized\") {\n      updateState(\n        dispatch,\n        [\n          lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(result.key),\n          lb<IState>().p(\"lastSynced\").record(undefined),\n        ],\n        \"Update subscription no storage\"\n      );\n      return \"done\";\n    } else if (result.type === \"error\") {\n      if (result.error === \"outdated_client_storage\") {\n        Dialog_alert(\n          \"The version of the storage on a device is older than on the server, so sync failed. \" +\n            \"To fix it - kill/restart the app a couple times.\"\n        );\n      }\n      throw new NoRetryError(result.error);\n    }\n    return \"done\";\n  }\n  async function switchedAccount(result: IPostSyncResponse): Promise<boolean> {\n    const mismatch = SyncAccountMismatch_fromResponse(result);\n    if (mismatch == null) {\n      return false;\n    }\n    await switchToSyncAccount(dispatch, getState, env, state.storage.tempUserId, mismatch);\n    return true;\n  }\n  const fetchReason = SyncBaseline_needsFetch(state.lastSynced, state.storage.tempUserId, Date.now());\n  if (fetchReason != null) {\n    dispatch(\n      Thunk_postevent(\"fetch-last-synced-storage\", {\n        reason: fetchReason,\n        lastUserId: state.lastSynced?.tempUserId ?? \"\",\n        newUserId: state.storage.tempUserId ?? \"\",\n      })\n    );\n    const result = await env.service.postSync({\n      tempUserId: state.storage.tempUserId,\n      storageUpdate: {\n        version: state.storage.version,\n      },\n      signal,\n      deviceId: state.deviceId,\n      history: { mode: \"none\" },\n    });\n    if (signal?.aborted || (await switchedAccount(result))) {\n      return;\n    }\n    if (handleResponse(result, { kind: \"fetch\" }) === \"baseline-fetched\") {\n      await _sync2(dispatch, getState, env, args, signal);\n    }\n  } else {\n    dispatch(Thunk_postevent(\"sync-storage-update\", { force: args?.force ? \"true\" : \"false\" }));\n    const probeSyncTarget = PerfProbe_isTarget();\n    const probeSyncT0 = probeSyncTarget ? Date.now() : 0;\n    const storageUpdate = Sync_getStorageUpdate2(state.storage, state.lastSynced?.versions, state.deviceId);\n    if (probeSyncTarget) {\n      lg(\"perf-sync\", {\n        build_ms: Date.now() - probeSyncT0,\n        has_update: storageUpdate.storage != null ? \"true\" : \"false\",\n      });\n    }\n    if (args?.force || storageUpdate.storage) {\n      const sentStorage = state.storage;\n      const result = await env.service.postSync({\n        tempUserId: state.storage.tempUserId,\n        storageUpdate: storageUpdate,\n        signal,\n        deviceId: state.deviceId,\n        history: { mode: \"delta\", local: { history: state.storage.history, versions: state.storage._versions } },\n      });\n      if (signal?.aborted || (await switchedAccount(result))) {\n        return;\n      }\n      handleResponse(result, { kind: \"upload\", sent: sentStorage });\n    }\n  }\n}\n\nasync function switchToSyncAccount(\n  dispatch: IDispatch,\n  getState: () => IState,\n  env: IEnv,\n  sentTempUserId: string,\n  mismatch: ISyncAccountMismatch\n): Promise<void> {\n  dispatch(Thunk_postevent(\"sync-account-mismatch\", { localUserId: sentTempUserId, serverUserId: mismatch.userId }));\n  await env.persistence.flushSave();\n  const localCopy = await env.persistence.load(`liftosaur_${mismatch.userId}`);\n  const localStorageResult = localCopy?.storage != null ? Storage_get(localCopy.storage) : undefined;\n  const plan = SyncAccountMismatch_plan({\n    sentTempUserId,\n    currentTempUserId: getState().storage.tempUserId,\n    hasLocalCopy: localStorageResult?.success === true && localStorageResult.data.tempUserId === mismatch.userId,\n  });\n  if (plan === \"load-local\" && localCopy != null) {\n    const newState = await getInitialState(env.service.client, { localStorage: localCopy, deviceId: getState().deviceId });\n    newState.user = { id: mismatch.userId, email: mismatch.email };\n    dispatch({ type: \"ReplaceState\", state: newState });\n    dispatch(Thunk_fetchInitial());\n  } else if (plan === \"fetch-server\") {\n    const result = await env.service.getStorage(mismatch.userId);\n    await handleLogin(dispatch, result, env, sentTempUserId);\n  }\n}\n\nfunction getDeletedStats(state: IState): number[] {\n  let deleted: string[] = [];\n  const versionStats = state.storage._versions?.stats as Record<string, Record<string, ICollectionVersions>>;\n  for (const type of Object.keys(versionStats || {})) {\n    for (const statType of Object.keys(versionStats[type] || {})) {\n      const stats = versionStats[type][statType];\n      deleted = deleted.concat(Object.keys(stats.deleted || {}));\n    }\n  }\n  return deleted.map(Number);\n}\n\nasync function _syncHealthKit(dispatch: IDispatch, getState: () => IState, env: IEnv): Promise<void> {\n  const settings = getState().storage.settings;\n  if (!env.health) {\n    return;\n  }\n  const platform: \"ios\" | \"android\" = Platform.OS === \"ios\" ? \"ios\" : \"android\";\n  const syncMeasurements =\n    platform === \"ios\" ? settings.appleHealthSyncMeasurements : settings.googleHealthSyncMeasurements;\n  const syncSleepNutrition =\n    platform === \"ios\" ? settings.appleHealthSyncSleepNutrition : settings.googleHealthSyncSleepNutrition;\n\n  if (syncMeasurements) {\n    dispatch(Thunk_postevent(platform === \"ios\" ? \"read-apple-health\" : \"read-google-health\"));\n    const anchor = platform === \"ios\" ? settings.appleHealthAnchor : settings.googleHealthAnchor;\n    const result = await env.health.syncMeasurements({\n      anchor,\n      weightUnit: settings.units,\n      lengthUnit: settings.lengthUnits,\n    });\n    EditStats_uploadHealthStats(\n      platform,\n      dispatch,\n      { data: result },\n      getState().storage.settings,\n      getDeletedStats(getState())\n    );\n  }\n\n  if (syncSleepNutrition) {\n    dispatch(Thunk_postevent(platform === \"ios\" ? \"read-apple-health-daily\" : \"read-google-health-daily\"));\n    // iOS reads a 90-day rolling window; Android is 30 because Health Connect won't return records older\n    // than 30 days without the READ_HEALTH_DATA_HISTORY permission (which we don't request).\n    const windowDays = platform === \"android\" ? 30 : 90;\n    const daily = await env.health.syncDailyMetrics({ windowDays, metrics: [\"sleep\", \"calories\", \"protein\"] });\n    EditStats_uploadDailyMetrics(platform, dispatch, daily);\n  }\n}\n\nexport function Thunk_saveWorkoutToHealth(\n  args: IHealthWorkoutPayload & { source: \"finish\" | \"merge\"; successAlert?: boolean }\n): IThunk {\n  return async (dispatch, getState, env) => {\n    if (!env.health || AdminDebug_isDebugAccountId(getState().storage.tempUserId)) {\n      return;\n    }\n    const platform = Platform.OS === \"ios\" ? \"apple\" : \"google\";\n    if (args.source === \"merge\" && platform !== \"apple\") {\n      return;\n    }\n    dispatch(Thunk_postevent(`submit-workout-${platform}-health`));\n    dispatch(\n      Thunk_postevent(`storing-workout-to-${platform}-health`, {\n        intervalsCount: args.intervals.length,\n        source: args.source,\n      })\n    );\n    try {\n      await env.health.saveWorkout(args);\n      dispatch(Thunk_postevent(`success-workout-${platform}-health`, { source: args.source }));\n      if (args.successAlert) {\n        Dialog_alert(`Synced to ${platform === \"apple\" ? \"Apple Health\" : \"Google Health\"}`);\n      }\n    } catch (e) {\n      console.warn(\"Failed to save workout to Health\", e);\n      dispatch(\n        Thunk_postevent(`fail-workout-${platform}-health`, {\n          error: (e as Error)?.message ?? \"unknown\",\n          source: args.source,\n        })\n      );\n      if (args.source === \"finish\") {\n        Dialog_alert(`Couldn't save workout to ${platform === \"apple\" ? \"Apple Health\" : \"Google Health\"}`);\n      }\n    }\n  };\n}\n\nexport function Thunk_saveMeasurementsToHealth(args: {\n  bodyweight?: IWeight;\n  bodyfat?: IPercentage;\n  waist?: ILength;\n  timestamp: number;\n}): IThunk {\n  return async (dispatch, getState, env) => {\n    if (!env.health || AdminDebug_isDebugAccountId(getState().storage.tempUserId)) {\n      return;\n    }\n    if (!args.bodyweight && !args.bodyfat && !args.waist) {\n      return;\n    }\n    try {\n      await env.health.saveMeasurements(args);\n    } catch (e) {\n      console.warn(\"Failed to save measurements to Health\", e);\n      const platform = Platform.OS === \"ios\" ? \"apple\" : \"google\";\n      dispatch(\n        Thunk_postevent(`${platform}-health-save-measurements-error`, {\n          error: (e as Error)?.message ?? \"unknown\",\n        })\n      );\n      Dialog_alert(`Couldn't save measurements to ${platform === \"apple\" ? \"Apple Health\" : \"Google Health\"}`);\n    }\n  };\n}\n\nexport function Thunk_requestHealthPermissions(): IThunk {\n  return async (_dispatch, getState, env) => {\n    if (!env.health || AdminDebug_isDebugAccountId(getState().storage.tempUserId)) {\n      return;\n    }\n    try {\n      await env.health.requestPermissions();\n    } catch (e) {\n      console.warn(\"Failed to request health permissions\", e);\n    }\n  };\n}\n\nexport function Thunk_syncHealthKit(cb?: () => void): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    if (AdminDebug_isDebugAccountId(state.storage.tempUserId)) {\n      if (cb != null) {\n        cb();\n      }\n      return;\n    }\n    const s = state.storage.settings;\n    const appleSyncEnabled = s.appleHealthSyncMeasurements || s.appleHealthSyncSleepNutrition;\n    const googleSyncEnabled = s.googleHealthSyncMeasurements || s.googleHealthSyncSleepNutrition;\n    if (\n      !(appleSyncEnabled && HealthSync_eligibleForAppleHealth()) &&\n      !(googleSyncEnabled && HealthSync_eligibleForGoogleHealth())\n    ) {\n      if (cb != null) {\n        cb();\n      }\n      return;\n    }\n    try {\n      await env.queue.enqueue(async () => {\n        try {\n          await _syncHealthKit(dispatch, getState, env);\n        } catch (e) {\n          console.warn(\"Failed to sync from Health\", e);\n          const platform = Platform.OS === \"ios\" ? \"apple\" : \"google\";\n          dispatch(Thunk_postevent(`${platform}-health-sync-error`, { error: (e as Error)?.message ?? \"unknown\" }));\n        }\n      });\n    } finally {\n      if (cb != null) {\n        cb();\n      }\n    }\n  };\n}\n\nexport function Thunk_sync2(args?: { force?: boolean; cb?: () => void; log?: boolean }): IThunk {\n  return async (dispatch, getState, env) => {\n    if (args?.log) {\n      dispatch(\n        Thunk_postevent(\"sync2-enter\", {\n          isProcessing: `${env.queue.getIsProcessing()}`,\n          queueLength: env.queue.length().toString(),\n        })\n      );\n    }\n    try {\n      const state = getState();\n      if (state.errors.corruptedstorage == null && !state.nosync && (state.user != null || args?.force)) {\n        await env.queue.enqueue(\n          async (args2, signal) => {\n            await load(dispatch, \"Sync\", async () => {\n              if (args2?.log) {\n                dispatch(Thunk_postevent(\"sync2-start\"));\n              }\n              await _sync2(dispatch, getState, env, args2, signal);\n            });\n          },\n          { force: !!args?.force, log: !!args?.log }\n        );\n      }\n    } finally {\n      if (args?.cb) {\n        args.cb();\n      }\n    }\n  };\n}\n\nexport function Thunk_updateTimer(\n  newTimer: number,\n  entryIndex: number | undefined,\n  setIndex: number | undefined,\n  skipLiveActivityUpdate: boolean\n): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const progress = Progress_getProgress(state);\n    if (!progress) {\n      return;\n    }\n    const program = Program_getProgram(state, progress.programId);\n    if (!program) {\n      return;\n    }\n    const effects: INativeEffect[] = [];\n    const newProgress = Progress_updateTimer(\n      effects,\n      progress,\n      program,\n      newTimer,\n      progress.timerSince || Date.now(),\n      entryIndex,\n      setIndex,\n      !!skipLiveActivityUpdate,\n      state.storage.settings,\n      state.storage.subscription\n    );\n    NativeEffects_apply(env, effects);\n    updateProgress(dispatch, lb<IHistoryRecord>().record(newProgress), \"Update rest timer\");\n  };\n}\n\nexport function Thunk_updateLiveActivity(\n  entryIndex: number | undefined,\n  setIndex: number | undefined,\n  restTimer: number | undefined,\n  restTimerSince: number | undefined\n): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const progress = Progress_getProgress(state);\n    if (!progress) {\n      return;\n    }\n    const program = Program_getProgram(state, progress.programId);\n    if (!program) {\n      return;\n    }\n    const effects: INativeEffect[] = [];\n    LiveActivityManager_updateProgressLiveActivity(\n      effects,\n      program,\n      progress,\n      state.storage.settings,\n      state.storage.subscription,\n      entryIndex,\n      setIndex,\n      restTimer,\n      restTimerSince\n    );\n    NativeEffects_apply(env, effects);\n  };\n}\n\nexport function Thunk_completeSetExternal(\n  entryIndex: number,\n  setIndex: number,\n  restTimer: number,\n  restTimerSince: number\n): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const progress = Progress_getProgress(state);\n    if (!progress) {\n      return;\n    }\n    const entry = progress.entries[entryIndex];\n    const isWarmup = setIndex < entry.warmupSets.length;\n    let adjustedSetIndex = setIndex;\n    if (!isWarmup) {\n      adjustedSetIndex -= entry.warmupSets.length;\n    }\n    const program = Program_getFullProgram(state, progress.programId);\n    const evaluatedProgram = program ? Program_evaluate(program, state.storage.settings) : undefined;\n    const programExercise = evaluatedProgram\n      ? Program_getProgramExercise(progress.day, evaluatedProgram, entry.programExerciseId)\n      : undefined;\n\n    const set = isWarmup ? entry.warmupSets[adjustedSetIndex] : entry.sets[adjustedSetIndex];\n    if (!set) {\n      dispatch(Thunk_updateLiveActivity(entryIndex, setIndex, restTimer, restTimerSince));\n      return;\n    }\n    if (set.isCompleted) {\n      dispatch(Thunk_updateLiveActivity(entryIndex, setIndex, restTimer, restTimerSince));\n      return;\n    }\n\n    dispatch({\n      type: \"CompleteSetAction\",\n      setIndex: adjustedSetIndex,\n      entryIndex: entryIndex,\n      programExercise: programExercise,\n      otherStates: evaluatedProgram?.states,\n      isPlayground: false,\n      mode: isWarmup ? \"warmup\" : \"workout\",\n      forceUpdateEntryIndex: true,\n      isExternal: true,\n    });\n  };\n}\n\nfunction resolveTimedSetProgramContext(\n  state: IState,\n  progress: IHistoryRecord,\n  entryIndex: number | undefined\n): { programExercise: IPlannerProgramExercise | undefined; otherStates: IByExercise<IProgramState> | undefined } {\n  const entry = entryIndex != null ? progress.entries[entryIndex] : undefined;\n  if (!entry) {\n    return { programExercise: undefined, otherStates: undefined };\n  }\n  const program = Program_getFullProgram(state, progress.programId);\n  const evaluatedProgram = program ? Program_evaluate(program, state.storage.settings) : undefined;\n  const programExercise = evaluatedProgram\n    ? Program_getProgramExercise(progress.day, evaluatedProgram, entry.programExerciseId)\n    : undefined;\n  return { programExercise, otherStates: evaluatedProgram?.states };\n}\n\n// Record the running set timer and complete the set. The model (Progress_completeSetAction) derives the\n// elapsed time from when the clock started, decides whether to advance/close+rest, and may open the\n// AMRAP modal — this thunk just resolves the program context the update script needs.\nexport function Thunk_recordSetTimer(\n  entryIndex: number,\n  setIndex: number,\n  keepTiming: boolean,\n  recordedSeconds?: number,\n  phaseId?: string\n): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const progress = Progress_getProgress(state);\n    if (!progress) {\n      return;\n    }\n    // A native Live Activity / Live Update \"Stop & Record\"/\"Log & keep\" tap can arrive stale — the timed set\n    // already auto-closed at its target, or the user double-tapped an old notification. The set timer modal is\n    // then gone (or points at a different set), and completing here would fall through to normal set toggling\n    // and flip the already-completed set back off. Ignore it and just resync the surface that sent it.\n    const setTimerModal = progress.setTimer;\n    if (\n      setTimerModal == null ||\n      setTimerModal.entryIndex !== entryIndex ||\n      setTimerModal.setIndex !== setIndex ||\n      (phaseId != null && setTimerModal.id !== phaseId)\n    ) {\n      dispatch(Thunk_refreshLiveActivity());\n      return;\n    }\n    const { programExercise, otherStates } = resolveTimedSetProgramContext(state, progress, entryIndex);\n    dispatch({\n      type: \"CompleteSetAction\",\n      entryIndex,\n      setIndex,\n      mode: \"workout\",\n      programExercise,\n      otherStates,\n      forceUpdateEntryIndex: false,\n      isExternal: false,\n      isPlayground: false,\n      keepSetTimerRunning: keepTiming,\n      // From the live activity this is the elapsed at the moment of the tap (native-computed) — use it\n      // instead of recomputing from startedAt at processing time, which drifts if the app woke late.\n      recordedSeconds,\n    });\n  };\n}\n\n// Polled by the set-timer banner and the rest timer every tick. Cheap no-op unless a time threshold has\n// actually been crossed (auto work timer hit its target, or auto rest expired), in which case the model\n// advances/completes. Gated by the pure predicate so we don't evaluate the program every second.\nexport function Thunk_checkSetTimer(): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    if (Progress_getProgressId(state) !== 0) {\n      return;\n    }\n    const progress = Progress_getCurrentProgress(state);\n    if (!progress || !Progress_isSetTimerCheckDue(progress, Date.now())) {\n      return;\n    }\n    const hadSetTimer = progress.setTimer != null;\n    const hadGetReady = progress.setTimerGetReady != null;\n    const entryIndex =\n      progress.setTimer?.entryIndex ?? progress.setTimerGetReady?.entryIndex ?? progress.timerEntryIndex;\n    const { programExercise, otherStates } = resolveTimedSetProgramContext(state, progress, entryIndex);\n    dispatch({ type: \"CheckSetTimerAction\", programExercise, otherStates });\n    // The set timer just closed — into rest, into an AMRAP prompt, or ended (an EMOM that rolls straight to\n    // the next set keeps setTimer, so it stays silent, matching the watch). Play the set→rest cue.\n    const after = Progress_getProgress(getState());\n    const setTimerClosed = hadSetTimer && (after?.setTimer == null || after?.amrapModal != null);\n    const workStarted = hadGetReady && after?.setTimerGetReady == null && after?.setTimer != null;\n    // Its own sound, not `notification`: in an `auto` circuit the shortened rest expires only seconds\n    // earlier and already chirps `notification`, so the two cues have to be tellable apart.\n    if ((setTimerClosed || workStarted) && getState().adminKey == null) {\n      const settings = getState().storage.settings;\n      env.audio.play(settings.volume, !!settings.vibration, workStarted ? \"get-ready-end\" : \"set-timer-end\");\n    }\n    // The predicate above guarantees the model just advanced (auto work timer hit target, or auto rest\n    // expired → next set timer). Re-push so the live activity/live update follows along — otherwise an\n    // in-app poll advances the UI while the lock-screen stays on the expired rest until the next update.\n    dispatch(Thunk_refreshLiveActivity());\n  };\n}\n\n// Re-pushes the live activity for the current workout state (set timer / rest / next set). Used on app\n// foreground (after Thunk_checkSetTimer reconciles the model) to resync the live activity, which can't\n// advance itself while the app is suspended.\nexport function Thunk_refreshLiveActivity(): IThunk {\n  return async (dispatch, getState, env) => {\n    const state = getState();\n    const progress = Progress_getProgress(state);\n    if (!progress || !Progress_isCurrent(progress)) {\n      return;\n    }\n    const program = Program_getFullProgram(state, progress.programId);\n    const settings = state.storage.settings;\n    const subscription = state.storage.subscription;\n    const setTimerModal = progress.setTimer;\n    const effects: INativeEffect[] = [];\n    if (setTimerModal != null) {\n      // Centralization in LiveActivityManager_updateLiveActivity reads setTimerModal, so the entry/set\n      // passed here are overridden — it renders the set-timer view.\n      LiveActivityManager_updateProgressLiveActivity(\n        effects,\n        program,\n        progress,\n        settings,\n        subscription,\n        setTimerModal.entryIndex,\n        setTimerModal.setIndex,\n        undefined,\n        undefined\n      );\n      NativeEffects_apply(env, effects);\n      return;\n    }\n    if (progress.timer != null && progress.timerSince != null) {\n      // The rest timer belongs to the just-completed set (progress.timerSetIndex), but the live activity\n      // must show the NEXT set so its complete button targets a set that can actually be completed — pushing\n      // the completed set's index makes the button a no-op. Mirrors screenWorkout/restTimer; the rest timer\n      // itself is read from progress.timer/timerSince inside updateLiveActivity, so it still shows.\n      const next =\n        progress.timerEntryIndex != null\n          ? Reps_findNextEntryAndSetIndex(progress, progress.timerEntryIndex, progress.timerMode ?? \"workout\")\n          : undefined;\n      LiveActivityManager_updateProgressLiveActivity(\n        effects,\n        program,\n        progress,\n        settings,\n        subscription,\n        next?.entryIndex ?? progress.timerEntryIndex,\n        next?.setIndex ?? progress.timerSetIndex,\n        progress.timer,\n        progress.timerSince\n      );\n      NativeEffects_apply(env, effects);\n      return;\n    }\n    const next = Progress_getFirstIncompleteWorkoutSet(progress);\n    if (next != null) {\n      const entry = progress.entries[next.entryIndex];\n      const absoluteSetIndex = entry.warmupSets.length + next.setIndex;\n      LiveActivityManager_updateProgressLiveActivity(\n        effects,\n        program,\n        progress,\n        settings,\n        subscription,\n        next.entryIndex,\n        absoluteSetIndex,\n        undefined,\n        undefined\n      );\n      NativeEffects_apply(env, effects);\n    }\n  };\n}\n\n// Volume 0 with vibration on is the vibrate-without-sound path — audioInterface only bails when volume <= 0\n// AND vibration is off. Silent on purpose: both existing sounds already fire inside an `auto` rest.\nexport function Thunk_playGetReadyCue(): IThunk {\n  return async (dispatch, getState, env) => {\n    if (getState().adminKey == null) {\n      const settings = getState().storage.settings;\n      if (settings.vibration) {\n        env.audio.play(0, true);\n      }\n    }\n  };\n}\n\nexport interface IQueueableCountdownTap {\n  entryIndex: number;\n  setIndex: number;\n  tappedAt?: number;\n  countdownStartedAt?: number;\n  phaseId?: string;\n}\n\n// Only the Live Activity and the Android live update pass a tap. Their events can sit in a queue while\n// the app is suspended, and Progress_checkSetTimer fast-forwards every overdue transition on wake — so\n// the countdown the user tapped may be gone and a later one live by the time this runs. The phone\n// banner and the watch dispatch in-process and cannot outlive the countdown they name.\nexport function Thunk_startSetTimerWork(queuedTap?: IQueueableCountdownTap): IThunk {\n  return async (dispatch, getState, env) => {\n    const progress = Progress_getProgress(getState());\n    if (progress == null) {\n      return;\n    }\n    if (queuedTap != null) {\n      const getReady = progress.setTimerGetReady;\n      // Matching on start time as well as indices, because reopening the same set makes a new countdown.\n      const tapMatchesLiveCountdown =\n        getReady != null &&\n        getReady.entryIndex === queuedTap.entryIndex &&\n        getReady.setIndex === queuedTap.setIndex &&\n        (queuedTap.phaseId == null || getReady.id === queuedTap.phaseId) &&\n        (queuedTap.countdownStartedAt == null || getReady.startedAt === queuedTap.countdownStartedAt);\n      if (!tapMatchesLiveCountdown) {\n        dispatch(Thunk_refreshLiveActivity());\n        return;\n      }\n    }\n    dispatch({ type: \"StartSetTimerWorkAction\", startedAt: queuedTap?.tappedAt });\n    if (getState().adminKey == null) {\n      const settings = getState().storage.settings;\n      env.audio.play(settings.volume, !!settings.vibration, \"get-ready-end\");\n    }\n    dispatch(Thunk_refreshLiveActivity());\n  };\n}\n\nexport function Thunk_playAudioNotification(): IThunk {\n  return async (dispatch, getState, env) => {\n    if (getState().adminKey == null) {\n      const settings = getState().storage.settings;\n      env.audio.play(settings.volume, !!settings.vibration);\n    }\n  };\n}\n\nexport function Thunk_handleWatchStorageMerge(storageJson: string, isLiveActivity?: boolean): IThunk {\n  return async (dispatch, getState, env) => {\n    try {\n      const watchStorage: IStorage = runMigrations(JSON.parse(storageJson));\n      const state = getState();\n      if (WatchStorageAccount_isOtherAccount(state.storage, watchStorage)) {\n        lg(\"ls-watch-merge-other-account\", {\n          phoneUserId: state.storage.tempUserId,\n          watchUserId: watchStorage.tempUserId,\n        });\n        return;\n      }\n\n      const phoneHistoryLen = state.storage.history?.length ?? 0;\n      const watchHistoryLen = watchStorage.history?.length ?? 0;\n\n      const wasOnProgressScreen = env.getCurrentScreenData?.()?.name === \"progress\";\n      const hadProgress = state.storage.progress && state.storage.progress.length > 0;\n\n      // Merge watch storage with phone storage. amrapModal now lives on progress (not progress.ui), so it\n      // version-merges across devices like setTimer — no manual propagation past the `ui` exclusion needed.\n      let mergedStorage = Storage_mergeStorage(state.storage, watchStorage, state.deviceId);\n\n      // currentEntryIndex syncs, but the workout pager only scrolls when forceUpdateEntryIndex (a device-local\n      // ui flag) flips — without this a watch-driven exercise switch highlights the thumbnail but never scrolls\n      // the pager to it. Flip the flag when the merge actually moved the shown exercise.\n      const prevEntryIndex = state.storage.progress?.[0]?.currentEntryIndex ?? 0;\n      const mergedEntryIndex = mergedStorage.progress?.[0]?.currentEntryIndex ?? 0;\n      if (mergedEntryIndex !== prevEntryIndex && mergedStorage.progress?.[0]) {\n        mergedStorage = {\n          ...mergedStorage,\n          progress: [\n            {\n              ...mergedStorage.progress[0],\n              ui: {\n                ...mergedStorage.progress[0].ui,\n                forceUpdateEntryIndex: !mergedStorage.progress[0].ui?.forceUpdateEntryIndex,\n              },\n            },\n          ],\n        };\n      }\n\n      if (Storage_isChanged(state.storage, mergedStorage)) {\n        const mergedHistoryLen = mergedStorage.history?.length ?? 0;\n\n        if (phoneHistoryLen > 0 && mergedHistoryLen < phoneHistoryLen) {\n          lg(\"ls-history-deletion-watch-merge\", {\n            phoneHistoryLen,\n            watchHistoryLen,\n            mergedHistoryLen,\n          });\n        }\n\n        updateState(dispatch, [lb<IState>().p(\"storage\").record(mergedStorage)], \"Merge watch storage\");\n\n        const beforeProgress = state.storage.progress?.[0];\n        const afterProgress = mergedStorage.progress?.[0];\n        const timerChanged =\n          beforeProgress?.timer !== afterProgress?.timer || beforeProgress?.timerSince !== afterProgress?.timerSince;\n        if (timerChanged) {\n          if (\n            afterProgress?.timer != null &&\n            afterProgress.timerSince != null &&\n            afterProgress.timerEntryIndex != null &&\n            afterProgress.timerMode != null &&\n            Subscriptions_hasSubscription(mergedStorage.subscription)\n          ) {\n            const remaining = afterProgress.timer - (Date.now() - afterProgress.timerSince) / 1000;\n            const timerEffects: INativeEffect[] = [];\n            if (remaining > 0) {\n              Progress_scheduleTimerNotification(\n                timerEffects,\n                afterProgress,\n                afterProgress.timerEntryIndex,\n                afterProgress.timerMode,\n                mergedStorage.settings,\n                remaining,\n                afterProgress.timerSince,\n                afterProgress.timer\n              );\n            } else {\n              timerEffects.push({ type: \"stopTimer\" });\n            }\n            NativeEffects_apply(env, timerEffects);\n          } else {\n            env.timer.stopTimer();\n          }\n        }\n\n        if (afterProgress != null && beforeProgress !== afterProgress) {\n          const entryIndex = afterProgress.timerEntryIndex ?? 0;\n          const mode = afterProgress.timerMode ?? \"workout\";\n          const program = Program_getProgram(getState(), afterProgress.programId);\n          const evaluatedProgram = program ? Program_evaluate(program, mergedStorage.settings) : undefined;\n          const entry = afterProgress.entries[entryIndex];\n          const programExercise =\n            evaluatedProgram && entry\n              ? Program_getProgramExercise(afterProgress.day, evaluatedProgram, entry.programExerciseId)\n              : undefined;\n          const liveActivityEffects: INativeEffect[] = [];\n          LiveActivityManager_updateLiveActivityForNextEntry(\n            liveActivityEffects,\n            afterProgress,\n            entryIndex,\n            mode,\n            programExercise,\n            mergedStorage.settings,\n            mergedStorage.subscription\n          );\n          NativeEffects_apply(env, liveActivityEffects);\n        }\n\n        const progressIsNowEmpty = !mergedStorage.progress || mergedStorage.progress.length === 0;\n        if (hadProgress && progressIsNowEmpty) {\n          env.workout.discardWorkout();\n        }\n        if (wasOnProgressScreen && hadProgress && progressIsNowEmpty) {\n          dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n        }\n      }\n\n      // Sent whether or not the merge changed anything: a record the phone already holds still has to\n      // be confirmed, or the watch would keep it forever waiting for an acknowledgement.\n      const mergedIds = new Set((mergedStorage.history ?? []).map((r) => `${r.id}`));\n      const ackedIds = (watchStorage.history ?? []).map((r) => `${r.id}`).filter((id) => mergedIds.has(id));\n      if (ackedIds.length > 0) {\n        env.watch.sendStorageAckToWatch(ackedIds);\n      }\n    } catch (error) {\n      console.error(\"handleWatchStorageMerge: failed to merge storage\", error);\n    }\n  };\n}\n\nexport function Thunk_fetchStorage(storageId?: string): IThunk {\n  return async (dispatch, getState, env) => {\n    if (getState().errors.corruptedstorage == null) {\n      const result = await load(dispatch, \"Loading from cloud\", () => {\n        const state = getState();\n        const url = typeof window !== \"undefined\" ? UrlUtils_build(window.location.href) : undefined;\n        const userId = url != null ? url.searchParams.get(\"userid\") : state.user?.id;\n        return env.service.getStorage(state.storage.tempUserId, userId || undefined, storageId, state.adminKey);\n      });\n      await handleLogin(dispatch, result, env, getState().user?.id || getState().storage.tempUserId);\n    }\n  };\n}\n\nexport function Thunk_pushToEditProgram(): IThunk {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const currentProgram =\n      state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n    if (Program_isEmpty(currentProgram)) {\n      dispatch(Thunk_pushScreen(\"programs\", undefined, { tab: \"program\" }));\n    } else if (currentProgram) {\n      Program_editAction(dispatch, currentProgram, { tab: \"program\" });\n    }\n  };\n}\n\nexport function Thunk_startProgramDay(programId?: string): IThunk {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const progress = Progress_getCurrentProgress(state);\n    if (progress != null) {\n      dispatch(Thunk_pushScreen(\"progress\", { id: progress.id }, { tab: \"workout\" }));\n    } else if (state.storage.currentProgramId != null) {\n      const program = Program_getProgram(state, programId ?? state.storage.currentProgramId);\n      if (program != null) {\n        const newProgress = Program_nextHistoryRecord(program, state.storage.settings, state.storage.stats);\n        updateState(dispatch, [lb<IState>().p(\"storage\").p(\"progress\").record([newProgress])], \"Create new progress\");\n        dispatch(Thunk_log(\"ls-start-workout\"));\n        dispatch(Thunk_pushScreen(\"progress\", { id: newProgress.id }, { tab: \"workout\" }));\n      } else {\n        Dialog_alert(\"No currently selected program\");\n      }\n    }\n  };\n}\n\n// Which program to edit, and — the part that used to be implicit and got it wrong — whether the\n// *saved* copy or the unsaved draft is the one being edited. A workout reads the saved program,\n// because that is what it is performing. Anything inside the program editor has to read the draft,\n// or an exercise that has only been added and not saved yet doesn't exist at all: the sheet finds no\n// declaration for the key and falls back to its sample text, which reads as some other program\n// entirely. Passing an id used to mean \"from a workout\", so the editor supplying its own id was\n// enough to send it down the wrong branch.\nexport function Thunk_pushToEditProgramExercise(\n  key: string,\n  dayData: Required<IDayData>,\n  opts?: { workoutProgramId?: string; editProgramId?: string }\n): IThunk {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const workoutProgramId = opts?.workoutProgramId;\n    const isFromWorkout = workoutProgramId != null;\n    const editProgramIds = Object.keys(state.editProgramStates);\n    const programId = isFromWorkout\n      ? workoutProgramId\n      : (opts?.editProgramId ?? editProgramIds[0] ?? state.storage.currentProgramId);\n    const editProgramState = programId ? state.editProgramStates[programId] : undefined;\n    const currentProgram = isFromWorkout\n      ? programId != null\n        ? Program_getProgram(state, programId)\n        : undefined\n      : editProgramState?.current.program || (programId != null ? Program_getProgram(state, programId) : undefined);\n    if (currentProgram && !Program_isEmpty(currentProgram) && programId) {\n      dispatch(Thunk_log(\"ls-program-edit-exercise-screen\"));\n      const { navigateToModal } = await getNavigationService();\n      // Prototype: exercise edits open the Liftoscript editor sheet instead of the\n      // full edit screen.\n      navigateToModal(\"exerciseLiftoEditorModal\", { programId, key, dayData, fromWorkout: isFromWorkout });\n    } else {\n      dispatch(Thunk_pushScreen(\"main\"));\n    }\n  };\n}\n\n// The workout screen's day-level edit, and the Program screen's eventually. Takes the absolute\n// day number the workout already carries rather than a dayData, so nothing here has to know how\n// weeks are laid out.\nexport function Thunk_pushToEditProgramDay(day: number, workoutProgramId?: string): IThunk {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const isFromWorkout = workoutProgramId != null;\n    const editProgramIds = Object.keys(state.editProgramStates);\n    const programId = isFromWorkout ? workoutProgramId : (editProgramIds[0] ?? state.storage.currentProgramId);\n    const currentProgram = programId != null ? Program_getProgram(state, programId) : undefined;\n    if (currentProgram && !Program_isEmpty(currentProgram) && programId) {\n      dispatch(Thunk_log(\"ls-program-edit-day-sheet\"));\n      const { navigateToModal } = await getNavigationService();\n      navigateToModal(\"dayLiftoEditorModal\", { programId, day, fromWorkout: isFromWorkout });\n    } else {\n      dispatch(Thunk_pushScreen(\"main\"));\n    }\n  };\n}\n\nexport function Thunk_pushScreen<T extends IScreen>(\n  screen: T,\n  params?: IScreenParams<T>,\n  opts?: INavigateOpts\n): IThunk {\n  return async (dispatch, getState) => {\n    dispatch(Thunk_postevent(\"navigate-to-\" + screen));\n    if (\n      [\"musclesProgram\", \"musclesDay\", \"graphsList\"].indexOf(screen) !== -1 &&\n      !Subscriptions_hasSubscription(getState().storage.subscription)\n    ) {\n      opts = { stack: \"subscription\" };\n      screen = \"subscription\" as T;\n    }\n    if (screen === \"subscription\") {\n      opts = { ...opts, stack: \"subscription\" };\n    }\n    const screensWithoutCurrentProgram = [\n      \"first\",\n      \"onboarding\",\n      \"units\",\n      \"programs\",\n      \"programPreview\",\n      \"setupequipment\",\n      \"setupplates\",\n      \"hearaboutus\",\n      \"programselect\",\n      \"food\",\n      \"foodAdd\",\n      \"foodLibrary\",\n      \"foodItem\",\n      \"foodGoals\",\n      \"foodTemplates\",\n    ];\n    if (getState().storage.currentProgramId == null && screensWithoutCurrentProgram.indexOf(screen) === -1) {\n      screen = \"programs\" as T;\n    }\n    const { navigateTo } = await getNavigationService();\n    navigateTo(screen, params as IAllScreenParamList[typeof screen], opts);\n    if (typeof window !== \"undefined\" && window.scroll) {\n      window.scroll(0, 0);\n    }\n  };\n}\n\nexport function Thunk_updateScreenParams<T extends IScreen>(params?: IScreenParams<T>): IThunk {\n  return async (_dispatch, _getState, env) => {\n    if (env.navigationRef?.isReady()) {\n      env.navigationRef.setParams(params as Record<string, unknown>);\n    }\n  };\n}\n\nexport function Thunk_maybeRequestReview(): IThunk {\n  return async (dispatch, getState) => {\n    try {\n      const history = getState().storage.history;\n      const state = getState();\n      const now = Date.now();\n      const reviewRequests = state.storage.reviewRequests;\n      const lastReviewRequest = reviewRequests[reviewRequests.length - 1];\n      if (\n        history.length >= 5 &&\n        reviewRequests.length < 3 &&\n        (!lastReviewRequest || now - lastReviewRequest > 1000 * 60 * 60 * 24 * 32)\n      ) {\n        dispatch(Thunk_postevent(\"request-review\"));\n        updateState(\n          dispatch,\n          [\n            lb<IState>()\n              .p(\"storage\")\n              .p(\"reviewRequests\")\n              .recordModify((r) => [...r, now]),\n          ],\n          \"Add review request\"\n        );\n        InAppReview_request();\n      }\n    } catch (error) {\n      const e = error as Error;\n      Rollbar.error(e);\n    }\n  };\n}\n\nexport function Thunk_maybeRequestSignup(): IThunk {\n  return async (dispatch, getState) => {\n    try {\n      const history = getState().storage.history;\n      const state = getState();\n      const now = Date.now();\n      const signupRequests = state.storage.signupRequests;\n      const lastsignupRequest = signupRequests[signupRequests.length - 1];\n      if (\n        state.user?.id == null &&\n        history.length >= 3 &&\n        signupRequests.length < 3 &&\n        (!lastsignupRequest || now - lastsignupRequest > 1000 * 60 * 60 * 24 * 14)\n      ) {\n        dispatch(Thunk_postevent(\"request-signup\"));\n        updateState(dispatch, [lb<IState>().p(\"showSignupRequest\").record(true)], \"Show signup request\");\n      }\n    } catch (error) {\n      const e = error as Error;\n      Rollbar.error(e);\n    }\n  };\n}\n\nexport function Thunk_maybeShowOnloadModal(): IThunk {\n  return async (dispatch, getState) => {\n    try {\n      const next = OnloadModal_getNext(getState());\n      if (next === \"whatsnew\") {\n        updateState(dispatch, [lb<IState>().p(\"showWhatsNew\").record(true)], \"Show what's new on load\");\n      } else if (next === \"hearaboutus\") {\n        dispatch(Thunk_maybeRequestHearAboutUs());\n      }\n    } catch (error) {\n      Rollbar.error(error as Error);\n    }\n  };\n}\n\nexport function Thunk_maybeRequestHearAboutUs(): IThunk {\n  return async (dispatch, getState) => {\n    try {\n      if (OnloadModal_shouldShowHearAboutUs(getState())) {\n        dispatch(Thunk_postevent(\"request-hear-about-us\"));\n        updateState(dispatch, [lb<IState>().p(\"showHearAboutUs\").record(true)], \"Show hear-about-us\");\n      }\n    } catch (error) {\n      Rollbar.error(error as Error);\n    }\n  };\n}\n\nexport const screensWithEditState: IScreen[] = [\"progress\", \"editProgram\"];\n\nfunction cleanupScreenEditState(dispatch: IDispatch, state: IState, screen: IScreenData): void {\n  if (screen.name === \"progress\") {\n    const progressId = screen.params?.id ?? 0;\n    const progress = Progress_getProgressById(state, progressId);\n    if (progress && !Progress_isCurrent(progress)) {\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .pi(\"progress\")\n            .recordModify((progresses) => Progress_stop(progresses, progress.id)),\n        ],\n        \"Stop workout progress\"\n      );\n    }\n  } else if (screen.name === \"editProgram\") {\n    const programId = screen.params?.programId;\n    if (programId != null && state.editProgramStates[programId] != null) {\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"editProgramStates\")\n            .recordModify((states) => ObjectUtils_omit(states, [programId])),\n        ],\n        \"Stop edit program\"\n      );\n    }\n  }\n}\n\nexport function Thunk_cleanupRemovedScreens(screens: IScreenData[]): IThunk {\n  return async (dispatch, getState) => {\n    for (const screen of screens) {\n      cleanupScreenEditState(dispatch, getState(), screen);\n    }\n  };\n}\n\nexport function Thunk_pullScreen(): IThunk {\n  return async () => {\n    const { goBack } = await getNavigationService();\n    goBack();\n    if (typeof window !== \"undefined\" && window.scroll) {\n      window.scroll(0, 0);\n    }\n  };\n}\n\nexport function Thunk_confirmScreenLeave(screen: IScreenData, action: NavigationAction): IThunk {\n  return async (dispatch, getState, env) => {\n    // Save flows (e.g. Thunk_finishProgramDay) dispatch their commit synchronously\n    // right after the navigation call that got prevented. Deferring a tick lets that\n    // commit land, so the re-check below sees clean state and proceeds silently.\n    await new Promise((resolve) => setTimeout(resolve, 0));\n    const confirmation = Screen_shouldConfirmNavigation(getState(), screen);\n    if (confirmation == null || (await Dialog_confirm(confirmation))) {\n      env.navigationRef?.dispatch(action);\n    }\n  };\n}\n\nexport function Thunk_editHistoryRecord(historyRecord: IHistoryRecord): IThunk {\n  return async (dispatch) => {\n    dispatch({ type: \"EditHistoryRecord\", historyRecord });\n    const { navigateTo } = await getNavigationService();\n    navigateTo(\"progress\", { id: historyRecord.id });\n  };\n}\n\nexport function Thunk_finishProgramDay(args: {\n  id: number;\n  startTime: number;\n  healthSync: boolean;\n  onStale: () => void;\n}): IThunk {\n  return async (dispatch, getState, env) => {\n    const { id, startTime, healthSync } = args;\n    const progress = Progress_getProgressById(getState(), id);\n    if (progress == null || progress.startTime !== startTime) {\n      args.onStale();\n      return;\n    }\n    const isCurrent = Progress_isCurrent(progress);\n    env.workout.pauseWorkout();\n    if (isCurrent) {\n      dispatch(Thunk_postevent(\"finish-workout\", { workout: JSON.stringify(progress) }));\n      env.workout.finishWorkout();\n    }\n    const { navigateTo, goBack } = await getNavigationService();\n    // Navigate before dispatch so the progress screen unmounts before\n    // FallbackScreen can detect null progress and redirect to home.\n    // The dispatch must stay synchronous after goBack: for a dirty past workout\n    // useConfirmScreenLeave intercepts the goBack, and Thunk_confirmScreenLeave's\n    // one-tick defer needs the save committed by then to proceed without a dialog.\n    // ScreenRemovalCleanup's \"state\" event also fires post-commit, so the save\n    // lands before the removed screen's edit state gets cleaned up.\n    if (isCurrent) {\n      navigateTo(\"finishDay\", { id: progress.startTime }, { tab: \"workout\" });\n    } else {\n      goBack();\n    }\n    dispatch({ type: \"FinishProgramDayAction\", id, startTime, healthSync });\n  };\n}\n\nexport function Thunk_pauseWorkout(): IThunk {\n  return async (dispatch, getState, env) => {\n    env.workout.pauseWorkout();\n    History_pauseWorkoutState(dispatch);\n  };\n}\n\nexport function Thunk_deleteProgress(id: number): IThunk {\n  return async (dispatch) => {\n    dispatch({ type: \"DeleteProgress\", id });\n    const { navigateTo } = await getNavigationService();\n    navigateTo(\"main\", undefined, { tab: \"home\" });\n  };\n}\n\nexport function Thunk_fetchPrograms(): IThunk {\n  return async (dispatch, getState, env) => {\n    const result = await load(dispatch, \"Loading programs\", async () => {\n      const index = await env.service.programsIndex();\n      const details = await Promise.all(index.map((entry) => env.service.programDetail(entry.id)));\n      const programs = index.map((entry, i) => {\n        const detail = details[i];\n        const program: IProgram = {\n          ...Program_create(entry.name, entry.id),\n          author: entry.author,\n          url: entry.url,\n          shortDescription: entry.shortDescription,\n          description: entry.description || \"\",\n          isMultiweek: entry.isMultiweek,\n          tags: entry.tags as IProgram[\"tags\"],\n          planner: detail.planner,\n        };\n        return program;\n      });\n      return { programs, index };\n    });\n    if (result) {\n      dispatch({\n        type: \"UpdateState\",\n        lensRecording: [\n          lb<IState>().p(\"programs\").record(result.programs),\n          lb<IState>().p(\"programsIndex\").record(result.index),\n        ],\n        desc: \"Set loaded Programs\",\n      });\n    }\n  };\n}\n\nexport function Thunk_fetchRevisions(programId: string, cb: () => void): IThunk {\n  return async (dispatch, getState, env) => {\n    const programRevisions = await load(dispatch, \"Loading revisions\", () =>\n      env.service.getProgramRevisions(programId, Service_adminTarget(getState().adminKey, getState().user?.id))\n    );\n    if (programRevisions.success) {\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"revisions\")\n            .recordModify((revisions) => {\n              return { ...revisions, [programId]: programRevisions.data };\n            }),\n        ],\n        \"Set loaded Revisions\"\n      );\n    } else {\n      const error = programRevisions.error;\n      const state = getState();\n      const context = {\n        programId,\n        status: error.status ?? 0,\n        message: error.message,\n        body: error.body ?? \"\",\n        isLoggedIn: state.user?.id ? \"yes\" : \"no\",\n      };\n      lg(\"ls-program-revisions-fetch-error\", context, env.service, state.user?.id || state.storage.tempUserId);\n      Rollbar.error(\"Couldn't fetch program revisions\", { ...context, userId: state.user?.id });\n      Dialog_alert(\n        `Couldn't fetch program revisions${error.status != null ? ` (${error.status})` : `: ${error.message}`}`\n      );\n    }\n    cb();\n  };\n}\n\nexport function Thunk_exportStorage(): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"export-storage-to-json\"));\n    ImportExporter_exportStorage(getState().storage);\n  };\n}\n\nexport function Thunk_exportProgramToFile(program: IProgram): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"export-program-to-file\"));\n    const state = getState();\n    Program_exportProgramToFile(program, state.storage.settings, state.storage.version);\n  };\n}\n\nexport function Thunk_exportProgramToLink(program: IProgram): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"export-program-to-link\"));\n    const state = getState();\n    const link = await Program_exportProgramToLink(program, state.storage.settings, state.storage.version);\n    await ClipboardUtils_copy(link);\n    Dialog_alert(\"Link copied to clipboard:\\n\\n\" + link);\n  };\n}\n\nexport function Thunk_exportHistoryToCSV(): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"export-history-to-csv\"));\n    const state = getState();\n    const csv = CSV_toString(History_exportAsCSV(state.storage.history, state.storage.settings));\n    Exporter_toFile(`liftosaur_${DateUtils_formatYYYYMMDD(Date.now())}.csv`, csv);\n  };\n}\n\nexport function Thunk_exportProgramsToText(): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"export-programs-to-text\"));\n    let text = \"\";\n    for (const program of getState().storage.programs) {\n      if (!program.planner) {\n        continue;\n      }\n      text += `======= ${program.name} =======\\n\\n`;\n      text += PlannerProgram_generateFullText(program.planner.weeks);\n      text += `\\n\\n\\n`;\n    }\n    Exporter_toFile(`liftosaur_all_programs_${DateUtils_formatYYYYMMDD(Date.now())}.txt`, text);\n  };\n}\n\nexport function Thunk_importStorage(maybeStorage: string): IThunk {\n  return async (dispatch) => {\n    dispatch(Thunk_postevent(\"import-json-storage\"));\n    let parsedMaybeStorage: Record<string, unknown>;\n    try {\n      parsedMaybeStorage = JSON.parse(maybeStorage);\n    } catch (e) {\n      Dialog_alert(\"Couldn't parse the provided file\");\n      return;\n    }\n    const result = Storage_get(parsedMaybeStorage, false);\n    if (result.success) {\n      updateState(dispatch, [lb<IState>().p(\"storage\").record(result.data)], \"Importing Storage\");\n      Dialog_alert(\"Successfully imported\");\n    } else {\n      Dialog_alert(`Couldn't import the storage, errors: \\n${result.error.join(\"\\n\")}`);\n    }\n  };\n}\n\n// Parsing a large CSV blocks the JS thread, so show the navbar spinner while it runs. The yield lets\n// the spinner paint before the synchronous parse starts (otherwise it wouldn't render until parsing\n// finishes). This does NOT use `load()` - that retries up to 3x, which would re-parse a bad file.\nasync function importWithSpinner<T>(dispatch: IDispatch, cb: () => T): Promise<T> {\n  const name = UidFactory_generateUid(4);\n  updateState(\n    dispatch,\n    [lb<IState>().p(\"loading\").p(\"items\").p(name).record({ startTime: Date.now(), type: \"Importing\" })],\n    \"Start import parse\"\n  );\n  try {\n    await new Promise((resolve) => setTimeout(resolve, 16));\n    return cb();\n  } finally {\n    updateState(\n      dispatch,\n      [lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now())],\n      \"End import parse\"\n    );\n  }\n}\n\nexport function Thunk_importCsvData(rawCsv: string): IThunk {\n  return async (dispatch, getState, env) => {\n    try {\n      dispatch(Thunk_postevent(\"import-csv-data\"));\n      const result = await importWithSpinner(dispatch, () =>\n        ImportFromLiftosaur_convertLiftosaurCsvToHistoryRecords(rawCsv, getState().storage.settings)\n      );\n      if (result.historyRecords.length === 0) {\n        Dialog_alert(\"No workouts found in the file.\");\n        return;\n      }\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"importPreview\").record({ source: \"liftosaurCsv\", result })],\n        \"Open import preview\"\n      );\n      dispatch(Thunk_pushScreen(\"importPreview\"));\n    } catch (e) {\n      if (e instanceof ImportFileError) {\n        Dialog_alert(e.message);\n      } else {\n        console.error(e);\n        Dialog_alert(\"Couldn't parse the provided file\");\n      }\n    }\n  };\n}\n\nexport function Thunk_importHevyData(rawCsv: string): IThunk {\n  return async (dispatch, getState) => {\n    try {\n      dispatch(Thunk_postevent(\"import-hevy-data\"));\n      const result = await importWithSpinner(dispatch, () =>\n        ImportFromHevy_convertHevyCsvToHistoryRecords(rawCsv, getState().storage.settings)\n      );\n      if (result.historyRecords.length === 0) {\n        Dialog_alert(\"No workouts found in the file.\");\n        return;\n      }\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"importPreview\").record({ source: \"hevy\", result })],\n        \"Open import preview\"\n      );\n      dispatch(Thunk_pushScreen(\"importPreview\"));\n    } catch (e) {\n      if (e instanceof ImportFileError) {\n        Dialog_alert(e.message);\n      } else {\n        console.error(e);\n        Rollbar.error(e as Error);\n        Dialog_alert(\"Failed to import history from Hevy.\");\n      }\n    }\n  };\n}\n\nexport function Thunk_undoImport(sessionId: string): IThunk {\n  return async (dispatch, getState) => {\n    const storage = getState().storage;\n    const session = (storage.importSessions ?? []).find((s) => s.id === sessionId);\n    if (session == null) {\n      return;\n    }\n    const editedCount = ImportSession_findEditedRecordIds(storage, session).length;\n    const editedWarning = editedCount > 0 ? ` ${editedCount} of them were edited after the import.` : \"\";\n    const sourceName = session.source === \"hevy\" ? \"Hevy\" : \"CSV\";\n    if (\n      !(await Dialog_confirm(\n        `Remove ${session.workoutCount} ${StringUtils_pluralize(\"workout\", session.workoutCount)} imported from ${sourceName} on ${DateUtils_format(session.timestamp)}?${editedWarning}`\n      ))\n    ) {\n      return;\n    }\n    const undone = ImportSession_undo(getState().storage, sessionId);\n    if (undone != null) {\n      updateState(dispatch, [lb<IState>().p(\"storage\").record(undone)], \"Undo import\");\n    }\n  };\n}\n\nexport function Thunk_applyImport(\n  historyRecords: IHistoryRecord[],\n  customExercises: Record<string, ICustomExercise>,\n  source: IImportSession[\"source\"]\n): IThunk {\n  return async (dispatch, getState) => {\n    const applied = ImportSession_apply(getState().storage, historyRecords, customExercises, source);\n    updateState(\n      dispatch,\n      [\n        lb<IState>().p(\"storage\").p(\"history\").record(applied.history),\n        lb<IState>().p(\"storage\").p(\"settings\").p(\"exercises\").record(applied.exercises),\n        lb<IState>().p(\"storage\").p(\"importSessions\").record(applied.importSessions),\n      ],\n      `Import history from ${source === \"hevy\" ? \"Hevy\" : \"CSV\"}`\n    );\n  };\n}\n\nexport function Thunk_importFromLink(link: string): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"import-from-link\"));\n    const data = await ImportFromLink_importFromLink(link, env.service.client);\n    if (data.success) {\n      if (data.data.source) {\n        Storage_setAffiliate(dispatch, data.data.source, \"program\");\n      }\n      dispatch(Thunk_importProgram(data.data));\n    } else {\n      Dialog_alert(data.error.join(\"\\n\"));\n    }\n  };\n}\n\nexport function Thunk_generateAndCopyLink(\n  editProgram: IProgram,\n  settings: ISettings,\n  cb: (link: string) => void\n): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"generate-and-copy-link\"));\n    const link = await Program_exportProgramToLink(editProgram, settings, getLatestMigrationVersion());\n    try {\n      const state = getState();\n      const service = new Service(env.service.client);\n      const url = await service.postShortUrl(\n        link,\n        \"p\",\n        state.storage.settings.affiliateEnabled && state.user?.id ? state.user.id : undefined\n      );\n      ClipboardUtils_copy(url);\n      cb(url);\n    } catch (error) {\n      const e = error as Error;\n      Rollbar.error(e);\n      ClipboardUtils_copy(link);\n      cb(link);\n    }\n  };\n}\n\nexport function Thunk_importProgram(importLinkData: IImportLinkData): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"import-program-from-link\"));\n    const { decoded: maybeProgram, source, userid } = importLinkData;\n    const state = getState();\n    const result = await ImportExporter_getExportedProgram(env.service.client, maybeProgram, state.storage.settings);\n    if (result.success) {\n      const { program, customExercises } = result.data;\n      const existingCustomExerciseNames = new Set(\n        CollectionUtils_compact(ObjectUtils_values(state.storage.settings.exercises).map((e) => e?.name))\n      );\n      const newCustomExercises = ObjectUtils_filter(\n        customExercises,\n        (_, v) => v != null && !existingCustomExerciseNames.has(v.name)\n      );\n      if (source) {\n        program.source = source;\n      }\n      if (userid) {\n        program.authorid = userid;\n      }\n      const newProgram: IProgram = { ...ObjectUtils_clone(program), clonedAt: Date.now() };\n      if (!(await Dialog_confirm(`Do you want to import program ${newProgram.name}?`))) {\n        return;\n      }\n      const hasExistingProgram = getState().storage.programs.some((p) => p.id === newProgram.id);\n      if (\n        hasExistingProgram &&\n        !(await Dialog_confirm(\"Program with the same id already exists, do you want to overwrite it?\"))\n      ) {\n        return;\n      }\n      if (newProgram.planner && PlannerProgram_hasNonSelectedWeightUnit(newProgram.planner, state.storage.settings)) {\n        const fromUnit = Weight_oppositeUnit(state.storage.settings.units);\n        const toUnit = state.storage.settings.units;\n        if (await Dialog_confirm(`The program has weights in ${fromUnit}, do you want to convert them to ${toUnit}?`)) {\n          newProgram.planner = PlannerProgram_switchToUnit(newProgram.planner, state.storage.settings);\n        }\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"storage\")\n            .p(\"settings\")\n            .p(\"exercises\")\n            .recordModify((e) => ({ ...e, ...newCustomExercises })),\n          lb<IState>()\n            .p(\"storage\")\n            .p(\"programs\")\n            .recordModify((programs) => {\n              const index = programs.findIndex((p) => p.id === newProgram.id);\n              if (index !== -1) {\n                return CollectionUtils_setAt(programs, index, newProgram);\n              } else {\n                return [...programs, newProgram];\n              }\n            }),\n          lb<IState>().p(\"storage\").p(\"currentProgramId\").record(newProgram.id),\n        ],\n        \"Importing Program\"\n      );\n      Dialog_alert(\"Successfully imported\");\n      const { navigateTo } = await getNavigationService();\n      navigateTo(\"main\", undefined, { tab: \"home\" });\n    } else {\n      Dialog_alert(result.error.join(\"\\n\"));\n    }\n  };\n}\n\nexport function Thunk_createAccount(): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"create-account\"));\n    dispatch(\n      Thunk_logOut(async () => {\n        const newState = await getInitialState(env.service.client, { deviceId: getState().deviceId });\n        dispatch({ type: \"ReplaceState\", state: newState });\n        dispatch(Thunk_fetchInitial());\n      })\n    );\n  };\n}\n\nexport function Thunk_deleteAccount(id: string, cb?: () => void): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"delete-local-account\"));\n    await env.persistence.delete(`liftosaur_${id}`);\n    if (cb) {\n      cb();\n    }\n  };\n}\n\nexport function Thunk_fetchAccounts(cb: (accounts: IAccount[]) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    cb(await Account_getAll(env.persistence));\n  };\n}\n\nexport function Thunk_deleteAccountRemote(cb?: (result: boolean) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    await load(dispatch, \"Delete cloud account\", () => {\n      return new Promise(async (resolve) => {\n        dispatch(Thunk_postevent(\"delete-remove-account\"));\n        const result = await env.service.deleteAccount();\n        dispatch(\n          Thunk_logOut(() => {\n            if (cb) {\n              cb(result);\n              resolve(result);\n            }\n          })\n        );\n      });\n    });\n  };\n}\n\nexport function Thunk_switchAccount(id: string): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(\n      Thunk_logOut(async () => {\n        dispatch(Thunk_postevent(\"switch-account\"));\n        const localStorage = await env.persistence.load(`liftosaur_${id}`);\n        if (localStorage?.storage != null) {\n          const result = Storage_get(localStorage.storage);\n          if (result.success) {\n            const newState = await getInitialState(env.service.client, { localStorage, deviceId: getState().deviceId });\n            dispatch({ type: \"ReplaceState\", state: newState });\n            dispatch(Thunk_fetchInitial());\n          } else {\n            console.error(\"Failed to switch account, error:\", result.error);\n            Dialog_alert(`Error while trying to switch the account: ${result.error}`);\n          }\n        } else {\n          console.error(\"Error while trying to switch the account: missing account\", id);\n          Dialog_alert(`Error while trying to switch the account: missing account ${id}`);\n        }\n      })\n    );\n  };\n}\n\nexport function Thunk_adminCheckKey(adminKey: string, cb: (isValid: boolean) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    const isValid = await load(dispatch, \"Validating admin key\", () => env.service.checkAdminKey(adminKey));\n    cb(isValid);\n  };\n}\n\nexport function Thunk_adminListDebugSnapshots(\n  userId: string,\n  adminKey: string,\n  cb: (snapshots: string[]) => void\n): IThunk {\n  return async (dispatch, getState, env) => {\n    const snapshots = await load(dispatch, \"Listing debug snapshots\", () =>\n      env.service.getDebugSnapshotList(userId, adminKey)\n    );\n    cb(snapshots);\n  };\n}\n\nexport function Thunk_adminLoginAsUser(\n  userId: string,\n  adminKey: string,\n  storageId?: string,\n  debugTimestamp?: string\n): IThunk {\n  return async (dispatch, getState, env) => {\n    const result = await load(dispatch, \"Loading user storage\", () =>\n      debugTimestamp != null\n        ? AdminDebug_fetchDebugSnapshotStorage(env.service, userId, adminKey, debugTimestamp)\n        : AdminDebug_fetchStorage(env.service, getState().storage.tempUserId, userId, adminKey, storageId)\n    );\n    if (!result.success) {\n      Dialog_alert(`Failed to login as user ${userId}: ${result.error}`);\n      return;\n    }\n    const debugStorage = result.data;\n    dispatch(Thunk_postevent(\"admin-login-as-user\"));\n    // Sign out the admin's own session so the debug sandbox is fully anonymous: the server\n    // never minted a target cookie, and clearing the admin's own cookie means no in-session\n    // request can be attributed to anyone. The admin's local account stays in IndexedDB.\n    await env.push?.unregisterBeforeSignout();\n    await env.service.signout();\n    const localStorage: ILocalStorage = { storage: debugStorage };\n    await IndexedDBUtils_set(\"current_account\", debugStorage.tempUserId);\n    await env.persistence.saveFull(`liftosaur_${debugStorage.tempUserId}`, localStorage);\n    const newState = await getInitialState(env.service.client, { localStorage, deviceId: getState().deviceId });\n    dispatch({ type: \"ReplaceState\", state: newState });\n    dispatch(Thunk_fetchInitial());\n    const { navigateTo } = await getNavigationService();\n    navigateTo(\"main\", undefined, { tab: \"home\" });\n  };\n}\n\nexport function Thunk_adminEnableServerSync(adminKey: string): IThunk {\n  return async (dispatch, getState, env) => {\n    const tempUserId = getState().storage.tempUserId;\n    if (!AdminDebug_isDebugAccountId(tempUserId)) {\n      return;\n    }\n    const session = await load(dispatch, \"Creating debug session\", () =>\n      env.service.createDebugSession(tempUserId, adminKey)\n    );\n    if (session == null) {\n      Dialog_alert(\"Failed to create debug session (check the admin key)\");\n      return;\n    }\n    // Enablement is intentionally session-only and fails closed: the set-cookie authenticates this\n    // session via the cookie jar, but on restart getInitialState reloads any debug_ account\n    // force-nosync, so sync turns back off and must be re-enabled here. We deliberately do NOT write\n    // the debug session to the keychain - that slot is the real login auth (+ watch bridge), and a\n    // debug token must never outlive the session or leak to the watch.\n    updateState(\n      dispatch,\n      [\n        lb<IState>().p(\"nosync\").record(false),\n        lb<IState>().p(\"user\").record({ id: session.userId, email: session.email }),\n      ],\n      \"Debug: enable server sync\"\n    );\n    dispatch(Thunk_sync2({ force: true, log: true }));\n  };\n}\n\nexport function Thunk_debugTestLogin(\n  apiKey?: string,\n  cb?: (result: { userId: string; email: string; apiKeyBound: boolean } | { error: string }) => void\n): IThunk {\n  return async (dispatch, getState, env) => {\n    try {\n      const userId = `test_${UidFactory_generateUid(8)}`;\n      const email = `${userId}@test.liftosaur.com`;\n      const result = await env.service.googleSignIn(email, userId, { forcedUserEmail: email });\n      if (result.email == null) {\n        cb?.({ error: \"Sign in failed - forceuseremail only works against a local dev server\" });\n        return;\n      }\n      // Setup before handleLogin so a failure (e.g. non-local backend without the dev route)\n      // doesn't leave the app committed to a half-provisioned account. The signin above already\n      // replaced the session cookie though, so on failure also sign out rather than keep\n      // HTTP-layer auth pointing at the throwaway account.\n      let setup: { apiKeyBound: boolean; key: string };\n      try {\n        setup = await env.service.postSetupTestAccount(apiKey, result.session);\n      } catch (e) {\n        await env.service.signout().catch(() => undefined);\n        throw e;\n      }\n      await handleLogin(dispatch, result, env, getState().user?.id || getState().storage.tempUserId);\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(setup.key)],\n        \"Set test account subscription key\"\n      );\n      dispatch(Thunk_sync2());\n      cb?.({ userId: result.user_id, email: result.email, apiKeyBound: setup.apiKeyBound });\n    } catch (e) {\n      cb?.({ error: e instanceof Error ? e.message : String(e) });\n    }\n  };\n}\n\nexport function Thunk_claimkey(): IThunk {\n  return async (dispatch, getState, env) => {\n    const claim = await env.service.postClaimKey(getState().storage.tempUserId);\n    if (claim) {\n      finishFreeAccess(dispatch, claim.key, claim.expires);\n    } else {\n      Dialog_alert(\"Failed to claim the free access\");\n      dispatch(Thunk_log(\"ls-claim-free-user-fail\"));\n    }\n  };\n}\n\nfunction finishFreeAccess(dispatch: IDispatch, key: string, expires: number): void {\n  updateState(dispatch, [lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(key)], \"Set subscription key\");\n  const date = DateUtils_format(expires);\n  Dialog_alert(`Successfully claimed the free access until ${date}`);\n  dispatch(Thunk_log(\"ls-claim-free-user-success\"));\n  dispatch(Thunk_pullScreen());\n}\n\nexport function Thunk_fetchInitial(): IThunk {\n  return async (dispatch, getState, env) => {\n    if (getState().storage.whatsNew == null) {\n      WhatsNew_updateStorage(dispatch);\n    }\n    dispatch(Thunk_fetchPrograms());\n    // A debug sandbox must not verify the target's subscription receipts or restore IAPs.\n    if (AdminDebug_isDebugAccountId(getState().storage.tempUserId)) {\n      return;\n    }\n    dispatch(Thunk_verifySubscriptionKey());\n    if (getState().storage.subscription.apple.length > 0) {\n      dispatch(Thunk_postevent(\"check-apple-subscription\"));\n      const receipt = getState().storage.subscription.apple[0]?.value;\n      const userId = getState().user?.id || getState().storage.tempUserId;\n      const isVerified = await Subscriptions_verifyAppleReceipt(userId, env.service, receipt);\n      if (!isVerified) {\n        dispatch(Thunk_postevent(\"apple-subscription-invalid-restore\"));\n        await Subscriptions_cleanupOutdatedAppleReceipts(\n          dispatch,\n          userId,\n          env.service,\n          getState().storage.subscription\n        );\n        if (Platform.OS === \"ios\") {\n          dispatch(Thunk_restorePurchases());\n        }\n      } else {\n        dispatch(Thunk_postevent(\"apple-subscription-verified\"));\n        if (getState().storage.subscription.apple.length === 0) {\n          Subscriptions_setAppleReceipt(dispatch, receipt);\n        }\n      }\n    }\n  };\n}\n\n// Restore on startup for the native stores, dispatched only after iap.initConnection() succeeds (getAvailablePurchases\n// needs an open connection). Android restores unconditionally; iOS only self-heals when no receipt is stored: a\n// lifetime/sub owned on this Apple ID but bought under a different local account (or never persisted) leaves\n// storage.subscription empty - the only signal devices without StoreKit access (the Apple Watch) use to unlock\n// Premium, and the live \"lifetime\" screen state hides the manual Restore button, so there's no other recovery path.\n// StoreKit 2's currentEntitlements read is silent (unlike legacy SK1 restoreCompletedTransactions, which prompts for\n// the App Store password - the reason iOS wasn't restored on load before), so it's safe to do on every launch.\nexport function Thunk_iapRestoreOnStartup(): IThunk {\n  return async (dispatch, getState, env) => {\n    if (env.iap == null) {\n      return;\n    }\n    // A debug sandbox must not restore the admin's IAPs into the target-derived debug account (same guard as\n    // Thunk_fetchInitial) - restoring would also write server-side subscription/payment records under the debug id.\n    if (AdminDebug_isDebugAccountId(getState().storage.tempUserId)) {\n      return;\n    }\n    if (Platform.OS === \"android\") {\n      dispatch(Thunk_restorePurchases());\n    } else if (Platform.OS === \"ios\" && getState().storage.subscription.apple.length === 0) {\n      dispatch(Thunk_restorePurchases());\n    }\n  };\n}\n\nexport function Thunk_redeemCoupon(code: string, cb: (success: boolean) => void): IThunk {\n  return async (dispatch, getState, env) => {\n    dispatch(Thunk_postevent(\"redeem-coupon\"));\n    const platform = StoreRuntime_isIos() ? \"ios\" : StoreRuntime_isAndroid() ? \"android\" : undefined;\n    const result = await load(dispatch, \"Claiming coupon\", () => env.service.postClaimCoupon(code, platform));\n    if (result.success) {\n      const { key, expires, appleOffer, googleOffer, affiliate } = result.data;\n      if (appleOffer) {\n        console.log(\"Apple promotional offer data:\", appleOffer);\n        updateState(dispatch, [lb<IState>().p(\"appleOffer\").record(appleOffer)], \"Set apple promotional offer\");\n        lg(\"ls-coupon-applied\", { code, type: \"apple\" });\n        Dialog_alert(\"Coupon has been applied! Proceed to purchase now.\");\n      } else if (googleOffer) {\n        console.log(\"Google promotional offer data:\", googleOffer);\n        updateState(dispatch, [lb<IState>().p(\"googleOffer\").record(googleOffer)], \"Set google promotional offer\");\n        lg(\"ls-coupon-applied\", { code, type: \"google\" });\n        Dialog_alert(\"Coupon has been applied! Proceed to purchase now.\");\n      } else if (key && expires) {\n        finishFreeAccess(dispatch, key, expires);\n      }\n      if (affiliate) {\n        Storage_setAffiliate(dispatch, affiliate, \"coupon\");\n      }\n      cb(true);\n    } else {\n      switch (result.error) {\n        case \"not_authorized\": {\n          Dialog_alert(\"You need to sign in first to claim the coupon.\");\n          break;\n        }\n        case \"coupon_not_found\": {\n          Dialog_alert(\"Couldn't find the coupon with that code.\");\n          break;\n        }\n        case \"coupon_disabled\": {\n          Dialog_alert(\"Couldn't find the coupon with that code.\");\n          break;\n        }\n        case \"coupon_already_claimed\": {\n          Dialog_alert(\"This coupon is already claimed.\");\n          break;\n        }\n        case \"wrong_platform\": {\n          Dialog_alert(\"This coupon could only be activated on Android or iOS.\");\n          break;\n        }\n        default: {\n          Dialog_alert(\"Failed to claim the coupon.\");\n          break;\n        }\n      }\n      dispatch(Thunk_log(\"ls-claim-coupon-fail\"));\n      cb(false);\n    }\n  };\n}\n\nexport function Thunk_setAppleReceipt(receipt?: string, opts?: { keepSubscriptionScreenOpen?: boolean }): IThunk {\n  return async (dispatch, getState, env) => {\n    if (receipt) {\n      if (\n        await Subscriptions_verifyAppleReceipt(\n          getState().user?.id || getState().storage.tempUserId,\n          env.service,\n          receipt\n        )\n      ) {\n        dispatch(Thunk_postevent(\"complete-apple-subscription\"));\n        dispatch(Thunk_log(\"ls-set-apple-receipt\"));\n        Subscriptions_setAppleReceipt(dispatch, receipt);\n        // A plan switch re-delivers the existing receipt; closing the screen would hide the freshly-updated\n        // pending-switch UI, so keep it open in that case and let the refresh repaint the management state.\n        if (env.getCurrentScreenData?.()?.name === \"subscription\" && !opts?.keepSubscriptionScreenOpen) {\n          dispatch(Thunk_pullScreen());\n        }\n      } else {\n        dispatch(Thunk_postevent(\"apple-subscription-invalid\"));\n      }\n    }\n  };\n}\n\nexport function Thunk_pushExerciseStatsScreen(exerciseType: IExerciseType): IThunk {\n  return async (dispatch, getState, env) => {\n    updateState(dispatch, [lb<IState>().p(\"viewExerciseType\").record(exerciseType)], \"Set exercise type to view\");\n    dispatch(Thunk_pushScreen(\"exerciseStats\"));\n  };\n}\n\nexport function Thunk_setGooglePurchaseToken(\n  productId?: string,\n  token?: string,\n  opts?: { keepSubscriptionScreenOpen?: boolean }\n): IThunk {\n  return async (dispatch, getState, env) => {\n    if (productId && token) {\n      const purchaseToken = JSON.stringify({ productId, token });\n      const state = getState();\n      const userId = state.user?.id || state.storage.tempUserId;\n      if (await Subscriptions_verifyGooglePurchaseToken(env.service, userId, purchaseToken)) {\n        dispatch(Thunk_postevent(\"complete-google-subscription\"));\n        dispatch(Thunk_log(\"ls-set-google-purchase-token\"));\n        Subscriptions_setGooglePurchaseToken(dispatch, purchaseToken);\n        // A plan switch re-delivers the existing token; keep the screen open so the updated pending-switch\n        // UI stays visible instead of being closed out from under the user.\n        if (env.getCurrentScreenData?.()?.name === \"subscription\" && !opts?.keepSubscriptionScreenOpen) {\n          dispatch(Thunk_pullScreen());\n        }\n      } else {\n        dispatch(Thunk_postevent(\"google-subscription-invalid\", { productId, token }));\n      }\n    }\n  };\n}\n\nasync function load<T>(dispatch: IDispatch, type: string, cb: () => Promise<T>): Promise<T> {\n  return new Promise((resolve, reject) => {\n    const name = UidFactory_generateUid(4);\n    _load(dispatch, name, type, cb, 0, resolve, reject);\n  });\n}\n\nfunction _load<T>(\n  dispatch: IDispatch,\n  name: string,\n  type: string,\n  cb: () => Promise<T>,\n  attempt: number,\n  resolve: (arg: T) => void,\n  reject: (arg: unknown) => void\n): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"loading\")\n        .p(\"items\")\n        .p(name)\n        .recordModify((i) => {\n          if (i == null) {\n            return { startTime: Date.now(), attempt, type };\n          } else {\n            return { ...i, attempt };\n          }\n        }),\n    ],\n    \"Start loading\"\n  );\n  cb()\n    .then((r) => {\n      updateState(\n        dispatch,\n        [\n          lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now()),\n          lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"error\").record(undefined),\n        ],\n        \"End loading\"\n      );\n      resolve(r);\n    })\n    .catch((e) => {\n      if (e.name === \"AbortError\") {\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now()),\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"error\").record(undefined),\n          ],\n          \"Abort loading\"\n        );\n        reject(e);\n        return;\n      }\n      if (attempt >= 3 || (e instanceof NoRetryError && e.noretry)) {\n        updateState(\n          dispatch,\n          [\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"error\").record(`${type} failed`),\n            lb<IState>().p(\"loading\").p(\"items\").pi(name).p(\"endTime\").record(Date.now()),\n          ],\n          `Failed loading`\n        );\n        if (type === \"Logging in\") {\n          Rollbar.error(\"Error while logging in\", {\n            error: e instanceof Error ? e.message : String(e),\n          });\n          Rollbar.error(e);\n        }\n        reject(e);\n      } else {\n        setTimeout(() => {\n          _load(dispatch, name, type, cb, attempt + 1, resolve, reject);\n        }, 1000);\n      }\n    });\n}\n\nasync function handleLogin(\n  dispatch: IDispatch,\n  result: IGetStorageResponse,\n  env: IEnv,\n  oldUserId?: string\n): Promise<void> {\n  const client = env.service.client;\n  try {\n    if (result.email != null) {\n      dispatch(Thunk_postevent(\"login\"));\n      Rollbar.configure(RollbarUtils_config({ person: { email: result.email, id: result.user_id } }));\n      let storage: IStorage;\n      const lastSynced = SyncBaseline_fromServer(\n        { _versions: result.storage._versions, tempUserId: result.user_id },\n        Date.now()\n      );\n      const storageResult = Storage_get(result.storage, true);\n      const service = new Service(client);\n      if (storageResult.success) {\n        storage = storageResult.data;\n      } else {\n        storage = result.storage;\n        const userid = result.user_id || result.storage.tempUserId || `missing-${UidFactory_generateUid(8)}`;\n        await service.postDebug(userid, JSON.stringify(result.storage), { local: \"false\" });\n      }\n      storage.tempUserId = result.user_id;\n      storage.email = result.email;\n      if (result.is_new_user) {\n        Analytics_trackSignUp();\n        if (oldUserId) {\n          try {\n            await service.postDebug(oldUserId, JSON.stringify(window.state || {}), {\n              new_userid: result.user_id,\n              email: result.email,\n            });\n          } catch (e) {\n            console.error(\"Failed to upload debug data for old user\", e);\n          }\n        }\n      }\n      if (oldUserId === result.user_id) {\n        dispatch(Thunk_postevent(\"login-same-user\"));\n        updateState(dispatch, [lb<IState>().p(\"lastSynced\").record(lastSynced)], \"Set last synced on login\");\n        dispatch({ type: \"Login\", email: result.email, userId: result.user_id });\n        if (storage.subscription.key !== result.key) {\n          updateState(\n            dispatch,\n            [lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(result.key)],\n            \"Set subscription key from login\"\n          );\n        }\n      } else {\n        dispatch(Thunk_postevent(\"login-different-user\"));\n        storage.subscription.key = result.key;\n        const newState = await getInitialState(client, { storage, deviceId: await DeviceId_get() });\n        newState.lastSynced = lastSynced;\n        newState.user = { id: result.user_id, email: result.email };\n        dispatch({ type: \"ReplaceState\", state: newState });\n      }\n      dispatch(Thunk_fetchInitial());\n      if (result.session) {\n        const auth: IAuthToken = {\n          token: result.session,\n          expiresAt: Math.floor(Date.now() / 1000) + 10 * 365 * 24 * 60 * 60,\n          userId: result.user_id,\n        };\n        try {\n          await env.keychain.setAuthToken(auth);\n        } catch (e) {\n          lg(\"ls-keychain-set-auth-fail\", { error: e instanceof Error ? e.message : String(e) });\n        }\n        if (WatchAuthHandoff_accountId({ id: result.user_id, email: result.email }, storage) != null) {\n          env.watch.sendAuthToWatch(auth);\n        }\n      }\n    } else if (result.key) {\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"storage\").p(\"subscription\").p(\"key\").record(result.key)],\n        \"Set subscription free user key\"\n      );\n    }\n  } catch (error) {\n    console.error(error);\n    throw error;\n  }\n}\n\ninterface IIapSubscribeArgs {\n  applePromo?: IApplePromotionalOffer;\n  googlePromo?: IGooglePromotionalOffer;\n}\n\nfunction buildSubscribeThunk(loadingKey: keyof ISubscriptionLoading, sku: string, args?: IIapSubscribeArgs): IThunk {\n  return async (dispatch, getState, env) => {\n    IapHelpers_setLoading(dispatch, getState, { [loadingKey]: true } as ISubscriptionLoading);\n    if (env.iap) {\n      const owned = await env.iap.getAvailablePurchases();\n      if (owned.length > 0) {\n        IapHelpers_alertAlreadySubscribed();\n        IapHelpers_clearLoading(dispatch);\n        return;\n      }\n      try {\n        await env.iap.requestSubscription({\n          sku,\n          applePromo: IapHelpers_applePromoToAdapter(args?.applePromo),\n          googleOfferId: args?.googlePromo?.offerId,\n        });\n      } catch (e) {\n        IapHelpers_clearLoading(dispatch);\n        console.warn(\"IAP requestSubscription failed\", e);\n      }\n    }\n  };\n}\n\nexport function Thunk_subscribeMonthly(args?: IIapSubscribeArgs): IThunk {\n  return buildSubscribeThunk(\"monthly\", IapHelpers_getSkus().monthly, args);\n}\n\nexport function Thunk_subscribeYearly(args?: IIapSubscribeArgs): IThunk {\n  return buildSubscribeThunk(\"yearly\", IapHelpers_getSkus().yearly, args);\n}\n\nexport function Thunk_buyLifetime(): IThunk {\n  return async (dispatch, getState, env) => {\n    IapHelpers_setLoading(dispatch, getState, { lifetime: true });\n    if (env.iap) {\n      const owned = await env.iap.getAvailablePurchases();\n      if (owned.length > 0) {\n        IapHelpers_alertAlreadySubscribed();\n        IapHelpers_clearLoading(dispatch);\n        return;\n      }\n      try {\n        await env.iap.requestInAppProduct({ sku: IapHelpers_getSkus().lifetime });\n      } catch (e) {\n        IapHelpers_clearLoading(dispatch);\n        console.warn(\"IAP requestInAppProduct failed\", e);\n      }\n    }\n  };\n}\n\nexport function Thunk_restorePurchases(args?: { interactive?: boolean }): IThunk {\n  return async (dispatch, _getState, env) => {\n    const interactive = args?.interactive ?? false;\n    if (env.iap) {\n      try {\n        const purchases = await env.iap.getAvailablePurchases();\n        if (purchases.length === 0) {\n          if (interactive) {\n            Dialog_alert(\"No active purchases to restore.\");\n          }\n          return;\n        }\n        if (Platform.OS === \"ios\") {\n          const receipt = await IapHelpers_readReceiptOrJwsIOS(env.iap, purchases[0]);\n          if (receipt) {\n            dispatch(Thunk_setAppleReceipt(receipt));\n          }\n        } else {\n          for (const purchase of purchases) {\n            if (purchase.purchaseToken && purchase.productId) {\n              dispatch(Thunk_setGooglePurchaseToken(purchase.productId, purchase.purchaseToken));\n            }\n          }\n        }\n      } catch (e) {\n        console.warn(\"IAP restorePurchases failed\", e);\n        if (interactive) {\n          Dialog_alert(\"Couldn't restore purchases. Please try again later.\");\n        }\n      }\n    }\n  };\n}\n\nexport function Thunk_iapHandlePurchase(purchase: IIapPurchase): IThunk {\n  return async (dispatch, _getState, env) => {\n    if (!env.iap) {\n      return;\n    }\n    try {\n      const keepScreen = { keepSubscriptionScreenOpen: !!purchase.renewsAsProductId };\n      if (Platform.OS === \"ios\") {\n        const receipt = await IapHelpers_readReceiptOrJwsIOS(env.iap, purchase);\n        if (receipt) {\n          dispatch(Thunk_setAppleReceipt(receipt, keepScreen));\n        } else {\n          console.warn(\"IAP: no receipt obtained for purchase, server will not be notified\");\n        }\n      } else {\n        if (purchase.purchaseToken && purchase.productId) {\n          dispatch(Thunk_setGooglePurchaseToken(purchase.productId, purchase.purchaseToken, keepScreen));\n        }\n      }\n      // A queued plan switch re-delivers the existing transaction (renewsAsProductId set); it's not a\n      // new purchase, so don't double-count it as one.\n      if (!purchase.renewsAsProductId) {\n        let price = purchase.price;\n        let currency = purchase.currency;\n        if (price == null) {\n          // Re-deliveries (background renewals, killed-app replays, restores) arrive before the\n          // paywall fetched prices, so resolve the product price now to avoid reporting af_revenue: 0.\n          // A transient store-lookup failure here must not skip the purchase event entirely - fall\n          // back to whatever the purchase already carried and still track.\n          try {\n            const resolved = await env.iap.getProductPrice(purchase.productId);\n            price = resolved.price ?? price;\n            currency = resolved.currency ?? currency;\n          } catch (e) {\n            console.warn(\"IAP getProductPrice failed\", e);\n          }\n        }\n        Analytics_trackPurchase({\n          productId: purchase.productId,\n          price: price ?? 0,\n          currency: currency || \"USD\",\n          transactionId: purchase.transactionId ?? purchase.id,\n          transactionDate: purchase.transactionDate,\n        });\n      }\n    } finally {\n      try {\n        await env.iap.finishTransaction(purchase);\n      } catch (e) {\n        console.warn(\"IAP finishTransaction failed\", e);\n      }\n      IapHelpers_clearLoading(dispatch);\n      // Refresh so a plan switch (or its cancellation) reflects in subscriptionStatus.pendingProductId\n      // right away, instead of only after the screen re-mounts.\n      dispatch(Thunk_iapRefreshActiveSubscriptions());\n    }\n  };\n}\n\nexport function Thunk_iapHandlePurchaseError(error: IIapPurchaseError): IThunk {\n  return async (dispatch) => {\n    console.warn(\"IAP purchase error\", error);\n    dispatch(\n      Thunk_postevent(\"iap-purchase-error\", {\n        code: error.code,\n        message: error.message,\n        ...(error.productId ? { productId: error.productId } : {}),\n      })\n    );\n    IapHelpers_clearLoading(dispatch);\n  };\n}\n\n// Android's Google Play billing sheet (especially for in-app products) doesn't reliably emit a\n// purchaseError event when the user dismisses it without buying, so the plan-card spinner would\n// otherwise hang until the safety timeout. A real purchase clears its own loading via\n// Thunk_iapHandlePurchase, so by the time the app has been back in the foreground for a moment any\n// still-set loading means the sheet was dismissed.\nexport function Thunk_iapClearStuckLoadingOnForeground(): IThunk {\n  return async (dispatch, getState) => {\n    if (Platform.OS !== \"android\") {\n      return;\n    }\n    if (getState().subscriptionLoading != null) {\n      IapHelpers_clearLoading(dispatch);\n    }\n  };\n}\n\nexport function Thunk_redeemCouponIOS(): IThunk {\n  return async (_dispatch, _getState, env) => {\n    if (!env.iap) {\n      return;\n    }\n    try {\n      await env.iap.presentCodeRedemptionSheetIOS();\n    } catch (e) {\n      console.warn(\"IAP presentCodeRedemptionSheetIOS failed\", e);\n    }\n  };\n}\n\nexport function Thunk_iapFetchProducts(): IThunk {\n  return async (dispatch, getState, env) => {\n    if (!env.iap) {\n      return;\n    }\n    try {\n      const skus = IapHelpers_getSkus();\n      const subs = await env.iap.fetchSubscriptions([skus.monthly, skus.yearly]);\n      const inApp = await env.iap.fetchInAppProducts([skus.lifetime]);\n      const newPrices: Record<string, string> = {};\n      const newOffers: Record<string, IOfferData[]> = {};\n      for (const sub of subs) {\n        newPrices[sub.id] = sub.displayPrice;\n        const mapped: IOfferData[] = sub.subscriptionOffers\n          .filter((o) => !!o.id)\n          .map((o) => ({ offerId: o.id, formattedPrice: o.displayPrice }));\n        if (mapped.length > 0) {\n          newOffers[sub.id] = mapped;\n        }\n      }\n      for (const product of inApp) {\n        newPrices[product.id] = product.displayPrice;\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .p(\"prices\")\n            .recordModify((v) => ({ ...(v ?? {}), ...newPrices })),\n          lb<IState>()\n            .p(\"offers\")\n            .recordModify((v) => ({ ...(v ?? {}), ...newOffers })),\n        ],\n        \"Update prices for products\"\n      );\n      // Persist localized prices to synced storage so the web paywall can show them. Guard on change\n      // so an unchanged fetch on every app open doesn't bump the storage version and trigger a sync.\n      const storedPrices = getState().storage.subscriptionPrices ?? {};\n      const changed = ObjectUtils_keys(newPrices).some((k) => newPrices[k] !== storedPrices[k]);\n      if (changed) {\n        updateState(\n          dispatch,\n          [\n            lb<IState>()\n              .p(\"storage\")\n              .p(\"subscriptionPrices\")\n              .recordModify((v) => ({ ...(v ?? {}), ...newPrices })),\n          ],\n          \"Save subscription prices to storage\"\n        );\n      }\n    } catch (e) {\n      console.warn(\"IAP fetchProducts failed\", e);\n    }\n  };\n}\n\n// How long the optimistic Android plan-switch hint survives before deferring to the server. Generous\n// enough to cover Google's deferred RTDN propagation; the hint also clears as soon as the server reports.\nconst SUBSCRIPTION_PENDING_HINT_MS = 1 * 60 * 1000;\n\nexport function Thunk_iapRefreshActiveSubscriptions(): IThunk {\n  return async (dispatch, getState, env) => {\n    if (!env.iap) {\n      return;\n    }\n    updateState(\n      dispatch,\n      [lb<IState>().p(\"subscriptionStatusLoading\").record(true)],\n      \"Start subscription status loading\"\n    );\n    try {\n      const [subs, owned] = await Promise.all([env.iap.getActiveSubscriptions(), env.iap.getAvailablePurchases()]);\n      const lifetimeSku = IapHelpers_getSkus().lifetime;\n      const ownedLifetime = owned.some((p) => p.productId === lifetimeSku);\n      let patchedSubs = subs;\n      let serverPending: string | undefined;\n      // Android exposes neither the subscription expiry nor a queued plan switch client-side, so fill\n      // both from the server's verified subscriptionsv2 record (iOS already has them from StoreKit).\n      // `pendingProduct` comes from Google's `deferredItemReplacement` and is authoritative: when the\n      // switch is cancelled in Play or has landed, the server drops it and the pending card clears.\n      if (Platform.OS === \"android\" && subs.some((s) => s.isActive)) {\n        try {\n          // Re-verify the live purchase token to get the server's freshly-derived status (incl. a queued\n          // `deferredItemReplacement` plan switch), so it surfaces immediately instead of waiting on Google's\n          // laggy SUBSCRIPTION_DEFERRED RTDN. Authorized by the purchase token, not a userId lookup.\n          const state = getState();\n          const userId = state.user?.id || state.storage.tempUserId;\n          const activeStoreSub = subs.find((s) => s.isActive && !!s.purchaseTokenAndroid);\n          if (activeStoreSub?.purchaseTokenAndroid) {\n            const purchaseToken = JSON.stringify({\n              productId: activeStoreSub.productId,\n              token: activeStoreSub.purchaseTokenAndroid,\n            });\n            const sub = await env.service.refreshGoogleSubscription(userId, purchaseToken);\n            if (sub) {\n              serverPending = sub.pendingProduct;\n              patchedSubs = subs.map((s) =>\n                s.isActive ? { ...s, expirationDate: s.expirationDate ?? sub.expires } : s\n              );\n            }\n          }\n        } catch (e) {\n          console.warn(\"IAP refreshGoogleSubscription failed\", e);\n        }\n      }\n      // The server's pendingProduct is authoritative once present; until Google's deferred RTDN lands,\n      // a fresh non-expired optimistic hint bridges the gap. Drop the hint when the server takes over,\n      // it expires, or the switch has landed (active product already equals the hint).\n      const hint = getState().subscriptionPendingHint;\n      const hintValid =\n        hint != null &&\n        Date.now() < hint.until &&\n        !patchedSubs.some((s) => s.isActive && s.productId === hint.productId);\n      const keepHint = hintValid && serverPending == null;\n      const effectivePending = serverPending ?? (hintValid ? hint?.productId : undefined);\n      if (effectivePending != null) {\n        patchedSubs = patchedSubs.map((s) => (s.isActive ? { ...s, pendingProductId: effectivePending } : s));\n      }\n      updateState(\n        dispatch,\n        [\n          lb<IState>().p(\"subscriptionStatus\").record(patchedSubs),\n          lb<IState>().p(\"ownedLifetime\").record(ownedLifetime),\n          ...(keepHint ? [] : [lb<IState>().p(\"subscriptionPendingHint\").record(undefined)]),\n        ],\n        \"Update active subscriptions\"\n      );\n    } catch (e) {\n      console.warn(\"IAP getActiveSubscriptions failed\", e);\n    } finally {\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"subscriptionStatusLoading\").record(undefined)],\n        \"Stop subscription status loading\"\n      );\n    }\n  };\n}\n\nexport function Thunk_switchSubscription(target: \"monthly\" | \"yearly\"): IThunk {\n  return async (dispatch, getState, env) => {\n    const sku = target === \"monthly\" ? IapHelpers_getSkus().monthly : IapHelpers_getSkus().yearly;\n    IapHelpers_setLoading(dispatch, getState, { [target]: true } as ISubscriptionLoading);\n    if (!env.iap) {\n      IapHelpers_clearLoading(dispatch);\n      return;\n    }\n    try {\n      if (Platform.OS === \"ios\") {\n        // StoreKit applies the subscription group's upgrade/downgrade rules automatically,\n        // so a switch is just a normal purchase of the target sku. Deliberately skips the\n        // already-subscribed guard that the initial-purchase thunks use.\n        await env.iap.requestSubscription({ sku });\n      } else {\n        let active = getState().subscriptionStatus ?? [];\n        if (active.length === 0) {\n          active = await env.iap.getActiveSubscriptions();\n        }\n        const current = active.find((s) => s.isActive && !!s.purchaseTokenAndroid);\n        if (!current?.purchaseTokenAndroid) {\n          IapHelpers_clearLoading(dispatch);\n          Dialog_alert(\"Couldn't find your active subscription to switch. Please try again.\");\n          return;\n        }\n        // monthly→yearly defers to the next billing cycle (short wait, no wasted paid time);\n        // yearly→monthly prorates immediately (a year is too long to wait).\n        const isDeferred = target === \"yearly\";\n        await env.iap.requestSubscription({\n          sku,\n          androidOldPurchaseToken: current.purchaseTokenAndroid,\n          androidOldProductId: current.productId,\n          androidReplacementMode: isDeferred ? \"deferred\" : \"with-time-proration\",\n        });\n        // Android plan changes don't reliably emit a purchase event, so clear the spinner here. The\n        // pending \"Switching to…\" state is read authoritatively from the server (subscriptionsv2\n        // `deferredItemReplacement`) on refresh, but that lags behind Google's deferred RTDN — so set a\n        // short-lived, non-synced optimistic hint to show the card immediately. The refresh reconciles it\n        // against the server and drops it once the server is authoritative (or after it expires).\n        if (isDeferred) {\n          updateState(\n            dispatch,\n            [\n              lb<IState>()\n                .p(\"subscriptionPendingHint\")\n                .record({ productId: sku, until: Date.now() + SUBSCRIPTION_PENDING_HINT_MS }),\n            ],\n            \"Optimistic pending subscription switch\"\n          );\n        }\n        IapHelpers_clearLoading(dispatch);\n        dispatch(Thunk_iapRefreshActiveSubscriptions());\n      }\n    } catch (e) {\n      IapHelpers_clearLoading(dispatch);\n      console.warn(\"IAP switchSubscription failed\", e);\n    }\n  };\n}\n\nexport function Thunk_openManageSubscriptions(): IThunk {\n  return async (_dispatch, _getState, env) => {\n    if (!env.iap) {\n      Dialog_alert(`Manage your subscription from your ${StoreRuntime_storeName()} account settings.`);\n      return;\n    }\n    try {\n      await env.iap.openManageSubscriptions();\n    } catch (e) {\n      console.warn(\"IAP openManageSubscriptions failed\", e);\n    }\n  };\n}\n","import { LensBuilder, ILensRecordingPayload } from \"lens-shmens\";\nimport { IEnv, IState } from \"../models/state\";\nimport { ILensDispatch } from \"../utils/useLensReducer\";\nimport { IAction } from \"./reducer\";\n\nexport function buildCustomDispatch<T, O = never>(\n  originalDispatch: IDispatch,\n  builder: LensBuilder<IState, T, {}, O>\n): ILensDispatch<T> {\n  return (lensRecording: ILensRecordingPayload<T>[] | ILensRecordingPayload<T>, desc: string) => {\n    const recordings = (Array.isArray(lensRecording) ? lensRecording : [lensRecording]).map((recording) => {\n      return recording.prepend(builder);\n    });\n    originalDispatch({ type: \"UpdateState\", lensRecording: recordings, desc });\n  };\n}\n\nexport function buildCustomLensDispatch<T, U, O = never>(\n  originalDispatch: ILensDispatch<T>,\n  builder: LensBuilder<T, U, {}, O>\n): ILensDispatch<U> {\n  return (lensRecording: ILensRecordingPayload<U>[] | ILensRecordingPayload<U>, desc: string) => {\n    const recordings = (Array.isArray(lensRecording) ? lensRecording : [lensRecording]).map((recording) => {\n      return recording.prepend(builder);\n    });\n    originalDispatch(recordings, desc);\n  };\n}\n\nexport type IGThunk<TState, TAction, TEnv> = (\n  dispatch: IGDispatch<TState, TAction, TEnv>,\n  getState: () => TState,\n  env: TEnv\n) => Promise<void>;\nexport type IGDispatch<TState, TAction, TEnv> = (\n  action: TAction | IGThunk<TState, TAction, TEnv>\n) => Promise<void> | void;\nexport type IReducerOnIGAction<TState, TAction, TEnv> = (\n  dispatch: IGDispatch<TState, TAction, TEnv>,\n  action: TAction | IGThunk<TState, TAction, TEnv>,\n  oldState: TState,\n  newState: TState\n) => void | Promise<void>;\n\nexport type IDispatch = IGDispatch<IState, IAction, IEnv>;\nexport type IThunk = IGThunk<IState, IAction, IEnv>;\nexport type IReducerOnAction = IReducerOnIGAction<IState, IAction, IEnv>;\n","// Auto-generated from ./CHANGELOG.md\n// Do not edit manually - run npm run build:markdown to update\n\nexport const content = `<!--\n  This file is the source of truth for the in-app \"What's new?\" modal.\n  It is bundled into the JS at build time by scripts/build-markdown.js.\n\n  Format: each entry is a YAML-frontmatter block delimited by ---.\n  Required keys: date (YYYY-MM-DD), title.\n  Body is markdown. Each paragraph in the body becomes a paragraph in the modal.\n  Use bullet lists (- ...) only when you want bullets to render as actual bullets.\n\n  Custom inline directives:\n    ::icon-discord::, ::icon-doc::, ::icon-swap::, ::icon-help::, ::icon-edit2::, ::icon-preview::\n    Editor mode buttons: ::icon-reorder:: (grid), ::icon-ui-mode:: (per-day UI),\n      ::icon-day-text-mode:: (per-day text), ::icon-full-text-mode:: (full text)\n    [label](internal:/path)        — internal app/website link\n    \\`\\`\\`liftoscript ... \\`\\`\\`          — Liftoscript code block with syntax highlighting\n-->\n\n---\ndate: 2026-10-03\ntitle: Redesigned the web editor\n---\n\nNow the [Web Editor's UI](https://www.liftosaur.com/planner) is matching the UI of the Program tab in the app. It now also got the new \"Reorder\" tab, where\nyou can edit the program structure by dragging things around. Also you don't need to do \"Apply\" from the full mode like before, anything you change in the Full Text automatically gets applied across other tabs as well, so you can switch between tabs freely.\n\nBut for the rest of it - it's the same functionality, just moved things around a bit.\n\n---\ndate: 2026-09-29\ntitle: Show heart rate on the workout screen\n---\n\nOn iOS, it now shows the heart rate (if available) on the workout screen. It takes it from the Apple Watch - if you have them. Alternatively, it can also get the heart rate from AirPods 3 Pro as well.\n\n---\ndate: 2026-09-22\ntitle: Redesign of the workout screen\n---\n\nRedesigned the workout screen. Main goal was to declutter it, make it easier to use with shaking hands after heavy weight, and also ability to see things in distance (e.g. when your phone is laying down on a bench).\n\nSo, did the following changes. For the next set:\n\n* The next set is **expanded** now, gets a large reps/weight fields, plates, and large checkmark button.\n* It also shows the best/last/same day reps/weights underneath.\n* Swiping of a set is gone, there's ::icon-edit2:: icon to edit/delete it now\n* You can expand / collapse sets by tapping on them\n\nAlso:\n\n* Workout/exercise notes are toggleable now, in the kebab or cog menus\n* Delete, help, etc also moved to the kebab menu\n* You reorder exercises now by long-tapping and dragging them\n* AMRAP modal got bigger inputs and buttons\n\nAnd there're also some other minor tweaks here and there.\n\n---\ndate: 2026-09-19\ntitle: Realtime sync on the phone\n---\n\nNow if you update your workouts or programs or anything outside of the app - e.g. via Claude/ChatGPT, via API, from Web Editor, etc - the phone will get the updates in real time. No need to close/open the app anymore.\n\n---\ndate: 2026-09-17\ntitle: Editable preview in bottom sheet Liftoscript editor\n---\n\nThere's a preview icon ::icon-preview:: in the bottom sheet Liftoscript editor on the right of the pills.\nIt shows how the exercise liftoscript looks with all resolved reuses. E.g. if it shows:\n\n\\`\\`\\`liftoscript\nSquat / ...t1\n\\`\\`\\`\nand t1 is defined like\n\n\\`\\`\\`liftoscript\nt1 / used: none / 3x8 100lb\n\\`\\`\\`\n\nit will show\n\n\\`\\`\\`liftoscript\nSquat / 3x8 100lb\n\\`\\`\\`\n\nNow that preview is editable. You can tap e.g. on that \\`100lb\\` in \\`t1\\` and change it to e.g. \\`105lb\\`, and the\noriginal exercise text will have that override - becomes:\n\n\\`\\`\\`liftoscript\nSquat / ...t1 / 105lb\n\\`\\`\\`\n\nIt's useful when you need to tweak some values of the reusing exercise, but they only exist in the reused exercise.\n\n---\ndate: 2026-09-09\ntitle: Time-based exercises: Countdown and unilateral exercises support\n---\n\nThere's now a countdown timer for the time-based exercises. It starts when you approach the end of rest time.\nYou can set it in **Me -> Timers**.\n\nAlso, now the unilateral exercises will present 2 set timers one after another - for the left, and the for right side. With the countdown in-between as well.\n\nCountdown is extracted from the rest time:\n* With \\`30s|60s\\`, and countdown == 5s, your rest time would be \\`55s\\`, and then \\`5s\\` countdown would start. If you want to disable countdown completely on specific exercise.\n* With \\`30s|0s\\` there will be no countdown (and if it's unilateral - no countdown between sides)\n\n---\ndate: 2026-09-01\ntitle: Autocompletion suggestions in freeform mode in Liftoscript editor\n---\n\nNow if in the freeform mode in Liftoscript editor you have autocompletion. It'll suggest the exercise names,\nvariable names in \\`progress\\`/\\`update\\` blocks, the template names when you add reusing, etc etc.\n\n---\ndate: 2026-08-28\ntitle: New grid view for structuring the program\n---\n\nHuge change on the Program screen - the previous ::icon-reorder:: that let you reorder weeks now is waaay more powerful.\n\nNow, that mode shows a calendar-like view grid view of your program. If your exercises span multiple weeks with repeat ranges, you'll see them as a single strip crossing multiple weeks. You can drag the end of that strip to extend it to more weeks - and it'll adjust the repeat ranges.\n\nWhen you select an exercise, it now highlights the template it reuses.\n\nEverything is draggable there, you can long-tap and then drag exercises to reorder within the same day, and across days.\nYou can also drag weeks to reorder them. When you select a day and drag - it drags across all weeks though - because the program layout is usually the same across all weeks, and dragging a single day in a multiweek program likely would break the program.\n\nYou can pinch-zoom the grid to scale the weeks. All that stuff hopefully gives you a good birds-eye view of your entire program (especially useful if it's multiweek), and you can easily restructure across all of the weeks.\n\nYou can also add multiple exercises from the same picker now there.\n\nI'm thinking to eventually remove per-day mode as well (the ::icon-ui-mode:: mode), that new view should do pretty much all the same things. But let me know what you think!\n\nAnd yeah, it was a massive and very complex change, so let me know if you find any bugs or issues - in Discord, Reddit, or by emailing to **info@liftosaur.com**.\n\n---\ndate: 2026-08-17\ntitle: Some Liftoeditor improvements\n---\n\n1. If you tap ::icon-edit2:: icon on the workout screen, it now opens the liftoeditor in a bottomsheet with the current program day, that you can edit.\n\n2. You can reorder exercises in the editor by long-press and dragging them.\n\n3. On the \"Edit Program Exercise\" sheet, there's ::icon-preview:: icon that shows the preview of the exercise with all the reuses filled in.\n\n4. On the \"Edit Program Exercise\" it also will tell you if the progress is defined on some other week/day, and you jump there, or show it right for this week/day, editable.\n\n---\ndate: 2026-08-12\ntitle: Improvements in exercise swapping during workout\n---\n\nWhen you swap an exercise during a workout, it now remembers the last exercises you swapped, and offers them in a \"Recent\" section at the top of the exercise picker. That should make doing repeated swaps faster.\n\nAlso, it used to keep the same weight when you swap to an adhoc exercise. Which only makes sense if you used 1RM percentage weights. But for absolute weights it almost never makes sense.\n\nSo, now it'll try to adjust the weight. It'll try to find the latest weights you did for the same reps in history, and use that weight. If it couldn't - it'll try to find the closest and infer from it. If it couldn't - it'll infer the weights from 1RM.\n\nAnd for warmups - it'll check if you have specific warmup config in your current program for that exercise, and will use that if it's there. Otherwise - just fallback to the default warmups.\n\n---\ndate: 2026-08-11\ntitle: Swapping an exercise now adjusts the weights to match\n---\n\nWhen you swapped an exercise mid-workout, only the exercise changed - the weights stayed exactly as they were. That's fine if your program uses percentages of 1RM, but if it uses absolute weights, you'd swap Leg Press for a Lateral Raise and end up staring at a 500lb lateral raise.\n\nNow the weights come along with the swap. For each set, the app looks at your history for the exercise you're swapping **to**, finds the set closest in reps to what you're about to do, and converts that weight to your target reps and RPE. If the reps and RPE match, you just get the weight you actually lifted last time. Sets with different reps each get their own weight, so a 12/10/8 pyramid comes back as a pyramid.\n\nIf you've never done the new exercise before, it falls back to your 1RM for it, or the exercise's default starting weight if you haven't set one - which is what percentage-based sets have always done on a swap. Either way, correcting it once is enough: your correction becomes history, so the next swap picks it up.\n\nWarmups get rebuilt for the new exercise too - from the warmups your program defines for it if it has any, and from that exercise's defaults otherwise.\n\n---\ndate: 2026-08-10\ntitle: Text size now scales the whole app, and follows your device setting\n---\n\nWhen you had the Aa (for font-size) slider moved to the right, and also increased font-size in your device settings,\nit used to multiply the values, completely breaking the app layout (because the font size became huuuge).\n\nFixed that, now the font size slider is the only thing that controls the app's text size. It also uses the device's font size as the starting point, so if you have a larger system font, the app will start out larger too.\n\nAlso the icons, exercise thumbnails, etc also scale with the text now. Everything scales together!\n\n---\ndate: 2026-08-09\ntitle: Embrace Liftoscript, part 1: Redesign of the \"Edit Program Exercise\" screen\n---\n\nOne of the main sources of confusion and frustration in Liftosaur are the \"Program\" and \"Edit Program Exercise\" screens. They provide the UI to edit the program, but the problem is that the UI maps pretty poorly to Liftoscript.\nAnd Liftoscript is still source of truth. Also, when you edit UI - you have little idea what Liftoscript it'd result to. Users get weird errors they have no idea how to resolve - because errors come from Liftoscript syntax, not UI.\n\nHistorically, I tried to hide the complexity of Liftoscript, trying to lower the learning curve. But IMHO it doesn't work - I just need to be honest and upfront that knowing at least some Liftoscript basics is required to use Liftosaur effectively. So, I'm pivoting to the new approach - embracing Liftoscript!\n\nAs a first step - now \"Edit Program Exercise\" is not a screen anymore, it's a bottom sheet, where you can edit Liftoscript. For that, I created a new native code editor from ground up. Typing code generally is not convenient on a phone, so it solves that by having 'structured' editing mode, where you can tap values, elements, and use the action pills to do actions with them. So, kinda a mix of UI and code. You can swipe between elements, and you can double-tap on text to switch to freeform editing. Each element also shows a hint what it means, so hopefully it helps to learn Liftoscript basics easier.\n\nFor now, it's only \"Edit Program Exercise\" screen, but I will work on replacing all the editors in the app with this new native editor.\n\nI understand it's a quite controversial change, so please let me know your thoughts in Discord, r/liftosaur subreddit, or by email at **info@liftosaur.com**.\n\n---\ndate: 2026-07-19\ntitle: Added Sleep & Nutrition tracking\n---\n\nLiftosaur can now import your sleep duration, dietary calories, and protein from Apple Health or Google Health Connect. To turn it on, go to the Me screen, then scroll to \"Apple Health\" (or \"Google Health Connect\" on Android), and there enable \"Sync Sleep & Nutrition\".\n\nThere's a new \"Sleep & Nutrition\" screen you can enter from the Me tab, with a trend graph and history for each metric. The import is read-only and happens on app open, daily aggregated. You can also soft-delete (hide) it from the list, and unhide if necessary.\n\nThe data also syncs to your account like the rest of your measurements, so it's available through the [REST API](internal:/docs/api) and the [MCP server](internal:/docs/mcp) as a new \\`health\\` measurements category. So you can e.g. ask an AI assistant to correlate your sleep or protein intake with your training performance.\n\nYou need an iOS/Android native app update (from App Store / Google Play) to get this feature.\n\n---\ndate: 2026-07-17\ntitle: Tap a crossed-out weight to see why it was rounded\n---\n\nWhen a set's target shows a crossed-out weight next to another one - that's the app rounding the program's exact weight to what you can actually load with your equipment. It's been a common source of confusion: why is my working weight different from the target? Why is it suddenly 0?\n\nNow the rounded weight is underlined, and you can tap it to get the full explanation: how the target was calculated (e.g. as a percentage of your 1RM), how it was converted between kg and lb, and how it was matched to your equipment - the bar weight, the plates per side, or the closest fixed dumbbell.\n\nIf the equipment is marked as \"Is Assisting\" (like an assisted pull-up machine, where added weight makes the exercise easier), the explanation will call that out too - accidentally enabling it is the usual reason weights unexpectedly drop to 0.\n\nHopefully that'll help to understand why it crosses out the weights!\n\n---\ndate: 2026-07-13\ntitle: More accurate volume for two-dumbbell exercises\n---\n\nVolume and total weight now count both dumbbells for exercises you load with a pair - like dumbbell shoulder press, bench press, rows, lunges, and split squats. The weight you enter for these is per-dumbbell, so previously we only counted one and undercounted the volume by half. Now it's doubled to reflect the real load moved.\n\nThis changes how numbers look in your volume graphs - your dumbbell volume will double compared to before. So, it's somewhat a breaking change.\n\nIf a particular exercise doesn't fit (say you do a single-dumbbell variation), you can turn this off per-exercise: go to Exercise Stats, and toggle \"Two weights (count both)\".\n\n---\ndate: 2026-07-10\ntitle: Added exercise variations (progression ladders)\n---\n\nA single program exercise can now hold multiple movements, and you can switch between them - either automatically as you progress, or by hand. Great for calisthenics progressions, where you graduate from an easier movement to a harder one once you can do enough reps.\n\nList the movements separated by \\`|\\` in the exercise name. The current one is marked with \\`!\\` (the first is current by default):\n\n\\`\\`\\`liftoscript\nSplit Squat | ! Bulgarian Split Squat | Pistol Squat / 3x8 0lb\n\\`\\`\\`\n\nTo advance automatically, use the new \\`exerciseVariationIndex\\` variable in a progress script - it moves to the next movement when your condition is met:\n\n\\`\\`\\`liftoscript\nSquat | Pistol Squat | Front Squat / 3x8 0lb / progress: custom() {~\n  if (completedReps >= reps) {\n    exerciseVariationIndex += 1\n  }\n~}\n\\`\\`\\`\n\nYou can also add, remove, reorder, and switch variations right from the Edit Program Exercise screen - enable \"Exercise Variations\" from the 3-dot menu. The sets, reps, and progress logic are shared across all movements; only the movement itself changes.\n\nNote that if you had a custom exercise with \\`|\\` or \\`!\\` in the name, it will be replaced to \\`-\\` character. If you program used \\`!\\` or \\`|\\` in the exercise names - you may need to tweak it, there's a migration that tries to fix it automatically, but it may miss some cases.\n\n---\ndate: 2026-07-01\ntitle: Added time-based exercises and intervals/circuits support\n---\n\nYou can now time the set itself, not just the rest after it. Great for planks, timed cardio, or any \"hold for X seconds\" exercise. Use the \\`setTimer|restTimer\\` syntax:\n\n\\`\\`\\`liftoscript\nPlank / 3x1 0lb 60s|30s\n\\`\\`\\`\n\nThat's 3 sets of plank, holding each for 60s, then resting 30s. Add \\`+\\` to count up past the target instead of stopping automatically (like \\`30s+|60s\\`). Add \\`auto\\` to auto-advance to the next set when the rest ends - which is how you build circuits like EMOM or Tabata:\n\n\\`\\`\\`liftoscript\n// EMOM - 5 rounds, 5 reps, 1-minute window\nPower Clean / 5x5 135lb 60s|0s auto\n// Tabata - 8 rounds of 20s work / 10s rest\nSquat, Bodyweight / 8x1+ 0lb 20s|10s auto\n\\`\\`\\`\n\nIn the UI (in the app, in Live Activity / Live Update, and in Apple Watch as well), you'll get a set timer modal if the current set has time.\n\nRead more in the [docs](internal:/docs/liftoscript). You need an iOS/Android native app update (from App Store / Google Play) to get this feature.\n\n---\ndate: 2026-06-17\ntitle: Added Apple Watch complications\n---\n\nTo get them - update the app from App Store\n\n---\ndate: 2026-06-15\ntitle: Added API / MCP for body measurements\n---\n\nNow you can manage your body measurements through the API and MCP server - bodyweight, bodyfat, and body parts (neck, chest, waist, biceps, thighs, and the rest).\n\nRead your full measurement history, record new values (with a custom date if you're backfilling), edit a value, or delete one - all from an AI assistant or directly over the REST API.\n\n---\ndate: 2026-06-14\ntitle: Added API / MCP for the equipment and exercise data\n---\n\nNow you can manage your gyms and equipment through API and MCP, as well as managing the exercise data:\n\n* 1RM value\n* Muscle overrides\n* Equipment assigned to exercises\n* Default rounding\n* Whether the exercise is unilateral\n* Exercise persistent notes\n\n---\ndate: 2026-06-13\ntitle: Added subscription management to the Account screen\n---\n\nIt was somewhat confusing that you couldn't see your current subscription status within the app, so I added it\nto the Account screen. So now you see what's your subscription status there, and can manage it from there as well.\n\n---\ndate: 2026-06-08\ntitle: Improved import history flow\n---\n\nImport history although a pretty rarely used feature - is one of the most dangerous. With slightly wrong CSV file,\nyou can massively mess up your workout history, and cleaning it up or restoring the account may be hard and painful.\n\nNow that functionality is way less destructive. When you import Liftosaur CSV or Hevy CSV, it'll show you\na preview screen, where it will display:\n\n* The workout history preview - the way you'd see it on the Home screen\n* Warnings - like if some weights or reps look suspicious, if there are duplicated workouts, if dates look wrong, etc\n* Summary stats - like how many workouts, exercises, sets, etc would be imported\n* The list of custom exercises that would be created by the import\n\nAnd after your import it - there's still a way to \"undo\" the import - you can go to Me -> Recent Imports, and there you'll see the list of 5 last imports, with the option to undo each of them. Undoing the import would remove all workouts that were imported in that import, as well as custom exercises that were created in that import (unless they already used in other workouts or programs).\n\n---\ndate: 2026-05-31\ntitle: New native iOS and Android apps\n---\n\nBefore, the iOS and Android Liftosaur apps were webapps. Basically, a site, that is rendered inside a little browser window, wrapped as a native app. It worked fine, but didn't have that native feeling, screen navigations, gestures, native-looking modals, etc.\n\nFrom now on, the new versions of the apps on App Store and Google Play are native apps. They look the same, but have smoother animations, native navigation and modals. Update and check them out!\n\nThat was a massive ground-up rewrite of Liftosaur, so in case you find any bugs - please let me know in Discord or at **info@liftosaur.com**!\n\n---\ndate: 2026-05-02\ntitle: Huge update where nothing changed\n---\n\nIn preparation for migrating the app from a webapp (like it is right now) to a native app, I had to do a massive rewrite of the whole codebase. But the functionality stays the same. The only difference is graphs look slightly different (had to rewrite the graphs engine from the scratch).\n\nSo, in case you find any new bugs after this - please let me know in Discord or at **info@liftosaur.com**. Thanks!\n\n---\ndate: 2026-03-16\ntitle: Added \"tour\" modals\n---\n\nIf you're a new user (did less than 4 workouts), you'll see a \"tour\" modal on key screens in the app - **workout screen**, **program editor**, and **program exercise editor**. It walks you through the key features of each screen, so you don't miss out on anything important. You can also access those tours anytime by tapping the ::icon-help:: in the top right corner of those screens.\n\n---\ndate: 2026-03-08\ntitle: MCP Server and REST API\n---\n\nLiftosaur now has an [MCP server](internal:/docs/mcp) - connect AI assistants like Claude, ChatGPT, or Gemini to manage your programs and workout history through natural conversation. Ask the AI to create programs, tweak progressions, log workouts, or analyze your training - it knows Liftoscript and can do it all for you.\n\nThere's also a [REST API](internal:/docs/api) - if you want direct programmatic access. Generate an API key in Settings and make HTTP requests to create programs, log workouts, simulate progressions, pull stats, etc.\n\nBoth require a premium subscription.\n\n---\ndate: 2026-03-03\ntitle: Export workouts as text\n---\n\nYou can now copy your workout as a compact text format. After finishing a workout, tap the \"Text\" button on the finish screen, or open any past workout from history and use the share menu to copy as text.\n\nThe text format is human-readable and can be pasted into notes, messages, or social media.\n\n---\ndate: 2026-02-28\ntitle: Improved Double Progression (dp) to support rep ranges\n---\n\nDouble Progression now properly handles rep range exercises (like 3x8-12). It auto-detects whether your exercise uses ranges, and progressively narrows the range from below until you hit the top, then increases weight and resets.\n\nFor non-range exercises (like 3x8), it works as before — increasing reps from min to max, then bumping weight and resetting reps.\n\nIf you adjust weight during a workout (e.g. the programmed weight wasn't available), the next weight increase will now be based on the weight you actually used, not the originally programmed weight.\n\n---\ndate: 2026-02-22\ntitle: New /programs page on the liftosaur.com site\n---\n\nNot the app, but the site update. There's now the /programs page on the liftosaur.com site, where you can find all the programs available in the app, along with full description (pros/cons, program philosophy, how to run it, etc), preview, Liftoscript code, etc.\n\nIf you're currently figuring out the next program, it could be a great resource to check it out, compare different programs, and pick the one that suits you the best.\n\n---\ndate: 2026-02-08\ntitle: Exerciser Picker by default now hides exercises with hidden equipment\n---\n\nIf you hide some equipment in the \"Available Equipment\" screen, it used to not affect exercise picker, it still was showing e.g. cable, smith machine, etc exercises even though you disabled them in the \"Available Equipment\".\n\nSo from now on, those exercises are hidden. You still can make them show if you tap the checkmark in the filter section inside the exercise picker.\n\nAlso, sorting order (by Name, by Similar Muscles) persists between picker opens from now on.\n\n---\ndate: 2026-01-29\ntitle: ⌚ Add Apple Watch Support\n---\n\nIf you have Premium and iPhone, you can now use Liftosaur on your Apple Watch to track your workouts. You can complete sets, see rest timers, view upcoming exercises, etc. You cannot modify the workout though (like change exercises or add sets, or change targets), for that you'll need to grab your phone.\n\nMake sure to update the native iOS app to >= 6.31 to get the Watch app as well.\n\nThat was a huge and complex project, so definitely let me know if you notice any bugs or issues - in Discord, Reddit, or by [info@liftosaur.com](mailto:info@liftosaur.com)\n\n---\ndate: 2026-01-24\ntitle: Workout now syncs to Apple/Google health when you finish a workout\n---\n\nPreviously, the workout would sync to Apple or Google health when you tap \"Continue\" on the \"Congratulations\" screen. But some users never did that, exiting the app right after they finished a workout, so the workout never got synced to Apple/Google Health.\n\nSo, now the workout syncs to Apple/Google Health right when you finish a workout. You can toggle \"Ask for confirmation\" in the Health settings, if you want. Without it, it just will always submit the workout right away.\n\nYou can also submit past workouts to Apple/Google Health - if you open a past workout, and tap the share icon - there'll be an option to \"Sync to Apple/Google Health\".\n\n---\ndate: 2026-01-20\ntitle: The current ongoing workout now syncs to the server\n---\n\nPreviously, if you start a workout e.g. on a phone, and then open a webapp, you won't be able to see it there. The ongoing workout would only exist locally, and syncs to the server when you finish it.\n\nFrom now on, the ongoing workout also syncs to the server. So, you can start a workout on a phone, but continue in the webapp, and then switch back to phone.\n\n---\ndate: 2026-01-03\ntitle: Changes in progress - lp() and dp() behavior\n---\n\nIf you omit the weight in the program initially, like this:\n\n\\`\\`\\`liftoscript\nSquat / 3x8 / progress: lp(5lb)\n\\`\\`\\`\n\nthe **lp** and **dp** behave weird. They consider the program weight as 0lb, add 5lb to it, and the program weight becomes 5lb. But user may entered e.g. 100lb there for each set, and then they see 5lb as the weight next time, and got confused.\n\nTo address that, there're 2 breaking changes in lp/dp built-in progressions:\n\n- If the weight wasn't specified in the program, it'll set the completed weights to the program.\n- It will increment based on the completed weight, not the target weight in the program from now on.\n\n---\ndate: 2025-11-25\ntitle: Added Live Updates on Android\n---\n\nSimilarly to iOS, there's now Live Updates notification on the lock screen, with the timer, next exercise, set, reps, weights, plates, etc.\n\nYou can adjust the rest timer from there, or complete a set.\n\nThere's also rest timer in the little chip near the clock, which is shown if you're currently in another app.\n\nIt's a **Premium feature**, so you'd need to have Premium subscription to use it.\n\n---\ndate: 2025-11-23\ntitle: Added Live Activity / Dynamic Island on iOS\n---\n\nOn the lock screen, it'll show Live Activity, with the timer, next exercise, set, reps, weights, plates, etc.\n\nYou can adjust the rest timer from there, or complete a set.\n\nThere's also rest timer in the **dynamic island**, and if you long press it - it'll expand into the same info as in the live activity.\n\nIt's a **Premium feature**, so you'd need to have Premium subscription to use it.\n\n---\ndate: 2025-11-09\ntitle: Added unilateral exercise support\n---\n\nFor unilateral exercises (like one-arm dumbbell rows, bicep curls, bulgarian split squats, etc) you can now specify reps per side. It's enabled by default for built-in unilateral exercises, but you can override it on the Exercise Stats screen, via \"Is Unilateral\" checkbox.\n\nThe volume is calculated by summing up reps from both sides. The e1RM is calculated by taking the average from reps of both sides.\n\n---\ndate: 2025-11-03\ntitle: Added ability to customize muscle groups\n---\n\nIf you don't like the current split by muscle group, you can customize it now! Go to Me -> Muscle Groups, and you can hide built-in muscle groups, and create new ones.\n\nFor example, you may want to have Front/Side/Rear delts instead of just \"Shoulders\", or Upper/Lower Back instead of just \"Back\".\n\nYou can also customize it through the \"Planner Settings\" modal (where you set up set ranges for muscle groups), both inside of the app, and in the web editor.\n\n---\ndate: 2025-11-01\ntitle: Add supersets\n---\n\nNow you can add exercises to superset groups, and within that group it will switch between exercises each time you finish a workout set. E.g. if you have 3 exercises in a superset group, you'd do 1 set of the first exercise, it'll switch to the seocond exercise, you finish a set there, it'll switch to the third exercise, and then back to the first one again.\n\nYou can set those groups both in a program and in a workout. In a program, you can do it both in the text and UI. In the text, it looks like this:\n\n\\`\\`\\`liftoscript\nSquat / 3x8 / superset: A\nDeadlift / 3x8 / superset: A\nBent Over Row / 3x8 / superset: A\n\\`\\`\\`\n\nSo, you add **superset: GROUP_NAME** to each exercise you want to be in a superset group. GROUP_NAME could be any string, e.g. A, B, ChestDay1, etc.\n\nThere's a new timer setting for the rest timers within supersets - in Me -> Timers. It takes precedence over the default rest timer, but the per-set rest timers take precedence over both.\n\nThe supersets will be highlighted by a colored line on the bottom side of exercise thumbnails during workout, as well as within the exercise card.\n\n---\ndate: 2025-10-13\ntitle: Override target/synergist muscles of exercises with custom synergist multipliers\n---\n\nIf you disagree with the built-in target/synergist muscles of some exercise, you can now override them! Go to the Exercise Stats screen (e.g. from Me - Exercises), and tap on \"Override Muscles\" at the very top. You can choose the muscles and the multiplier there. If it's **1** - it's a target muscle, if less than 1 - it's a synergist muscle. This will be taken into account in the week insights, in the week volume stats on the Program screen, on the graphs, etc.\n\n---\ndate: 2025-10-01\ntitle: Added estimated 1 Rep Max column to the workout screen\n---\n\nIf you tap on the swap icon at the second column header (where the \"Target\" is) - the last variant would be the estimated 1 Rep Max for the set. Would be semi-transparent for non-completed set, and solid for completed set. It uses completed reps/weight/RPE for calculation, but if not available yet - uses target reps/weight/RPE.\n\n---\ndate: 2025-09-24\ntitle: 🏋️‍♂️ Improved custom exercises\n---\n\nAdded a bunch of changes to address most requests/feedback about the custom exercises:\n\n- People noted it's hard to add target/synergist muscles because you don't know on the top of your head what muscles exercise works, and from what muscle group each muscle is. So now:\n  1. Each muscle has a **little image**\n  2. They're **grouped by a muscle group**\n  3. There's **\"Autofill\"** button, that tries to prefill all the muscles/types based on the exercise name using AI.\n- Added ability to **add exercise notes** to the custom exercise form as well\n- You now can **upload an image** for a custom exercise from your phone (it requires being signed up though, to avoid abusing API for uploading images).\n- You also can pick an image from **\"Image library\"** for your custom exercise. The Image Library has images of built-in exercises, as well as previously uploaded ones.\n- You can **clone from existing** built-in (or existing custom) exercises, and it will prefill the image, the muscles and the types of the cloned exercise to your custom one.\n\nThere's one **breaking change** though - you won't be able to specify URLs of images anymore for custom exercises. It was a temporary hack (which survived for like 2 years!), and external images sometimes don't work if you generate workout or program images. It still will work for existing exercises, but you won't be able to change their image URLs anymore. You can only change the image there by uploading a new one, or picking from a library.\n\n---\ndate: 2025-09-14\ntitle: Exercise and equipment notes\n---\n\nYou can now add exercise and equipment notes.\n\nThose are not tied to a program, those are associated with exercises or equipment. You can use exercise notes to e.g. list form cues for a specific exercise, and the equipment notes to e.g. list tweaks of equipment, e.g. bench angle, cable setup, etc.\n\nSo, this way you have 3 note types in the app:\n\n- **Program exercise description** - the ones you add right in the program text via **// comment**. You can use them to add program-specific details for the exercise, e.g. progression explanation.\n- **Exercise notes** - those would be not tied to a program, but to an exercise. You can use them to add general notes for the exercise, e.g. form cues. You can edit them on the Exercise Stats screen.\n- **Equipment notes** - those would be tied to a specific equipment. You can use them to add details about the equipment, e.g. bench angle, cable setup, etc. You can edit them on the Available Equipment screen.\n\nAll of them would be displayed on the workout screen.\n\nAlso, from now on the previous workout exercise note only would be displayed for two months on the workout screen.\n\n---\ndate: 2025-09-05\ntitle: Preview tab on the Program screen now changes 1RM/Equipment/State vars\n---\n\nIt used to be ephemeral like Playground, but it's non obvious that it behaves that way. Also, seems like a lot of people go there after cloning a program, so this is the place where they'd expect to configure equipment and 1RMs.\n\nSo, now you can change 1RM and Equipment there, adjust state variables, and all those changes would be persisted.\n\nTapping on the name or exercise image also goes to the Exercise Stats screen.\n\n---\ndate: 2025-09-04\ntitle: Add new variables - 'amraps', 'logrpes' and 'askweights'\n---\n\nThey allow to mark a set AMRAP, ask for actual RPE after completing a set or ask for actual weight. Basically the same as adding **+** after appropriate value.\n\nYou can use them in exactly the same way you use **reps** or **weights**.\n\nTo disable, assign 0 to them, to enable - assign any non-zero value. E.g.:\n\n\\`\\`\\`liftoscript\nSquat / 3x8 100lb / progress: custom() {~\n  amraps = 1  // Mark all sets AMRAP\n  askweights[ns] = 1 // Ask for the last set actual weight\n~}\n\\`\\`\\`\n\n---\ndate: 2025-08-30\ntitle: Bar == Bodyweight and \"Assisted\" equipment\n---\n\nYou can now set the bar == your current bodyweight, and also switch the equipment to \"Assisted\" mode.\n\nIf the equipment is in the \"Assisted\" mode, the plates calculator will show the plates you need to add to reduce the weight, not to add to it.\n\nThis is mostly useful for e.g. assisted pull ups or dips. You can set the bar to your bodyweight, check \"Is Assisted\", and enter the plates you have for the leverage machine. It will round to the weight to bodyweight minus plates, so properly would show what you need to load on the machine.\n\n---\ndate: 2025-08-26\ntitle: 🌑 Dark Theme\n---\n\nNow there's Dark Theme! By default it uses your phone's current system theme (Dark or Light), but you can override it in Me - Appearance - Dark mode.\n\nMake sure to update iOS or Android native apps too, otherwise there'll be some parts that are not dark.\n\nLet me know if some colors look weird or contrast is bad - info@liftosaur.com, or our Discord or /r/liftosaur subreddit.\n\n---\ndate: 2025-08-13\ntitle: Hiding equipment, and changes in default exercise equipment\n---\n\nNow you can hide the built-in equipment you don't have / not going to use on the \"Available Equipment\" screen.\n\nAlso **POTENTIALLY BREAKING CHANGE** - if you never ever set the equipment for some exercises, it will be automatically set to matching equipment now. E.g. the exercise is **Bench Press, Barbell** - it will have **Barbell** equipment set by default - only if you never set it before (and it was **None**).\n\nDid that because there was a lot of confusion for new users - like why they set up Barbell equipment, but it's not applied to barbell exercises by default.\n\n---\ndate: 2025-08-10\ntitle: Redesign of the exercise picker\n---\n\nRedesigned the exercise picker. The biggest change is that now you can add/edit not only ad-hoc, but also **program exercises from the current program**, both used and unused. They'll be added with all their sets, and will run the progression logic on workout completion.\n\nSo, now you can define a bunch of unused exercises you may want to switch to (e.g. if some machines are often busy in your gym - you can define alternatives), and quickly add / replace them during the workout.\n\nThere's also ability to \"star\" exercises, so you can quickly find them in the future. There're redesigned filters, with images for each muscle and muscle group. **Substitute** tab is gone, and replaced by sorting by similar muscles (which is exactly the same) in the filters section.\n\nWhen you add exercises to a workout, you can pick multiple exercises now. And when you start an ad-hoc workout, the picker will be open automatically, so you can add exercises right away.\n\nHopefully the whole experience now makes more sense, and it's more logical - you can either add an ad-hoc exercise (and then you set up the sets yourself), or you add program exercise, and it behaves like you defined it in the program.\n\n---\ndate: 2025-07-06\ntitle: Improved syncing mechanism\n---\n\nRewrote the syncing mechanism to make it more reliable, and resolve conflicts better. Ideally you shouldn't notice any changes, and hopefully it'll prevent rare cases when the app doesn't data sync properly between the web editor, web app, and phone app.\n\nIt's a HUGE under the hood change, so if you notice any issues with syncing - please let me know at **info@liftosaur.com** or via Discord/Reddit.\n\n---\ndate: 2025-06-22\ntitle: Added bodyweight varaible\n---\n\nNow there's a **bodyweight** variable that would return the latest bodyweight moving average from **Measurements** screen. You can use it e.g. for pull ups or some other bodyweight exercises.\n\n\\`\\`\\`liftoscript\nPull Up / 3x8 0lb / update: custom() {~\n  if (setIndex == 0) {\n    weights = bodyweight\n  }\n~}\n\\`\\`\\`\n\n---\ndate: 2025-06-21\ntitle: Added increment() and decrement() functions\n---\n\nThey'll accept a weight, and return the previous/next possible weight based on your equipment. E.g. if you have 2x2.5lb smallest plates, **increment()** would increase the weight by 5lb. Or if you have 10lb and then 20lb fixed dumbbells, it would increment by 10lb. Use it like this:\n\n\\`\\`\\`liftoscript\nSquat / 3x8 100lb / progress: custom() {~\n  weights = increment(weights[1])\n~}\n\\`\\`\\`\n\nSame thing for **decrement()**. They work exactly the same way as the +/- buttons on the weight keyboard\n\n---\ndate: 2025-06-19\ntitle: AI prompt generator\n---\n\nTo help you write Liftoscript, there's now a page - [liftosaur.com/ai/prompt](internal:/ai/prompt) - that you could use to generate a prompt e.g. for ChatGPT, Claude, Gemini, etc that would help you to write your program in Liftoscript. It combines all the documentation and a bunch of examples into that huge prompt, and you can copy it, and paste into AI or your choice, and it'll generate a program for you.\n\nIt's not perfect, and sometimes makes mistakes - in that case just copy the errors back to AI chat, and it should be able to fix them.\n\nYou can also paste a URL to some web page, or even a google sheet into the input field on that page, and it will try to generate a program from there.\n\nCurrently works best with Claude, but should provide decent results with ChatGPT too.\n\nYou can access it through the website, tap on \"AI Helper\" at the nav bar.\n\n---\ndate: 2025-06-13\ntitle: Suppressing progress\n---\n\nNow you can suppress progress for an exercise, if you won't want it to run the progress logic and updates weights/reps/etc after finishing a workout.\n\nFor that, after finishing all sets of an exercise, tap \"Suppress\" link near the progress changes info.\n\nSuper optional, but sometimes you may want to do it.\n\n---\ndate: 2025-06-07\ntitle: Redesigned the \"Program\" screen\n---\n\nMade the structure more logical - now there're very prominent tabs for Editing and for Playground, and also 4 icons/tabs to switch between sorting, UI mode, per day code mode and full code mode.\n\nAlso, when you edit a program exercise - it navigates to a separate \"Edit Program Exercise\" screen. On that screen you can edit everything related to the exercise - sets, warmups, descriptions, as well as progress and update logic.\n\nSo from now on, everything you could do in the full text mode is pretty much possible to do via UI, including custom progressions and updates.\n\nAlso, you can go straight to that \"Edit Program Exercise\" screen from the workout screen - so if you need to quickly tweak warmups or e.g. adjust weight for the program exercise during workout - it's now easier to do so.\n\nIt's a **VERY large and complex change**, so if you notice any issues / bugs / etc - don't hesitate to email me at **info@liftosaur.com**, or contact me via Discord/Reddit.\n\n---\ndate: 2025-04-24\ntitle: Redesigned \"Choose Program\" screen\n---\n\nIt now has filters (by frequency, duration of a workout, experience, etc) to help you find a suitable program.\n\nBuiltin and your programs are now separated into separate tabs, and the cards for your programs look similar to built-in programs.\n\nAlso, you can skip selecting a program now, and go without a program. Could be useful if you want to build a program iteratively over time from ad-hoc workouts.\n\n---\ndate: 2025-04-21\ntitle: Sets are now optional in the program\n---\n\nIf you don't specify any sets for an exercise - it won't be an error anymore. So, a program like this is a valid program now:\n\n\\`\\`\\`liftoscript\nSquat\nBench Press\nBicep Curl\n\\`\\`\\`\n\nIt could be also useful for \"templates\", where you could define a template without sets, but e.g. with progress and warmups:\n\n\\`\\`\\`liftoscript\nmain / used: none / warmup: 1x5 45lb, 1x5 135lb / progress: lp(5lb)\nSquat / 3x8 100lb / ...main\n\\`\\`\\`\n\nOne **BREAKING CHANGE** is that if you don't specify the weight - it won't add 1RM percentage anymore based on reps/RPE. It'd be just empty weight field now, and will ask you about the weight on completion.\n\n---\ndate: 2025-04-17\ntitle: Add a way to create program days from Ad-hoc workouts\n---\n\nIf you did an ad-hoc workout, you may want to create a program day from it (either in a new or existing program) - so you could do it again, or incorporate it into your programs.\n\nIt also lowers the barrier for creating programs - you don't have to create programs upfront, you can build them over time iteratively. You do ad-hoc workouts, then create program days from it, slap some progression logic on top of it, and you're good to go.\n\nYou can do that either after finishing the workout - from the congratulations screen, or if you tap on the past workout on Home screen.\n\n---\ndate: 2025-04-13\ntitle: Add \"programNumberOfSets\" and \"completedNumberOfSets\" read-only variables\n---\n\nThose could be useful for number of sets-based progressions.\n\nCurrently, there is **numberOfSets** variable, but it only shows how many sets currently in the workout total. There's currently no way to read how many sets are in the program for that week/day, or how many sets is currently completed.\n\nThose 2 new variables return that. You can use them both in the progress and update scripts.\n\n---\ndate: 2025-04-09\ntitle: 📅 Tweaked the Calendar (Home screen)\n---\n\nBringing back the infinite scroll to the Home screen!\n\nA few months ago I added calendar to the Home screen, and removed the infinite scroll, showing only the currently selected week workouts instead.\n\nThe downside of that was that now the scrolling happens in 2 directions - horizontally (switching weeks) and vertically (scrolling the workouts) - not as convenient. Also, it used to be nice to see the currently ongoing workout on the top of the screen - that was removed with per-week workouts.\n\nSo, now the infinite scroll is back, and it will show the currently ongoing workout (if any) at the top of home screen. While you're scrolling the list, it will update the week insights and week calendar on top. And if you open the month calendar (by tapping on the week calendar) and then tap on the workout there - it will scroll to that workout.\n\n---\ndate: 2025-03-30\ntitle: New Workout Screen!\n---\n\nWorkout screen was completely redesigned.\n\nIt now looks closer to all the rest of the workout apps, where each row is a set, and reps and weights are input fields. It still will prefill the fields with the values from the program, but you can change them if necessary. You don't need to change the fields though, just tap the checkmark if they already look right.\n\nThe **Target** column contains the requirements for the set - from the program. We still use the same color coding to distinguish between success sets (green), failed sets (red) and in-range sets (yellow).\n\nYou can swipe the sets, to edit the target, or delete the set.\n\nInstead of one long list with all exercises, now there're tabs for each exercise at the top, and you can see the progress of each exercise there. Under each exercise there's graphs and history for that exercise.\n\n🚨 **There's a breaking change!!!** 🚨. Completed weights now are contained in the **completedWeights** array var (used to be in **weights**). **weights** now contains the program weights. There's automated migration that should run and theoretically you don't need to do anything, but check your scripts to make sure it looks good.\n\n---\ndate: 2025-03-09\ntitle: Big changes in Liftoscript reuse syntax\n---\n\nThe reuse syntax like **Squat / ...Bench Press** just became way more powerful.\n\n- It now reuses **progress** and **update** scripts as well, including built-in like **lp** or **dp**.\n- For \"template\" exercises (the **/ used: none /** ones) it's not required to have a custom or built-in exercise matching the name anymore. So, you can name your templates like **T1** or something like that, and don't create custom exercises with **T1** name.\n- If you reuse **progress: custom()**, you don't have to list all the state variables again in the reusing **progress: custom()** arguments. They will be inherited, you only need to list the ones that have different value from the original ones.\n- You can reuse exercises with multiple set variations too now.\n\nIt's a slightly breaking change because if you previously used **...Squat** it didn't reuse progress and update scripts, and now it does. So, if you want to reuse everything except progress/update - you'd need to overwrite them in the reusing exercise, like:\n\n\\`\\`\\`liftoscript\nSquat / ...Bench Press / progress: custom() {~ ~}\n\\`\\`\\`\n\n---\ndate: 2025-03-05\ntitle: Added negative weights support\n---\n\nYou can now use negative values for weights, e.g. **-5lb**.\n\nThat could be useful e.g. for the assisted Pull Ups with Leverage Machine, e.g. you can define it as:\n\n\\`\\`\\`liftoscript\nPull Up / 3x8 40lb / progress: lp(-5lb)\n\\`\\`\\`\n\nand it will decrease the weight you load on the machine by 5lb each time you finish a workout.\n\nOr you could do it like:\n\n\\`\\`\\`liftoscript\nPull Up / 3x8 -40lb / progress: lp(5lb)\n\\`\\`\\`\n\ni.e. use negative weight as a base, and incrementing it over time.\n\n---\ndate: 2025-03-04\ntitle: Massive update where nothing is changed\n---\n\nI rewrote the Liftoscript engine from the ground up, to simplify it and remove the dependency on the old-style programs. It's now way easier to add new features to it, but that also means I'm replacing a system that was battle-tested for years with a new one. So, there could be bugs.\n\nIn case you see any issues with the Liftoscript or your programs - please please please let me know at **info@liftosaur.com**! Please include the account name (from Me -> Account) in the email. Thanks!\n\n---\ndate: 2025-02-10\ntitle: 📅 Added calendar\n---\n\nNow instead of a flat list of workouts on the Workout History screen, there's a calendar now.\n\nAt the top there's week calendar now, that you can swipe left and right to change the week. If you tap it - it opens monthly calendar.\n\nYou can switch whether a week starts from Monday or Sunday in Settings.\n\n---\ndate: 2025-02-02\ntitle: Redesigning the navigation\n---\n\nChanging the navigation quite drastically, to accomodate upcoming calendar. The following things changed:\n\n- Footer buttons got changed - now there's \"Home\" for the history, \"Settings\" is renamed to \"Me\", and **\"Measurements\" got moved into \"Me\"**.\n- To start a new workout, tap the Dumbbell button in the footer. **No way to start a workout from the history screen anymore!**\n- If there's ongoing workout, tap the Dumbbell button again to get back to it.\n- Each button in the footer resets the navigation stack. So if you go from Home to Program, there'd be no \"Back\" button. This is to make the app navigation more similar to other apps (like Instagram, Facebook, etc)\n\n---\ndate: 2025-01-19\ntitle: Redesigned the sets, and added PRs to history/exercise stats\n---\n\nChanged what the sets (on the history screen, in the program, etc) look like - now they laid out vertically, and it's easier to scan weight/reps for the sets.\n\nAlso added PRs indication to the history and to the exercise stats screens - highlighting if some set was a PR.\n\n---\ndate: 2025-01-17\ntitle: Share workouts on Social Media\n---\n\nYou can share your finished workouts on Instagram (and once Tiktok approves Liftosaur app - on Tiktok)\n\nYou can do it from the congratulations screen, or if you tap on one of the past workouts. This replaces outdated \"Share\" functionality where you could share via a post on Facebook or Twitter.\n\nIt generates an image of a workout that you could share on some default background, or use your photo as a background. Or you can just generate a workout image via \"... More\" menu, and share it through native share sheet.\n\n---\ndate: 2024-12-23\ntitle: Added a way to generate program images\n---\n\nYou can share them in the social media, chats, etc.\n\nYou can configure what the image would look like - how many columns (days) would it have, what days to include, etc.\n\nAvailable in the Web Editor (the picture icon on the right), or in the kebab menu in the top right corner on the Program screen in the app.\n\n---\ndate: 2024-12-14\ntitle: Added day/week descriptions\n---\n\nNow you can add week and day descriptions, in Markdown format. Current week description will be shown on the history screen, and the day description will be shown on the ongoing workout screen.\n\nYou can do that through UI, or in the full program mode you just add comments above the day or week, similarly how you do that for the exercises. Like:\n\n\\`\\`\\`liftoscript\n// This is a description for week 1\n// * Do this\n// * Then do that\n# Week 1\n\n// This is a description for day 1\n// **Do those exercises:**\n## Day 1\n\nSquat / 5x5 / progress: lp(5lb)\n\\`\\`\\`\n\n---\ndate: 2024-12-08\ntitle: Added \\`print\\` function\n---\n\nUseful for debugging your scripts. Use it like:\n\n\\`\\`\\`liftoscript\nSquat / 3x3 / progress: custom() {~\n  print(1, completedReps[1])\n~}\n\\`\\`\\`\n\nIt accepts any number of arguments, and outputs them in the playground or during a workout. Unfortunately Liftoscript still doesn't support strings, but you can use numbers to distinguish prints, like:\n\n\\`\\`\\`liftoscript\nSquat / 3x3 / progress: custom() {~\n  var.a = 10%\n  print(1, completedReps[1])\n  print(2, 30lb)\n  print(3, var.a)\n~}\n\\`\\`\\`\n\nYou can use them both in **progress** and **update** scripts.\n\n---\ndate: 2024-12-07\ntitle: Added ongoing workout reminder push notification\n---\n\nIn case you forget to finish the workout, there will be an additional push notification that will remind you that you have an ongoing workout.\n\nIt's mostly useful if you keep forgetting to finish it, and then you open it in like 5 hours, and it syncs to Apple/Google Health, and your calories stats go crazy.\n\nYou can control the delay when it will notify you on the Settings - Timers screen. By default it's set to 15 minutes.\n\nYou need to update the app from App Store or Google Play to get the feature.\n\n---\ndate: 2024-11-30\ntitle: Added Week Insights\n---\n\nAfter each week workouts on the Workout History screen - there'll be a card with \"Week Insights\".\n\nIt's pretty much the same as \"Week Stats\" on the Program screen, but for the actual week - it'll show how many sets total, hypertrophy/strength split, sets per muscle group you did with the workouts that week.\n\nIt can help you analyze your performace in case you skipped workouts, or did Ad-Hoc workouts, or mixed different programs.\n\nIt's a Premium-only feature! 💵\n\n---\ndate: 2024-11-17\ntitle: Added some convenience shortcuts\n---\n\nNow you can change the next day or start empty (\"Ad-Hoc\") workout from the history screen.\n\nOn the workout screen there's \"Equipment\" and (if exercises uses it) - \"1RM\" links. They open modal to edit those, and in Equipment you can define availables plates right from the modal.\n\nAdded big bold \"Start\" and \"Continue\" buttons to the start workout card, because some new users were confused how to start a workout.\n\n---\ndate: 2024-11-09\ntitle: Improve experience with kg units\n---\n\nNow all the newly cloned programs will be automatically converted to the unit (kg or lb) you have selected in Settings. And if you import a program via link, and it has different units from the Settings one, it'll ask you if you want to convert into the Settings units.\n\nAlso, for the new users the app will ask to pick your units before choosing a program.\n\n---\ndate: 2024-11-03\ntitle: Change numberOfSets in progress scripts\n---\n\nNow you can change **numberOfSets** in the progress scripts. So, sets based progressions just got way easier to do. Before you had to use either **numsets** state variable + update script, or use multiple set variations. Now you can just do **numberOfSets = 4** or **numberOfSets += 1** in your progress scripts.\n\n**numberOfSets** also behaves a bit differently now both in **progress** and **update** scripts - if you add sets, it'll add them the same as the last set you had before. So, most of the time you don't need to pair it with the **sets()** function anymore. E.g. if you have **2x4, 3x8 / 100lb** and you do **numberOfSets += 1** - you'll end up with **2x4, 4x8 / 100lb**.\n\nIn **progress** scripts you can also specify what week/day/set variation specifically you want to change number of sets for, by doing **numberOfSets[week:day:setvariation] = 3**, for example: **numberOfSets[2:*:2] = 3**.\n\n---\ndate: 2024-10-11\ntitle: Apple Health and Google Health Connect integration\n---\n\nNow you can submit workouts and body measurements to **Apple Health** and **Google Health Connect**.\n\nFor the body measurements - it will submit your bodyweight, body fat, and (Apple Health only) - waist circumference.\n\nIt will also read the bodyweight/bodyfat and (Apple Health only) waist circumference from Apple Health or Google Health Connect, and add them to the app.\n\nYou can enable that in the Settings - Sync - Apple (or Google) Health.\n\nIt's available for **Android 14** and for **iOS 15** and higher.\n\n---\ndate: 2024-09-22\ntitle: Pausing a workout\n---\n\nYou can now pause the workout, by tapping the pause button in the workout screen header. It'll stop the total workout timer.\n\nYou can unpause it the same way, or just log any set - it'll unpause it too.\n\n---\ndate: 2024-09-14\ntitle: Custom unit (lb/kg) for equipment\n---\n\nNow equipment can override the default unit (lb or kg).\n\nThe weight of an exercise would be converted to that unit if that equipment is attached to the exercise. You would see the weight in that unit in the history too, but not on graphs - graphs still use default unit.\n\nThat could be useful if you have equipment with different units in your gym - like some machines are in lb, some plates are in kg - that way you can properly track all of them.\n\nTo make it even better - you may want to use a matching unit in the program exercise as well, to avoid any conversions at all. Like if you live in the US, and you have default unit as lbs, but the gym you usually go has \"Lat Pulldown\" cable machine in kgs - it makes sense to specify weights in kg for Lat Pulldown, and set it to the kg-based equipment.\n\n---\ndate: 2024-08-25\ntitle: 💸 Introducing localized pricing\n---\n\nIt was a bit unfair to ask the same price for users from US and e.g. Afganistan or Phillipines, since the purchasing power is so different in those countries.\n\nSo now the pricing is adjusted according to the country GDP per capita. E.g. it now costs **$5/$40/$80** for monthly/yearly/lifetime in **US**, and **$2.5/$20/$40** in **Turkey**, and **$1/$8/$16** in **Phillipines**.\n\n---\ndate: 2024-08-10\ntitle: Custom Exercise Images\n---\n\nNow you can optionally set exercise images to your custom exercises. You can provide URLs for a small image (used across the workout screen/program preview/etc) and a large image (used on the exercise stats screen).\n\n---\ndate: 2024-08-08\ntitle: Settings - Exercises screen\n---\n\nA lot of users were finding it weird you can only make 1RM or equipment adjustments for exercises during a workout. Which makes sense, so I added a separate \"Exercises\" screen that you can access from the \"Settings\" screen (\"Workout\" section).\n\nYou can see exercises grouped by the ones used in your current program, and the ones you did previously, but not included into the current program. You can filter them by name, type, muscle groups, etc.\n\nAnd for each exercise you can see their 1RM and currently attached equipment (or default rounding if no equipment attached).\n\n---\ndate: 2024-08-03\ntitle: Program Version History\n---\n\nThere's still a way to lose your program changes you did e.g. in the Web Editor, if immediately after saving on the Web you change a program in the app (e.g. by finishing a workout, or changing a program weight) - then the changes from the app will overwrite the changes from the Web.\n\nThat could be super frustrating. So as a way to fix that, I'm adding **Program Version History**.\n\nNow each time you save a program (both on the web or in the app), it creates a snapshot of the program. You can access the history of all the snapshots in the Web Editor (there's **Versions** link there, that opens a modal with all the snapshots), and restore any of the past snapshots. I'll store up to 100 recent snapshots.\n\nHopefully it'll reduce the chances of losing your program changes, and make the process less frustrating!\n\n---\ndate: 2024-07-31\ntitle: Updates related to syncing and program saving\n---\n\nI did a massive under the hood update how the app syncs changes with the server, to ensure it only sends the necessary (that actually changed) data. Hopefully it'll make the data sync faster and more reliable. There're also some user-facing changes related to that:\n\n- The Web Editor now has the \"Save\" button, and the programs don't autosave anymore. Autosaving sometimes worked pretty inconsistently, and it wasn't clear whether the changes got saved or not, so I'm trying to solve it with explicit saving.\n- The app now has \"Pull-to-refresh\" functionality - pull the screen to the bottom to force fetch the data from the server. Could be useful if you make the changes on the Web Editor, and want to sync them immediately to the app.\n- The app also will try to sync when it goes from background to foreground.\n\n---\ndate: 2024-06-12\ntitle: Changed how equipment works and added multi-gym support\n---\n\n⚠️ This is a breaking change! Please read! ⚠️\n\nExercises in Liftosaur used to consist of 2 parts - exercise name and equipment. For example: **Bench Press** and **Dumbbell**, or **Squat** and **Barbell**. And when you select an exercise, you have to pick both equipment and name.\n\nThere were several issues with that, but mainly two:\n\n- It was confusing for new users to **pick the equipment AND exercise name**. The fact that you need to pick equipment first, and then tap on the exercise name, even if you just want to change the equipment for the current exercise was very weird.\n- **Equipment was tied to the available plates**. So, if you wanted to change bar/plates (like to a different barbell) - but keep the old ones - you'd get a new exercise, with the new history, graphs, etc - which sometimes was undesirable.\n\nIn this change I'm trying to simplify it - now exercise only consists of the exercise name. So, there're exercises like **Bench Press, Dumbbell** and **Bench Press, Barbell** - but those are 2 different exercises and exercise names.\n\nEquipment is separated from the exercise now, and it defines only the plates/bar/fixed weights. You can attach equipment to your exercises, and that will be used for rounding and plates calculator - but that's optional!\n\nSo, for example, you can have **Squat, Barbell** exercise, and attach e.g. **Olymplic Barbell** equipment with 45lb bar and one set of plates. Or attach **Standard Barbell** with 35lb bar, and a different set of plates. Or don't attach any equipment - and just specify the default rounding - but in that case you won't have plates calculated.\n\nOr you may have **Bicep Curl, Dumbbell**, and attach **Fixed Dumbbells** or **Loaded Dumbbells** to it for rounding and plates calculation.\n\nIt also changes how custom exercises work. You cannot choose equipment for custom exercises anymore - only the name. So, if you had custom exercises with different equipment or even custom equipment - they will be migrated to \"equipment-less\" new exercises.\n\nAnother new feature is **Gyms**. You can create another **Gym** and specify different set of equipment for it. For each exercise you can specify equipment from each gym. And you can change the current gym in Settings, and that will define what equipment would be used for exercises.\n\nGyms are totally optional, and by default you only have one. But it could be useful if you **go to multiple gyms**, or if you're **travelling** - then you can just create a new gym but don't attach equipment from it to exercises. In that case they'd just use default rounding, which could be good enough for travelling - you probably don't want to enter all the equipment details for temporary gyms.\n\nI know I say that a lot, but - that's a very big new feature, so could be bugs - so don't hesitate to email me at **info@liftosaur.com** or contact via Discord/Reddit if there're issues!\n\n---\ndate: 2024-05-25\ntitle: Add UI for tweaking programs\n---\n\nLiftoscript is an amazing way to define weightlifting programs, but typing on the phone could be tedious. Sometimes you need to tweak your program on a phone, while you're in a gym - adjust warmups, reps, weights, replace/add some exercises. But it's not very convenient to do it in a plain text editor on a phone.\n\nSo now there's a UI mode for editing the programs, which is the default mode on a phone. You can do almost anything you could do in a plain text editor except defining progress, update blocks, descriptions and tags.\n\nYou can still switch to the plain text mode by tapping on ::icon-doc::, and adjust the program text. Also, for the Web Editor the plain text mode is still the main way of editing programs.\n\nThat's a very big feature, so could be bugs - don't hesitate to email me at **info@liftosaur.com** or contact via Discord if there're issues.\n\n---\ndate: 2024-05-06\ntitle: \"Quick-add sets\" is now per set variations\n---\n\nIt used to be per whole exercise, so even if you add **1+x5** in one of the days/weeks for your exercise, it'd apply to ALL days/weeks (or set variations) in a program for that exercise.\n\nIt's a bit inconvenient if you only want to have this feature enabled on certain days/weeks. So, now \"Quick-add sets\" is per set variation - if you have **1+x5** on day 1, and **1x5** on day 2, you won't have \"Quick-add sets\" enabled on day 2.\n\n⚠️ This is a breaking change though! ⚠️ If you use this feature, you likely would need to change your program to enable it across all weeks/days where you want to have it, not only the first week/day of the exercise!!!\n\n---\ndate: 2024-04-21\ntitle: Added rich reps / weight / rpe inputs\n---\n\nNow all the modals (like modal when you edit a set for the current exercise, modal when you edit weights, or the AMRAP modal) have \"rich\" inputs for reps, weight and RPE. They have buttons allowing to adjust the values, weight inputs have a Rep Max Calculator, and the buttons increment and decrement various values properly.\n\nFor example, it'd increment/decrement weights according to available equipment - getting next possible weight with your plates. And for reps - it increments by 1, and for RPE - by 0.5\n\n---\ndate: 2024-04-20\ntitle: Added tags\n---\n\nNow you can add **id: tags(123)** to your exercises, and then change state variables of that exercise from a progress block of another exercise. For example:\n\n\\`\\`\\`liftoscript\nSquat / 3x8 / id: tags(123) / progress: custom(rating: 0) {~ ~}\nBench Press / 3x8 / progress: custom() {~\n  state[123].rating = 2\n~}\n\\`\\`\\`\n\nThat **state[123].rating = 2** will set state variable rating in **Squat** to **2**.\n\nIt's kinda a niche feature, but could be useful for some programs.\n\n---\ndate: 2024-04-17\ntitle: update - custom() improvements\n---\n\nYou can use state variables defined in **progress: custom()** in your **update: custom()** scripts.\n\nAlso kinda breaking change, but also now **update: custom()** script would run right after starting a workout. Before completing any sets. With **setIndex == 0**.\n\nYou can use that to programmatically configure your workout\n\n---\ndate: 2024-04-15\ntitle: Added a bunch of new programs\n---\n\nNamely:\n\n- 5/3/1: Boring But Big\n- 5/3/1: Building The Monolith\n- nSuns LP\n- Madcow 5x5\n- PHUL\n- Phrak's Greyskull LP\n\n---\ndate: 2024-04-13\ntitle: Quickly change weights in a program exercise\n---\n\nFor the old programs, it was pretty convenient to just change **state.weight** state variable to adjust the weight across the sets of the exercise.\n\nIn the new plain-text syntax, it got more complicated - if the program is not 1RM-based, you'd need to edit the absolute weight in the program text. Which could be quite cumbersome, especially if you have multiple weeks to adjust.\n\nSo I added a way to quickly change the weights in the program exercise, in the \"Edit\" modal on the workout screen. It lists all the weights used by the exercise in a program, and you can quickly adjust them, either by typing, or by buttons, and there's also a Rep Max Calculator for convenience.\n\n---\ndate: 2024-04-03\ntitle: All built-in programs are migrated to the new syntax\n---\n\nAll the built-in programs now use the new **Liftoscript 2.0 (aka Workout Planner)** syntax.\n\nAlso, by default you now create the programs with the new syntax.\n\n---\ndate: 2024-04-01\ntitle: Loops\n---\n\nYou can now write **for** loops in the Liftoscripts.\n\nLooks like this:\n\n\\`\\`\\`liftoscript\nBench Press / 3x8 / progress: custom() {~\n  for (var.i in completedReps) {\n    weights[var.i] = weights[var.i] + 5lb\n  }\n~}\n\\`\\`\\`\n\nIn this case, **var.i** would contain an index of a set, starting from 1.\n\n---\ndate: 2024-03-28\ntitle: Improved reusing of sets, reps, weight, RPE, timer and warmups\n---\n\nNow the **...Squat** syntax would also reuse the warmups.\n\nAlso, you can override the reused weights, RPE and timer. For example, if you do:\n\n\\`\\`\\`liftoscript\nSquat / ...Bench Press / 200lb\n\\`\\`\\`\n\nThen it would reuse sets x reps, timer, RPE and warmups from Bench Press - everything except the weight.\n\n---\ndate: 2024-03-18\ntitle: Redesigned exercise picker and ability to replace exercises from the workout and new editor screens.\n---\n\nThere's a new exercise picker modal, that now combines equipment selection + exercise selection, and also the \"Substitute\" feature.\n\nThere's also a new \"Swap\" exercise feature on the workout screen (the ::icon-swap:: icon), where you can replace exercise for this workout only, or for the whole program.\n\nAnd now you can replace the exercise across whole program in the new Liftoscript 2.0 editor, both in Web and app. You were able to do it before as well with Find & Replace, but now there's simpler UI for it.\n\n---\ndate: 2024-02-05\ntitle: New update - custom() syntax for updates after completed sets (in the \"Experimental\" programs)\n---\n\nNow you can dynamically make updates in reps, sets or weights. Like for example, if you want to have AMRAP on the first set, and then based on the completed reps of that set adjust the reps of the rest sets, you can do it now. Do something like:\n\n\\`\\`\\`liftoscript\nSquat / 1x6+, 3x3 / update: custom() {~\n    if (setIndex == 1) {\n      reps = floor(completedReps[1] / 2)\n    }\n  ~}\n\\`\\`\\`\n\nand that will make the rest of the sets update after finishing the first set.\n\nThat **update** script is run after completing every set or updating completed reps on the set. It's available only in the new \"Experimental\" programs.\n\nIn that script, you may change **reps**, **minReps**, **weights**, and **RPE** variables. It doesn't change a program, and you cannot access state variables, but you can access any other built-in variable.\n\nYou can target all incompleted sets (by using **reps = 3**, **weights = 40lb**, etc), or you can target specific sets (e.g. **reps[3] = 10**)\n\n---\ndate: 2024-01-27\ntitle: ✨ New \"Experimental\" programs (aka \"in-app Workout Planner\") ✨\n---\n\nMassive update - now there's a way to build Liftosaur programs using completely different syntax - the one that you used in the [Workout Planner](https://www.liftosaur.com/planner)\n\nThe syntax got extended with the new features, making it pretty much as powerful as a regular way of building programs. You now can use Liftoscript within the new syntax to describe the progressions.\n\nBasically, the new programs is just one blob of text, and it changes over time based on your progressions. You can define set variations, quick add sets, descriptions, ways to switch between them, etc - everything is possible!\n\nTo create that \"experimental\" program, just go to **\"Choose Program\"** screen, tap on **\"Create\"**, and tap the **\"Create experimental program\"** button.\n\nRead more about new syntax and how to write programs that way [in the blogpost.](https://www.liftosaur.com/blog/posts/new-experimental-program-editor/)\n\nIMHO it should be much easier to build programs this way. Eventually I'd like to make it a default way of writing programs in Liftosaur. So, check it out, and don't hesitate to ask questions in our Discord channel, subreddit, or just shooting email to **info@liftosaur.com**!\n\n---\ndate: 2024-01-06\ntitle: Added ability to set 1 Rep Max for exercises\n---\n\n1RM would be reused across programs, and is tied to exercise themselves, not programs. You still can access it in the Liftoscript scripts via **rm1** variable, and you can set it in the Finish Day Script too.\n\nI.e. you can do things like \\`rm1 * 0.9\\` in your Weight Liftoscript expressions, or things like \\`rm1 += 5lb\\` in your Finish Day Scripts\n\nYou can edit 1RM on the Exercise Stats screen (when you tap on the exercise name on the workout screen). Also, it'll show up on the \"Edit\" modal (when you tap on the Edit icon on the working screen) in case it was used anywhere in the program exercise scripts.\n\nThat should be a good way to make 1RM of the exercises transferrable between programs.\n\n---\ndate: 2024-01-03\ntitle: Added \"Full Program\" mode to the Workout Planner\n---\n\nNow there's a new \"Full Program\" mode in the [Workout Planner](https://www.liftosaur.com/planner). You can activate it by clicking on the ::icon-doc:: icon near the \"Convert to Liftosaur program\" button. It represents the planner program as one big text blob. That could be pretty convenient for editing programs, especially multi-week ones. You can save those programs as text files, edit them in any text editor, share them as text blobs.\n\nIt adds 2 new syntax constructions you need to use in the \"Full Program\" mode - for weeks and for days. To create a week, you type a week name from a new line, starting with a hash sign. Like **# Week 1**. To create a week - same thing, just starting with 2 hash signs, like **## Day 1**.\n\nThere's also a bunch of features built-in into the Workout Planner editor:\n\n**Find & Replace** - you can even use regular expressions for powerful replacing\n\n**Multicursor typing** - you can set several cursors (by Cmd+click or Ctrl+click), and type in multiple places simultaneously.\n\n---\ndate: 2023-12-25\ntitle: Improved Program Preview in the app and Web Editor\n---\n\n🎄 Merry Christmas! I tweaked the program preview page in the app (both for built-in and your programs), and also added Program Preview for the Web Editor.\n\nYou can use it to get a quick glance at the whole program, try your state var values (e.g. your weights) there. You can also enable \"Playground\" mode, and try how finish day scripts work for various exercises when you finish all sets.\n\nIt should be especially useful for the Web Editor, before it was sometimes pretty tricky to understand if your program works properly, especially if it has a bunch of set variations. There was Exercise-level Playground, but wasn't Program-level Playground, and now there is!\n\n---\ndate: 2023-12-07\ntitle: You can now fully delete your account\n---\n\nAdded deleting account on the cloud. It's available on the Settings - Account screen.\n\nNow you can be in control of your data, and fully wipe out all your data from the Liftosaur servers if necessary!\n\n---\ndate: 2023-10-16\ntitle: Changed how Web Editor program links work\n---\n\nIt used to be that when you edit a program in a web editor, it'd update the link right in the URL bar, and the short links like /p/123abc would just redirect to the long links with whole program presented into a URL.\n\nBut apprently there's 10K limit in the URL length, so it was breaking for some large programs. So, I had to change how it works. Now, when you edit a program, you need to generate a link to \"Save\" it, each change won't automatically update the browser history. It'll also show a warning (that you can close) when you change a linked program that in order to \"Save\" the changes, you need to generate a new link that'll represent a changed program.\n\n---\ndate: 2023-09-27\ntitle: Offline mode\n---\n\nLiftosaur now can work offline. If there's no Internet, it of course won't be able to load all the built-in programs, and it won't be able to sync your data to the server. But it'll still work, all your history and programs would be there, and it will just sync the data next time when Internet is available if you're logged in.\n\n---\ndate: 2023-09-22\ntitle: Moving Average on the Measurement Graphs\n---\n\nNow, on the Measurement screen, for the graphs there you can add moving average graph. It's super useful especially for tracking bodyweight or body fat, due to high volatility of those measurements. This was added by awesome [@123marvin123](https://github.com/123marvin123), thank you so so much for contributing and adding this feature! It'll help a lot of people tracking their weight, and it's a great addition to Liftosaur. Thank you very very much!\n\n---\ndate: 2023-09-20\ntitle: Added Rep Max Calculator\n---\n\nIt's located near weight state variables. You can enter the known weight, reps and RPE, and target reps and RPE, and it'll calculate the weight for you.\n\nFor actual Rep Max, use RPE = 10.\n\n---\ndate: 2023-09-02\ntitle: Added rep ranges support\n---\n\nThere's a new \"Extra Feature\" you can enable for exercises now - **Rep Ranges**. If you turn it on, you can specify optional **Min Reps** Liftoscript scripts for each set in an exercise. On the sets, you'll see rep ranges instead of just a single rep number.\n\nIf the reps are less than max reps, but more or equal than min reps, the set will be yellow, both in the workout and in the history.\n\nIf the min reps are enabled and provided, you'll have them available in the **minReps** variable in the Finish Day scripts. If they're not enabled or provided, they'll use **reps** (i.e. max reps) variable values. For example, you don't have min reps for the first set, but max reps are **5**. Then, \\`minReps[1]\\` would be **5**.\n\n---\ndate: 2023-08-31\ntitle: Added multi-week support\n---\n\nNow for programs you can enable \"Multi-week\" mode. That adds **Weeks** - they are similar to **Days**. Like you add exercises to Days and can reuse exercises between days - now you can add Days to Weeks and reuse Days between Weeks.\n\nThat makes it easier to create multi-week programs with mesocycles, deload weeks, 1RM testing weeks, etc. You can create regular days, deload days or testing RM days, and then create e.g. 6 weeks with regular days, and then 1 week with deload days.\n\nWhen multi-week mode is enabled, the program follows the order of days in weeks. I.e. when you finish a workout, it'll go to the next day in the week, or when it was the last day in the week - goes to the first day of the next week.\n\nThere are also new variables available for all the Liftoscript scripts - **week** and **dayInWeek**. You can use them to define logic based on the week number, or week day number.\n\n---\ndate: 2023-08-22\ntitle: Added visual cues when rounding weights\n---\n\nIt's currently very confusing when and why we round the weights, especially for the new users of the app. It looks like a bug in the app because it's unexpected, but it just tries to round the weights to your available equipment.\n\nSo, from now on, it'll show strikethrough original weights, and the weight it was rounded to. Also, will show a little help message, explaining where you can adjust the equipment.\n\nThe rounding logic is slightly different now - we round the weights only at the very end, during the workouts. State variable changes are not rounded at all.\n\nIf this change somehow breaks the rounding logic in your program, please contact in Discord or by [info@liftosaur.com](mailto:info@liftosaur.com). It shouldn't break anything, but I could miss some edge cases...\n\n---\ndate: 2023-08-04\ntitle: Added RPE support\n---\n\nRPE (Rating of Perceived Exertion) now is well supported in Liftosaur. It's how hard was the exercise, on the scale of 0-10, where 10 is the hardest (you couldn't make any more reps)\n\nNow you can enable RPE support for your exercises (in Extra Features section), and each set will have 2 additional fields: **RPE** and **Log RPE**.\n\nFor RPE, you can provide Liftoscript expression, that would define required RPE for that set.\n\nIf you enable \"Log RPE\", it'll ask you for YOUR perceived RPE value when you finish the set.\n\nYou can access the required RPE values via \\`RPE\\` and logged RPE in \\`completedRPE\\` variables in the Finish Day Script.\n\nUsing that, you can define progressions based on RPE, e.g. comparing if your RPE was lower than required RPE - then increase the weight, or something like that.\n\nOn the history and workout screens, we show required RPE like **@8** (gray color) and logged RPE like **@9** (orange color), prefixed by **@** sign.\n\n---\ndate: 2023-07-29\ntitle: Add better volume support\n---\n\nNow there's a switch between volume and max weight for exercise graphs.\n\nThere are also muscle group volume per week graphs\n\nThere's also volume in lbs added to the exercise stats screen and also previous workouts.\n\n---\ndate: 2023-07-27\ntitle: Import history from Hevy app\n---\n\nThere's a new item in Settings - \"Import history from other apps\". It opens a modal, where you can choose Hevy app, and upload CSV file - and it'll import the history from the file into Liftosaur.\n\n---\ndate: 2023-07-24\ntitle: Make the rest timer adjustable\n---\n\nNow you can adjust a running rest timer. Tap on the timer on the right bottom corner, it'll expand, and you can add time, reduce time, or cancel the timer completely.\n\n---\ndate: 2023-07-16\ntitle: Improve exercise selection modal\n---\n\nNow listing target, synergetic muscle groups, and also the \"type\" of the exercise (pull, push, upper, lower, etc) for each exercise.\n\nAlso, now you can filter by the \"type\" and by muscle groups. E.g. you can list all the pull exercises with the chest muscle group, or something like that.\n\nYou can assign the \"type\" to your custom exercises now too.\n\n---\ndate: 2023-07-12\ntitle: Add Custom Equipment\n---\n\nNow you can create your own **custom equipment** (in Settings -> Available Equipment).\n\nIt could be useful if you have multiple Cable machines with different plate weights for different exercises, or you want to create some custom equipment like \"Safety Squat Bar\", where the bar weights more than regular olympic bar.\n\nCustom Equipment has all the same properties as built-in equipment (fixed/non-fixed, plates configuration), but also additionally you can specify the name, and \"Similar To\" field.\n\n\"Similar To\" for now only used for the exercise images, so if you create new equipment \"Cable 2\", with different plates, you can set \"Similar To\" to \"Cable\", and it'll use cable exercise image.\n\nYou now also can edit equipment in the Web Editor's Settings modal. You can create new equipment there (e.g. Safety Squat Bar), and assign to your exercises there. Custom equipment is properly exported into a link when you create a link of a program to share.\n\n---\ndate: 2023-07-04\ntitle: Switched \"reps x sets\" to \"sets x reps\" on the history screen\n---\n\nIt was kinda confusing since widely used format is \"sets x reps\".\n\nSo now it's \"sets x reps\"\n\n---\ndate: 2023-06-30\ntitle: Bodyfat tracking\n---\n\nLiftosaur is [open-source](https://github.com/astashov/liftosaur), so anyone can see the code, and potentially add features. Amazing [@codymurdoc](https://github.com/codymurdoc) went ahead and added bodyfat tracking support to Liftosaur! This is so cool, thank you so much! It's really impressing you were able to figure out how to do that in pretty large codebase, and add it in a clean and nice way, it's a pretty big feature. I'm really impressed!\n\n---\ndate: 2023-06-25\ntitle: Added Long Press to edit the quickly edit the sets in current workout\n---\n\nNow, you can do long press on a set square (for 1 second), and it'll open the edit set modal - the same one that you get if you press on the Edit icon, choose \"Only in this workout\", and then tap on a set.\n\nThat works both on the workout screen, and also in playgrounds on the edit program exercise screen. But on the playground, it won't change the program! It's just to simulate the logic if you change the sets only in current running workout.\n\nHopefully that'll make it easier to handle the cases when you want to deviate from a program for some reason only for that workout (change the weight for some set, or number of required reps, etc).\n\n---\ndate: 2023-06-24\ntitle: Made \"Quick Add Set\" supported in playgrounds\n---\n\nSo it's easier to test your program exercise logic when you have \"Quick Add Set\" feature enabled.\n\n---\ndate: 2023-06-13\ntitle: Added sound controls to iOS / Android apps\n---\n\nIf the sound of the rest timer is too loud or too quiet, you can now adjust it in the app. There's a Volume slider now, as well as a toggle to enable vibration when rest timer ends.\n\nYou need to get the new version of the app from App Store / Google Play to get this feature.\n\n---\ndate: 2023-06-11\ntitle: Added a way to add labels to sets\n---\n\nSimilar like there's a label \"Warmup\" for the warmup sets, you can add short labels to workout sets as well. You can use it to mark sets as **\"Drop set\"**, or **\"RPE 7\"**, or **\"TM 70%\"**, or something like that. The space is limited, so the label is 8 characters max.\n\nYou can specify labels on the \"Edit Program Exercise\" screen, where you specify reps, weights and AMRAP.\n\n---\ndate: 2023-06-09\ntitle: Added new functions - sum, min and max\n---\n\nYou can use them in your scripts to find e.g. min or max completed reps, or sum of all reps. They work on variables that are arrays, like \\`reps\\`, \\`weights\\` and \\`completedReps\\`.\n\nLike this: \\`state.allCompletedReps = sum(completedReps)\\`\n\n---\ndate: 2023-05-24\ntitle: Added \"Always On Display\" in Settings\n---\n\nIf you want to keep your screen always on during the workouts, you can enable it in Settings. You need to update the app for that though.\n\n---\ndate: 2023-05-11\ntitle: Improved program exercise timer expressions\n---\n\nNow you can use not only state variables there, but also the workout variables. Like, \\`completedReps\\`, \\`weights\\`, \\`numberOfSets\\`, etc.\n\nAlso, added new variable specifically for the timer expression - \\`setIndex\\`. It contains the index of the just completed set. You can use it to change timer based on the set number. Or to set a timer between exercises (\\`setIndex == numberOfSets ? 90 : 180\\`).\n\n---\ndate: 2023-05-01\ntitle: More Liftoscript features\n---\n\nAdded modulo operator **%** to Liftoscript. I.e. **7 % 2 == 1**, or **5 % 5 == 0**. It's useful for creating programs with repeating patterns.\n\nThen, added functions **floor**, **ceil** and **round**. You use them like **state.foo = floor(23.4)**. Use them if you need rounding.\n\nAlso, finally added increment assignment operators, like **+=**, **-=**, **\\\\*=** and **/=**. Use them like **state.foo += 5lb** - that'd increase \\`foo\\` variable by 5lb.\n\n---\ndate: 2023-04-30\ntitle: New Liftoscript Engine\n---\n\nThe internals of Liftoscript are fully rewrote to a new engine. It's more strict, and it will better find syntax errors, missing variables, and it's generally more correct. Also, it will be way easier to add features to it now.\n\n⚠️ But because it's stricter, it may consider your previously valid scripts invalid now. **If you get an error - please go to edit exercise screen, and fix the errors!**. Otherwise, it may not calculate your reps/weights properly when you finish exercise.\n\n---\ndate: 2023-04-22\ntitle: Quick add sets\n---\n\nAdd a way to enable \"quick add sets\" feature for a program exercise. When enabled, there'll be a button on the workout screen after last set, that allows to add another set. On press, there'll be a modal, where you specify required sets and weight. It also is marked as completed automatically.\n\nAlso, there are 2 new variables available in Finish Day Script - **numberOfSets**, and an alias for it - **ns**. They contain the number of sets for the exercise at the end of the workout.\n\nYou can use this to create set-based programs. E.g. increase weight if you did more than 5 sets with 4 reps each, or if you did at least 5 sets, and last set reps were more than 8. To access last set weight or reps, you can use **weights[numberOfSets]** or **reps[numberOfSets]**.\n\n---\ndate: 2023-04-19\ntitle: Program Exercise Descriptions\n---\n\nYou can now add exercise descriptions when you edit a program exercise. You can add any tips how to do it, reminders, or some notes, that'll persist between workouts. You can use markdown for formatting.\n\n---\ndate: 2023-04-09\ntitle: Edit state variables from workout screen\n---\n\nYou don't need to go to the edit exercise screen to edit the state variables anymore. Now you can do it right from a modal that pops up when you tap \"edit\" icon on the exercise card, on the workout screen.\n\n---\ndate: 2023-03-30\ntitle: User entered state variables\n---\n\nNow you can make a user to provide a value for the state variable when they finish an exercise. For that, there's a checkbox when you create a state variable.\n\nThat's useful e.g. for the programs that use RPE (Rating of Perceived Exertion) or RIR (Reps in Reserve) for progressions. Or if you want to manually choose the weight for the next workout. Or something like that.\n\n---\ndate: 2023-03-24\ntitle: Per Exercise Rest Timers\n---\n\nNow you can specify custom exercise rest timers. By default it still would use your workout timer from Settings, but you can override it for some exercises. So now you can have different rest timers for Deadlift and Bicep Curls!\n\nYou specify timer as a Liftoscript expression, similar to reps and weight, so you can define logic there too, and use state variables. Progressive overload in your rest timer? Why not! :)\n\n---\ndate: 2023-03-19\ntitle: Discord Server\n---\n\nWe've got a Discord server now! You can join it here: [::icon-discord:: Discord Server](https://discord.com/invite/AAh3cvdBRs)\n\nJoin and ask questions there, suggest features, leave feedback, or just chat with other Liftosaur users.\n\n---\ndate: 2023-03-01\ntitle: Notes\n---\n\nAdded ability to add notes to the overall workouts and specific exercises during workout. You can then see those notes on the History screen, on the exercise details screen, and also on the Graphs.\n\nYou can also filter the history on the exercise details screen by whether the history record had notes for that exercise.\n\n---\ndate: 2023-02-24\ntitle: Inspirations in the Advanced Edit Mode\n---\n\nNow in the \"Advanced\" mode of the exercise editor (both on a phone and in the web editor), there's a link at the top that opens a modal with various examples of the reps/weight and finish day scripts.\n\nYou could use it for \"inspiration\", to reuse some of the recipes, or come up with your own based on those. Or just to see what you can do with **Liftoscript**.\n\n---\ndate: 2023-02-22\ntitle: Web Editor for programs\n---\n\nThere's a new web editor for programs, so you could edit the programs from a laptop - [liftosaur.com/program](internal:/program). You can create a program there, then copy the link, and paste it into the app (on the program selection screen). You can also generate a link for any of your programs (on the program edit screen), and open in the web editor, edit there, copy link again, and paste it into the app to import the changes.\n\nThose links are immutable - any change in the program would change the link. You can share those links if you want to share your program with somebody else, and they'll be able to import the program into their app.\n\n---\ndate: 2023-02-09\ntitle: Choose Programs screen redesign\n---\n\nNow it shows all the exercise images a built-in program contains, as well as the required equipment and approximate time to finish a workout from the program. Hopefully it'll help with choosing the right program.\n\n---\ndate: 2023-02-07\ntitle: Footer navigation\n---\n\nWe've got complains that the footer navigation is confusing. And indeed, the left part was different from screen to screen, and it sometimes was hard to understand where are you.\n\nSo, now the footer nav is always the same across all screens. The screen-based buttons got moved to either 3-dot menu in the navbar, or to regular buttons right on the screen.\n\nAlso, had to move the rest timer from the footer, now it's a floating timer, that is visible on all screens. If you tap on it, you will go to the currently ongoing workout.\n\n---\ndate: 2023-01-21\ntitle: Exercise Stats\n---\n\nAdded Exercise Stats - a new screen that shows various statistics for an exercise. It shows the graph, the personal records, the history of the exercise. You can switch between different exercises right on that screen.\n\nThe entrypoint to that screen is from the workout screen - when you tap on the exercise name, exercise image, or when you open the bottom sheet - there's an option \"Exercise Stats\"\n\n---\ndate: 2023-01-15\ntitle: Program Preview\n---\n\nAdded Program Preview, that shows the high-level overview of a program. It lists all the days and exercises, all the sets variations (sets/reps/weight), you could see the formulas/scripts for each exercise, and muscles for each day and the whole program. You can use it for 2 cases:\n\n- When you pick a built-in program, there's a \"Preview\" button in the modal with the program info. So you could see now what you sign up for.\n- When you build your own program, there's \"Preview\" footer button. If will give you high-level overview of the program, and could help to make sure everything works right there.\n\n---\ndate: 2023-01-11\ntitle: Graph Improvements\n---\n\n- Using 2 fingers, you can pinch-zoom graphs now.\n- Also using 2 fingers you can move the zoomed area.\n- By double-tapping a graph, you can reset the zoom and return to its original size.\n- Added vertical lines on the graphs when program was changed.\n- Added a link in the legend to the selected workout on the graph.\n- Removed the horizontal line on the cursor, since it was pretty useless.\n\n---\ndate: 2022-12-28\ntitle: Add Reuse Logic feature\n---\n\nIf you have multiple exercises in a program that share the same logic for sets, reps and weight, and also logic for updating those, you now can \"reuse logic\" from other exercises. This way you can avoid repeating the same logic over and over again, and you'll have a single source of truth for that logic (in the exercise you reuse).\n\nIt should be useful for most programs, since usually they have multiple exercises following the same progression/deload pattern.\n\nEach exercise still has its own state variables values, but it must have the same variable names and types.\n\n---\ndate: 2022-12-26\ntitle: New Account Management.\n---\n\nNow you can have multiple local accounts, and manage them and switch between them. Also, the whole Account screen was updated.\n\n---\ndate: 2022-12-25\ntitle: Redesign.\n---\n\nBig redesign of the whole app! Hopefully it's more visually pleasant, and makes more sense than the previous one.\n\n---\ndate: 2022-08-08\ntitle: Big changes in the equipment settings.\n---\n\nYou can now specify plates separately for each equipment type - barbell, dumbbell, cable, etc.\n\nEach equipment type now supports \"fixed\" weights, without plates, e.g. if you use fixed weight dumbbells.\n\n---\ndate: 2022-06-04\ntitle: Add 1 Rep Max line to the exercises graphs.\n---\n\nIt better shows the progress trend, since it combines weight and reps into one value. We use [Epley formula](https://en.wikipedia.org/wiki/One-repetition_maximum) to calculate it. It's enabled by default, but you can disable it in settings on Graphs screen.\n\n---\ndate: 2022-02-19\ntitle: Import/Export of all data and also specific programs.\n---\n\nYou can now export all your data into a file (history, settings, etc), and then import it later on.\n\nAlso can export and import programs. Could use it to e.g. share a workout program with a friend, or as a backup, or for some other reason.\n`;\n\nexport default content;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createRoot } from \"react-dom/client\";\nimport RB from \"rollbar\";\nimport { RollbarUtils_config } from \"./utils/rollbar\";\n\ndeclare let Rollbar: RB;\ndeclare let __ENV__: string;\nRollbar.configure(RollbarUtils_config());\n\nimport { AppView } from \"./components/app\";\nimport { AudioInterface } from \"./lib/audioInterface\";\nimport { TimerBridge } from \"./utils/nativeTimerBridge\";\nimport { getInitialState, getIdbKey } from \"./ducks/reducer\";\nimport { DateUtils_formatYYYYMMDDHHMM } from \"./utils/date\";\nimport { IndexedDBUtils_initializeForSafari, IndexedDBUtils_getAllKeys } from \"./utils/indexeddb\";\nimport { Persistence } from \"./utils/persistence\";\nimport { ILocalStorage } from \"./models/state\";\nimport { Service } from \"./api/service\";\nimport { UrlUtils_build } from \"./utils/url\";\nimport { AsyncQueue } from \"./utils/asyncQueue\";\nimport { DeviceId_get } from \"./utils/deviceId\";\n\nIndexedDBUtils_initializeForSafari();\n\nif (\"serviceWorker\" in navigator && (typeof window === \"undefined\" || window.location.protocol.startsWith(\"http\"))) {\n  navigator.serviceWorker.register(\"/webpushr-sw.js\");\n}\n\nconsole.log(DateUtils_formatYYYYMMDDHHMM(Date.now()));\nconst client = window.fetch.bind(window);\nconst timer = new TimerBridge(new Service(client));\nconst audio = new AudioInterface(timer);\nconst persistence = new Persistence();\nconst url = UrlUtils_build(document.location.href);\nconst userId = url.searchParams.get(\"userid\") || undefined;\nconst adminKey = url.searchParams.get(\"admin\");\n\nasync function initialize(loadedData: ILocalStorage | undefined): Promise<void> {\n  try {\n    (window as any).loadedData = loadedData;\n    const deviceId = await DeviceId_get();\n    const initialState = await getInitialState(client, { url, localStorage: loadedData, deviceId });\n    if (adminKey) {\n      initialState.adminKey = adminKey;\n    }\n    const uid = initialState.user?.id || initialState.storage.tempUserId;\n    Rollbar.configure(RollbarUtils_config({ person: { id: uid } }));\n    (window as any).state = initialState;\n    (window as any).service = new Service(window.fetch.bind(window));\n    const queue = new AsyncQueue();\n    (window as any).queue = queue;\n    createRoot(document.getElementById(\"app\")!).render(\n      <AppView\n        initialState={initialState}\n        client={client}\n        audio={audio}\n        queue={queue}\n        persistence={persistence}\n        timer={timer}\n      />\n    );\n  } catch (e) {\n    console.error(e);\n    Rollbar.error(\"Failed to initialize app\", e instanceof Error ? e : new Error(String(e)));\n  }\n}\n\nIndexedDBUtils_getAllKeys();\n\nasync function main(): Promise<void> {\n  persistence\n    .load(await getIdbKey(userId, !!adminKey))\n    .then(initialize)\n    .catch((e) => {\n      console.error(e);\n      initialize(undefined);\n    });\n}\n\nmain();\n\nsetTimeout(() => {\n  const appEl = document.getElementById(\"app\");\n  if (appEl && appEl.childElementCount === 0) {\n    Rollbar.error(\"White screen detected - app failed to render after 10s\");\n  }\n}, 10000);\n\n(window as any).storeData = async (data: any) => {\n  try {\n    const localStorage: ILocalStorage = typeof data === \"string\" ? JSON.parse(data) : data;\n    await persistence.saveFull(await getIdbKey(userId, !!adminKey), localStorage);\n  } catch (e) {\n    console.error(e);\n  }\n};\n\n(window as any).clearData = async (data: any) => {\n  try {\n    await persistence.delete(await getIdbKey(userId, !!adminKey));\n  } catch (e) {\n    console.error(e);\n  }\n};\n","import { JSX, ReactNode } from \"react\";\n\ninterface IProps {\n  href: string;\n  className?: string;\n  children: ReactNode;\n  name: string;\n}\n\nexport function InternalLink(props: IProps): JSX.Element {\n  return (\n    <a\n      href={props.href}\n      target=\"_blank\"\n      className={props.className}\n      onClick={(e) => {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        if ((window.navigator as any).standalone) {\n          e.preventDefault();\n          window.open(`https://liftosaur.netlify.app${props.href}`, \"_blank\");\n        }\n      }}\n    >\n      {props.children}\n    </a>\n  );\n}\n","import { ITimerBridge } from \"../utils/timerBridge\";\n\n// Closed set, because every platform resolves these names separately - web by filename, iOS by bundle\n// resource, Android by a `when` over R.raw. An unmapped name doesn't fail there, it plays the wrong sound.\nexport type ISoundName = \"notification\" | \"set-timer-end\" | \"get-ready-end\";\n\nexport interface IAudioInterface {\n  play(volume: number, vibration: boolean, sound?: ISoundName): void;\n}\n\nexport class MockAudioInterface implements IAudioInterface {\n  public play(volume: number, vibration: boolean, sound?: ISoundName): void {\n    // noop\n  }\n}\n\nexport class AudioInterface implements IAudioInterface {\n  private readonly audios: Record<string, HTMLAudioElement> = {};\n\n  constructor(private readonly timer: ITimerBridge) {}\n\n  private getAudio(sound: ISoundName): HTMLAudioElement {\n    if (this.audios[sound] == null) {\n      this.audios[sound] = new Audio(`/${sound}.m4r`);\n    }\n    return this.audios[sound];\n  }\n\n  public play(volume: number, vibration: boolean, sound: ISoundName = \"notification\"): void {\n    if (volume <= 0 && !vibration) {\n      return;\n    }\n    const isPlayed = this.timer.playSound(volume, vibration, sound);\n    if (!isPlayed && volume > 0) {\n      const audio = this.getAudio(sound);\n      audio.volume = volume;\n      audio.play();\n    }\n  }\n}\n","import { Platform } from \"react-native\";\n\nexport function HealthSync_eligibleForAppleHealth(): boolean {\n  return Platform.OS === \"ios\" && parseFloat(String(Platform.Version)) >= 15;\n}\n\nexport function HealthSync_eligibleForGoogleHealth(): boolean {\n  // Platform.Version on Android is the API level, not the user-facing version. 34 = Android 14 (UPSIDE_DOWN_CAKE),\n  // the minimum for Health Connect's runtime permission flow.\n  return Platform.OS === \"android\" && Number(Platform.Version) >= 34;\n}\n","import { ISettings, IStorage } from \"../types\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { DateUtils_formatYYYYMMDD } from \"../utils/date\";\nimport { Exporter_toFile } from \"../utils/exporter\";\nimport { IExportedProgram } from \"../models/program\";\nimport { Storage_getDefault, Storage_get, Storage_setAffiliate } from \"../models/storage\";\nimport { IEither } from \"../utils/types\";\nimport { getLatestMigrationVersion } from \"../migrations/migrations\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_importProgram } from \"../ducks/thunks\";\nimport { ObjectUtils_clone, ObjectUtils_pick } from \"../utils/object\";\nimport { ImportFromLink_importFromLink } from \"../utils/importFromLink\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { IExportedPlannerProgram } from \"../pages/planner/models/types\";\nimport { PlannerProgram_convertExportedPlannerToProgram } from \"../pages/planner/models/plannerProgram\";\nimport { Settings_build } from \"../models/settings\";\n\nexport function ImportExporter_exportStorage(storage: IStorage): void {\n  Exporter_toFile(`liftosaur-${DateUtils_formatYYYYMMDD(Date.now())}.json`, JSON.stringify(storage, null, 2));\n}\n\nfunction isPlanProgram(program: IExportedProgram | IExportedPlannerProgram): program is IExportedPlannerProgram {\n  return \"type\" in program && program.type === \"v2\";\n}\n\nexport async function ImportExporter_getExportedProgram(\n  client: Window[\"fetch\"],\n  maybeProgram: string,\n  settings?: ISettings\n): Promise<IEither<IExportedProgram, string[]>> {\n  let parsedMaybeProgram: IExportedProgram | IExportedPlannerProgram;\n  try {\n    parsedMaybeProgram = JSON.parse(maybeProgram);\n  } catch (e) {\n    return { success: false, error: [\"Couldn't parse the provided file\"] };\n  }\n  let exportedProgram: IExportedProgram;\n  if (isPlanProgram(parsedMaybeProgram)) {\n    exportedProgram = PlannerProgram_convertExportedPlannerToProgram(parsedMaybeProgram, settings || Settings_build());\n  } else {\n    exportedProgram = parsedMaybeProgram;\n  }\n  const payload = Storage_getDefault();\n  payload.settings = ObjectUtils_clone(settings || payload.settings);\n  payload.settings.timers.workout = exportedProgram.settings?.timers?.workout || payload.settings.timers.workout;\n  payload.settings.units = exportedProgram.settings?.units || payload.settings.units;\n  payload.settings.exercises = exportedProgram.customExercises;\n  payload.programs.push(exportedProgram.program);\n  payload.version = exportedProgram.version;\n  const result = Storage_get(payload, false);\n  if (result.success) {\n    const storage = result.data;\n    const customExercises = storage.settings.exercises;\n    const program = storage.programs.filter((p) => p.id === exportedProgram.program.id)[0];\n    return {\n      success: true,\n      data: {\n        customExercises,\n        program,\n        version: getLatestMigrationVersion(),\n        settings: ObjectUtils_pick(payload.settings, [\"timers\", \"units\"]),\n      },\n    };\n  } else {\n    return result;\n  }\n}\n\nexport async function ImportExporter_handleUniversalLink(\n  dispatch: IDispatch,\n  link: string,\n  client: Window[\"fetch\"]\n): Promise<void> {\n  const url = UrlUtils_build(link);\n  if ((url.pathname === \"/program\" && url.searchParams.has(\"data\")) || url.pathname.startsWith(\"/p/\")) {\n    const data = await ImportFromLink_importFromLink(link, client);\n    if (data.success) {\n      const source = data.data.source;\n      if (source) {\n        Storage_setAffiliate(dispatch, source, \"program\");\n      }\n      dispatch(Thunk_importProgram(data.data));\n    } else {\n      Dialog_alert(data.error.join(\"\\n\"));\n    }\n  }\n}\n","import { IHistoryRecord, IHistoryEntry, ISet, ISettings, IProgram } from \"../types\";\nimport { Exercise_get, Exercise_fullName, Exercise_sanitizeName } from \"../models/exercise\";\nimport { Weight_print } from \"../models/weight\";\nimport { emptyProgramId, Program_evaluate, Program_isEmpty } from \"../models/program\";\nimport { n } from \"../utils/math\";\nimport { Reps_groupConsecutive, Reps_completedSetKey, Reps_targetSetKey } from \"../models/set\";\nimport { History_workoutTime } from \"../models/history\";\n\nexport function LiftohistorySerializer_serialize(\n  historyRecord: IHistoryRecord,\n  settings: ISettings,\n  program?: IProgram\n): string {\n  return serializeWorkoutRecord(historyRecord, settings, program);\n}\n\nfunction formatNotes(notes: string, indent: string): string {\n  return notes\n    .split(\"\\n\")\n    .map((line) => `${indent}// ${line}`)\n    .join(\"\\n\");\n}\n\nfunction formatDate(isoDate: string): string {\n  const d = new Date(isoDate);\n  const offset = -d.getTimezoneOffset();\n  const sign = offset >= 0 ? \"+\" : \"-\";\n  const absOff = Math.abs(offset);\n  const hh = String(Math.floor(absOff / 60)).padStart(2, \"0\");\n  const mm = String(absOff % 60).padStart(2, \"0\");\n  const year = d.getFullYear();\n  const month = String(d.getMonth() + 1).padStart(2, \"0\");\n  const day = String(d.getDate()).padStart(2, \"0\");\n  const hours = String(d.getHours()).padStart(2, \"0\");\n  const mins = String(d.getMinutes()).padStart(2, \"0\");\n  const secs = String(d.getSeconds()).padStart(2, \"0\");\n  return `${year}-${month}-${day} ${hours}:${mins}:${secs} ${sign}${hh}:${mm}`;\n}\n\nfunction serializeWorkoutRecord(record: IHistoryRecord, settings: ISettings, program?: IProgram): string {\n  const lines: string[] = [];\n  if (record.notes) {\n    lines.push(formatNotes(record.notes, \"\"));\n  }\n\n  const isAdhoc = program ? Program_isEmpty(program) : record.programId === emptyProgramId;\n  let isMultiWeek = true;\n  if (program && !isAdhoc) {\n    const evaluatedProgram = program && !isAdhoc ? Program_evaluate(program, settings) : undefined;\n    if (evaluatedProgram) {\n      isMultiWeek = evaluatedProgram.weeks.length > 1;\n    }\n  }\n\n  let header = formatDate(record.date);\n  if (!isAdhoc) {\n    header += ` / program: \"${record.programName}\"`;\n    if (isMultiWeek) {\n      header += ` / dayName: \"${record.dayName}\"`;\n      header += ` / week: ${record.week}`;\n      header += ` / dayInWeek: ${record.dayInWeek}`;\n    } else {\n      header += ` / day: ${record.day}`;\n    }\n  }\n  if (record.endTime) {\n    const durationMs = History_workoutTime(record);\n    header += ` / duration: ${Math.round(durationMs / 1000)}s`;\n  }\n  header += ` / exercises: {`;\n  lines.push(header);\n\n  for (const entry of record.entries) {\n    const hasCompletedSets = entry.sets.some((s) => s.completedReps != null);\n    if (!hasCompletedSets) {\n      continue;\n    }\n    if (entry.notes) {\n      lines.push(formatNotes(entry.notes, \"  \"));\n    }\n    lines.push(`  ${serializeEntry(entry, settings)}`);\n  }\n\n  lines.push(\"}\");\n  return lines.join(\"\\n\");\n}\n\nfunction serializeEntry(entry: IHistoryEntry, settings: ISettings): string {\n  const exercise = Exercise_get(entry.exercise, settings.exercises);\n  // Legacy custom exercise names may contain characters the liftohistory grammar rejects,\n  // which would make the export unparseable on re-import.\n  let line = Exercise_fullName({ ...exercise, name: Exercise_sanitizeName(exercise.name) }, settings);\n\n  const completedStr = serializeCompletedSets(entry.sets);\n  if (completedStr) {\n    line += ` / ${completedStr}`;\n  }\n\n  const warmupStr = serializeCompletedSets(entry.warmupSets);\n  if (warmupStr) {\n    line += ` / warmup: ${warmupStr}`;\n  }\n\n  const targetStr = serializeTargetSets(entry.sets);\n  if (targetStr) {\n    line += ` / target: ${targetStr}`;\n  }\n\n  return line;\n}\n\nfunction serializeCompletedSets(sets: ISet[]): string {\n  const completed = sets.filter((s) => s.completedReps != null);\n  if (completed.length === 0) {\n    return \"\";\n  }\n  const groups = Reps_groupConsecutive(completed, Reps_completedSetKey);\n  return groups.map(([set, count]) => formatCompletedSet(set, count)).join(\", \");\n}\n\nfunction formatSeconds(seconds: number): string {\n  return `${Math.round(seconds)}s`;\n}\n\nfunction formatCompletedSet(set: ISet, count: number): string {\n  const reps = set.completedReps ?? 0;\n  let str = `${count}x`;\n  if (set.isUnilateral && set.completedRepsLeft != null) {\n    str += `${reps}|${set.completedRepsLeft}`;\n  } else {\n    str += `${reps}`;\n  }\n  if (set.completedWeight) {\n    str += ` ${Weight_print(set.completedWeight)}`;\n  }\n  if (set.completedRpe != null) {\n    str += ` @${n(set.completedRpe)}`;\n  }\n  if (set.isUnilateral && set.completedSetTimerLeft != null) {\n    str += ` ${set.completedSetTimer != null ? formatSeconds(set.completedSetTimer) : \"?\"}|${formatSeconds(set.completedSetTimerLeft)}`;\n  } else if (set.completedSetTimer != null) {\n    str += ` ${formatSeconds(set.completedSetTimer)}`;\n  }\n  if (set.label) {\n    str += ` (${set.label})`;\n  }\n  return str;\n}\n\nfunction serializeTargetSets(sets: ISet[]): string {\n  const withTargets = sets.filter((s) => s.reps != null || s.weight != null);\n  if (withTargets.length === 0) {\n    return \"\";\n  }\n  const groups = Reps_groupConsecutive(withTargets, Reps_targetSetKey);\n  return groups.map(([set, count]) => formatTargetSet(set, count)).join(\", \");\n}\n\nfunction formatTargetSet(set: ISet, count: number): string {\n  const reps = set.reps ?? 0;\n  let str = `${count}x`;\n  if (set.minReps != null) {\n    str += `${set.minReps}-`;\n  }\n  str += `${reps}`;\n  if (set.isAmrap) {\n    str += \"+\";\n  }\n  if (set.weight) {\n    str += ` ${Weight_print(set.weight)}`;\n    if (set.askWeight) {\n      str += \"+\";\n    }\n  }\n  if (set.rpe != null) {\n    str += ` @${n(set.rpe)}`;\n    if (set.logRpe) {\n      str += \"+\";\n    }\n  }\n  if (set.setTimer != null) {\n    str += ` ${formatSeconds(set.setTimer)}${set.isOverflowSetTimer ? \"+\" : \"\"}|${set.timer != null ? formatSeconds(set.timer) : \"?\"}`;\n  } else if (set.timer != null) {\n    str += ` ${formatSeconds(set.timer)}`;\n  }\n  if (set.label) {\n    str += ` (${set.label})`;\n  }\n  return str;\n}\n","/* eslint-disable no-template-curly-in-string */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport { LRParser } from \"@lezer/lr\";\nconst spec_Keyword: any = { __proto__: null, if: 100, else: 102, for: 104 };\nexport const parser = LRParser.deserialize({\n  version: 14,\n  states:\n    \",fQcQPOOO!iQPO'#C}OOQO'#Cd'#CdO#cQPO'#CdO${QPO'#DXOcQPO'#CiO%SQPO'#CjO%ZQPO'#ClO%`QPO'#CnO%eQQO'#CrO%mQPO'#CuO'ZQPO'#DXOcQPO'#C{OOQO'#DX'#DXQcQPOOOcQPO,58yOcQPO,58yOcQPO,58yOcQPO,58yOcQPO,59VOOQO,59O,59OOOQO,59Q,59QO'eQPO,59TOOQO,59U,59UO'lQPO,59UO'sQPO,59WO'xQPO,59YO'}QPO,59^OcQPO,59^O(SQSO,59aO(ZQPO,59fOcQPO,59]OcQPO,59dOOQO,59g,59gOOQO-E6{-E6{O)uQPO1G.eOOQO1G.e1G.eO)|QPO1G.eO*TQPO1G.eO+hQPO1G.qOOQO1G.o1G.oOOQO1G.p1G.pO+oQPO1G.rO-VQQO1G.tOOQO1G.x1G.xO-[QPO'#CtO-cQPO1G.xO-hQPO'#CvOOQO'#Cw'#CwOOQO'#Cv'#CvO-rQPO1G.{O-zQPO1G/QOcQPO'#DQO.UQPO1G/QOOQO1G/Q1G/QO.^QPO1G.wO/dQPO1G/OOcQPO7+$]O0jQPO7+$^O0rQPO7+$^OcQPO7+$`O2YQQO7+$dO(SQSO'#DPO2_QPO7+$gOOQO7+$g7+$gO2gQPO7+$lOOQO7+$l7+$lO2oQPO,59lOOQO-E7O-E7OO2yQPO<<GwO%ZQPO,59jOOQO<<Gx<<GxO0jQPO<<GxOOQO-E6|-E6|O4PQPO'#CpO4WQPO<<GzO4]QPO<<HOOOQO,59k,59kOOQO-E6}-E6}OOQO<<HR<<HROOQO<<HW<<HWO'sQPO1G/UOOQOAN=dAN=dP0mQPO'#DOO'sQPOAN=fOOQOAN=jAN=jOOQO7+$p7+$pOOQOG23QG23Q\",\n  stateData:\n    \"4m~OwOSPOSxOSyOSzOS~OSROXQO[]OaYOcZOgXOp[O|TO!OUO!SVO!UWO~OS_OT`OUaOVbO!QcO~OXqX[qXaqXcqXgqXpqXuqX|qX!OqX!SqX!UqX!PqX~P!WOXdO~OS{XT{XU{XV{XX{X[{Xa{Xc{Xg{Xp{Xu{X|{X!O{X!Q{X!S{X!U{X}{X!P{X!R{X!X{X!]{X~OZeO~P#hO!PgO~PcO|TO~O|jO~O!WlO!YkO~O|nO!WmOSiXTiXUiXViXXiX[iXaiXciXgiXmiXpiXuiX!OiX!QiX!SiX!UiX![iX}iX!PiX!RiX!XiX!]iX~OmpO![oO~P#hO}xO~P!WO!PyO~PcO!OUO~Oc{O~Oa|O~O!Z!QO~PcO}!WO!]!UO~PcOT`OURiVRiXRi[RiaRicRigRipRiuRi|Ri!ORi!QRi!SRi!URi}Ri!PRi!RRi!XRi!]Ri~OSRi~P(eOS_O~P(eOS_OT`OUaOVRiXRi[RiaRicRigRipRiuRi|Ri!ORi!QRi!SRi!URi}Ri!PRi!RRi!XRi!]Ri~O!R!ZO~P!WO!T![OS`iT`iU`iV`iX`i[`ia`ic`ig`ip`iu`i|`i!O`i!Q`i!S`i!U`i}`i!P`i!R`i!X`i!]`i~O!V!^O~O!XhX~P!WO!X!_O~O!RjX!XjX~P!WO!R!`O!X!bO~O}!dO!]!UO~P!WO}!dO!]!UO~OXei[eiaeiceigeipeiuei|ei!Oei!Sei!Uei}ei!Pei!Rei!Xei!]ei~P!WOXli[lialicliglipliuli|li!Oli!Sli!Uli}li!Pli!Rli!Xli!]li~P!WO!OUO!S!hO~O!T!jOS`qT`qU`qV`qX`q[`qa`qc`qg`qp`qu`q|`q!O`q!Q`q!S`q!U`q}`q!P`q!R`q!X`q!]`q~O!Y!nO~O!R!`O!X!qO~O}!rO!]!UO~O}ta!]ta~P!WOX_y[_ya_yc_yg_yp_yu_y|_y!O_y!S_y!U_y}_y!P_y!R_y!X_y!]_y~P!WO}dX~P!WO}!vO~Oa!wO~OPTg[XScZaZ~\",\n  goto: \"'O|PPP}PPPP!eP}PP!{#i}}P}P$`}$cP$y$c$|%S}P}}P%W%b%h%nPPPPPP%xy]OTU[^_`abchlmnop!U!Z!^!`ySOTU[^_`abchlmnop!U!Z!^!`x]OTU[^_`abchlmnop!U!Z!^!`QiVR!s!hx]OTU[^_`abchlmnop!U!Z!^!`QziQ!i![Q!t!jQ!x!sR!y!vR!m!^yZOTU[^_`abchlmnop!U!Z!^!`R!OlQ!SmR!o!`T!Rm!`Q^OQhUTr^hQ!]zR!k!]Q!a!SR!p!aQ!VnQ!c!TT!f!V!cWPOU^hQfTQq[Qs_Qt`QuaQvbQwcQ}lS!Pm!`Q!TnQ!XoQ!YpQ!e!UQ!g!ZR!l!^\",\n  nodeNames:\n    \"⚠ LineComment Program BinaryExpression Plus Times Cmp AndOr NumberExpression Number WeightExpression Unit Percentage ParenthesisExpression BlockExpression Ternary IfExpression Keyword ForExpression Variable ForInExpression AssignmentExpression StateVariable StateKeyword StateVariableIndex VariableExpression VariableIndex Wildcard IncAssignmentExpression IncAssignment BuiltinFunctionExpression UnaryExpression Not\",\n  maxTerm: 59,\n  skippedNodes: [0, 1],\n  repeatNodeCount: 4,\n  tokenData:\n    \"1S~R}X^$Opq$Oqr$suv%Qvw%Vxy%byz%gz{%l{|%{|}&T}!O%{!O!P&Y!P!Q&r!Q!['f![!](e!]!^(j!^!_(o!_!`(w!`!a(o!a!b)P!c!})U!}#O)g#P#Q)l#T#])U#]#^)q#^#_)U#_#`*m#`#a+i#a#g)U#g#h,Q#h#j)U#j#k.b#k#o)U#o#p0_#p#q0l#q#r0r#r#s0w#y#z$O$f$g$O#BY#BZ$O$IS$I_$O$I|$JO$O$JT$JU$O$KV$KW$O&FU&FV$O~$TYw~X^$Opq$O#y#z$O$f$g$O#BY#BZ$O$IS$I_$O$I|$JO$O$JT$JU$O$KV$KW$O&FU&FV$O~$xPp~!_!`${~%QOU~P%VOTP~%YPvw%]~%bOV~~%gO|~~%lO}~T%sP!ZSTP!_!`%vP%{OmP~&QPS~!_!`%v~&YO!]~V&_P!YQ!Q![&bT&gQXTuv&m!Q![&bT&rO[T~&wQTP!P!Q&}!_!`%v~'SSP~OY&}Z;'S&};'S;=`'`<%lO&}~'cP;=`<%l&}T'kRXTuv&m!O!P't!Q!['fT'yQXTuv&m!Q![(PT(URXTuv&m!O!P(_!Q![(PT(bP!Q![(P~(jO!R~~(oOx~~(tPU~!_!`${~(|P![~!_!`${~)UO!Q~T)ZSaT!Q![)U!c!})U#R#S)U#T#o)U~)lO!W~~)qO!X~V)vUaT!Q![)U!c!})U#R#S)U#T#b)U#b#c*Y#c#o)UV*aS!VQaT!Q![)U!c!})U#R#S)U#T#o)U~*rUaT!Q![)U!c!})U#R#S)U#T#Z)U#Z#[+U#[#o)U~+]SZ~aT!Q![)U!c!})U#R#S)U#T#o)U~+nUaT!Q![)U!c!})U#R#S)U#T#U)U#U#V+U#V#o)U~,VUaT!Q![)U!c!})U#R#S)U#T#h)U#h#i,i#i#o)U~,nTaT!Q![)U!c!})U#R#S)U#T#U,}#U#o)U~-SUaT!Q![)U!c!})U#R#S)U#T#h)U#h#i-f#i#o)U~-kUaT!Q![)U!c!})U#R#S)U#T#X)U#X#Y-}#Y#o)U~.USg~aT!Q![)U!c!})U#R#S)U#T#o)U~.gTaT!Q![)U!c!})U#R#S)U#T#U.v#U#o)U~.{UaT!Q![)U!c!})U#R#S)U#T#f)U#f#g/_#g#o)U~/dTaT!O!P/s!Q![)U!c!})U#R#S)U#T#o)U~/vQ!c!}/|#T#o/|~0RSc~!Q![/|!c!}/|#R#S/|#T#o/|~0dP!O~#r#s0g~0lOy~~0oP#p#q%]~0wO!P~~0zP#q#r0}~1SOz~\",\n  tokenizers: [0, 1, 2],\n  topRules: { Program: [0, 2] },\n  specialized: [{ term: 17, get: (value: any) => spec_Keyword[value] || -1 }],\n  tokenPrec: 892,\n});\n","import { LanguageSupport, syntaxTree } from \"@codemirror/language\";\nimport { CompletionContext } from \"@codemirror/autocomplete\";\nimport type { IProgramState } from \"./types\";\nimport { liftoscriptLanguage } from \"./liftoscriptLanguage\";\nimport { PlannerCompletions_codemirrorLiftoscript } from \"./pages/planner/plannerCompletions\";\n\nexport function buildLiftoscriptLanguageSupport(codeEditor: { state: IProgramState }): LanguageSupport {\n  const liftosaurCompletion = liftoscriptLanguage.data.of({\n    autocomplete: (context: CompletionContext) => {\n      const result = PlannerCompletions_codemirrorLiftoscript(context.state.doc.toString(), context.pos, {\n        tree: syntaxTree(context.state),\n        state: codeEditor.state,\n      });\n      if (result == null) {\n        return null;\n      }\n      return {\n        from: result.from,\n        options: result.options,\n        // The bare word list is what completeFromList used to return, and it re-queries once\n        // the text stops being a word; everything else stays valid and is filtered by\n        // CodeMirror as you type.\n        validFor: result.kind === \"liftoscript\" ? /\\w*$/ : /.*/,\n      };\n    },\n  });\n\n  return new LanguageSupport(liftoscriptLanguage, [liftosaurCompletion]);\n}\n","// import util from \"util\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { ILiftoscriptErrorDetails } from \"./syntaxErrorTypes\";\nimport { IScriptBindings, IScriptFnContext } from \"./models/progress\";\nimport {\n  IScriptFunctions,\n  IScriptFnName,\n  IScriptStaticType,\n  LiftoscriptFns_isFnName,\n  LiftoscriptFns_arity,\n  LiftoscriptFns_argSignature,\n  LiftoscriptFns_isValidArg,\n  LiftoscriptFns_acceptsTypeAt,\n  LiftoscriptFns_bindingStaticType,\n} from \"./liftoscriptFns\";\nimport {\n  Weight_gt,\n  Weight_lt,\n  Weight_gte,\n  Weight_lte,\n  Weight_eq,\n  Weight_build,\n  Weight_print,\n  Weight_smartConvert,\n  Weight_is,\n  Weight_isPct,\n  Weight_buildAny,\n  Weight_applyOp,\n  Weight_convertToWeight,\n  Weight_buildPct,\n  Weight_op,\n} from \"./models/weight\";\nimport { IProgramState, IWeight, IUnit, IPercentage } from \"./types\";\nimport { CollectionUtils_compact } from \"./utils/collection\";\nimport { MathUtils_applyOp, MathUtils_round, MathUtils_clamp, MathUtils_roundFloat } from \"./utils/math\";\nimport { IProgramMode } from \"./models/program\";\nimport { parser as LiftoscriptParser } from \"./liftoscript\";\n\nexport enum NodeName {\n  LineComment = \"LineComment\",\n  Program = \"Program\",\n  BinaryExpression = \"BinaryExpression\",\n  Plus = \"Plus\",\n  Times = \"Times\",\n  Cmp = \"Cmp\",\n  AndOr = \"AndOr\",\n  NumberExpression = \"NumberExpression\",\n  Number = \"Number\",\n  Percentage = \"Percentage\",\n  WeightExpression = \"WeightExpression\",\n  ParenthesisExpression = \"ParenthesisExpression\",\n  BlockExpression = \"BlockExpression\",\n  Ternary = \"Ternary\",\n  IfExpression = \"IfExpression\",\n  ForExpression = \"ForExpression\",\n  ForInExpression = \"ForInExpression\",\n  If = \"If\",\n  Else = \"Else\",\n  AssignmentExpression = \"AssignmentExpression\",\n  IncAssignmentExpression = \"IncAssignmentExpression\",\n  StateVariable = \"StateVariable\",\n  StateVariableIndex = \"StateVariableIndex\",\n  Variable = \"Variable\",\n  BuiltinFunctionExpression = \"BuiltinFunctionExpression\",\n  Keyword = \"Keyword\",\n  VariableExpression = \"VariableExpression\",\n  VariableIndex = \"VariableIndex\",\n  Current = \"Current\",\n  Wildcard = \"Wildcard\",\n  UnaryExpression = \"UnaryExpression\",\n  Not = \"Not\",\n  Unit = \"Unit\",\n}\n\nexport type IAssignmentOp = \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"=\";\n\nexport class LiftoscriptSyntaxError extends SyntaxError {\n  public readonly line: number;\n  public readonly offset: number;\n  public readonly from: number;\n  public readonly to: number;\n  public readonly details: ILiftoscriptErrorDetails;\n\n  constructor(\n    message: string,\n    line: number,\n    offset: number,\n    from: number,\n    to: number,\n    details: ILiftoscriptErrorDetails\n  ) {\n    super(message);\n    this.line = line;\n    this.offset = offset;\n    this.from = from;\n    this.to = to;\n    this.details = details;\n  }\n}\n\nfunction getChildren(node: SyntaxNode): SyntaxNode[] {\n  const cur = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cur.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cur.node);\n  } while (cur.nextSibling());\n  return result;\n}\n\nfunction comparing(\n  left: number | IWeight | IPercentage | (number | IWeight | IPercentage | undefined)[],\n  right: number | IWeight | IPercentage | (number | IWeight | IPercentage | undefined)[],\n  operator: \">\" | \"<\" | \">=\" | \"<=\" | \"==\" | \"!=\"\n): boolean {\n  function comparator(l: number | IWeight | IPercentage, r: number | IWeight | IPercentage): boolean {\n    switch (operator) {\n      case \">\":\n        return Weight_gt(l, r);\n      case \"<\":\n        return Weight_lt(l, r);\n      case \">=\":\n        return Weight_gte(l, r);\n      case \"<=\":\n        return Weight_lte(l, r);\n      case \"==\":\n        return Weight_eq(l, r);\n      case \"!=\":\n        return !Weight_eq(l, r);\n    }\n  }\n\n  if (Array.isArray(left) && Array.isArray(right)) {\n    return left.every((l, i) => comparator(l ?? 0, right[i] ?? 0));\n  } else if (Array.isArray(left) && !Array.isArray(right)) {\n    return left.every((l, i) => comparator(l ?? 0, right ?? 0));\n  } else if (!Array.isArray(left) && Array.isArray(right)) {\n    return right.every((r, i) => comparator(left ?? 0, r ?? 0));\n  } else if (!Array.isArray(left) && !Array.isArray(right)) {\n    return comparator(left ?? 0, right ?? 0);\n  } else {\n    throw new Error(\"Impossible case\");\n  }\n}\n\nfunction assert(name: string): never {\n  throw new LiftoscriptSyntaxError(`Missing required nodes for ${name}, this should never happen`, 0, 0, 0, 1, {\n    type: \"internal\",\n    data: { node: name },\n  });\n}\n\nexport interface ILiftoscriptVariableValue<T> {\n  value: T;\n  op: IAssignmentOp;\n  target: (\"*\" | \"_\" | number)[];\n}\n\nexport type ILiftoscriptEvaluatorUpdate =\n  | { type: \"setVariationIndex\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"exerciseVariationIndex\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"descriptionIndex\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"reps\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"minReps\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"weights\"; value: ILiftoscriptVariableValue<number | IPercentage | IWeight> }\n  | { type: \"timers\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"setTime\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"RPE\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"logrpes\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"amraps\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"askweights\"; value: ILiftoscriptVariableValue<number> }\n  | { type: \"numberOfSets\"; value: ILiftoscriptVariableValue<number> };\n\nexport class LiftoscriptEvaluator {\n  private readonly script: string;\n  private readonly state: IProgramState;\n  private readonly otherStates: Record<number, IProgramState>;\n  private readonly bindings: IScriptBindings;\n  private readonly fns: IScriptFunctions;\n  private readonly fnContext: IScriptFnContext;\n  private readonly unit: IUnit;\n  private readonly mode: IProgramMode;\n  private readonly vars: IProgramState = {};\n  public readonly updates: ILiftoscriptEvaluatorUpdate[] = [];\n\n  constructor(\n    script: string,\n    state: IProgramState,\n    otherStates: Record<number, IProgramState>,\n    bindings: IScriptBindings,\n    fns: IScriptFunctions,\n    fnContext: IScriptFnContext,\n    unit: IUnit,\n    mode: IProgramMode\n  ) {\n    this.script = script;\n    this.state = state;\n    this.otherStates = otherStates;\n    this.bindings = bindings;\n    this.fns = fns;\n    this.fnContext = fnContext;\n    this.unit = unit;\n    this.mode = mode;\n  }\n\n  public static getValueRaw(script: string, node: SyntaxNode): string {\n    return script.slice(node.from, node.to);\n  }\n\n  public static getValue(script: string, node: SyntaxNode): string {\n    return this.getValueRaw(script, node).replace(/\\n/g, \"\\\\n\").replace(/\\t/g, \"\\\\t\");\n  }\n\n  private getValue(node: SyntaxNode): string {\n    return LiftoscriptEvaluator.getValue(this.script, node);\n  }\n\n  private error(message: string, node: SyntaxNode, details: ILiftoscriptErrorDetails): never {\n    const [line, offset] = this.getLineAndOffset(node);\n    throw new LiftoscriptSyntaxError(`${message} (${line}:${offset})`, line, offset, node.from, node.to, details);\n  }\n\n  private staticTypeOfNode(node: SyntaxNode): IScriptStaticType | undefined {\n    if (node.type.name === NodeName.NumberExpression) {\n      return \"number\";\n    } else if (node.type.name === NodeName.WeightExpression) {\n      return \"weight\";\n    } else if (node.type.name === NodeName.Percentage) {\n      return \"percentage\";\n    } else if (node.type.name === NodeName.VariableExpression) {\n      if (node.getChildren(NodeName.VariableIndex).length > 0) {\n        return undefined;\n      }\n      const nameNode = node.getChild(NodeName.Keyword);\n      const name = nameNode != null ? this.getValue(nameNode) : undefined;\n      return name != null ? LiftoscriptFns_bindingStaticType(name) : undefined;\n    }\n    return undefined;\n  }\n\n  private validateFnArg(name: IScriptFnName, index: number, node: SyntaxNode, value: unknown): void {\n    if (LiftoscriptFns_isValidArg(name, index, value)) {\n      return;\n    }\n    if (Array.isArray(value) && !LiftoscriptFns_acceptsTypeAt(name, index, \"array\")) {\n      const argText = this.getValue(node);\n      this.error(\n        `Function '${name}' doesn't accept arrays. Use an index to pick one value, like '${argText}[1]'`,\n        node,\n        { type: \"fnArrayArgument\", data: { fn: name, argText } }\n      );\n    }\n    const argSignature = LiftoscriptFns_argSignature(name, index);\n    const printedValue =\n      Weight_is(value) || Weight_isPct(value)\n        ? `${Weight_print(value)}`\n        : Array.isArray(value)\n          ? \"an array\"\n          : String(value);\n    this.error(\n      `Argument ${index + 1} (${argSignature?.name}) of '${name}' should be ${argSignature?.hint}, but got ${printedValue}`,\n      node,\n      {\n        type: \"fnArgumentType\",\n        data: { fn: name, index, argName: argSignature?.name, hint: argSignature?.hint, got: printedValue },\n      }\n    );\n  }\n\n  private getLineAndOffset(node: SyntaxNode): [number, number] {\n    const linesLengths = this.script.split(\"\\n\").map((l) => l.length + 1);\n    let offset = 0;\n    for (let i = 0; i < linesLengths.length; i++) {\n      const lineLength = linesLengths[i];\n      if (node.from > offset && node.from < offset + lineLength) {\n        return [i + 1, node.from - offset];\n      }\n      offset += lineLength;\n    }\n    return [linesLengths.length, linesLengths[linesLengths.length - 1]];\n  }\n\n  public hasKeyword(expr: SyntaxNode, name: string): boolean {\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.name === NodeName.Keyword) {\n        if (this.getValue(cursor.node) === name) {\n          return true;\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  private getWeight(expr?: SyntaxNode | null): IWeight | undefined {\n    if (expr?.type.name === NodeName.WeightExpression) {\n      const numberNode = expr.getChild(NodeName.NumberExpression);\n      const unitNode = expr.getChild(NodeName.Unit);\n      if (numberNode == null || unitNode == null) {\n        assert(NodeName.WeightExpression);\n      }\n      const num = this.evaluate(numberNode);\n      if (typeof num !== \"number\") {\n        this.error(\"WeightExpression must contain a number\", numberNode, { type: \"malformedWeight\" });\n      }\n      return Weight_build(num, this.getValue(unitNode) as IUnit);\n    } else {\n      return undefined;\n    }\n  }\n\n  public switchWeightsToUnit(programNode: SyntaxNode, toUnit: IUnit): string {\n    const cursor = programNode.cursor();\n    let script = this.script;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === NodeName.WeightExpression) {\n        const weight = this.getWeight(cursor.node);\n        if (weight != null) {\n          if (weight.unit !== toUnit) {\n            const from = cursor.node.from;\n            const to = cursor.node.to;\n            const oldWeightStr = Weight_print(weight);\n            const newWeightStr = Weight_print(Weight_smartConvert(weight, toUnit));\n            script = script.substring(0, from + shift) + newWeightStr + script.substring(to + shift);\n            shift = shift + newWeightStr.length - oldWeightStr.length;\n          }\n        }\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public getStateVariableKeys(expr: SyntaxNode): Set<string> {\n    const cursor = expr.cursor();\n    const stateKeys: Set<string> = new Set();\n    do {\n      if (cursor.node.type.name === NodeName.StateVariable) {\n        const stateKey = this.getStateKey(cursor.node);\n        if (stateKey != null) {\n          stateKeys.add(stateKey);\n        }\n      }\n    } while (cursor.next());\n    return stateKeys;\n  }\n\n  private getStateKey(expr: SyntaxNode): string | undefined {\n    const index = expr.getChild(NodeName.StateVariableIndex);\n    if (index == null) {\n      const stateKeyNode = expr.getChild(NodeName.Keyword);\n      if (stateKeyNode != null) {\n        const stateKey = this.getValue(stateKeyNode);\n        return stateKey;\n      }\n    }\n    return undefined;\n  }\n\n  public parse(expr: SyntaxNode): void {\n    const cursor = expr.cursor();\n    const vars: IProgramState = {};\n    do {\n      if (cursor.node.type.isError) {\n        this.error(\"Syntax error\", cursor.node, { type: \"parse\" });\n      } else if (cursor.node.type.name === NodeName.BuiltinFunctionExpression) {\n        const [keyword, ...fnArgs] = getChildren(cursor.node);\n        if (keyword == null || keyword.type.name !== NodeName.Keyword) {\n          assert(NodeName.BuiltinFunctionExpression);\n        }\n        const name = this.getValue(keyword);\n        if (!LiftoscriptFns_isFnName(name)) {\n          this.error(`Unknown function '${name}'`, keyword, { type: \"unknownFunction\", data: { name } });\n        }\n        const arity = LiftoscriptFns_arity(name);\n        if (fnArgs.length < arity.min || (arity.max != null && fnArgs.length > arity.max)) {\n          const expected = arity.max == null || arity.max === arity.min ? `${arity.min}` : `${arity.min}-${arity.max}`;\n          this.error(\n            `Function '${name}' expects ${expected} argument${arity.max === 1 ? \"\" : \"s\"}, but got ${fnArgs.length}`,\n            keyword,\n            { type: \"fnArity\", data: { fn: name, expected, got: fnArgs.length } }\n          );\n        }\n        fnArgs.forEach((fnArg, index) => {\n          const staticType = this.staticTypeOfNode(fnArg);\n          if (staticType != null && !LiftoscriptFns_acceptsTypeAt(name, index, staticType)) {\n            if (staticType === \"array\") {\n              const argText = this.getValue(fnArg);\n              this.error(\n                `Function '${name}' doesn't accept arrays, and '${argText}' is an array. Use an index to pick one value, like '${argText}[1]'`,\n                fnArg,\n                { type: \"fnArrayArgument\", data: { fn: name, argText } }\n              );\n            } else {\n              const argSignature = LiftoscriptFns_argSignature(name, index);\n              this.error(\n                `Argument ${index + 1} (${argSignature?.name}) of '${name}' should be ${argSignature?.hint}, but '${this.getValue(fnArg)}' is a ${staticType}`,\n                fnArg,\n                {\n                  type: \"fnArgumentType\",\n                  data: {\n                    fn: name,\n                    index,\n                    argName: argSignature?.name,\n                    hint: argSignature?.hint,\n                    got: staticType,\n                  },\n                }\n              );\n            }\n          }\n        });\n      } else if (cursor.node.type.name === NodeName.ForExpression) {\n        const variableNode = cursor.node.getChild(NodeName.Variable);\n        if (variableNode != null) {\n          vars[this.getValue(variableNode)] = 1;\n        }\n      } else if (cursor.node.type.name === NodeName.AssignmentExpression) {\n        const [variableNode] = getChildren(cursor.node);\n        if (variableNode.type.name === NodeName.Variable) {\n          vars[this.getValue(variableNode)] = 1;\n        } else if (variableNode.type.name === NodeName.VariableExpression) {\n          const nameNode = variableNode.getChild(NodeName.Keyword);\n          if (nameNode != null) {\n            const name = this.getValue(nameNode);\n            if (this.mode === \"update\") {\n              if (\n                [\n                  \"reps\",\n                  \"weights\",\n                  \"RPE\",\n                  \"minReps\",\n                  \"numberOfSets\",\n                  \"timers\",\n                  \"setTime\",\n                  \"askweights\",\n                  \"amraps\",\n                  \"logrpes\",\n                ].indexOf(name) === -1\n              ) {\n                this.error(`Cannot assign to '${name}'`, variableNode, { type: \"readonlyVariable\", data: { name } });\n              }\n              const indexExprs = variableNode.getChildren(NodeName.VariableIndex);\n              if (name === \"numberOfSets\" && indexExprs.length > 0) {\n                this.error(`${name} is not an array`, variableNode, { type: \"notAnArray\", data: { name } });\n              } else if (indexExprs.length > 1) {\n                this.error(`Can't assign to set variations, weeks or days here`, variableNode, {\n                  type: \"indexNotAssignableHere\",\n                  data: { name },\n                });\n              }\n            }\n          }\n        }\n      } else if (cursor.node.type.name === NodeName.StateVariable) {\n        const stateKey = this.getStateKey(cursor.node);\n        if (stateKey != null && !(stateKey in this.state)) {\n          this.error(`There's no state variable '${stateKey}'`, cursor.node, {\n            type: \"unknownStateVariable\",\n            data: { stateKey },\n          });\n        }\n      } else if (cursor.node.type.name === NodeName.Variable) {\n        const variableKey = this.getValue(cursor.node);\n        if (!(variableKey in vars)) {\n          this.error(`There's no variable '${variableKey}'`, cursor.node, {\n            type: \"unknownVariable\",\n            data: { name: variableKey },\n          });\n        }\n      } else if (cursor.node.type.name === NodeName.VariableExpression) {\n        const [nameNode, indexExpr] = getChildren(cursor.node);\n        if (nameNode == null) {\n          assert(NodeName.VariableExpression);\n        }\n        const name = this.getValue(nameNode);\n        if (indexExpr != null) {\n          const validNames: (keyof IScriptBindings)[] = [\n            \"originalWeights\",\n            \"weights\",\n            \"reps\",\n            \"minReps\",\n            \"completedReps\",\n            \"completedRepsLeft\",\n            \"completedWeights\",\n            \"timers\",\n            \"setTime\",\n            \"completedSetTime\",\n            \"completedSetTimeLeft\",\n            \"w\",\n            \"r\",\n            \"cr\",\n            \"cw\",\n            \"mr\",\n            \"completedRPE\",\n            \"bodyweight\",\n            \"RPE\",\n            \"setVariationIndex\",\n            \"exerciseVariationIndex\",\n            \"descriptionIndex\",\n            \"numberOfSets\",\n            \"programNumberOfSets\",\n            \"completedNumberOfSets\",\n            \"amraps\",\n            \"logrpes\",\n            \"askweights\",\n          ];\n          if (validNames.indexOf(name as keyof IScriptBindings) === -1) {\n            this.error(`${name} is not an array variable`, nameNode, { type: \"notAnArray\", data: { name } });\n          }\n        } else if (!(name in this.bindings)) {\n          this.error(`${name} is not a valid variable`, nameNode, { type: \"unknownVariable\", data: { name } });\n        }\n      }\n    } while (cursor.next());\n  }\n\n  public static changeWeightsToCompleteWeights(oldScript: string): string {\n    const node = LiftoscriptParser.parse(oldScript);\n    const cursor = node.cursor();\n    let script = oldScript;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === NodeName.VariableExpression) {\n        const keywordNode = cursor.node.getChild(NodeName.Keyword);\n        if (keywordNode) {\n          const keyword = LiftoscriptEvaluator.getValue(oldScript, keywordNode);\n          if (keyword === \"weights\") {\n            const parent = cursor.node.parent;\n            if (\n              parent != null &&\n              !(\n                (parent.type.name === NodeName.AssignmentExpression ||\n                  parent.type.name === NodeName.IncAssignmentExpression) &&\n                parent.firstChild?.from === cursor.node.from &&\n                parent.firstChild?.to === cursor.node.to\n              )\n            ) {\n              const from = keywordNode.from;\n              const to = keywordNode.to;\n              const oldWeightStr = keyword;\n              const newWeightStr = \"completedWeights\";\n              script = script.substring(0, from + shift) + newWeightStr + script.substring(to + shift);\n              shift = shift + newWeightStr.length - oldWeightStr.length;\n            }\n          }\n        }\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  private evaluateToNumber(expr: SyntaxNode): number {\n    const v = this.evaluate(expr);\n    const v1 = Array.isArray(v) ? v[0] : v;\n    return Weight_is(v1) ? v1.value : typeof v1 === \"number\" ? v1 : v1 ? 1 : 0;\n  }\n\n  private evaluateToNumberOrWeightOrPercentage(expr: SyntaxNode): number | IWeight | IPercentage {\n    const v = this.evaluate(expr);\n    const v1 = Array.isArray(v) ? v[0] : v;\n    return Weight_is(v1) || Weight_isPct(v1) ? v1 : typeof v1 === \"number\" ? v1 : v1 ? 1 : 0;\n  }\n\n  private changeNumberOfSets(expression: SyntaxNode, op: IAssignmentOp): number | IWeight | IPercentage {\n    const oldNumberOfSets = this.bindings.weights.length;\n    const evaluatedValue = MathUtils_applyOp(this.bindings.numberOfSets, this.evaluateToNumber(expression), op);\n\n    this.bindings.weights = this.bindings.weights.slice(0, evaluatedValue);\n    this.bindings.originalWeights = this.bindings.originalWeights.slice(0, evaluatedValue);\n    this.bindings.reps = this.bindings.reps.slice(0, evaluatedValue);\n    this.bindings.minReps = this.bindings.minReps.slice(0, evaluatedValue);\n    this.bindings.RPE = this.bindings.RPE.slice(0, evaluatedValue);\n    this.bindings.w = this.bindings.weights.slice(0, evaluatedValue);\n    this.bindings.r = this.bindings.reps.slice(0, evaluatedValue);\n    this.bindings.mr = this.bindings.minReps.slice(0, evaluatedValue);\n    this.bindings.timers = this.bindings.timers.slice(0, evaluatedValue);\n    this.bindings.setTime = this.bindings.setTime.slice(0, evaluatedValue);\n    this.bindings.amraps = this.bindings.amraps.slice(0, evaluatedValue);\n    this.bindings.logrpes = this.bindings.logrpes.slice(0, evaluatedValue);\n    this.bindings.askweights = this.bindings.askweights.slice(0, evaluatedValue);\n    this.bindings.completedReps = this.bindings.completedReps.slice(0, evaluatedValue);\n    this.bindings.completedRepsLeft = this.bindings.completedRepsLeft.slice(0, evaluatedValue);\n    this.bindings.cr = this.bindings.cr.slice(0, evaluatedValue);\n    this.bindings.cw = this.bindings.cw.slice(0, evaluatedValue);\n    this.bindings.completedWeights = this.bindings.completedWeights.slice(0, evaluatedValue);\n    this.bindings.completedRPE = this.bindings.completedRPE.slice(0, evaluatedValue);\n    this.bindings.isCompleted = this.bindings.isCompleted.slice(0, evaluatedValue);\n\n    const ns = oldNumberOfSets - 1;\n    for (let i = 0; i < evaluatedValue; i += 1) {\n      if (i > ns) {\n        this.bindings.weights[i] = Weight_build(\n          this.bindings.weights[ns]?.value ?? 0,\n          this.bindings.weights[ns]?.unit || \"lb\"\n        );\n        this.bindings.originalWeights[i] = Weight_buildAny(\n          this.bindings.originalWeights[ns]?.value ?? 0,\n          this.bindings.originalWeights[ns]?.unit || \"lb\"\n        );\n        this.bindings.reps[i] = this.bindings.reps[ns] ?? 0;\n        this.bindings.timers[i] = this.bindings.timers[ns];\n        this.bindings.setTime[i] = this.bindings.setTime[ns];\n        this.bindings.amraps[i] = this.bindings.amraps[ns];\n        this.bindings.logrpes[i] = this.bindings.logrpes[ns];\n        this.bindings.askweights[i] = this.bindings.askweights[ns];\n        this.bindings.minReps[i] = this.bindings.minReps[ns];\n        this.bindings.RPE[i] = this.bindings.RPE[ns];\n        this.bindings.w[i] = this.bindings.weights[i];\n        this.bindings.r[i] = this.bindings.reps[i];\n        this.bindings.mr[i] = this.bindings.minReps[i];\n        this.bindings.completedReps[i] = undefined;\n        this.bindings.completedRepsLeft[i] = undefined;\n        this.bindings.completedWeights[i] = undefined;\n        this.bindings.completedRPE[i] = undefined;\n        this.bindings.cr[i] = undefined;\n        this.bindings.cw[i] = undefined;\n        this.bindings.isCompleted[i] = 0;\n      }\n    }\n\n    this.bindings.numberOfSets = evaluatedValue;\n    this.bindings.ns = evaluatedValue;\n\n    return evaluatedValue;\n  }\n\n  private changeBinding(\n    key: \"reps\" | \"weights\" | \"RPE\" | \"minReps\" | \"timers\" | \"setTime\" | \"logrpes\" | \"amraps\" | \"askweights\",\n    expression: SyntaxNode,\n    indexExprs: SyntaxNode[],\n    op: IAssignmentOp\n  ): number | IWeight | IPercentage {\n    const indexes = indexExprs.map((ie) => getChildren(ie)[0]);\n    const maxTargetLength = 1;\n    if (indexes.length > maxTargetLength) {\n      this.error(`${key} can only have 1 value inside []`, expression, {\n        type: \"tooManyIndexes\",\n        data: { key, max: 1 },\n      });\n    }\n    const indexValues = this.calculateIndexValues(indexes);\n    const normalizedIndexValues = this.normalizeTarget(indexValues, maxTargetLength);\n    const [setIndex] = normalizedIndexValues;\n    let value: number | IWeight | IPercentage = 0;\n    if (key === \"weights\") {\n      for (let i = 0; i < this.bindings.weights.length; i += 1) {\n        if (!this.bindings.isCompleted[i] && (setIndex === \"*\" || setIndex === i + 1)) {\n          const evalutedValue = this.evaluateToNumberOrWeightOrPercentage(expression);\n          const newValue = Weight_applyOp(\n            this.bindings.rm1,\n            this.bindings.weights[i] ?? Weight_build(0, this.unit),\n            evalutedValue,\n            op\n          );\n          value = Weight_convertToWeight(this.bindings.rm1, newValue, this.unit);\n          this.bindings.originalWeights[i] = value;\n          this.bindings.weights[i] = this.fns.roundWeight([value], this.fnContext, this.bindings);\n        }\n      }\n    } else {\n      for (let i = 0; i < this.bindings[key].length; i += 1) {\n        if (!this.bindings.isCompleted[i] && (setIndex === \"*\" || setIndex === i + 1)) {\n          const evaluatedValue = this.evaluateToNumber(expression);\n          value = MathUtils_applyOp(this.bindings[key][i] ?? 0, evaluatedValue, op);\n          if (key === \"RPE\") {\n            value = MathUtils_round(MathUtils_clamp(value, 0, 10), 0.5);\n          }\n          if (key === \"amraps\" || key === \"logrpes\" || key === \"askweights\") {\n            value = Math.round(MathUtils_clamp(value, 0, 1));\n          }\n          this.bindings[key][i] = value;\n        }\n      }\n    }\n    return value;\n  }\n\n  private recordVariableUpdate(\n    key:\n      | \"reps\"\n      | \"weights\"\n      | \"timers\"\n      | \"setTime\"\n      | \"RPE\"\n      | \"minReps\"\n      | \"setVariationIndex\"\n      | \"exerciseVariationIndex\"\n      | \"descriptionIndex\"\n      | \"numberOfSets\"\n      | \"logrpes\"\n      | \"amraps\"\n      | \"askweights\",\n    expression: SyntaxNode,\n    indexExprs: SyntaxNode[],\n    op: IAssignmentOp\n  ): number | IWeight | IPercentage {\n    const indexes = indexExprs.map((ie) => getChildren(ie)[0]);\n    const maxTargetLength =\n      key === \"setVariationIndex\" || key === \"exerciseVariationIndex\" || key === \"descriptionIndex\"\n        ? 2\n        : key === \"numberOfSets\"\n          ? 3\n          : 4;\n    if (key === \"setVariationIndex\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`setVariationIndex can only have 2 values inside [*:*]`, expression, {\n          type: \"tooManyIndexes\",\n          data: { key, max: 2 },\n        });\n      }\n    } else if (key === \"exerciseVariationIndex\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`exerciseVariationIndex can only have 2 values inside [*:*]`, expression, {\n          type: \"tooManyIndexes\",\n          data: { key, max: 2 },\n        });\n      }\n    } else if (key === \"descriptionIndex\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`descriptionIndex can only have 2 values inside [*:*]`, expression, {\n          type: \"tooManyIndexes\",\n          data: { key, max: 2 },\n        });\n      }\n    } else if (key === \"numberOfSets\") {\n      if (indexes.length > maxTargetLength) {\n        this.error(`numberOfSets can only have 3 values inside [*:*:*]`, expression, {\n          type: \"tooManyIndexes\",\n          data: { key, max: 3 },\n        });\n      }\n    } else if (indexes.length > maxTargetLength) {\n      this.error(`${key} can only have 4 values inside [*:*:*:*]`, expression, {\n        type: \"tooManyIndexes\",\n        data: { key, max: 4 },\n      });\n    }\n    const indexValues = this.calculateIndexValues(indexes);\n    const normalizedIndexValues = this.normalizeTarget(indexValues, maxTargetLength);\n    let result: number | IWeight | IPercentage;\n    if (key === \"weights\") {\n      result = this.evaluateToNumberOrWeightOrPercentage(expression);\n      this.updates.push({ type: key, value: { value: result, op, target: normalizedIndexValues } });\n    } else {\n      result = this.evaluateToNumber(expression);\n      this.updates.push({ type: key, value: { value: result, op, target: normalizedIndexValues } });\n      if (key === \"setVariationIndex\") {\n        const [week, day] = normalizedIndexValues;\n        if ((week === \"*\" || week === this.bindings.week) && (day === \"*\" || day === this.bindings.day)) {\n          this.bindings.setVariationIndex = result;\n        }\n      } else if (key === \"exerciseVariationIndex\") {\n        const [week, day] = normalizedIndexValues;\n        if ((week === \"*\" || week === this.bindings.week) && (day === \"*\" || day === this.bindings.day)) {\n          this.bindings.exerciseVariationIndex = result;\n        }\n      } else if (key === \"descriptionIndex\") {\n        const [week, day] = normalizedIndexValues;\n        if ((week === \"*\" || week === this.bindings.week) && (day === \"*\" || day === this.bindings.day)) {\n          this.bindings.descriptionIndex = result;\n        }\n      } else if (key === \"numberOfSets\") {\n        const [week, day, setVariationIndex] = normalizedIndexValues;\n        if (\n          (week === \"*\" || week === this.bindings.week) &&\n          (day === \"*\" || day === this.bindings.day) &&\n          (setVariationIndex === \"*\" || setVariationIndex === this.bindings.setVariationIndex)\n        ) {\n          this.bindings.numberOfSets = result;\n          this.bindings.ns = result;\n        }\n      }\n    }\n\n    return result;\n  }\n\n  private calculateIndexValues(indexes: SyntaxNode[]): (number | \"*\")[] {\n    return CollectionUtils_compact(indexes).map((ie) => {\n      if (ie.type.name === NodeName.Wildcard) {\n        return \"*\" as const;\n      } else {\n        const v = this.evaluate(ie);\n        const v1 = Array.isArray(v) ? v[0] : v;\n        return Weight_is(v1) ? v1.value : typeof v1 === \"number\" ? v1 : v1 ? 1 : 0;\n      }\n    });\n  }\n\n  private normalizeTarget(target: (number | \"*\")[], length: number): (number | \"*\")[] {\n    const newTarget = [...target];\n    for (let i = 0; i < length - target.length; i += 1) {\n      newTarget.unshift(\"*\");\n    }\n    return newTarget;\n  }\n\n  private toNumber(\n    value: number | boolean | IWeight | IPercentage | (IWeight | IPercentage | number | undefined)[]\n  ): number {\n    if (typeof value === \"number\") {\n      return value;\n    } else if (typeof value === \"boolean\") {\n      return 0;\n    } else if (Weight_is(value)) {\n      return value.value;\n    } else if (Weight_isPct(value)) {\n      return value.value;\n    } else if (Array.isArray(value)) {\n      return this.toNumber(value[0] ?? 0);\n    } else {\n      return 0;\n    }\n  }\n\n  public evaluate(\n    expr: SyntaxNode\n  ): number | boolean | IWeight | IPercentage | (IWeight | IPercentage | number | undefined)[] {\n    if (expr.type.name === NodeName.Program || expr.type.name === NodeName.BlockExpression) {\n      let result: number | boolean | IWeight | (IWeight | IPercentage | number | undefined)[] | IPercentage = 0;\n      for (const child of getChildren(expr)) {\n        if (!child.type.isSkipped) {\n          result = this.evaluate(child);\n        }\n      }\n      return result;\n    } else if (expr.type.name === NodeName.BinaryExpression) {\n      const [left, operator, right] = getChildren(expr);\n      const evalLeft = this.evaluate(left);\n      const evalRight = this.evaluate(right);\n      const op = this.getValue(operator);\n      if (typeof evalLeft === \"boolean\" || typeof evalRight === \"boolean\") {\n        if (op === \"&&\") {\n          return evalLeft && evalRight;\n        } else if (op === \"||\") {\n          return evalLeft || evalRight;\n        } else {\n          this.error(`Unknown operator ${op}`, operator, { type: \"unknownOperator\", data: { op } });\n        }\n      } else {\n        if (op === \">\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"<\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \">=\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"<=\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"==\") {\n          return comparing(evalLeft, evalRight, op);\n        } else if (op === \"!=\") {\n          return comparing(evalLeft, evalRight, op);\n        } else {\n          if (Array.isArray(evalLeft) || Array.isArray(evalRight)) {\n            this.error(`You cannot apply ${op} to arrays`, operator, { type: \"operatorOnArray\", data: { op } });\n          }\n          if (op === \"+\") {\n            return this.add(evalLeft, evalRight);\n          } else if (op === \"-\") {\n            return this.subtract(evalLeft, evalRight);\n          } else if (op === \"*\") {\n            return this.multiply(evalLeft, evalRight);\n          } else if (op === \"/\") {\n            return this.divide(evalLeft, evalRight);\n          } else if (op === \"%\") {\n            return this.modulo(evalLeft, evalRight);\n          } else {\n            this.error(`Unknown operator ${op} between ${evalLeft} and ${evalRight}`, operator, {\n              type: \"unknownOperator\",\n              data: { op },\n            });\n          }\n        }\n      }\n    } else if (expr.type.name === NodeName.NumberExpression) {\n      const numberNode = expr.getChild(NodeName.Number);\n      if (numberNode == null) {\n        assert(NodeName.NumberExpression);\n      }\n      const value = parseFloat(this.getValue(numberNode));\n      const plusNode = expr.getChild(NodeName.Plus);\n      const sign = plusNode ? this.getValue(plusNode) : undefined;\n      return sign === \"-\" ? -value : value;\n    } else if (expr.type.name === NodeName.Percentage) {\n      const value = MathUtils_roundFloat(parseFloat(this.getValue(expr)), 2);\n      return Weight_buildPct(value);\n    } else if (expr.type.name === NodeName.Ternary) {\n      const [condition, then, or] = getChildren(expr);\n      return this.evaluate(condition) ? this.evaluate(then) : this.evaluate(or);\n    } else if (expr.type.name === NodeName.ForExpression) {\n      const variableNode = expr.getChild(NodeName.Variable);\n      const forInExpression = expr.getChild(NodeName.ForInExpression);\n      const blockNode = expr.getChild(NodeName.BlockExpression);\n      if (variableNode == null) {\n        assert(NodeName.ForExpression);\n      }\n      if (forInExpression == null) {\n        assert(NodeName.ForInExpression);\n      }\n      if (blockNode == null) {\n        assert(NodeName.BlockExpression);\n      }\n      const forIn = this.evaluate(forInExpression);\n      if (!Array.isArray(forIn)) {\n        this.error(`for in expression should return an array`, forInExpression, { type: \"forInNotArray\" });\n      }\n      const varKey = this.getValue(variableNode).replace(\"var.\", \"\");\n      for (let i = 1; i <= forIn.length; i += 1) {\n        this.vars[varKey] = i;\n        this.evaluate(blockNode);\n      }\n      return forIn.length;\n    } else if (expr.type.name === NodeName.IfExpression) {\n      const parenthesisNodes = expr.getChildren(NodeName.ParenthesisExpression);\n      const blockNodes = expr.getChildren(NodeName.BlockExpression);\n      while (parenthesisNodes.length > 0) {\n        const parenthesisNode = parenthesisNodes.shift()!;\n        const blockNode = blockNodes.shift()!;\n        const condition = this.evaluate(parenthesisNode);\n        if (condition) {\n          return this.evaluate(blockNode);\n        }\n      }\n      const lastBlock = blockNodes.shift();\n      if (lastBlock != null) {\n        return this.evaluate(lastBlock);\n      } else {\n        return 0;\n      }\n    } else if (expr.type.name === NodeName.ParenthesisExpression) {\n      const [node] = getChildren(expr);\n      if (node == null) {\n        assert(NodeName.ParenthesisExpression);\n      }\n      return this.evaluate(node);\n    } else if (expr.type.name === NodeName.StateVariableIndex) {\n      const [expression] = getChildren(expr);\n      return this.evaluate(expression);\n    } else if (expr.type.name === NodeName.AssignmentExpression) {\n      const [variableNode, expression] = getChildren(expr);\n      if (\n        variableNode == null ||\n        (variableNode.type.name !== NodeName.StateVariable &&\n          variableNode.type.name !== NodeName.VariableExpression &&\n          variableNode.type.name !== NodeName.Variable) ||\n        expression == null\n      ) {\n        assert(NodeName.AssignmentExpression);\n      }\n      if (variableNode.type.name === NodeName.VariableExpression) {\n        const nameNode = variableNode.getChild(NodeName.Keyword);\n        if (nameNode == null) {\n          this.error(`Missing variable name`, variableNode, { type: \"missingVariableName\" });\n        }\n        const indexExprs = variableNode.getChildren(NodeName.VariableIndex);\n        const variable = this.getValue(nameNode);\n        if (variable === \"rm1\") {\n          if (indexExprs.length > 0) {\n            this.error(`rm1 is not an array`, expr, { type: \"notAnArray\", data: { name: \"rm1\" } });\n          }\n          const evaluatedValue = this.evaluate(expression);\n          let value = Array.isArray(evaluatedValue) ? evaluatedValue[0] : evaluatedValue;\n          value = value ?? 0;\n          value = value === true ? 1 : value === false ? 0 : value;\n          value = Weight_convertToWeight(this.bindings.rm1, value, this.unit);\n          this.bindings.rm1 = value;\n          return value;\n        } else if (\n          this.mode === \"planner\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTime\" ||\n            variable === \"logrpes\" ||\n            variable === \"amraps\" ||\n            variable === \"askweights\" ||\n            variable === \"setVariationIndex\" ||\n            variable === \"exerciseVariationIndex\" ||\n            variable === \"descriptionIndex\" ||\n            variable === \"numberOfSets\")\n        ) {\n          return this.recordVariableUpdate(variable, expression, indexExprs, \"=\");\n        } else if (this.mode === \"update\" && variable === \"numberOfSets\") {\n          return this.changeNumberOfSets(expression, \"=\");\n        } else if (\n          this.mode === \"update\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"amraps\" ||\n            variable === \"logrpes\" ||\n            variable === \"askweights\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTime\")\n        ) {\n          return this.changeBinding(variable, expression, indexExprs, \"=\");\n        } else {\n          this.error(`Unknown variable '${variable}'`, variableNode, {\n            type: \"unknownVariable\",\n            data: { name: variable },\n          });\n        }\n      } else if (variableNode.type.name === NodeName.Variable) {\n        const varKey = this.getValue(variableNode).replace(\"var.\", \"\");\n        const value = this.evaluate(expression);\n        if (Weight_is(value) || Weight_isPct(value) || typeof value === \"number\") {\n          this.vars[varKey] = value;\n        } else {\n          this.vars[varKey] = value ? 1 : 0;\n        }\n        return this.vars[varKey];\n      } else {\n        const indexNode = variableNode.getChild(NodeName.StateVariableIndex);\n        const stateKeyNode = variableNode.getChild(NodeName.Keyword);\n        if (stateKeyNode != null) {\n          const stateKey = this.getValue(stateKeyNode);\n          let state: IProgramState | undefined;\n          if (indexNode == null) {\n            if (stateKey in this.state) {\n              state = this.state;\n            } else {\n              this.error(`There's no state variable '${stateKey}'`, variableNode, {\n                type: \"unknownStateVariable\",\n                data: { stateKey },\n              });\n            }\n          } else {\n            const indexEval = this.evaluate(indexNode);\n            const index = this.toNumber(indexEval);\n            state = this.otherStates[index];\n          }\n          const value = this.evaluate(expression);\n          if (state != null) {\n            if (Weight_is(value) || Weight_isPct(value) || typeof value === \"number\") {\n              state[stateKey] = value;\n            } else {\n              state[stateKey] = value ? 1 : 0;\n            }\n          }\n          return value;\n        } else {\n          return 0;\n        }\n      }\n    } else if (expr.type.name === NodeName.IncAssignmentExpression) {\n      const [stateVar, incAssignmentExpr, expression] = getChildren(expr);\n      if (\n        stateVar == null ||\n        (stateVar.type.name !== NodeName.StateVariable &&\n          stateVar.type.name !== NodeName.VariableExpression &&\n          stateVar.type.name !== NodeName.Variable) ||\n        expression == null ||\n        incAssignmentExpr == null\n      ) {\n        assert(NodeName.IncAssignmentExpression);\n      }\n      if (stateVar.type.name === NodeName.VariableExpression) {\n        const nameNode = stateVar.getChild(NodeName.Keyword);\n        if (nameNode == null) {\n          this.error(`Missing variable name`, stateVar, { type: \"missingVariableName\" });\n        }\n        const indexExprs = stateVar.getChildren(NodeName.VariableIndex);\n        const variable = this.getValue(nameNode);\n        if (variable === \"rm1\") {\n          if (indexExprs.length > 0) {\n            this.error(`rm1 is not an array`, expr, { type: \"notAnArray\", data: { name: \"rm1\" } });\n          }\n          const evaluatedValue = this.evaluate(expression);\n          let value = Array.isArray(evaluatedValue) ? evaluatedValue[0] : evaluatedValue;\n          value = value ?? 0;\n          value = value === true ? 1 : value === false ? 0 : value;\n\n          const op = this.getValue(incAssignmentExpr);\n          if (op === \"+=\") {\n            this.bindings.rm1 = Weight_convertToWeight(\n              this.bindings.rm1,\n              this.add(this.bindings.rm1, value),\n              this.unit\n            );\n          } else if (op === \"-=\") {\n            this.bindings.rm1 = Weight_convertToWeight(\n              this.bindings.rm1,\n              this.subtract(this.bindings.rm1, value),\n              this.unit\n            );\n          } else if (op === \"*=\") {\n            this.bindings.rm1 = Weight_convertToWeight(\n              this.bindings.rm1,\n              this.multiply(this.bindings.rm1, value),\n              this.unit\n            );\n          } else if (op === \"/=\") {\n            this.bindings.rm1 = Weight_convertToWeight(\n              this.bindings.rm1,\n              this.divide(this.bindings.rm1, value),\n              this.unit\n            );\n          } else {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr, {\n              type: \"unknownAssignmentOperator\",\n              data: { op, variable },\n            });\n          }\n          return this.bindings.rm1;\n        } else if (\n          this.mode === \"planner\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTime\" ||\n            variable === \"setVariationIndex\" ||\n            variable === \"exerciseVariationIndex\" ||\n            variable === \"descriptionIndex\" ||\n            variable === \"numberOfSets\")\n        ) {\n          const op = this.getValue(incAssignmentExpr);\n          if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr, {\n              type: \"unknownAssignmentOperator\",\n              data: { op, variable },\n            });\n          }\n          return this.recordVariableUpdate(variable, expression, indexExprs, op);\n        } else if (this.mode === \"update\" && variable === \"numberOfSets\") {\n          const op = this.getValue(incAssignmentExpr);\n          if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr, {\n              type: \"unknownAssignmentOperator\",\n              data: { op, variable },\n            });\n          }\n          return this.changeNumberOfSets(expression, op);\n        } else if (\n          this.mode === \"update\" &&\n          (variable === \"reps\" ||\n            variable === \"weights\" ||\n            variable === \"RPE\" ||\n            variable === \"minReps\" ||\n            variable === \"timers\" ||\n            variable === \"setTime\")\n        ) {\n          const op = this.getValue(incAssignmentExpr);\n          if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n            this.error(`Unknown operator ${op} after ${variable}`, incAssignmentExpr, {\n              type: \"unknownAssignmentOperator\",\n              data: { op, variable },\n            });\n          }\n          return this.changeBinding(variable, expression, indexExprs, op);\n        } else {\n          this.error(`Unknown variable '${variable}'`, stateVar, {\n            type: \"unknownVariable\",\n            data: { name: variable },\n          });\n        }\n      } else if (stateVar.type.name === NodeName.Variable) {\n        const varKey = this.getValue(stateVar).replace(\"var.\", \"\");\n        let value = this.evaluate(expression);\n        if (!(Weight_is(value) || Weight_isPct(value) || typeof value === \"number\")) {\n          value = value ? 1 : 0;\n        }\n        const op = this.getValue(incAssignmentExpr);\n        if (op !== \"=\" && op !== \"+=\" && op !== \"-=\" && op !== \"*=\" && op !== \"/=\") {\n          this.error(`Unknown operator ${op} after ${varKey}`, incAssignmentExpr, {\n            type: \"unknownAssignmentOperator\",\n            data: { op, variable: varKey },\n          });\n        }\n        const currentValue = this.vars[varKey];\n        if (op === \"+=\") {\n          this.vars[varKey] = this.add(currentValue, value);\n        } else if (op === \"-=\") {\n          this.vars[varKey] = this.subtract(currentValue, value);\n        } else if (op === \"*=\") {\n          this.vars[varKey] = this.multiply(currentValue, value);\n        } else if (op === \"/=\") {\n          this.vars[varKey] = this.divide(currentValue, value);\n        } else {\n          this.error(`Unknown operator ${op} after ${varKey}`, incAssignmentExpr, {\n            type: \"unknownAssignmentOperator\",\n            data: { op, variable: varKey },\n          });\n        }\n        return this.vars[varKey];\n      } else {\n        const indexNode = stateVar.getChild(NodeName.StateVariableIndex);\n        const stateKeyNode = stateVar.getChild(NodeName.Keyword);\n        if (stateKeyNode != null) {\n          const stateKey = this.getValue(stateKeyNode);\n          let state: IProgramState | undefined;\n          if (indexNode == null) {\n            if (stateKey in this.state) {\n              state = this.state;\n            } else {\n              this.error(`There's no state variable '${stateKey}'`, stateVar, {\n                type: \"unknownStateVariable\",\n                data: { stateKey },\n              });\n            }\n          } else {\n            const indexEval = this.evaluate(indexNode);\n            const index = this.toNumber(indexEval);\n            state = this.otherStates[index];\n          }\n\n          let value = this.evaluate(expression);\n          if (state != null) {\n            if (!(Weight_is(value) || Weight_isPct(value) || typeof value === \"number\")) {\n              value = value ? 1 : 0;\n            }\n            const op = this.getValue(incAssignmentExpr);\n            const currentValue = state[stateKey] ?? 0;\n            if (op === \"+=\") {\n              state[stateKey] = this.add(currentValue, value);\n            } else if (op === \"-=\") {\n              state[stateKey] = this.subtract(currentValue, value);\n            } else if (op === \"*=\") {\n              state[stateKey] = this.multiply(currentValue, value);\n            } else if (op === \"/=\") {\n              state[stateKey] = this.divide(currentValue, value);\n            } else {\n              this.error(`Unknown operator ${op} after state.${stateKey}`, incAssignmentExpr, {\n                type: \"unknownAssignmentOperator\",\n                data: { op, variable: `state.${stateKey}` },\n              });\n            }\n            return state[stateKey];\n          } else {\n            return value;\n          }\n        } else {\n          return 0;\n        }\n      }\n    } else if (expr.type.name === NodeName.BuiltinFunctionExpression) {\n      const fns = this.fns;\n      const [keyword, ...args] = getChildren(expr);\n      if (keyword == null || keyword.type.name !== NodeName.Keyword) {\n        assert(NodeName.BuiltinFunctionExpression);\n      }\n      const name = this.getValue(keyword);\n      if (LiftoscriptFns_isFnName(name) && fns[name] != null) {\n        const argValues = args.map((a, index) => {\n          const value = this.evaluate(a);\n          this.validateFnArg(name, index, a, value);\n          return value;\n        });\n        const fn = fns[name];\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return (fn as any)(argValues, this.fnContext, this.bindings);\n      } else {\n        this.error(`Unknown function '${name}'`, keyword, { type: \"unknownFunction\", data: { name } });\n      }\n    } else if (expr.type.name === NodeName.UnaryExpression) {\n      const [, expression] = getChildren(expr);\n      if (expression == null) {\n        assert(NodeName.UnaryExpression);\n      }\n      const evaluated = this.evaluate(expression);\n      return !evaluated;\n    } else if (expr.type.name === NodeName.WeightExpression) {\n      return this.getWeight(expr) ?? Weight_build(0, this.unit);\n    } else if (expr.type.name === NodeName.VariableExpression) {\n      const [nameNode, ...indexExprs] = getChildren(expr);\n      if (nameNode == null) {\n        assert(NodeName.VariableExpression);\n      }\n      const name = this.getValue(nameNode) as keyof IScriptBindings;\n      if (indexExprs.some((e) => e.type.name !== NodeName.VariableIndex)) {\n        assert(NodeName.VariableIndex);\n      }\n      if (indexExprs.length === 0) {\n        let value = this.bindings[name];\n        if (Array.isArray(value) && name === \"minReps\") {\n          value = value.map((v, i) => (v as number) ?? this.bindings.reps[i]);\n        }\n        return value;\n      } else if (indexExprs.length === 1) {\n        const indexExpr = indexExprs[0];\n        const indexNode = getChildren(indexExpr)[0];\n        if (indexNode.type.name === NodeName.Wildcard || indexNode.type.name === NodeName.Current) {\n          this.error(`Can't use '*' or '_' as an index when reading from variables`, indexNode, {\n            type: \"wildcardIndexOnRead\",\n          });\n        }\n        const indexEval = this.evaluate(indexNode);\n        let index: number;\n        if (Weight_is(indexEval) || Weight_isPct(indexEval)) {\n          index = indexEval.value;\n        } else if (typeof indexEval === \"number\") {\n          index = indexEval;\n        } else {\n          index = indexEval ? 1 : 0;\n        }\n        index -= 1;\n        const binding = this.bindings[name];\n        if (!Array.isArray(binding)) {\n          this.error(`Variable ${name} should be an array`, nameNode, { type: \"notAnArray\", data: { name } });\n        }\n        if (index >= binding.length) {\n          this.error(`Out of bounds index ${index + 1} for array ${name}`, nameNode, {\n            type: \"indexOutOfBounds\",\n            data: { name, index: index + 1 },\n          });\n        }\n        let value = binding[index];\n        if (value == null) {\n          value = name === \"minReps\" ? (this.bindings.reps[index] ?? 0) : 0;\n        }\n        return value;\n      } else {\n        this.error(`Can't use [1:1] syntax when reading from the ${name} variable`, expr, {\n          type: \"rangeIndexOnRead\",\n          data: { name },\n        });\n      }\n    } else if (expr.type.name === NodeName.StateVariable) {\n      const stateKey = this.getStateKey(expr);\n      if (stateKey == null) {\n        this.error(`You cannot read from other exercises states, you can only write to them`, expr, {\n          type: \"otherStateIsWriteOnly\",\n        });\n      }\n      if (stateKey in this.state) {\n        return this.state[stateKey];\n      } else {\n        this.error(`There's no state variable '${stateKey}'`, expr, {\n          type: \"unknownStateVariable\",\n          data: { stateKey },\n        });\n      }\n    } else if (expr.type.name === NodeName.Variable) {\n      const varKey = this.getValue(expr).replace(\"var.\", \"\");\n      if (varKey in this.vars) {\n        return this.vars[varKey];\n      } else {\n        this.error(`There's no variable '${varKey}'`, expr, { type: \"unknownVariable\", data: { name: varKey } });\n      }\n    } else if (expr.type.name === NodeName.ForInExpression) {\n      const child = getChildren(expr)[0];\n      return this.evaluate(child);\n    } else {\n      this.error(`Unknown node type ${expr.node.type.name}`, expr, {\n        type: \"unexpectedNode\",\n        data: { node: expr.node.type.name },\n      });\n    }\n  }\n\n  private add(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a + b);\n  }\n\n  private subtract(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a - b);\n  }\n\n  private multiply(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => a * b);\n  }\n\n  // Division/modulo by zero returns 0 instead of NaN - NaN serializes to null in JSON\n  // and corrupts storage (fails schema validation on the server)\n  private divide(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(this.bindings.rm1, one, two, (a, b) => (b === 0 ? 0 : a / b));\n  }\n\n  private modulo(\n    one: IWeight | number | IPercentage,\n    two: IWeight | number | IPercentage\n  ): IWeight | number | IPercentage {\n    return this.operation(undefined, one, two, (a, b) => (b === 0 ? 0 : a % b));\n  }\n\n  private operation(\n    onerm: IWeight | undefined,\n    a: IWeight | number | IPercentage,\n    b: IWeight | number | IPercentage,\n    op: (x: number, y: number) => number\n  ): IWeight | number | IPercentage {\n    try {\n      return Weight_op(onerm, a, b, op);\n    } catch (error) {\n      const e = error as Error;\n      throw new LiftoscriptSyntaxError(e.message, 0, 0, 0, 0, { type: \"invalidWeightOperation\" });\n    }\n  }\n}\n","import * as v from \"valibot\";\nimport { VWeight, VPercentage } from \"./types\";\nimport type { IScriptFnContext } from \"./models/progress\";\n\nconst optionalNumbers = v.array(v.optional(v.number()));\nconst optionalWeights = v.array(v.optional(VWeight));\n\nexport const VScriptBindings = v.object({\n  day: v.number(),\n  week: v.number(),\n  dayInWeek: v.number(),\n  originalWeights: v.array(v.union([VWeight, VPercentage])),\n  weights: optionalWeights,\n  completedWeights: optionalWeights,\n  rm1: VWeight,\n  reps: optionalNumbers,\n  minReps: optionalNumbers,\n  amraps: optionalNumbers,\n  askweights: optionalNumbers,\n  logrpes: optionalNumbers,\n  timers: optionalNumbers,\n  setTime: optionalNumbers,\n  completedSetTime: optionalNumbers,\n  completedSetTimeLeft: optionalNumbers,\n  RPE: optionalNumbers,\n  completedRPE: optionalNumbers,\n  completedReps: optionalNumbers,\n  completedRepsLeft: optionalNumbers,\n  isCompleted: v.array(v.picklist([0, 1])),\n  w: optionalWeights,\n  r: optionalNumbers,\n  mr: optionalNumbers,\n  cr: optionalNumbers,\n  cw: optionalWeights,\n  ns: v.number(),\n  programNumberOfSets: v.number(),\n  numberOfSets: v.number(),\n  completedNumberOfSets: v.number(),\n  setVariationIndex: v.number(),\n  exerciseVariationIndex: v.number(),\n  bodyweight: VWeight,\n  descriptionIndex: v.number(),\n  setIndex: v.number(),\n});\n\nexport type IScriptBindings = v.InferOutput<typeof VScriptBindings>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype IAnySchema = v.GenericSchema<any, any>;\n\nexport interface IScriptFnArgSignature {\n  readonly name: string;\n  readonly schema: IAnySchema;\n  readonly hint: string;\n  readonly optional?: boolean;\n}\n\nexport interface IScriptFnSignature {\n  readonly args?: readonly IScriptFnArgSignature[];\n  readonly variadic?: { readonly schema: IAnySchema; readonly hint: string };\n  readonly returns: IAnySchema;\n}\n\nconst scalar = v.union([v.number(), VWeight, VPercentage]);\nconst numberOrWeight = v.union([v.number(), VWeight]);\nconst numberOrWeightArray = v.array(v.nullish(numberOrWeight));\n// Booleans are allowed in aggregate fns because they historically were silently\n// ignored there, and erroring now would break existing user programs.\nconst aggregatable = v.union([scalar, v.boolean(), v.array(v.nullish(scalar))]);\n\nexport const liftoscriptFnSignatures = {\n  roundWeight: {\n    args: [{ name: \"weight\", schema: numberOrWeight, hint: \"a weight or a number\" }],\n    returns: VWeight,\n  },\n  roundConvertWeight: {\n    args: [{ name: \"weight\", schema: numberOrWeight, hint: \"a weight or a number\" }],\n    returns: VWeight,\n  },\n  calculateTrainingMax: {\n    args: [\n      { name: \"weight\", schema: numberOrWeight, hint: \"a weight or a number\" },\n      { name: \"reps\", schema: v.number(), hint: \"a number of reps\" },\n    ],\n    returns: VWeight,\n  },\n  calculate1RM: {\n    args: [\n      { name: \"weight\", schema: numberOrWeight, hint: \"a weight or a number\" },\n      { name: \"reps\", schema: v.number(), hint: \"a number of reps\" },\n    ],\n    returns: VWeight,\n  },\n  rpeMultiplier: {\n    args: [\n      { name: \"reps\", schema: numberOrWeight, hint: \"a number of reps\" },\n      { name: \"rpe\", schema: numberOrWeight, hint: \"an RPE value\", optional: true },\n    ],\n    returns: v.number(),\n  },\n  floor: {\n    args: [{ name: \"value\", schema: scalar, hint: \"a number, weight or percentage\" }],\n    returns: scalar,\n  },\n  ceil: {\n    args: [{ name: \"value\", schema: scalar, hint: \"a number, weight or percentage\" }],\n    returns: scalar,\n  },\n  round: {\n    args: [{ name: \"value\", schema: scalar, hint: \"a number, weight or percentage\" }],\n    returns: scalar,\n  },\n  sum: {\n    variadic: { schema: aggregatable, hint: \"numbers, weights, percentages or arrays of them\" },\n    returns: scalar,\n  },\n  min: {\n    variadic: { schema: aggregatable, hint: \"numbers, weights, percentages or arrays of them\" },\n    returns: scalar,\n  },\n  max: {\n    variadic: { schema: aggregatable, hint: \"numbers, weights, percentages or arrays of them\" },\n    returns: scalar,\n  },\n  zeroOrGte: {\n    args: [\n      { name: \"values\", schema: numberOrWeightArray, hint: \"an array, like 'completedReps'\" },\n      { name: \"targets\", schema: numberOrWeightArray, hint: \"an array, like 'reps'\" },\n    ],\n    returns: v.boolean(),\n  },\n  print: {\n    variadic: { schema: v.any(), hint: \"any values\" },\n    returns: v.any(),\n  },\n  increment: {\n    args: [{ name: \"value\", schema: scalar, hint: \"a number, weight or percentage\" }],\n    returns: scalar,\n  },\n  decrement: {\n    args: [{ name: \"value\", schema: scalar, hint: \"a number, weight or percentage\" }],\n    returns: scalar,\n  },\n  sets: {\n    args: [\n      { name: \"fromIndex\", schema: v.number(), hint: \"a number\" },\n      { name: \"toIndex\", schema: v.number(), hint: \"a number\" },\n      { name: \"minReps\", schema: v.number(), hint: \"a number\" },\n      { name: \"maxReps\", schema: v.number(), hint: \"a number\" },\n      { name: \"isAmrap\", schema: v.number(), hint: \"a number (0 or 1)\" },\n      { name: \"weight\", schema: scalar, hint: \"a weight, number or percentage\" },\n      { name: \"timer\", schema: v.number(), hint: \"a number of seconds\" },\n      { name: \"rpe\", schema: v.number(), hint: \"a number\" },\n      { name: \"shouldLogRpe\", schema: v.number(), hint: \"a number (0 or 1)\" },\n    ],\n    returns: v.number(),\n  },\n} as const satisfies Record<string, IScriptFnSignature>;\n\nexport type IScriptFnName = keyof typeof liftoscriptFnSignatures;\n\ntype IArgOutput<TArg> = TArg extends { schema: infer TSchema extends IAnySchema }\n  ? TArg extends { optional: true }\n    ? v.InferOutput<TSchema> | undefined\n    : v.InferOutput<TSchema>\n  : never;\n\ntype IFnArgs<TSig> = TSig extends { args: infer TArgs extends readonly unknown[] }\n  ? { -readonly [I in keyof TArgs]: IArgOutput<TArgs[I]> }\n  : TSig extends { variadic: { schema: infer TSchema extends IAnySchema } }\n    ? v.InferOutput<TSchema>[]\n    : never;\n\nexport type IScriptFunctions = {\n  [K in IScriptFnName]: (\n    args: IFnArgs<(typeof liftoscriptFnSignatures)[K]>,\n    context: IScriptFnContext,\n    bindings: IScriptBindings\n  ) => v.InferOutput<(typeof liftoscriptFnSignatures)[K][\"returns\"]>;\n};\n\nexport function LiftoscriptFns_isFnName(name: string): name is IScriptFnName {\n  return name in liftoscriptFnSignatures;\n}\n\nexport function LiftoscriptFns_arity(name: IScriptFnName): { min: number; max: number | undefined } {\n  const signature: IScriptFnSignature = liftoscriptFnSignatures[name];\n  if (signature.args == null) {\n    return { min: 0, max: undefined };\n  }\n  const min = signature.args.filter((a) => !a.optional).length;\n  return { min, max: signature.args.length };\n}\n\nexport function LiftoscriptFns_argSignature(name: IScriptFnName, index: number): IScriptFnArgSignature | undefined {\n  const signature: IScriptFnSignature = liftoscriptFnSignatures[name];\n  if (signature.variadic != null) {\n    return { name: \"values\", schema: signature.variadic.schema, hint: signature.variadic.hint };\n  }\n  return signature.args?.[index];\n}\n\nexport function LiftoscriptFns_isValidArg(name: IScriptFnName, index: number, value: unknown): boolean {\n  const argSignature = LiftoscriptFns_argSignature(name, index);\n  if (argSignature == null) {\n    return true;\n  }\n  if (argSignature.optional && value == null) {\n    return true;\n  }\n  return v.is(argSignature.schema, value);\n}\n\nexport type IScriptStaticType = \"number\" | \"weight\" | \"percentage\" | \"array\";\n\nexport function LiftoscriptFns_bindingStaticType(name: string): IScriptStaticType | undefined {\n  const schema = (VScriptBindings.entries as Record<string, IAnySchema | undefined>)[name];\n  if (schema == null) {\n    return undefined;\n  }\n  const samples: [IScriptStaticType, unknown][] = [\n    [\"array\", []],\n    [\"number\", 1],\n    [\"weight\", { value: 1, unit: \"lb\" }],\n    [\"percentage\", { value: 1, unit: \"%\" }],\n  ];\n  return samples.find(([, sample]) => v.is(schema, sample))?.[0];\n}\n\nexport function LiftoscriptFns_acceptsTypeAt(name: IScriptFnName, index: number, type: IScriptStaticType): boolean {\n  const samples: Record<IScriptStaticType, unknown[]> = {\n    number: [1],\n    weight: [{ value: 1, unit: \"lb\" }],\n    percentage: [{ value: 1, unit: \"%\" }],\n    array: [[1], [{ value: 1, unit: \"lb\" }], [{ value: 1, unit: \"%\" }], []],\n  };\n  return samples[type].some((sample) => LiftoscriptFns_isValidArg(name, index, sample));\n}\n","import { parser as liftoscriptParser } from \"./liftoscript\";\nimport { LRLanguage, indentNodeProp, foldNodeProp, foldInside } from \"@codemirror/language\";\nimport { styleTags, tags as t } from \"@lezer/highlight\";\n\nexport const liftoscriptParserWithMetadata = liftoscriptParser.configure({\n  props: [\n    styleTags({\n      StateVariable: t.variableName,\n      Number: t.number,\n      LineComment: t.lineComment,\n      Unit: t.unit,\n      Keyword: t.keyword,\n    }),\n    indentNodeProp.add({\n      IfExpression: (context) => context.column(context.node.from) + context.unit,\n    }),\n    foldNodeProp.add({\n      IfExpression: foldInside,\n    }),\n  ],\n});\n\nexport const liftoscriptLanguage = LRLanguage.define({\n  name: \"liftoscript\",\n  parser: liftoscriptParserWithMetadata,\n});\n","import { CollectionUtils_sort } from \"../utils/collection\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { ObjectUtils_clone, ObjectUtils_keys, ObjectUtils_values } from \"../utils/object\";\nimport { IGraph, IHistoryRecord, IMuscle, ISettings, IStorage } from \"../types\";\nimport { Weight_build } from \"../models/weight\";\nimport { PlannerExerciseEvaluator } from \"../pages/planner/plannerExerciseEvaluator\";\nimport { basicBeginnerProgram } from \"../programs/basicBeginnerProgram\";\nimport { IVersions } from \"../models/versionTracker\";\nimport { Settings_build } from \"../models/settings\";\nimport { Progress_getEntryId } from \"../models/progress\";\n\nlet latestMigrationVersion: number | undefined;\nexport function getLatestMigrationVersion(): string {\n  if (latestMigrationVersion == null) {\n    latestMigrationVersion = CollectionUtils_sort(\n      Object.keys(migrations).map((v) => parseInt(v, 10)),\n      (a, b) => b - a\n    )[0];\n  }\n  return latestMigrationVersion.toString();\n}\n\nexport const migrations = {\n  \"20240720152051_fix_null_entries_set_weights\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const historyRecord of storage.history) {\n      for (const entry of historyRecord.entries) {\n        for (const set of entry.sets) {\n          if (set.weight?.value == null) {\n            set.weight = Weight_build(0, storage.settings.units || \"lb\");\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20240906074315_add_original_weight_to_sets\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const historyRecord of storage.history) {\n      for (const entry of historyRecord.entries) {\n        for (const set of entry.sets) {\n          set.originalWeight = ObjectUtils_clone(set.weight);\n        }\n        for (const set of entry.warmupSets) {\n          set.originalWeight = ObjectUtils_clone(set.weight);\n        }\n      }\n    }\n    return storage;\n  },\n  \"20241101192254_add_deleted_gyms\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.deletedGyms = storage.settings.deletedGyms || [];\n    return storage;\n  },\n  \"20241207120042_add_reminder_timer\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.timers.reminder = storage.settings.timers.reminder ?? 900;\n    return storage;\n  },\n  \"20250211073832_switch_to_planner_programs\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    const currentProgram = storage.programs.find((p) => p.id === storage.currentProgramId);\n    if (currentProgram && currentProgram.planner == null) {\n      const plannerProgram = storage.programs.find((p) => p.planner != null) || {\n        ...basicBeginnerProgram,\n        id: UidFactory_generateUid(8),\n      };\n      storage.programs.push(plannerProgram);\n      storage.currentProgramId = plannerProgram.id;\n      Dialog_alert(\n        `Old-style programs are not supported anymore, your current program now is '${plannerProgram.name}'`\n      );\n    }\n    return storage;\n  },\n  \"20250305183455_cleanup_custom_exercises\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const customExerciseKey of ObjectUtils_keys(storage.settings.exercises)) {\n      const customExercise = storage.settings.exercises[customExerciseKey]!;\n      delete customExercise.defaultEquipment;\n      for (const record of storage.history) {\n        for (const entry of record.entries) {\n          if (entry.exercise.id === customExerciseKey) {\n            entry.exercise = { id: customExerciseKey };\n            record.updatedAt = Date.now();\n          }\n        }\n      }\n      for (const key of ObjectUtils_keys(storage.settings.exerciseData)) {\n        if (key.includes(customExerciseKey)) {\n          if (!storage.settings.exerciseData[customExerciseKey]) {\n            const value = storage.settings.exerciseData[key];\n            delete storage.settings.exerciseData[key];\n            storage.settings.exerciseData[customExercise.id] = value;\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250306192146_fix_empty_graphs\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const customExerciseKey of ObjectUtils_keys(storage.settings.exercises)) {\n      if (Array.isArray(storage.settings.graphs)) {\n        for (const graph of storage.settings.graphs) {\n          if (graph.type === \"exercise\" && graph.id.includes(customExerciseKey) && graph.id !== customExerciseKey) {\n            graph.id = customExerciseKey;\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250322014249_add_is_completed\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const record of storage.history) {\n      for (const entry of record.entries) {\n        for (const set of entry.sets) {\n          if (set.completedReps != null) {\n            set.isCompleted = set.isCompleted ?? true;\n            set.completedWeight = set.completedWeight ?? ObjectUtils_clone(set.weight);\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250329092730_add_workout_settings\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.workoutSettings = storage.settings.workoutSettings || {\n      targetType: \"target\",\n    };\n    return storage;\n  },\n  \"20250331001906_migrate_weights_to_completed_weights\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const program of storage.programs) {\n      for (const week of program.planner?.weeks || []) {\n        for (const day of week.days) {\n          const newExerciseStr = PlannerExerciseEvaluator.changeWeightsToCompletedWeights(day.exerciseText);\n          if (newExerciseStr !== day.exerciseText) {\n            day.exerciseText = newExerciseStr;\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250429083937_add_ids_to_planner_weeks_and_days\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const program of storage.programs) {\n      for (const week of program.planner?.weeks || []) {\n        week.id = week.id || UidFactory_generateUid(8);\n        for (const day of week.days) {\n          day.id = day.id || UidFactory_generateUid(8);\n        }\n      }\n    }\n    return storage;\n  },\n  \"20250704123128_add_vtypes_and_restructure_subscriptions\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    if (storage.subscription) {\n      if (!Array.isArray(storage.subscription.apple)) {\n        storage.subscription.apple = ObjectUtils_keys(storage.subscription.apple as Record<string, null>).map(\n          (key) => ({\n            vtype: \"subscription_receipt\",\n            value: key,\n            id: UidFactory_generateUid(6),\n            createdAt: Date.now(),\n          })\n        );\n      }\n      if (!Array.isArray(storage.subscription.google)) {\n        storage.subscription.google = ObjectUtils_keys(storage.subscription.google as Record<string, null>).map(\n          (key) => ({\n            vtype: \"subscription_receipt\",\n            value: key,\n            id: UidFactory_generateUid(6),\n            createdAt: Date.now(),\n          })\n        );\n      }\n    }\n\n    for (const program of storage.programs) {\n      program.vtype = program.vtype ?? \"program\";\n      if (program.planner) {\n        program.planner.vtype = program.planner.vtype ?? \"planner\";\n      }\n    }\n    for (const record of storage.history) {\n      record.vtype = record.vtype ?? \"history_record\";\n    }\n    for (const key of ObjectUtils_keys(storage.stats?.weight || {})) {\n      for (const record of storage.stats?.weight[key] || []) {\n        record.vtype = record.vtype ?? \"stat\";\n      }\n    }\n    for (const key of ObjectUtils_keys(storage.stats?.length || {})) {\n      for (const record of storage.stats?.length[key] || []) {\n        record.vtype = record.vtype ?? \"stat\";\n      }\n    }\n    for (const key of ObjectUtils_keys(storage.stats?.percentage || {})) {\n      for (const record of storage.stats?.percentage[key] || []) {\n        record.vtype = record.vtype ?? \"stat\";\n      }\n    }\n    for (const gym of storage.settings.gyms || []) {\n      gym.vtype = gym.vtype ?? \"gym\";\n      for (const equipment of ObjectUtils_values(gym.equipment)) {\n        if (equipment) {\n          equipment.vtype = equipment.vtype ?? \"equipment_data\";\n        }\n      }\n    }\n    for (const exercise of ObjectUtils_values(storage.settings.exercises)) {\n      if (exercise) {\n        exercise.vtype = exercise.vtype ?? \"custom_exercise\";\n      }\n    }\n    if (Array.isArray(storage.settings.graphs || [])) {\n      // @ts-ignore\n      for (const graph of storage.settings.graphs || []) {\n        graph.vtype = graph.vtype ?? \"graph\";\n      }\n    }\n    return storage;\n  },\n  \"20250719104230_add_cloned_at_to_programs\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const program of storage.programs) {\n      program.clonedAt = program.clonedAt ?? Date.now() - Math.round(Math.random() * 1000000);\n    }\n    return storage;\n  },\n  \"20250720120545_make_graphs_atomic_object\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    if (!storage.settings.graphs.vtype) {\n      storage.settings.graphs = {\n        vtype: \"graphs\",\n        graphs: storage.settings.graphs as unknown as IGraph[],\n      };\n      if ((storage._versions?.settings as IVersions<ISettings>)?.graphs) {\n        // @ts-ignore\n        storage._versions.settings.graphs = Date.now();\n      }\n    }\n    return storage;\n  },\n  \"20250815161850_add_gyms_if_empty\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    if (storage.settings.gyms && storage.settings.gyms.length === 0) {\n      storage.settings.gyms.push({\n        ...Settings_build().gyms[0],\n      });\n    }\n    return storage;\n  },\n  \"20251005115332_migrate_affiliates_to_affiliates_data\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const key of Object.keys(storage.affiliates || {})) {\n      const value = storage.affiliates[key];\n      if (typeof value === \"number\") {\n        storage.affiliates[key] = { id: key, type: \"program\", timestamp: value, vtype: \"affiliate\" };\n      }\n    }\n    // @ts-ignore\n    if (storage._versions?.affiliates && !(\"items\" in storage._versions?.affiliates)) {\n      const items = storage._versions.affiliates;\n      storage._versions.affiliates = { items, deleted: {} };\n    }\n    return storage;\n  },\n  \"20251030203130_add_muscle_groups\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.settings.muscleGroups = storage.settings.muscleGroups || { vtype: \"muscle_groups_settings\", data: {} };\n    return storage;\n  },\n  \"20251230101232_fix_gym_names\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const gym of storage.settings.gyms || []) {\n      if (gym.name == null) {\n        gym.name = \"Main\";\n      }\n    }\n    return storage;\n  },\n  \"20251231182918_add_vtypes_and_indexes_to_entries_and_sets\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const record of storage.history) {\n      record.vtype = record.vtype || \"history_record\";\n      const progressUi = record.ui;\n      if (progressUi) {\n        progressUi.vtype = progressUi.vtype || \"progress_ui\";\n        progressUi.id = UidFactory_generateUid(8);\n      }\n      for (let entryIndex = 0; entryIndex < record.entries.length; entryIndex++) {\n        const entry = record.entries[entryIndex];\n        entry.vtype = entry.vtype || \"history_entry\";\n        entry.index = entry.index ?? entryIndex;\n        for (let setIndex = 0; setIndex < entry.sets.length; setIndex++) {\n          const set = entry.sets[setIndex];\n          set.vtype = set.vtype || \"set\";\n          set.index = set.index ?? setIndex;\n        }\n        for (let setIndex = 0; setIndex < entry.warmupSets.length; setIndex++) {\n          const set = entry.warmupSets[setIndex];\n          set.vtype = set.vtype || \"set\";\n          set.index = set.index ?? setIndex;\n        }\n      }\n    }\n    return storage;\n  },\n  \"20260103180023_add_progress_array\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    storage.progress = storage.progress || [];\n    return storage;\n  },\n  \"20260124114134_convert_muscle_multipliers_to_object\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const key of ObjectUtils_keys(storage.settings.exerciseData)) {\n      const exerciseData = storage.settings.exerciseData[key];\n      if (exerciseData?.muscleMultipliers && Array.isArray(exerciseData.muscleMultipliers)) {\n        const oldMultipliers = exerciseData.muscleMultipliers as Array<{ muscle: IMuscle; multiplier: number }>;\n        const newMultipliers: Partial<Record<IMuscle, number>> = {};\n        for (const mm of oldMultipliers) {\n          newMultipliers[mm.muscle] = mm.multiplier;\n        }\n        exerciseData.muscleMultipliers = newMultipliers;\n      }\n    }\n    return storage;\n  },\n  \"20260208210220_fill_sets_with_ids\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const record of storage.history) {\n      for (const entry of record.entries) {\n        for (const set of entry.sets) {\n          if (!set.id) {\n            set.id = UidFactory_generateUid(6);\n          }\n        }\n        for (const set of entry.warmupSets) {\n          if (!set.id) {\n            set.id = UidFactory_generateUid(6);\n          }\n        }\n      }\n    }\n    for (const record of storage.progress || []) {\n      for (const entry of record.entries) {\n        for (const set of entry.sets) {\n          if (!set.id) {\n            set.id = UidFactory_generateUid(6);\n          }\n        }\n        for (const set of entry.warmupSets) {\n          if (!set.id) {\n            set.id = UidFactory_generateUid(6);\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20260304084247_fill_entries_with_ids\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const record of storage.history) {\n      for (const entry of record.entries) {\n        if (!entry.id) {\n          entry.id = Progress_getEntryId(entry.exercise);\n        }\n      }\n    }\n    for (const record of storage.progress || []) {\n      for (const entry of record.entries) {\n        if (!entry.id) {\n          entry.id = Progress_getEntryId(entry.exercise);\n        }\n      }\n    }\n    return storage;\n  },\n  \"20260628120000_move_amrap_modal_to_progress\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    // amrapModal and currentEntryIndex moved from progress.ui to progress so they version-sync across devices\n    // like setTimer. Carry over the values from a workout left open across the upgrade.\n    for (const record of storage.progress || []) {\n      const legacyUi = record.ui as\n        | undefined\n        | { amrapModal?: IHistoryRecord[\"amrapModal\"]; currentEntryIndex?: number };\n      if (legacyUi?.amrapModal != null) {\n        if (record.amrapModal == null) {\n          record.amrapModal = legacyUi.amrapModal;\n        }\n        delete legacyUi.amrapModal;\n      }\n      if (legacyUi?.currentEntryIndex != null) {\n        if (record.currentEntryIndex == null) {\n          record.currentEntryIndex = legacyUi.currentEntryIndex;\n        }\n        delete legacyUi.currentEntryIndex;\n      }\n    }\n    return storage;\n  },\n  \"20260702120000_sanitize_pipe_bang_in_custom_exercise_names\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    // `|` now separates exercise variations and `!` marks the current one in Liftoscript, so custom\n    // exercise names can no longer contain them. Occurrence is near-zero (no built-in uses them).\n    const renames: { from: string; to: string }[] = [];\n    for (const customExerciseKey of ObjectUtils_keys(storage.settings.exercises)) {\n      const customExercise = storage.settings.exercises[customExerciseKey];\n      if (customExercise?.name != null && /[|!]/.test(customExercise.name)) {\n        const from = customExercise.name;\n        const to = from.replace(/[|!]/g, \"-\").replace(/\\s+/g, \" \").trim();\n        customExercise.name = to;\n        if (to !== from) {\n          renames.push({ from, to });\n        }\n      }\n    }\n    // Programs reference custom exercises by name in their planner text, so the same names must be\n    // rewritten there - otherwise the parser reads the old `|`/`!` as variation syntax and misparses.\n    if (renames.length > 0) {\n      renames.sort((a, b) => b.from.length - a.from.length);\n      const escapeRegExp = (s: string): string => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n      for (const program of storage.programs || []) {\n        for (const week of program.planner?.weeks || []) {\n          for (const day of week.days || []) {\n            for (const rename of renames) {\n              day.exerciseText = day.exerciseText.replace(new RegExp(escapeRegExp(rename.from), \"gi\"), rename.to);\n            }\n          }\n        }\n      }\n    }\n    return storage;\n  },\n  \"20260903120000_default_get_ready_to_5s\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    // Only when the key is absent: `0` is someone who deliberately turned the countdown off, and after\n    // this runs a cleared field stays cleared, so the setting is still switchable off.\n    if (storage.settings.timers.getReady == null) {\n      storage.settings.timers.getReady = 5;\n    }\n    return storage;\n  },\n  \"20260906120000_drop_set_timer_without_id\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    for (const record of [...(storage.progress || []), ...(storage.history || [])]) {\n      const setTimer = record.setTimer as { id?: string } | undefined;\n      if (setTimer != null && setTimer.id == null) {\n        record.setTimer = undefined;\n      }\n    }\n    return storage;\n  },\n  \"20260919120000_hide_notes_never_used\": (aStorage: IStorage): IStorage => {\n    const storage: IStorage = JSON.parse(JSON.stringify(aStorage));\n    const records = [...(storage.progress || []), ...(storage.history || [])];\n    const workoutSettings = storage.settings.workoutSettings;\n    if (workoutSettings.showWorkoutNotes == null) {\n      workoutSettings.showWorkoutNotes = records.some((r) => !!r.notes);\n    }\n    if (workoutSettings.showExerciseNotes == null) {\n      workoutSettings.showExerciseNotes = records.some((r) => r.entries.some((e) => !!e.notes));\n    }\n    return storage;\n  },\n};\n","import { getLatestMigrationVersion, migrations } from \"./migrations\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { IPartialStorage, IStorage } from \"../types\";\nimport { Storage_partialStorageToStorage } from \"../models/storage\";\nimport RB from \"rollbar\";\ndeclare const Rollbar: RB;\n\nexport function unrunMigrations(storage: { version: string }, maxVersion?: string): Array<keyof typeof migrations> {\n  const currentVersion = storage.version != null ? parseInt(storage.version.toString(), 10) : 0;\n  const keys = ObjectUtils_keys(migrations);\n  keys.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\n  const maxVersionInt = maxVersion != null ? parseInt(maxVersion, 10) : undefined;\n  return keys.filter((versionStr) => {\n    const version = parseInt(versionStr, 10);\n    return version > currentVersion && (maxVersionInt != null ? version <= maxVersionInt : true);\n  });\n}\n\nexport function runMigrations(storage: IStorage | IPartialStorage, maxVersion?: string): IStorage {\n  const newVersions = unrunMigrations(storage, maxVersion);\n  let result = Storage_partialStorageToStorage(storage);\n  for (const version of newVersions) {\n    try {\n      result = migrations[version](result);\n    } catch (error) {\n      const e = error as Error;\n      console.error(`Error running migration ${version}: ${e}`);\n    }\n  }\n  result = { ...result, version: getLatestMigrationVersion() };\n  return result;\n}\n","import { IndexedDBUtils_get } from \"../utils/indexeddb\";\nimport { Persistence } from \"../utils/persistence\";\nimport { IPartialStorage } from \"../types\";\n\nexport interface IAccount {\n  id: string;\n  name?: string;\n  email?: string;\n  numberOfPrograms?: number;\n  numberOfWorkouts?: number;\n  affiliateEnabled?: boolean;\n  isCurrent: boolean;\n}\n\nexport function Account_getFromStorage(id: string, email: string, storage: IPartialStorage): IAccount {\n  return {\n    id,\n    email,\n    name: storage.settings.nickname,\n    numberOfPrograms: storage.programs?.length,\n    numberOfWorkouts: storage.history?.length,\n    affiliateEnabled: storage.settings.affiliateEnabled,\n    isCurrent: true,\n  };\n}\n\nexport async function Account_getAll(persistence: Persistence): Promise<IAccount[]> {\n  const currentAccount = (await IndexedDBUtils_get(\"current_account\")) as string;\n  const summaries = await persistence.getAccountSummaries();\n  return summaries.map((summary) => ({ ...summary, isCurrent: summary.id === currentAccount }));\n}\n","import { Service } from \"../api/service\";\nimport { IStorage } from \"../types\";\nimport { IEither } from \"../utils/types\";\n\n// The \"debug_\" prefix on tempUserId is the single source of truth for a debug session:\n// it forces nosync on every load (see getInitialState) and, since it's never a real\n// user's tempUserId, an accidental sync can only ever land on a throwaway account.\nexport const adminDebugPrefix = \"debug_\";\n\nexport function AdminDebug_scrambledTempUserId(userId: string): string {\n  return `${adminDebugPrefix}${userId}`;\n}\n\nexport function AdminDebug_isDebugAccountId(id: string | undefined): boolean {\n  return id != null && id.startsWith(adminDebugPrefix);\n}\n\nexport async function AdminDebug_fetchStorage(\n  service: Service,\n  tempUserId: string,\n  userId: string,\n  adminKey: string,\n  storageId?: string\n): Promise<IEither<IStorage, string>> {\n  try {\n    const response = await service.getStorage(tempUserId, userId, storageId, adminKey);\n    if (response.storage == null) {\n      return { success: false, error: \"User not found or invalid admin key\" };\n    }\n    const storage: IStorage = { ...response.storage, tempUserId: AdminDebug_scrambledTempUserId(userId) };\n    return { success: true, data: storage };\n  } catch (e) {\n    return { success: false, error: e instanceof Error ? e.message : String(e) };\n  }\n}\n\nexport async function AdminDebug_fetchDebugSnapshotStorage(\n  service: Service,\n  userId: string,\n  adminKey: string,\n  timestamp: string\n): Promise<IEither<IStorage, string>> {\n  try {\n    const snapshotStorage = await service.getDebugSnapshotStorage(userId, adminKey, timestamp);\n    if (snapshotStorage == null) {\n      return { success: false, error: \"Snapshot not found or invalid admin key\" };\n    }\n    const storage: IStorage = { ...snapshotStorage, tempUserId: AdminDebug_scrambledTempUserId(userId) };\n    return { success: true, data: storage };\n  } catch (e) {\n    return { success: false, error: e instanceof Error ? e.message : String(e) };\n  }\n}\n","export const builtinProgramFrequencies: Record<3 | 4 | 5 | 6, string> = {\n  3: \"3 days a week\",\n  4: \"4 days a week\",\n  5: \"5 days a week\",\n  6: \"6 days a week\",\n};\nexport const builtinProgramFrequenciesKeys: (keyof typeof builtinProgramFrequencies)[] = [3, 4, 5, 6] as const;\n\nexport const builtinProgramAges: Record<\"less_than_3_months\" | \"3_to_12_months\" | \"more_than_year\", string> = {\n  less_than_3_months: \"less than 3 months\",\n  \"3_to_12_months\": \"3 to 12 months\",\n  more_than_year: \"more than a year\",\n};\nexport const builtinProgramAgesKeys: (keyof typeof builtinProgramAges)[] = [\n  \"less_than_3_months\",\n  \"3_to_12_months\",\n  \"more_than_year\",\n] as const;\n\nexport const builtinProgramDurations: Record<\"30-45\" | \"45-60\" | \"60-90\" | \"90+\", string> = {\n  \"30-45\": \"30-45 minutes\",\n  \"45-60\": \"45-60 minutes\",\n  \"60-90\": \"60-90 minutes\",\n  \"90+\": \"90+ minutes\",\n};\nexport const builtinProgramDurationsKeys: (keyof typeof builtinProgramDurations)[] = [\n  \"30-45\",\n  \"45-60\",\n  \"60-90\",\n  \"90+\",\n] as const;\n\nexport const builtinProgramGoals: Record<\"strength\" | \"hypertrophy\" | \"strength_and_hypertrophy\", string> = {\n  strength: \"strength\",\n  hypertrophy: \"hypertrophy\",\n  strength_and_hypertrophy: \"strength and hypertrophy\",\n};\n\nexport type IBuiltinProgramAge = keyof typeof builtinProgramAges;\nexport type IBuiltinProgramDuration = keyof typeof builtinProgramDurations;\nexport type IBuiltinProgramFrequency = keyof typeof builtinProgramFrequencies;\nexport type IBuiltinProgramGoal = keyof typeof builtinProgramGoals;\n","import { lb } from \"lens-shmens\";\nimport { IState, updateState } from \"./state\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IExerciseType, IEquipment, ISettings } from \"../types\";\nimport { Equipment_getEquipmentIdForExerciseType, Equipment_getEquipmentData } from \"./equipment\";\nimport { Exercise_toKey } from \"./exercise\";\n\nexport function EditEquipment_setEquipmentForExercise(\n  exerciseType: IExerciseType,\n  equipment: IEquipment | undefined,\n  programExerciseIds: string[],\n  dispatch: IDispatch,\n  settings: ISettings,\n  gymId?: string\n): void {\n  const exerciseKey = Exercise_toKey(exerciseType);\n  const oldEquipment = Equipment_getEquipmentIdForExerciseType(settings, exerciseType);\n  gymId = gymId ?? settings.currentGymId ?? settings.gyms[0].id;\n\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"settings\")\n        .p(\"exerciseData\")\n        .recordModify((data) => {\n          return {\n            ...data,\n            [exerciseKey]: {\n              ...data[exerciseKey],\n              equipment: { ...data[exerciseKey]?.equipment, [gymId]: equipment ? equipment : undefined },\n            },\n          };\n        }),\n    ],\n    \"Update equipment\"\n  );\n  const currentUnit =\n    (oldEquipment ? Equipment_getEquipmentData(settings, oldEquipment)?.unit : undefined) ?? settings.units;\n  const newUnit = (equipment ? Equipment_getEquipmentData(settings, equipment)?.unit : undefined) ?? settings.units;\n  if (currentUnit !== newUnit) {\n    dispatch({\n      type: \"ApplyProgramChangesToProgress\",\n      programExerciseIds: programExerciseIds,\n    });\n  }\n}\n\nexport function EditEquipment_setDefaultRoundingForExercise(\n  dispatch: IDispatch,\n  exercise: IExerciseType,\n  value: number\n): void {\n  if (isNaN(value)) {\n    return;\n  }\n\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"settings\")\n        .p(\"exerciseData\")\n        .recordModify((data) => {\n          const k = Exercise_toKey(exercise);\n          return { ...data, [k]: { ...data[k], rounding: Math.max(value, 0.1) } };\n        }),\n    ],\n    \"Update rounding\"\n  );\n}\n","import { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IFoodEntryValue, IFoodItem, IMealTemplate, INutritionGoals, IStats, IStatsFoodEntry } from \"../types\";\nimport { IState } from \"./state\";\nimport { Food_freeTimestamp, Food_newTimestamp } from \"./food\";\n\nfunction modifyEntries(\n  dispatch: IDispatch,\n  desc: string,\n  fn: (entries: IStatsFoodEntry[], stats: IStats) => IStatsFoodEntry[]\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc,\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .recordModify((stats) => ({\n          ...stats,\n          food: { ...stats.food, entries: fn(stats.food?.entries || [], stats) },\n        })),\n    ],\n  });\n}\n\nexport function EditFood_addEntries(dispatch: IDispatch, values: IFoodEntryValue[]): void {\n  modifyEntries(dispatch, \"Add food entries\", (entries, stats) => {\n    const now = Date.now();\n    const added: IStatsFoodEntry[] = [];\n    for (const value of values) {\n      const timestamp = Food_newTimestamp({ ...stats, food: { entries: [...entries, ...added] } }, now);\n      added.push({ vtype: \"stat\", timestamp, updatedAt: now, value });\n    }\n    return [...entries, ...added];\n  });\n}\n\nexport function EditFood_updateEntry(dispatch: IDispatch, timestamp: number, value: IFoodEntryValue): void {\n  modifyEntries(dispatch, \"Update food entry\", (entries) =>\n    entries.map((e) => (e.timestamp === timestamp ? { ...e, value, updatedAt: Date.now() } : e))\n  );\n}\n\nexport function EditFood_deleteEntry(dispatch: IDispatch, timestamp: number): void {\n  modifyEntries(dispatch, \"Delete food entry\", (entries) => entries.filter((e) => e.timestamp !== timestamp));\n}\n\nexport function EditFood_saveItem(dispatch: IDispatch, item: IFoodItem): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Save food item\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"foodLibrary\")\n        .recordModify((library) => {\n          const existing = library || [];\n          const saved = { ...item, updatedAt: Date.now() };\n          return existing.some((i) => i.id === item.id)\n            ? existing.map((i) => (i.id === item.id ? saved : i))\n            : [...existing, saved];\n        }),\n    ],\n  });\n}\n\nexport function EditFood_deleteItem(dispatch: IDispatch, id: string): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Delete food item\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"foodLibrary\")\n        .recordModify((library) => (library || []).filter((i) => i.id !== id)),\n    ],\n  });\n}\n\nexport function EditFood_setGoals(dispatch: IDispatch, goals: INutritionGoals): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Set nutrition goals\",\n    lensRecording: [lb<IState>().p(\"storage\").p(\"settings\").p(\"nutritionGoals\").record(goals)],\n  });\n}\n\nexport function EditFood_saveTemplate(dispatch: IDispatch, template: IMealTemplate): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Save meal template\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"mealTemplates\")\n        .recordModify((templates) => {\n          const existing = templates || [];\n          const saved = { ...template, updatedAt: Date.now() };\n          return existing.some((t) => t.id === template.id)\n            ? existing.map((t) => (t.id === template.id ? saved : t))\n            : [...existing, saved];\n        }),\n    ],\n  });\n}\n\nexport function EditFood_deleteTemplate(dispatch: IDispatch, id: string): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Delete meal template\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"mealTemplates\")\n        .recordModify((templates) => (templates || []).filter((t) => t.id !== id)),\n    ],\n  });\n}\n\nexport function EditFood_addWater(dispatch: IDispatch, date: string, ml: number): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Add water\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .recordModify((stats) => {\n          const water = stats.food?.water || [];\n          const now = Date.now();\n          const timestamp = Food_freeTimestamp(\n            water.map((w) => w.timestamp),\n            now\n          );\n          return {\n            ...stats,\n            food: {\n              ...stats.food,\n              water: [...water, { vtype: \"stat\", timestamp, updatedAt: now, value: { date, ml } }],\n            },\n          };\n        }),\n    ],\n  });\n}\n\nexport function EditFood_deleteWater(dispatch: IDispatch, timestamp: number): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Delete water\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .recordModify((stats) => ({\n          ...stats,\n          food: { ...stats.food, water: (stats.food?.water || []).filter((w) => w.timestamp !== timestamp) },\n        })),\n    ],\n  });\n}\n","import { IDispatch } from \"../ducks/types\";\nimport { lb } from \"lens-shmens\";\nimport { IState } from \"./state\";\nimport { IExercise, Exercise_toKey } from \"./exercise\";\nimport { IGraph, INutritionGraphId, ISettings, IStatsLength, IStatsPercentage, IStatsWeight } from \"../types\";\n\nexport function EditGraphs_removeGraph(dispatch: IDispatch, graph: IGraph): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"settings\")\n        .p(\"graphs\")\n        .p(\"graphs\")\n        .recordModify((exs) => {\n          return exs.filter((ex) => ex.id !== graph.id);\n        }),\n    ],\n    desc: `Remove graph ${graph.id}`,\n  });\n}\n\nexport function EditGraphs_reorderGraphs(dispatch: IDispatch, startIndex: number, endIndex: number): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"settings\")\n        .p(\"graphs\")\n        .p(\"graphs\")\n        .recordModify((exs) => {\n          const newExercises = [...exs];\n          const [exercisesToMove] = newExercises.splice(startIndex, 1);\n          newExercises.splice(endIndex, 0, exercisesToMove);\n          return newExercises;\n        }),\n    ],\n    desc: `Reorder graphs from index ${startIndex} to ${endIndex}`,\n  });\n}\n\nexport function EditGraphs_addExerciseGraph(dispatch: IDispatch, exercise: IExercise): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"settings\")\n        .p(\"graphs\")\n        .p(\"graphs\")\n        .recordModify((ex) => {\n          return Array.from(new Set([...ex, { vtype: \"graph\", type: \"exercise\", id: Exercise_toKey(exercise) }]));\n        }),\n    ],\n    desc: `Add graph for exercise ${Exercise_toKey(exercise)}`,\n  });\n}\n\nexport function EditGraphs_addMuscleGroupGraph(dispatch: IDispatch, muscleGroup: string): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"settings\")\n        .p(\"graphs\")\n        .p(\"graphs\")\n        .recordModify((ex) => {\n          if (!ex.some((e) => e.type === \"muscleGroup\" && e.id === muscleGroup)) {\n            return [...ex, { vtype: \"graph\", type: \"muscleGroup\", id: muscleGroup }];\n          } else {\n            return ex;\n          }\n        }),\n    ],\n    desc: `Add graph for muscle group ${muscleGroup}`,\n  });\n}\n\nexport function EditGraphs_addStatsWeightGraph(dispatch: IDispatch, statsKey: keyof IStatsWeight): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>()\n      .p(\"graphs\")\n      .p(\"graphs\")\n      .recordModify((ex) => {\n        return Array.from(new Set([...ex, { vtype: \"graph\", type: \"statsWeight\", id: statsKey }]));\n      }),\n    desc: `Add weight stat graph`,\n  });\n}\n\nexport function EditGraphs_addStatsLengthGraph(dispatch: IDispatch, statsKey: keyof IStatsLength): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>()\n      .p(\"graphs\")\n      .p(\"graphs\")\n      .recordModify((ex) => {\n        return Array.from(new Set([...ex, { vtype: \"graph\", type: \"statsLength\", id: statsKey }]));\n      }),\n    desc: `Add length stat graph`,\n  });\n}\n\nexport function EditGraphs_addStatsPercentageGraph(dispatch: IDispatch, statsKey: keyof IStatsPercentage): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>()\n      .p(\"graphs\")\n      .p(\"graphs\")\n      .recordModify((ex) => {\n        return Array.from(new Set([...ex, { vtype: \"graph\", type: \"statsPercentage\", id: statsKey }]));\n      }),\n    desc: `Add percentage stat graph`,\n  });\n}\n\nexport function EditGraphs_addNutritionGraph(dispatch: IDispatch, id: INutritionGraphId): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>()\n      .p(\"graphs\")\n      .p(\"graphs\")\n      .recordModify((ex) => {\n        return ex.some((g) => g.id === id) ? ex : [...ex, { vtype: \"graph\", type: \"nutrition\", id }];\n      }),\n    desc: `Add nutrition graph`,\n  });\n}\n","import { lb } from \"lens-shmens\";\nimport { emptyProgramId, IEvaluatedProgram, Program_create, Program_createFromHistoryRecord } from \"./program\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ObjectUtils_diff, ObjectUtils_keys, ObjectUtils_clone, ObjectUtils_entries } from \"../utils/object\";\nimport { updateState, IState } from \"./state\";\nimport { IProgram, IProgramState, ISettings, IHistoryRecord } from \"../types\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { updateStateVariable } from \"./editProgramLenses\";\nimport { IPlannerProgramExercise, IPlannerState, IPlannerUi, IPlannerEditMode } from \"../pages/planner/models/types\";\nimport { PP_iterate2 } from \"./pp\";\nimport { PlannerProgramExercise_getState } from \"../pages/planner/models/plannerProgramExercise\";\nimport { ProgramToPlanner } from \"./programToPlanner\";\nimport { Thunk_pushToEditProgram } from \"../ducks/thunks\";\n\nexport function EditProgram_properlyUpdateStateVariableInPlace(\n  program: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise,\n  values: Partial<IProgramState>\n): IEvaluatedProgram {\n  const state = PlannerProgramExercise_getState(programExercise);\n  values = ObjectUtils_diff(state, values);\n  if (ObjectUtils_keys(values).length === 0) {\n    return program;\n  }\n  if (!programExercise.progress) {\n    return program;\n  }\n  const newEvalutedProgram = ObjectUtils_clone(program);\n  PP_iterate2(newEvalutedProgram.weeks, (ex) => {\n    if (ex.key === programExercise.key) {\n      const progress = ex.progress;\n      if (progress) {\n        for (const [stateKey, newValue] of ObjectUtils_entries(values)) {\n          if (newValue == null) {\n            delete progress.stateMetadata?.[stateKey];\n          }\n          if (newValue == null || typeof newValue === \"string\") {\n            progress.state = updateStateVariable(state, stateKey, newValue);\n          } else {\n            progress.state = { ...progress.state, [stateKey]: newValue };\n          }\n        }\n      }\n    }\n  });\n  return newEvalutedProgram;\n}\n\nexport function EditProgram_deleteProgram(dispatch: IDispatch, program: IProgram, customPrograms: IProgram[]): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"programs\")\n        .recordModify((pgms) => pgms.filter((p) => p.id !== program.id)),\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"currentProgramId\")\n        .recordModify((id) =>\n          id === program.id ? (customPrograms.filter((p) => p.id !== program.id)[0]?.id ?? emptyProgramId) : id\n        ),\n    ],\n    \"Delete program\"\n  );\n}\n\nexport function EditProgram_setName(dispatch: IDispatch, program: IProgram, name: string): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).p(\"name\").record(name),\n      lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).pi(\"planner\").p(\"name\").record(name),\n    ],\n    \"Update program name\"\n  );\n}\n\nexport function EditProgram_setNextDay(dispatch: IDispatch, programId: string, nextDay: number): void {\n  updateState(\n    dispatch,\n    [lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", programId).p(\"nextDay\").record(nextDay)],\n    \"Set next day\"\n  );\n}\n\nexport const EditProgram_tabLabels = [\"Preview\", \"Edit\", \"Playground\"] as const;\n\nexport function EditProgram_mode(ui: IPlannerUi): IPlannerEditMode {\n  return ui.mode ?? \"grid\";\n}\n\nexport function EditProgram_initPlannerState(id: string, program: IProgram): IPlannerState {\n  return {\n    id,\n    current: { program },\n    ui: {\n      weekIndex: 0,\n      mode: \"grid\",\n      exerciseUi: { edit: new Set(), collapsed: new Set() },\n      dayUi: { collapsed: new Set() },\n    },\n    history: { past: [], future: [] },\n  };\n}\n\nexport function EditProgram_create(dispatch: IDispatch, name: string): void {\n  const newProgram: IProgram = {\n    ...Program_create(name),\n    planner: {\n      vtype: \"planner\",\n      name,\n      weeks: [{ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] }],\n    },\n  };\n\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"programs\")\n        .recordModify((pgms) => [...pgms, newProgram]),\n      lb<IState>().p(\"storage\").p(\"currentProgramId\").record(newProgram.id),\n    ],\n    \"Create program\"\n  );\n  dispatch(Thunk_pushToEditProgram());\n}\n\nexport function EditProgram_createFromHistoryRecord(\n  dispatch: IDispatch,\n  name: string,\n  record: IHistoryRecord,\n  settings: ISettings\n): void {\n  const program = Program_createFromHistoryRecord(name, record, settings);\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"programs\")\n        .recordModify((pgms) => [...pgms, program]),\n    ],\n    \"Create program from adhoc\"\n  );\n  Dialog_alert(`Created new program '${program.name}' with this workout`);\n}\n\nexport function EditProgram_updateProgram(dispatch: IDispatch, program: IProgram): void {\n  updateState(\n    dispatch,\n    [lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).record(program)],\n    \"Update program\"\n  );\n}\n\nexport function EditProgram_regenerateProgram(\n  program: IProgram,\n  evaluatedProgram: IEvaluatedProgram,\n  settings: ISettings\n): IProgram {\n  const newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n  return { ...program, planner: newPlanner };\n}\n","import { ILensRecordingPayload, LensBuilder } from \"lens-shmens\";\nimport { IExerciseType, IPercentage, IProgramExercise, IProgramState, ISettings, IWeight } from \"../types\";\nimport { ObjectUtils_entries } from \"../utils/object\";\nimport { Exercise_get } from \"./exercise\";\nimport { Weight_is, Weight_build, Weight_isPct, Weight_buildPct } from \"./weight\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\n\nexport function EditProgramLenses_changeExercise<T>(\n  prefix: LensBuilder<T, IProgramExercise, {}>,\n  settings: ISettings,\n  oldExerciseType: IExerciseType,\n  newExerciseType: IExerciseType\n): ILensRecordingPayload<T>[] {\n  const oldExercise = Exercise_get(oldExerciseType, settings.exercises);\n  const exercise = Exercise_get(newExerciseType, settings.exercises);\n  return [\n    prefix.p(\"exerciseType\").p(\"id\").record(exercise.id),\n    prefix.p(\"exerciseType\").p(\"equipment\").record(exercise.equipment),\n    prefix.p(\"state\").recordModify((oldState) => {\n      if (\"weight\" in oldState) {\n        return {\n          ...oldState,\n          weight: settings.units === \"kg\" ? exercise.startingWeightKg : exercise.startingWeightLb,\n        };\n      } else {\n        return oldState;\n      }\n    }),\n    prefix.p(\"name\").recordModify((oldName) => {\n      if (oldExercise != null) {\n        return oldName.replace(oldExercise.name, exercise.name);\n      } else {\n        return exercise.name;\n      }\n    }),\n  ];\n}\n\nfunction editStateVariable<T>(\n  prefix: LensBuilder<T, IPlannerProgramExercise, {}>,\n  stateKey: string,\n  newValue?: string | number | IWeight | IPercentage\n): ILensRecordingPayload<T> {\n  return prefix\n    .pi(\"progress\")\n    .p(\"state\")\n    .recordModify((state) => {\n      if (newValue == null || typeof newValue === \"string\") {\n        return updateStateVariable(state, stateKey, newValue);\n      } else {\n        return { ...state, [stateKey]: newValue };\n      }\n    });\n}\n\nfunction removeStateVariableMetadata<T>(\n  prefix: LensBuilder<T, IPlannerProgramExercise, {}>,\n  stateKey: string\n): ILensRecordingPayload<T> {\n  return prefix\n    .pi(\"progress\")\n    .p(\"stateMetadata\")\n    .recordModify((state) => {\n      const newState = { ...state };\n      delete newState[stateKey];\n      return newState;\n    });\n}\n\nexport function EditProgramLenses_properlyUpdateStateVariable<T>(\n  prefix: LensBuilder<T, IPlannerProgramExercise, {}>,\n  values: Partial<IProgramState>\n): ILensRecordingPayload<T>[] {\n  return ObjectUtils_entries(values).flatMap(([stateKey, newValue]) => {\n    if (newValue == null) {\n      return [removeStateVariableMetadata(prefix, stateKey), editStateVariable(prefix, stateKey, newValue)];\n    } else {\n      return [editStateVariable(prefix, stateKey, newValue)];\n    }\n  });\n}\n\nexport function updateStateVariable(state: IProgramState, stateKey: string, newValue?: string): IProgramState {\n  if (newValue === \"\") {\n    newValue = \"0\";\n  }\n  let v = newValue != null && newValue !== \"\" ? parseFloat(newValue) : null;\n  if (v != null && isNaN(v)) {\n    v = 0;\n  }\n  const newState = { ...state };\n  const value = state[stateKey];\n  if (Weight_is(value) && v != null && v < 0) {\n    v = 0;\n  }\n  if (v != null) {\n    newState[stateKey] = Weight_is(value)\n      ? Weight_build(v || 0, value.unit)\n      : Weight_isPct(value)\n        ? Weight_buildPct(v)\n        : v;\n  } else {\n    delete newState[stateKey];\n  }\n  return newState;\n}\n","import { IDispatch } from \"../ducks/types\";\nimport { lb } from \"lens-shmens\";\nimport { ISet, IHistoryRecord, IExerciseType, ISettings } from \"../types\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { ObjectUtils_clone } from \"../utils/object\";\nimport { Reps_newSet } from \"./set\";\nimport { Exercise_getIsUnilateral } from \"./exercise\";\n\nexport function EditProgressEntry_showEditSetModal(\n  dispatch: IDispatch,\n  settings: ISettings,\n  isWarmup: boolean,\n  entryIndex: number,\n  setIndex?: number,\n  programExercise?: IPlannerProgramExercise,\n  exerciseType?: IExerciseType,\n  set?: ISet\n): void {\n  const isUnilateral = exerciseType ? Exercise_getIsUnilateral(exerciseType, settings) : false;\n  dispatch({\n    type: \"UpdateProgress\",\n    lensRecordings: [\n      lb<IHistoryRecord>()\n        .pi(\"ui\", {})\n        .p(\"editSetModal\")\n        .record({\n          programExerciseId: programExercise?.key,\n          set: set ? ObjectUtils_clone(set) : Reps_newSet(isUnilateral, setIndex ?? 0),\n          isWarmup,\n          entryIndex,\n          setIndex,\n          exerciseType,\n        }),\n    ],\n    desc: \"show-target-bottomsheet\",\n  });\n}\n","import { IDispatch } from \"../ducks/types\";\nimport { lb } from \"lens-shmens\";\nimport {\n  ILength,\n  IPercentage,\n  ISettings,\n  IStatsHealth,\n  IStatsHealthKey,\n  IStatsHealthValue,\n  IStatsLength,\n  IStatsLengthValue,\n  IStatsPercentage,\n  IStatsPercentageValue,\n  IStatsWeight,\n  IStatsWeightValue,\n  IWeight,\n  statsHealthDef,\n} from \"../types\";\nimport { IHealthDailyResult, IHealthDailyValue } from \"../utils/healthAdapter\";\nimport { IState } from \"./state\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { CollectionUtils_sort, CollectionUtils_sortBy, CollectionUtils_uniqBy } from \"../utils/collection\";\nimport { Weight_roundTo005, Weight_convertTo } from \"./weight\";\nimport { Length_convertTo } from \"./length\";\nimport { Stats_insertByTimestamp } from \"./stats\";\n\nexport interface IHealthResponse {\n  added: {\n    timestamp: number;\n    type: \"bodyweight\" | \"bodyfat\" | \"waist\";\n    uuid: string;\n    value: IWeight | IPercentage | ILength;\n  }[];\n  anchor: string;\n  deleted: string[];\n}\n\nexport function EditStats_toggleWeightStats(dispatch: IDispatch, name: keyof IStatsWeight, value: boolean): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>().p(\"statsEnabled\").p(\"weight\").p(name).record(value),\n    desc: `Toggle ${name} weight stat`,\n  });\n}\n\nexport function EditStats_toggleLengthStats(dispatch: IDispatch, name: keyof IStatsLength, value: boolean): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>().p(\"statsEnabled\").p(\"length\").p(name).record(value),\n    desc: `Toggle ${name} length stat`,\n  });\n}\n\nexport function EditStats_togglePercentageStats(\n  dispatch: IDispatch,\n  name: keyof IStatsPercentage,\n  value: boolean\n): void {\n  dispatch({\n    type: \"UpdateSettings\",\n    lensRecording: lb<ISettings>().p(\"statsEnabled\").p(\"percentage\").p(name).record(value),\n    desc: `Toggle ${name} percentage stat`,\n  });\n}\n\nexport function EditStats_addWeightStats(\n  dispatch: IDispatch,\n  payload: Partial<Record<keyof IStatsWeight, IWeight>>,\n  timestamp?: number\n): void {\n  const sharedTime = timestamp ?? Date.now();\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"weight\")\n        .recordModify((st) => {\n          return ObjectUtils_keys(payload).reduce(\n            (memo, key) => {\n              memo[key] = Stats_insertByTimestamp(memo[key], {\n                vtype: \"stat\",\n                value: payload[key]!,\n                timestamp: sharedTime,\n                updatedAt: sharedTime,\n              });\n              return memo;\n            },\n            { ...st }\n          );\n        }),\n    ],\n    desc: \"Add weight stats\",\n  });\n}\n\nexport function EditStats_addLengthStats(\n  dispatch: IDispatch,\n  payload: Partial<Record<keyof IStatsLength, ILength>>,\n  timestamp?: number\n): void {\n  const sharedTime = timestamp ?? Date.now();\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"length\")\n        .recordModify((st) => {\n          return ObjectUtils_keys(payload).reduce(\n            (memo, key) => {\n              memo[key] = Stats_insertByTimestamp(memo[key], {\n                vtype: \"stat\",\n                value: payload[key]!,\n                timestamp: sharedTime,\n                updatedAt: sharedTime,\n              });\n              return memo;\n            },\n            { ...st }\n          );\n        }),\n    ],\n    desc: \"Add length stats\",\n  });\n}\n\nexport function EditStats_addPercentageStats(\n  dispatch: IDispatch,\n  payload: Partial<Record<keyof IStatsPercentage, IPercentage>>,\n  timestamp?: number\n): void {\n  const sharedTime = timestamp ?? Date.now();\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"percentage\")\n        .recordModify((st) => {\n          return ObjectUtils_keys(payload).reduce(\n            (memo, key) => {\n              memo[key] = Stats_insertByTimestamp(memo[key], {\n                vtype: \"stat\",\n                value: payload[key]!,\n                timestamp: sharedTime,\n                updatedAt: sharedTime,\n              });\n              return memo;\n            },\n            { ...st }\n          );\n        }),\n    ],\n    desc: \"Add percentage stats\",\n  });\n}\n\nexport function EditStats_changeStatWeightValue(\n  dispatch: IDispatch,\n  key: keyof IStatsWeight,\n  index: number,\n  value: IWeight\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"weight\")\n        .p(key)\n        .i(index)\n        .recordModify((v) => ({ ...v, value, updatedAt: Date.now() })),\n    ],\n    desc: `Change weight stat ${key} at index ${index} to ${value?.value}`,\n  });\n}\n\nexport function EditStats_changeStatLengthValue(\n  dispatch: IDispatch,\n  key: keyof IStatsLength,\n  index: number,\n  value: ILength\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"length\")\n        .p(key)\n        .i(index)\n        .recordModify((v) => ({ ...v, value, updatedAt: Date.now() })),\n    ],\n    desc: `Change length stat ${key} at index ${index} to ${value?.value}`,\n  });\n}\n\nexport function EditStats_changeStatPercentageValue(\n  dispatch: IDispatch,\n  key: keyof IStatsPercentage,\n  index: number,\n  value: IPercentage\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"percentage\")\n        .p(key)\n        .i(index)\n        .recordModify((v) => ({ ...v, value, updatedAt: Date.now() })),\n    ],\n    desc: `Change percentage stat ${key} at index ${index} to ${value?.value}`,\n  });\n}\n\nexport function EditStats_changeStatWeightTimestamp(\n  dispatch: IDispatch,\n  key: keyof IStatsWeight,\n  index: number,\n  timestamp: number\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"weight\")\n        .p(key)\n        .recordModify((coll) => {\n          return CollectionUtils_sort(\n            [...(coll || [])].map((v, i) => (i === index ? { ...v, timestamp, updatedAt: Date.now() } : v)),\n            (a, b) => b.timestamp - a.timestamp\n          );\n        }),\n    ],\n    desc: `Change weight stat ${key} timestamp at index ${index} to ${timestamp}`,\n  });\n}\n\nexport function EditStats_changeStatLengthTimestamp(\n  dispatch: IDispatch,\n  key: keyof IStatsLength,\n  index: number,\n  timestamp: number\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"length\")\n        .p(key)\n        .recordModify((coll) => {\n          return CollectionUtils_sort(\n            [...(coll || [])].map((v, i) => (i === index ? { ...v, timestamp, updatedAt: Date.now() } : v)),\n            (a, b) => b.timestamp - a.timestamp\n          );\n        }),\n    ],\n    desc: `Change length stat ${key} timestamp at index ${index} to ${timestamp}`,\n  });\n}\n\nexport function EditStats_changeStatPercentageTimestamp(\n  dispatch: IDispatch,\n  key: keyof IStatsPercentage,\n  index: number,\n  timestamp: number\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"percentage\")\n        .p(key)\n        .recordModify((coll) => {\n          return CollectionUtils_sort(\n            [...(coll || [])].map((v, i) => (i === index ? { ...v, timestamp, updatedAt: Date.now() } : v)),\n            (a, b) => b.timestamp - a.timestamp\n          );\n        }),\n    ],\n    desc: `Change percentage stat ${key} timestamp at index ${index} to ${timestamp}`,\n  });\n}\n\nexport function EditStats_deleteWeightStat(\n  dispatch: IDispatch,\n  key: keyof IStatsWeight,\n  index: number,\n  ts: number\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Delete weight stat\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"weight\")\n        .p(key)\n        .recordModify((s) => [...(s || [])].filter((_, i) => i !== index)),\n    ],\n  });\n}\n\nexport function EditStats_deleteLengthStat(\n  dispatch: IDispatch,\n  key: keyof IStatsLength,\n  index: number,\n  ts: number\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Delete length stat\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"length\")\n        .p(key)\n        .recordModify((s) => [...(s || [])].filter((_, i) => i !== index)),\n    ],\n  });\n}\n\nexport function EditStats_deletePercentageStat(\n  dispatch: IDispatch,\n  key: keyof IStatsPercentage,\n  index: number,\n  ts: number\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: \"Delete percentage stat\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"percentage\")\n        .p(key)\n        .recordModify((s) => [...(s || [])].filter((_, i) => i !== index)),\n    ],\n  });\n}\n\nexport function EditStats_uploadHealthStats(\n  platform: \"ios\" | \"android\",\n  dispatch: IDispatch,\n  dataAny: unknown,\n  settings: ISettings,\n  deletedStatsArr: number[]\n): void {\n  const deletedStats = new Set(deletedStatsArr);\n  const response = dataAny as { data: IHealthResponse };\n  const data = response.data;\n  if (!data.added) {\n    return;\n  }\n  const weightValues: IStatsWeightValue[] = [];\n  const bodyfatValues: IStatsPercentageValue[] = [];\n  const waistValues: IStatsLengthValue[] = [];\n\n  for (const d of data.added) {\n    if (deletedStats.has(d.timestamp)) {\n      continue;\n    }\n    if (d.type === \"bodyweight\") {\n      weightValues.push({\n        vtype: \"stat\",\n        value: Weight_roundTo005(Weight_convertTo(d.value as IWeight, settings.units)),\n        timestamp: d.timestamp,\n        updatedAt: Date.now(),\n        ...(platform === \"ios\" ? { appleUuid: d.uuid } : { googleUuid: d.uuid }),\n      });\n    } else if (d.type === \"bodyfat\") {\n      if (d.value.value > 0) {\n        bodyfatValues.push({\n          vtype: \"stat\",\n          value: d.value as IPercentage,\n          timestamp: d.timestamp,\n          updatedAt: Date.now(),\n          ...(platform === \"ios\" ? { appleUuid: d.uuid } : { googleUuid: d.uuid }),\n        });\n      }\n    } else if (d.type === \"waist\") {\n      waistValues.push({\n        vtype: \"stat\",\n        value: Length_convertTo(d.value as ILength, settings.lengthUnits),\n        timestamp: d.timestamp,\n        updatedAt: Date.now(),\n        ...(platform === \"ios\" ? { appleUuid: d.uuid } : { googleUuid: d.uuid }),\n      });\n    }\n  }\n\n  const applyValues = <T extends { timestamp: number }>(st: T[] | undefined, values: T[]): T[] | undefined => {\n    if (values.length === 0) {\n      return st;\n    }\n    const merged = CollectionUtils_uniqBy([...(st || []), ...values], \"timestamp\");\n    if (st != null && merged.length === st.length) {\n      return st;\n    }\n    return CollectionUtils_sortBy(merged, \"timestamp\", true);\n  };\n\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"weight\")\n        .p(\"weight\")\n        .recordModify((st) => applyValues(st, weightValues)),\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"percentage\")\n        .p(\"bodyfat\")\n        .recordModify((st) => applyValues(st, bodyfatValues)),\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"length\")\n        .p(\"waist\")\n        .recordModify((st) => applyValues(st, waistValues)),\n      platform === \"ios\"\n        ? lb<IState>().p(\"storage\").p(\"settings\").p(\"appleHealthAnchor\").record(data.anchor)\n        : lb<IState>().p(\"storage\").p(\"settings\").p(\"googleHealthAnchor\").record(data.anchor),\n    ],\n    desc: `Upload health stats from ${platform}`,\n  });\n}\n\nexport function EditStats_setHealthStatHidden(\n  dispatch: IDispatch,\n  key: IStatsHealthKey,\n  timestamp: number,\n  hidden: boolean\n): void {\n  dispatch({\n    type: \"UpdateState\",\n    desc: hidden ? \"Hide health stat\" : \"Unhide health stat\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"health\")\n        .recordModify((health) => {\n          const next: IStatsHealth = { ...(health || {}) };\n          next[key] = [...(next[key] || [])].map((v) => (v.timestamp === timestamp ? { ...v, hidden } : v));\n          return next;\n        }),\n    ],\n  });\n}\n\nexport function EditStats_uploadDailyMetrics(\n  platform: \"ios\" | \"android\",\n  dispatch: IDispatch,\n  result: IHealthDailyResult\n): void {\n  const byKey: Record<IStatsHealthKey, IHealthDailyValue[]> = { sleep: [], calories: [], protein: [] };\n  for (const v of result.values) {\n    byKey[v.type].push(v);\n  }\n  const now = Date.now();\n\n  // Daily aggregates are re-read over a rolling window each sync, so a day's total can change.\n  // Upsert by timestamp (replace same-day) rather than dedup-keep-first like measurements, carrying\n  // the user's `hidden` flag forward so hidden records stay hidden across re-syncs. When a day's value\n  // and source uuid are unchanged we keep the exact previous object (with its `updatedAt`) so\n  // VersionTracker doesn't treat the whole rolling window as changed on every sync.\n  //\n  // We intentionally KEEP existing days that are absent from the latest read rather than treating\n  // absence as a source-side deletion. HealthKit doesn't expose read-authorization status, so an\n  // empty/partial read is indistinguishable from revoked permission - auto-deleting on absence would\n  // risk silently wiping a user's history. Edits to a day ARE mirrored (same-day replace); a fully\n  // deleted source day lingers until the user hides it in the app.\n  const upsert = (\n    existing: IStatsHealthValue[] | undefined,\n    incoming: IHealthDailyValue[]\n  ): IStatsHealthValue[] | undefined => {\n    if (incoming.length === 0) {\n      return existing;\n    }\n    const existingByTimestamp = new Map((existing || []).map((v) => [v.timestamp, v]));\n    const incomingByTimestamp = new Set(incoming.map((v) => v.timestamp));\n    const merged = incoming.map((inc): IStatsHealthValue => {\n      const prev = existingByTimestamp.get(inc.timestamp);\n      const prevUuid = platform === \"ios\" ? prev?.appleUuid : prev?.googleUuid;\n      if (prev != null && prev.value === inc.value && prevUuid === inc.uuid) {\n        return prev;\n      }\n      const next: IStatsHealthValue = {\n        vtype: \"stat\",\n        value: inc.value,\n        timestamp: inc.timestamp,\n        updatedAt: now,\n        ...(platform === \"ios\" ? { appleUuid: inc.uuid } : { googleUuid: inc.uuid }),\n      };\n      if (prev?.hidden) {\n        next.hidden = true;\n      }\n      return next;\n    });\n    const kept = (existing || []).filter((v) => !incomingByTimestamp.has(v.timestamp));\n    return CollectionUtils_sortBy([...kept, ...merged], \"timestamp\", true);\n  };\n\n  dispatch({\n    type: \"UpdateState\",\n    lensRecording: [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"stats\")\n        .p(\"health\")\n        .recordModify((health) => {\n          const next: IStatsHealth = { ...(health || {}) };\n          for (const key of statsHealthDef) {\n            const upserted = upsert(next[key], byKey[key]);\n            if (upserted != null) {\n              next[key] = upserted;\n            }\n          }\n          return next;\n        }),\n    ],\n    desc: `Upload daily health metrics from ${platform}`,\n  });\n}\n","import {\n  IEquipment,\n  IEquipmentData,\n  equipments,\n  IAllEquipment,\n  ISettings,\n  IWeight,\n  IUnit,\n  IExerciseType,\n  IGym,\n} from \"../types\";\nimport { CollectionUtils_sort, CollectionUtils_concatBy } from \"../utils/collection\";\nimport { ObjectUtils_keys, ObjectUtils_filter } from \"../utils/object\";\nimport { equipmentName, Exercise_toKey } from \"./exercise\";\nimport { Weight_build, Weight_compare } from \"./weight\";\n\nexport function Equipment_build(name: string): IEquipmentData {\n  return {\n    vtype: \"equipment_data\",\n    name,\n    multiplier: 1,\n    bar: {\n      lb: Weight_build(0, \"lb\"),\n      kg: Weight_build(0, \"kg\"),\n    },\n    plates: [\n      { weight: Weight_build(10, \"lb\"), num: 4 },\n      { weight: Weight_build(5, \"kg\"), num: 4 },\n    ],\n    fixed: [],\n    isFixed: false,\n  };\n}\n\nexport function Equipment_getEquipmentOfGym(settings: ISettings, key?: string): IAllEquipment {\n  const firstEquipment = settings.gyms[0].equipment;\n  if (key != null) {\n    return settings.gyms.find((g) => g.id === key)?.equipment ?? firstEquipment;\n  } else {\n    return firstEquipment;\n  }\n}\n\nexport function Equipment_getGymByIdOrCurrent(settings: ISettings, gymId?: string): IGym {\n  return settings.gyms.find((g) => g.id === (gymId ?? settings.currentGymId)) ?? settings.gyms[0];\n}\n\nexport function Equipment_getCurrentGym(settings: ISettings): IGym {\n  return settings.gyms.find((g) => g.id === settings.currentGymId) ?? settings.gyms[0];\n}\n\nexport function Equipment_getEquipmentIdForExerciseType(\n  settings: ISettings,\n  exerciseType?: IExerciseType,\n  gymId?: string\n): string | undefined {\n  if (exerciseType == null) {\n    return undefined;\n  }\n\n  const key = Exercise_toKey(exerciseType);\n  if (\n    !(\n      settings.exerciseData[key] &&\n      (\"equipment\" in settings.exerciseData[key] || \"rounding\" in settings.exerciseData[key])\n    )\n  ) {\n    return exerciseType.equipment;\n  }\n  const exerciseData = settings.exerciseData[key];\n  const exerciseEquipment = exerciseData?.equipment;\n  if (exerciseEquipment == null) {\n    return undefined;\n  }\n\n  const currentGym = Equipment_getGymByIdOrCurrent(settings, gymId);\n  return exerciseEquipment[currentGym.id];\n}\n\nexport function Equipment_getEquipmentNameForExerciseType(\n  settings: ISettings,\n  exerciseType?: IExerciseType\n): string | undefined {\n  const equipment = Equipment_getEquipmentIdForExerciseType(settings, exerciseType);\n  if (equipment == null) {\n    return undefined;\n  }\n  const currentGym = Equipment_getCurrentGym(settings);\n  const gymEquipment = currentGym.equipment[equipment];\n  if (gymEquipment == null || gymEquipment.isDeleted) {\n    return undefined;\n  }\n  const name = gymEquipment.name;\n  return name || equipmentName(equipment);\n}\n\nexport function Equipment_getEquipmentDataForExerciseType(\n  settings: ISettings,\n  exerciseType?: IExerciseType\n): IEquipmentData | undefined {\n  const equipment = Equipment_getEquipmentIdForExerciseType(settings, exerciseType);\n  const currentGym = Equipment_getCurrentGym(settings);\n  return equipment ? currentGym.equipment[equipment] : undefined;\n}\n\nexport function Equipment_getUnitOrDefaultForExerciseType(settings: ISettings, exerciseType?: IExerciseType): IUnit {\n  const equipment = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n  return equipment?.unit ?? settings.units;\n}\n\nexport function Equipment_getUnitForExerciseType(settings: ISettings, exerciseType?: IExerciseType): IUnit | undefined {\n  const equipment = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n  const equipmentUnit = equipment?.unit;\n  return equipmentUnit == null || equipmentUnit === settings.units ? undefined : equipmentUnit;\n}\n\nexport function Equipment_getEquipmentData(settings: ISettings, key: string): IEquipmentData | undefined {\n  return Equipment_currentEquipment(settings)?.[key];\n}\n\nexport function Equipment_currentEquipment(settings: ISettings): IAllEquipment {\n  const currentGym = settings.gyms.find((g) => g.id === settings.currentGymId) ?? settings.gyms[0];\n  return currentGym?.equipment;\n}\n\nexport function Equipment_smallestPlate(equipmentData: IEquipmentData, unit: IUnit): IWeight {\n  return (\n    CollectionUtils_sort(\n      equipmentData.plates.filter((p) => p.weight.unit === unit),\n      (a, b) => Weight_compare(a.weight, b.weight)\n    )[0]?.weight || Weight_build(1, unit)\n  );\n}\n\nexport function Equipment_mergeEquipment(\n  oldEquipment: { [key in IEquipment]?: IEquipmentData },\n  newEquipment: { [key in IEquipment]?: IEquipmentData }\n): { [key in IEquipment]?: IEquipmentData } {\n  const newKeys = Array.from(new Set([...ObjectUtils_keys(newEquipment), ...ObjectUtils_keys(oldEquipment)]));\n  return newKeys.reduce<{ [key in IEquipment]?: IEquipmentData }>((acc, name) => {\n    const newEquipmentData = newEquipment[name];\n    const oldEquipmentData = oldEquipment[name];\n    if (newEquipmentData != null && oldEquipmentData == null) {\n      acc[name] = newEquipmentData;\n    } else if (newEquipmentData == null && oldEquipmentData != null) {\n      acc[name] = oldEquipmentData;\n    } else if (newEquipmentData != null && oldEquipmentData != null) {\n      acc[name] = {\n        ...oldEquipmentData,\n        bar: newEquipmentData.bar,\n        isFixed: newEquipmentData.isFixed,\n        plates: CollectionUtils_concatBy(\n          oldEquipmentData.plates,\n          newEquipmentData.plates,\n          (el) => `${el.weight.value}${el.weight.unit}`\n        ),\n        multiplier: newEquipmentData.multiplier,\n        fixed: CollectionUtils_concatBy(\n          oldEquipmentData.fixed,\n          newEquipmentData.fixed,\n          (el) => `${el.value}${el.unit}`\n        ),\n      };\n    }\n    return acc;\n  }, {});\n}\n\nexport function Equipment_isBuiltIn(key: string): boolean {\n  return (equipments as unknown as string[]).indexOf(key) !== -1;\n}\n\nexport function Equipment_customEquipment(equipmentSettings?: IAllEquipment): IAllEquipment {\n  return ObjectUtils_filter(equipmentSettings || {}, (key) => !Equipment_isBuiltIn(key));\n}\n\nexport function Equipment_equipmentKeyByName(name: string, equipmentSettings?: IAllEquipment): string | undefined {\n  const builtInEquipmentKey = equipments.find((eq) => eq === name.toLowerCase());\n  if (builtInEquipmentKey) {\n    return builtInEquipmentKey;\n  }\n\n  const builtInEquipmentName = equipments.find((eq) => equipmentName(eq).toLowerCase() === name.toLowerCase());\n  if (builtInEquipmentName) {\n    return builtInEquipmentName;\n  }\n\n  const customEquipmentKey = ObjectUtils_keys(equipmentSettings || {}).find((eq) => {\n    return equipmentName(eq).toLowerCase() === name.toLowerCase();\n  });\n  return customEquipmentKey;\n}\n","import { ObjectUtils_keys, ObjectUtils_values, ObjectUtils_filter } from \"../utils/object\";\nimport { Weight_build, Weight_gt, Weight_multiply, Weight_roundConvertTo, Weight_convertTo } from \"./weight\";\nimport {\n  IExerciseId,\n  IEquipment,\n  IBarKey,\n  IWeight,\n  ISet,\n  IExerciseType,\n  equipments,\n  ISettings,\n  IAllCustomExercises,\n  IMuscle,\n  IMetaExercises,\n  IProgramExerciseWarmupSet,\n  IUnit,\n  ICustomExercise,\n  IScreenMuscle,\n  IAllEquipment,\n  IProgram,\n  IMuscleMultiplier,\n} from \"../types\";\nimport {\n  Muscle_getScreenMusclesFromMuscle,\n  Muscle_getMusclesFromScreenMuscle,\n  Muscle_getAvailableMuscleGroups,\n  Muscle_getMuscleGroupName,\n} from \"./muscle\";\nimport {\n  StringUtils_fuzzySearch,\n  StringUtils_dashcase,\n  StringUtils_uncamelCase,\n  StringUtils_camelCase,\n  StringUtils_undashcase,\n  StringUtils_capitalize,\n} from \"../utils/string\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { CollectionUtils_compact, CollectionUtils_sort, CollectionUtils_flat } from \"../utils/collection\";\nimport { ExerciseImageUtils_exists } from \"./exerciseImage\";\nimport { Equipment_getUnitOrDefaultForExerciseType, Equipment_currentEquipment } from \"./equipment\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Program_changeExerciseName } from \"./program\";\nimport { EditProgram_updateProgram } from \"./editProgram\";\nimport { lb } from \"lens-shmens\";\nimport { updateSettings } from \"./state\";\n\nexport const allExercisesList: Record<IExerciseId, IExercise> = {\n  abWheel: {\n    id: \"abWheel\",\n    name: \"Ab Wheel\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  arnoldPress: {\n    id: \"arnoldPress\",\n    name: \"Arnold Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  aroundTheWorld: {\n    id: \"aroundTheWorld\",\n    name: \"Around The World\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"core\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  backExtension: {\n    id: \"backExtension\",\n    name: \"Back Extension\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"core\"],\n    startingWeightLb: { value: 50, unit: \"lb\" },\n    startingWeightKg: { value: 22.5, unit: \"kg\" },\n  },\n  ballSlams: {\n    id: \"ballSlams\",\n    name: \"Ball Slams\",\n    defaultEquipment: \"medicineball\",\n    types: [\"core\", \"upper\"],\n    startingWeightLb: { value: 10, unit: \"lb\" },\n    startingWeightKg: { value: 4.5, unit: \"kg\" },\n  },\n  battleRopes: {\n    id: \"battleRopes\",\n    name: \"Battle Ropes\",\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  behindTheNeckPress: {\n    id: \"behindTheNeckPress\",\n    name: \"Behind The Neck Press\",\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  benchDip: {\n    id: \"benchDip\",\n    name: \"Bench Dip\",\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  benchPress: {\n    id: \"benchPress\",\n    name: \"Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  benchPressCloseGrip: {\n    id: \"benchPressCloseGrip\",\n    name: \"Bench Press Close Grip\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  benchPressWideGrip: {\n    id: \"benchPressWideGrip\",\n    name: \"Bench Press Wide Grip\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  bentOverOneArmRow: {\n    id: \"bentOverOneArmRow\",\n    name: \"Bent Over One Arm Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  bentOverRow: {\n    id: \"bentOverRow\",\n    name: \"Bent Over Row\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  bicepCurl: {\n    id: \"bicepCurl\",\n    name: \"Bicep Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  bicycleCrunch: {\n    id: \"bicycleCrunch\",\n    name: \"Bicycle Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  boxJump: {\n    id: \"boxJump\",\n    name: \"Box Jump\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  boxSquat: {\n    id: \"boxSquat\",\n    name: \"Box Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 155, unit: \"lb\" },\n    startingWeightKg: { value: 70, unit: \"kg\" },\n  },\n  bulgarianSplitSquat: {\n    id: \"bulgarianSplitSquat\",\n    name: \"Bulgarian Split Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  burpee: {\n    id: \"burpee\",\n    name: \"Burpee\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"lower\", \"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  cableCrossover: {\n    id: \"cableCrossover\",\n    name: \"Cable Crossover\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  cableCrunch: {\n    id: \"cableCrunch\",\n    name: \"Cable Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"core\"],\n    startingWeightLb: { value: 50, unit: \"lb\" },\n    startingWeightKg: { value: 22.5, unit: \"kg\" },\n  },\n  cableKickback: {\n    id: \"cableKickback\",\n    name: \"Cable Kickback\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  cablePullThrough: {\n    id: \"cablePullThrough\",\n    name: \"Cable Pull Through\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"lower\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  cableTwist: {\n    id: \"cableTwist\",\n    name: \"Cable Twist\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"core\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  calfPressOnLegPress: {\n    id: \"calfPressOnLegPress\",\n    name: \"Calf Press on Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 150, unit: \"lb\" },\n    startingWeightKg: { value: 67.5, unit: \"kg\" },\n  },\n  calfPressOnSeatedLegPress: {\n    id: \"calfPressOnSeatedLegPress\",\n    name: \"Calf Press on Seated Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 120, unit: \"lb\" },\n    startingWeightKg: { value: 53.75, unit: \"kg\" },\n  },\n  chestDip: {\n    id: \"chestDip\",\n    name: \"Chest Dip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  chestFly: {\n    id: \"chestFly\",\n    name: \"Chest Fly\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  chestPress: {\n    id: \"chestPress\",\n    name: \"Chest Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  chestSupportedRow: {\n    id: \"chestSupportedRow\",\n    name: \"Chest-Supported Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  chinUp: {\n    id: \"chinUp\",\n    name: \"Chin Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  clean: {\n    id: \"clean\",\n    name: \"Clean\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  cleanandJerk: {\n    id: \"cleanandJerk\",\n    name: \"Clean and Jerk\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  concentrationCurl: {\n    id: \"concentrationCurl\",\n    name: \"Concentration Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  crossBodyCrunch: {\n    id: \"crossBodyCrunch\",\n    name: \"Cross Body Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  crunch: {\n    id: \"crunch\",\n    name: \"Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  cycling: {\n    id: \"cycling\",\n    name: \"Cycling\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  deadlift: {\n    id: \"deadlift\",\n    name: \"Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"pull\"],\n    startingWeightLb: { value: 185, unit: \"lb\" },\n    startingWeightKg: { value: 82.5, unit: \"kg\" },\n  },\n  deadliftHighPull: {\n    id: \"deadliftHighPull\",\n    name: \"Deadlift High Pull\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  declineBenchPress: {\n    id: \"declineBenchPress\",\n    name: \"Decline Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 125, unit: \"lb\" },\n    startingWeightKg: { value: 55, unit: \"kg\" },\n  },\n  declineCrunch: {\n    id: \"declineCrunch\",\n    name: \"Decline Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  deficitDeadlift: {\n    id: \"deficitDeadlift\",\n    name: \"Deficit Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"pull\"],\n    startingWeightLb: { value: 165, unit: \"lb\" },\n    startingWeightKg: { value: 75, unit: \"kg\" },\n  },\n  ellipticalMachine: {\n    id: \"ellipticalMachine\",\n    name: \"Elliptical Machine\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  facePull: {\n    id: \"facePull\",\n    name: \"Face Pull\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  flatKneeRaise: {\n    id: \"flatKneeRaise\",\n    name: \"Flat Knee Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  flatLegRaise: {\n    id: \"flatLegRaise\",\n    name: \"Flat Leg Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  frontRaise: {\n    id: \"frontRaise\",\n    name: \"Front Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  frontSquat: {\n    id: \"frontSquat\",\n    name: \"Front Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  gobletSquat: {\n    id: \"gobletSquat\",\n    name: \"Goblet Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  goodMorning: {\n    id: \"goodMorning\",\n    name: \"Good Morning\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  gluteBridge: {\n    id: \"gluteBridge\",\n    name: \"Glute Bridge\",\n    defaultWarmup: 45,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  gluteBridgeMarch: {\n    id: \"gluteBridgeMarch\",\n    name: \"Glute Bridge March\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  gluteKickback: {\n    id: \"gluteKickback\",\n    name: \"Glute Kickback\",\n    defaultWarmup: 45,\n    defaultEquipment: \"cable\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  hackSquat: {\n    id: \"hackSquat\",\n    name: \"Hack Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  hammerCurl: {\n    id: \"hammerCurl\",\n    name: \"Hammer Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  handstandPushUp: {\n    id: \"handstandPushUp\",\n    name: \"Handstand Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  hangClean: {\n    id: \"hangClean\",\n    name: \"Hang Clean\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  hangSnatch: {\n    id: \"hangSnatch\",\n    name: \"Hang Snatch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  hangingLegRaise: {\n    id: \"hangingLegRaise\",\n    name: \"Hanging Leg Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  highKneeSkips: {\n    id: \"highKneeSkips\",\n    name: \"High Knee Skips\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  highRow: {\n    id: \"highRow\",\n    name: \"High Row\",\n    defaultWarmup: 45,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  hipAbductor: {\n    id: \"hipAbductor\",\n    name: \"Hip Abductor\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  hipAdductor: {\n    id: \"hipAdductor\",\n    name: \"Hip Adductor\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  hipThrust: {\n    id: \"hipThrust\",\n    name: \"Hip Thrust\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  inclineBenchPress: {\n    id: \"inclineBenchPress\",\n    name: \"Incline Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  inclineBenchPressWideGrip: {\n    id: \"inclineBenchPressWideGrip\",\n    name: \"Incline Bench Press Wide Grip\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 110, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  inclineChestFly: {\n    id: \"inclineChestFly\",\n    name: \"Incline Chest Fly\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  inclineChestPress: {\n    id: \"inclineChestPress\",\n    name: \"Incline Chest Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  inclineCurl: {\n    id: \"inclineCurl\",\n    name: \"Incline Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  inclineRow: {\n    id: \"inclineRow\",\n    name: \"Incline Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  invertedRow: {\n    id: \"invertedRow\",\n    name: \"Inverted Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  isoLateralChestPress: {\n    id: \"isoLateralChestPress\",\n    name: \"Iso-Lateral Chest Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  isoLateralRow: {\n    id: \"isoLateralRow\",\n    name: \"Iso-Lateral Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  jackknifeSitUp: {\n    id: \"jackknifeSitUp\",\n    name: \"Jackknife Sit Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  jumpRope: {\n    id: \"jumpRope\",\n    name: \"Jump Rope\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  jumpSquat: {\n    id: \"jumpSquat\",\n    name: \"Jump Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  jumpingJack: {\n    id: \"jumpingJack\",\n    name: \"Jumping Jack\",\n    defaultWarmup: 10,\n    defaultEquipment: undefined,\n    types: [\"upper\", \"lower\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kettlebellSwing: {\n    id: \"kettlebellSwing\",\n    name: \"Kettlebell Swing\",\n    defaultWarmup: 10,\n    defaultEquipment: \"kettlebell\",\n    types: [\"upper\", \"lower\", \"core\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 16, unit: \"kg\" },\n  },\n  kettlebellTurkishGetUp: {\n    id: \"kettlebellTurkishGetUp\",\n    name: \"Kettlebell Turkish Get Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"kettlebell\",\n    types: [\"upper\", \"lower\", \"core\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 8, unit: \"kg\" },\n  },\n  kippingPullUp: {\n    id: \"kippingPullUp\",\n    name: \"Kipping Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneeRaise: {\n    id: \"kneeRaise\",\n    name: \"Knee Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneelingPulldown: {\n    id: \"kneelingPulldown\",\n    name: \"Kneeling Pulldown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneestoElbows: {\n    id: \"kneestoElbows\",\n    name: \"Knees to Elbows\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  latPulldown: {\n    id: \"latPulldown\",\n    name: \"Lat Pulldown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  lateralBoxJump: {\n    id: \"lateralBoxJump\",\n    name: \"Lateral Box Jump\",\n    defaultWarmup: 10,\n    defaultEquipment: undefined,\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  lateralRaise: {\n    id: \"lateralRaise\",\n    name: \"Lateral Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  legsUpBenchPress: {\n    id: \"legsUpBenchPress\",\n    name: \"Legs Up Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  legCurl: {\n    id: \"legCurl\",\n    name: \"Leg Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  legExtension: {\n    id: \"legExtension\",\n    name: \"Leg Extension\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  legPress: {\n    id: \"legPress\",\n    name: \"Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 250, unit: \"lb\" },\n    startingWeightKg: { value: 112.5, unit: \"kg\" },\n  },\n  lunge: {\n    id: \"lunge\",\n    name: \"Lunge\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  lyingBicepCurl: {\n    id: \"lyingBicepCurl\",\n    name: \"Lying Bicep Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  lyingLegCurl: {\n    id: \"lyingLegCurl\",\n    name: \"Lying Leg Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  mountainClimber: {\n    id: \"mountainClimber\",\n    name: \"Mountain Climber\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\", \"lower\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  muscleUp: {\n    id: \"muscleUp\",\n    name: \"Muscle Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  obliqueCrunch: {\n    id: \"obliqueCrunch\",\n    name: \"Oblique Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  overheadPress: {\n    id: \"overheadPress\",\n    name: \"Overhead Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  overheadSquat: {\n    id: \"overheadSquat\",\n    name: \"Overhead Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 55, unit: \"lb\" },\n    startingWeightKg: { value: 25, unit: \"kg\" },\n  },\n  pecDeck: {\n    id: \"pecDeck\",\n    name: \"Pec Deck\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 50, unit: \"lb\" },\n    startingWeightKg: { value: 22.5, unit: \"kg\" },\n  },\n  pendlayRow: {\n    id: \"pendlayRow\",\n    name: \"Pendlay Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  pistolSquat: {\n    id: \"pistolSquat\",\n    name: \"Pistol Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  plank: {\n    id: \"plank\",\n    name: \"Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  powerClean: {\n    id: \"powerClean\",\n    name: \"Power Clean\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  powerSnatch: {\n    id: \"powerSnatch\",\n    name: \"Power Snatch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  preacherCurl: {\n    id: \"preacherCurl\",\n    name: \"Preacher Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  pressUnder: {\n    id: \"pressUnder\",\n    name: \"Press Under\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  pullUp: {\n    id: \"pullUp\",\n    name: \"Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  pullover: {\n    id: \"pullover\",\n    name: \"Pullover\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  pushPress: {\n    id: \"pushPress\",\n    name: \"Push Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"kettlebell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 16, unit: \"kg\" },\n  },\n  pushUp: {\n    id: \"pushUp\",\n    name: \"Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  reverseCrunch: {\n    id: \"reverseCrunch\",\n    name: \"Reverse Crunch\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  reverseCurl: {\n    id: \"reverseCurl\",\n    name: \"Reverse Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  reverseFly: {\n    id: \"reverseFly\",\n    name: \"Reverse Fly\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  reverseGripConcentrationCurl: {\n    id: \"reverseGripConcentrationCurl\",\n    name: \"Reverse Grip Concentration Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  reversePlank: {\n    id: \"reversePlank\",\n    name: \"Reverse Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  reverseLatPulldown: {\n    id: \"reverseLatPulldown\",\n    name: \"Reverse Lat Pulldown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  reverseLunge: {\n    id: \"reverseLunge\",\n    name: \"Reverse Lunge\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  reverseWristCurl: {\n    id: \"reverseWristCurl\",\n    name: \"Reverse Wrist Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  romanianDeadlift: {\n    id: \"romanianDeadlift\",\n    name: \"Romanian Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 40, unit: \"lb\" },\n    startingWeightKg: { value: 17.5, unit: \"kg\" },\n  },\n  reverseHyperextension: {\n    id: \"reverseHyperextension\",\n    name: \"Reverse Hyperextension\",\n    defaultWarmup: 45,\n    defaultEquipment: \"band\",\n    types: [\"core\", \"lower\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  rowing: {\n    id: \"rowing\",\n    name: \"Rowing\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  russianTwist: {\n    id: \"russianTwist\",\n    name: \"Russian Twist\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  safetySquatBarSquat: {\n    id: \"safetySquatBarSquat\",\n    name: \"Safety Squat Bar Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 145, unit: \"lb\" },\n    startingWeightKg: { value: 65, unit: \"kg\" },\n  },\n  seatedCalfRaise: {\n    id: \"seatedCalfRaise\",\n    name: \"Seated Calf Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 90, unit: \"lb\" },\n    startingWeightKg: { value: 40, unit: \"kg\" },\n  },\n  seatedFrontRaise: {\n    id: \"seatedFrontRaise\",\n    name: \"Seated Front Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  seatedLegCurl: {\n    id: \"seatedLegCurl\",\n    name: \"Seated Leg Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 60, unit: \"lb\" },\n    startingWeightKg: { value: 26.25, unit: \"kg\" },\n  },\n  seatedLegPress: {\n    id: \"seatedLegPress\",\n    name: \"Seated Leg Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 200, unit: \"lb\" },\n    startingWeightKg: { value: 90, unit: \"kg\" },\n  },\n  seatedOverheadPress: {\n    id: \"seatedOverheadPress\",\n    name: \"Seated Overhead Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 75, unit: \"lb\" },\n    startingWeightKg: { value: 32.5, unit: \"kg\" },\n  },\n  seatedPalmsUpWristCurl: {\n    id: \"seatedPalmsUpWristCurl\",\n    name: \"Seated Palms Up Wrist Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 15, unit: \"lb\" },\n    startingWeightKg: { value: 5, unit: \"kg\" },\n  },\n  seatedRow: {\n    id: \"seatedRow\",\n    name: \"Seated Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  seatedWideGripRow: {\n    id: \"seatedWideGripRow\",\n    name: \"Seated Wide Grip Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  shoulderPress: {\n    id: \"shoulderPress\",\n    name: \"Shoulder Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  shoulderPressParallelGrip: {\n    id: \"shoulderPressParallelGrip\",\n    name: \"Shoulder Press Parallel Grip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  shrug: {\n    id: \"shrug\",\n    name: \"Shrug\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 45, unit: \"lb\" },\n    startingWeightKg: { value: 20, unit: \"kg\" },\n  },\n  sideBend: {\n    id: \"sideBend\",\n    name: \"Side Bend\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"core\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  sideCrunch: {\n    id: \"sideCrunch\",\n    name: \"Side Crunch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sideHipAbductor: {\n    id: \"sideHipAbductor\",\n    name: \"Side Hip Abductor\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sideLyingClam: {\n    id: \"sideLyingClam\",\n    name: \"Side Lying Clam\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sidePlank: {\n    id: \"sidePlank\",\n    name: \"Side Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegBridge: {\n    id: \"singleLegBridge\",\n    name: \"Single Leg Bridge\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegCalfRaise: {\n    id: \"singleLegCalfRaise\",\n    name: \"Single Leg Calf Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  singleLegDeadlift: {\n    id: \"singleLegDeadlift\",\n    name: \"Single Leg Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  singleLegGluteBridgeBench: {\n    id: \"singleLegGluteBridgeBench\",\n    name: \"Single Leg Glute Bridge On Bench\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegGluteBridgeStraight: {\n    id: \"singleLegGluteBridgeStraight\",\n    name: \"Single Leg Glute Bridge Straight Leg\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegGluteBridgeBentKnee: {\n    id: \"singleLegGluteBridgeBentKnee\",\n    name: \"Single Leg Glute Bridge Bent Knee\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  singleLegHipThrust: {\n    id: \"singleLegHipThrust\",\n    name: \"Single Leg Hip Thrust\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sissySquat: {\n    id: \"sissySquat\",\n    name: \"Sissy Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  sitUp: {\n    id: \"sitUp\",\n    name: \"Sit Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  skullcrusher: {\n    id: \"skullcrusher\",\n    name: \"Skullcrusher\",\n    defaultWarmup: 10,\n    defaultEquipment: \"ezbar\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 45, unit: \"lb\" },\n    startingWeightKg: { value: 20, unit: \"kg\" },\n  },\n  slingShotBenchPress: {\n    id: \"slingShotBenchPress\",\n    name: \"Sling Shot Bench Press\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 140, unit: \"lb\" },\n    startingWeightKg: { value: 62.5, unit: \"kg\" },\n  },\n  snatch: {\n    id: \"snatch\",\n    name: \"Snatch\",\n    defaultWarmup: 45,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  snatchPull: {\n    id: \"snatchPull\",\n    name: \"Snatch Pull\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  splitSquat: {\n    id: \"splitSquat\",\n    name: \"Split Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  splitJerk: {\n    id: \"splitJerk\",\n    name: \"Split Jerk\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 95, unit: \"lb\" },\n    startingWeightKg: { value: 42.5, unit: \"kg\" },\n  },\n  squat: {\n    id: \"squat\",\n    name: \"Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 135, unit: \"lb\" },\n    startingWeightKg: { value: 60, unit: \"kg\" },\n  },\n  squatRow: {\n    id: \"squatRow\",\n    name: \"Squat Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  standingCalfRaise: {\n    id: \"standingCalfRaise\",\n    name: \"Standing Calf Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 35, unit: \"lb\" },\n    startingWeightKg: { value: 15, unit: \"kg\" },\n  },\n  standingRow: {\n    id: \"standingRow\",\n    name: \"Standing Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  standingRowCloseGrip: {\n    id: \"standingRowCloseGrip\",\n    name: \"Standing Row Close Grip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  standingRowRearDeltWithRope: {\n    id: \"standingRowRearDeltWithRope\",\n    name: \"Standing Row Rear Delt With Rope\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  standingRowRearHorizontalDeltWithRope: {\n    id: \"standingRowRearHorizontalDeltWithRope\",\n    name: \"Standing Row Rear Delt, Horizontal, With Rope\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 30, unit: \"lb\" },\n    startingWeightKg: { value: 12.5, unit: \"kg\" },\n  },\n  standingRowVBar: {\n    id: \"standingRowVBar\",\n    name: \"Standing Row V-Bar\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 70, unit: \"lb\" },\n    startingWeightKg: { value: 30, unit: \"kg\" },\n  },\n  stepUp: {\n    id: \"stepUp\",\n    name: \"Step up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  stiffLegDeadlift: {\n    id: \"stiffLegDeadlift\",\n    name: \"Stiff Leg Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 115, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  straightLegDeadlift: {\n    id: \"straightLegDeadlift\",\n    name: \"Straight Leg Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 110, unit: \"lb\" },\n    startingWeightKg: { value: 50, unit: \"kg\" },\n  },\n  sumoDeadlift: {\n    id: \"sumoDeadlift\",\n    name: \"Sumo Deadlift\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 175, unit: \"lb\" },\n    startingWeightKg: { value: 77.5, unit: \"kg\" },\n  },\n  sumoDeadliftHighPull: {\n    id: \"sumoDeadliftHighPull\",\n    name: \"Sumo Deadlift High Pull\",\n    defaultWarmup: 95,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"pull\"],\n    startingWeightLb: { value: 85, unit: \"lb\" },\n    startingWeightKg: { value: 37.5, unit: \"kg\" },\n  },\n  superman: {\n    id: \"superman\",\n    name: \"Superman\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  tBarRow: {\n    id: \"tBarRow\",\n    name: \"T Bar Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"leverageMachine\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 90, unit: \"lb\" },\n    startingWeightKg: { value: 40, unit: \"kg\" },\n  },\n  thruster: {\n    id: \"thruster\",\n    name: \"Thruster\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"lower\", \"push\"],\n    startingWeightLb: { value: 65, unit: \"lb\" },\n    startingWeightKg: { value: 27.5, unit: \"kg\" },\n  },\n  toesToBar: {\n    id: \"toesToBar\",\n    name: \"Toes To Bar\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  torsoRotation: {\n    id: \"torsoRotation\",\n    name: \"Torso Rotation\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  trapBarDeadlift: {\n    id: \"trapBarDeadlift\",\n    name: \"Trap Bar Deadlift\",\n    defaultWarmup: 10,\n    defaultEquipment: \"trapbar\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 185, unit: \"lb\" },\n    startingWeightKg: { value: 82.5, unit: \"kg\" },\n  },\n  tricepsDip: {\n    id: \"tricepsDip\",\n    name: \"Triceps Dip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  tricepsExtension: {\n    id: \"tricepsExtension\",\n    name: \"Triceps Extension\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  tricepsPushdown: {\n    id: \"tricepsPushdown\",\n    name: \"Triceps Pushdown\",\n    defaultWarmup: 10,\n    defaultEquipment: \"cable\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 40, unit: \"lb\" },\n    startingWeightKg: { value: 17.5, unit: \"kg\" },\n  },\n  uprightRow: {\n    id: \"uprightRow\",\n    name: \"Upright Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 7.5, unit: \"kg\" },\n  },\n  vUp: {\n    id: \"vUp\",\n    name: \"V Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  widePullUp: {\n    id: \"widePullUp\",\n    name: \"Wide Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  wristCurl: {\n    id: \"wristCurl\",\n    name: \"Wrist Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"barbell\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 25, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  wristRoller: {\n    id: \"wristRoller\",\n    name: \"Wrist Roller\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  zercherSquat: {\n    id: \"zercherSquat\",\n    name: \"Zercher Squat\",\n    defaultWarmup: 45,\n    defaultEquipment: \"barbell\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 105, unit: \"lb\" },\n    startingWeightKg: { value: 47.5, unit: \"kg\" },\n  },\n  wallPushup: {\n    id: \"wallPushup\",\n    name: \"Wall Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  inclinePushup: {\n    id: \"inclinePushup\",\n    name: \"Incline Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneePushup: {\n    id: \"kneePushup\",\n    name: \"Knee Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  diamondPushup: {\n    id: \"diamondPushup\",\n    name: \"Diamond Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  pseudoPlanchePushup: {\n    id: \"pseudoPlanchePushup\",\n    name: \"Pseudo Planche Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  pikePushup: {\n    id: \"pikePushup\",\n    name: \"Pike Push Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  ringDip: {\n    id: \"ringDip\",\n    name: \"Ring Dip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  negativeDip: {\n    id: \"negativeDip\",\n    name: \"Negative Dip\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  verticalRow: {\n    id: \"verticalRow\",\n    name: \"Vertical Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  wideRow: {\n    id: \"wideRow\",\n    name: \"Wide Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  ringRow: {\n    id: \"ringRow\",\n    name: \"Ring Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  tuckFrontLeverRow: {\n    id: \"tuckFrontLeverRow\",\n    name: \"Tuck Front Lever Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  frontLeverRow: {\n    id: \"frontLeverRow\",\n    name: \"Front Lever Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  scapularPullUp: {\n    id: \"scapularPullUp\",\n    name: \"Scapular Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  deadHang: {\n    id: \"deadHang\",\n    name: \"Dead Hang\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  negativePullup: {\n    id: \"negativePullup\",\n    name: \"Negative Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  assistedSquat: {\n    id: \"assistedSquat\",\n    name: \"Assisted Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  shrimpSquat: {\n    id: \"shrimpSquat\",\n    name: \"Shrimp Squat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  nordicCurl: {\n    id: \"nordicCurl\",\n    name: \"Nordic Curl\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"lower\", \"legs\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  handstand: {\n    id: \"handstand\",\n    name: \"Handstand\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  wallHandstand: {\n    id: \"wallHandstand\",\n    name: \"Wall Handstand\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  crowPose: {\n    id: \"crowPose\",\n    name: \"Crow Pose\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  dragonFlag: {\n    id: \"dragonFlag\",\n    name: \"Dragon Flag\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  copenhagenPlank: {\n    id: \"copenhagenPlank\",\n    name: \"Copenhagen Plank\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  hangingKneeRaise: {\n    id: \"hangingKneeRaise\",\n    name: \"Hanging Knee Raise\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  archHang: {\n    id: \"archHang\",\n    name: \"Arch Hang\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  supportHold: {\n    id: \"supportHold\",\n    name: \"Support Hold\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"push\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  pallofPress: {\n    id: \"pallofPress\",\n    name: \"Pallof Press\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  renegadeRow: {\n    id: \"renegadeRow\",\n    name: \"Renegade Row\",\n    defaultWarmup: 10,\n    defaultEquipment: \"dumbbell\",\n    types: [\"upper\", \"pull\", \"core\"],\n    startingWeightLb: { value: 20, unit: \"lb\" },\n    startingWeightKg: { value: 10, unit: \"kg\" },\n  },\n  ringAbRollout: {\n    id: \"ringAbRollout\",\n    name: \"Ring Ab Rollout\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  kneelingRingAbRollout: {\n    id: \"kneelingRingAbRollout\",\n    name: \"Kneeling Ring Ab Rollout\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  archerPullUp: {\n    id: \"archerPullUp\",\n    name: \"Archer Pull Up\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  skinTheCat: {\n    id: \"skinTheCat\",\n    name: \"Skin the Cat\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"upper\", \"pull\", \"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  hollowBodyHold: {\n    id: \"hollowBodyHold\",\n    name: \"Hollow Body Hold\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  deadBug: {\n    id: \"deadBug\",\n    name: \"Dead Bug\",\n    defaultWarmup: 10,\n    defaultEquipment: \"bodyweight\",\n    types: [\"core\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n  shoulderPassThrough: {\n    id: \"shoulderPassThrough\",\n    name: \"Shoulder Pass Through\",\n    defaultWarmup: 10,\n    defaultEquipment: \"band\",\n    types: [\"upper\"],\n    startingWeightLb: { value: 0, unit: \"lb\" },\n    startingWeightKg: { value: 0, unit: \"kg\" },\n  },\n};\n\nconst nameToIdMapping = ObjectUtils_keys(allExercisesList).reduce<Partial<Record<string, IExerciseId>>>(\n  (acc, key) => {\n    acc[allExercisesList[key].name.toLowerCase()] = allExercisesList[key].id;\n    return acc;\n  },\n  // Null-prototype so arbitrary exercise names (e.g. \"constructor\", \"__proto__\") can't resolve to inherited props.\n  Object.create(null) as Partial<Record<string, IExerciseId>>\n);\n\nexport const metadata: Record<IExerciseId, IMetaExercises> = {\n  abWheel: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Deltoid Posterior\",\n      \"Latissimus Dorsi\",\n      \"Pectineous\",\n      \"Pectoralis Major Sternal Head\",\n      \"Sartorius\",\n      \"Serratus Anterior\",\n      \"Tensor Fasciae Latae\",\n      \"Teres Major\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  arnoldPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"dumbbell\", \"kettlebell\"],\n  },\n  aroundTheWorld: {\n    targetMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Deltoid Posterior\", \"Latissimus Dorsi\", \"Serratus Anterior\"],\n    bodyParts: [\"Chest\", \"Shoulders\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  backExtension: {\n    targetMuscles: [\"Erector Spinae\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\", \"leverageMachine\"],\n  },\n  ballSlams: {\n    targetMuscles: [\n      \"Infraspinatus\",\n      \"Latissimus Dorsi\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Rectus Abdominis\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"medicineball\"],\n  },\n  battleRopes: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  behindTheNeckPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  benchDip: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  benchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"smith\", \"band\", \"kettlebell\"],\n  },\n  benchPressCloseGrip: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"ezbar\", \"smith\"],\n  },\n  benchPressWideGrip: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"smith\"],\n  },\n  bentOverOneArmRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  bentOverRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"band\", \"leverageMachine\", \"smith\"],\n  },\n  bicepCurl: {\n    targetMuscles: [\"Biceps Brachii\"],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"leverageMachine\", \"cable\", \"ezbar\"],\n  },\n  bicycleCrunch: {\n    targetMuscles: [\"Obliques\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Iliopsoas\", \"Quadriceps\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  boxJump: {\n    targetMuscles: [\"Quadriceps\", \"Gluteus Maximus\", \"Gastrocnemius\", \"Soleus\"],\n    synergistMuscles: [\"Hamstrings\", \"Adductor Magnus\", \"Erector Spinae\", \"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  boxSquat: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  bulgarianSplitSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Hips\", \"Thighs\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  burpee: {\n    targetMuscles: [\n      \"Quadriceps\",\n      \"Gluteus Maximus\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Triceps Brachii\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Rectus Abdominis\",\n    ],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Latissimus Dorsi\",\n      \"Obliques\",\n      \"Erector Spinae\",\n      \"Obliques\",\n      \"Soleus\",\n      \"Gastrocnemius\",\n      \"Tibialis Anterior\",\n    ],\n    bodyParts: [\"Chest\", \"Shoulders\", \"Upper Arms\", \"Waist\", \"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  cableCrossover: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Latissimus Dorsi\", \"Levator Scapulae\", \"Pectoralis Major Clavicular Head\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cableCrunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cableKickback: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cablePullThrough: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"cable\"],\n  },\n  cableTwist: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Erector Spinae\",\n      \"Gluteus Medius\",\n      \"Iliopsoas\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\", \"cable\", \"leverageMachine\", \"band\"],\n  },\n  calfPressOnLegPress: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  calfPressOnSeatedLegPress: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  chestDip: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  chestFly: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"leverageMachine\"],\n  },\n  chestPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"leverageMachine\", \"band\"],\n  },\n  chestSupportedRow: {\n    targetMuscles: [\"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Latissimus Dorsi\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  chinUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\"],\n  },\n  clean: {\n    targetMuscles: [\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Lower Fibers\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n    ],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  cleanandJerk: {\n    targetMuscles: [\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Lower Fibers\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n    ],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  concentrationCurl: {\n    targetMuscles: [\"Brachialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"cable\"],\n  },\n  crossBodyCrunch: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Iliopsoas\", \"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  crunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\", \"bodyweight\", \"leverageMachine\"],\n  },\n  cycling: {\n    targetMuscles: [\"Quadriceps\", \"Hamstrings\", \"Gluteus Maximus\", \"Gastrocnemius\", \"Soleus\", \"Tibialis Anterior\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Adductor Longus\",\n      \"Adductor Brevis\",\n      \"Iliopsoas\",\n      \"Erector Spinae\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Calves\", \"Shins\", \"Back\", \"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  deadlift: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Hamstrings\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"leverageMachine\", \"smith\", \"band\", \"kettlebell\", \"bodyweight\"],\n  },\n  deadliftHighPull: {\n    targetMuscles: [\"Deltoid Lateral\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Gastrocnemius\",\n      \"Infraspinatus\",\n      \"Soleus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  declineBenchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"dumbbell\", \"smith\"],\n  },\n  declineCrunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  deficitDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Erector Spinae\", \"Hamstrings\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"trapbar\"],\n  },\n  ellipticalMachine: {\n    targetMuscles: [],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n      \"Quadriceps\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Hips\", \"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  facePull: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"band\"],\n  },\n  flatKneeRaise: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  flatLegRaise: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Pectineous\",\n      \"Quadriceps\",\n      \"Sartorius\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Hips\", \"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  frontRaise: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"bodyweight\", \"band\"],\n  },\n  gluteBridge: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Quadriceps\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"band\", \"barbell\", \"dumbbell\"],\n  },\n  gluteBridgeMarch: {\n    targetMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\"],\n    synergistMuscles: [\"Hamstrings\", \"Quadriceps\", \"Sartorius\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  gluteKickback: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\"],\n    bodyParts: [\"Glute\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\", \"cable\", \"band\"],\n  },\n  frontSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"kettlebell\", \"dumbbell\", \"cable\", \"smith\"],\n  },\n  gobletSquat: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"kettlebell\", \"dumbbell\"],\n  },\n  goodMorning: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"smith\", \"leverageMachine\"],\n  },\n  hackSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"smith\"],\n  },\n  hammerCurl: {\n    targetMuscles: [\"Brachioradialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachialis\"],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"band\"],\n  },\n  handstandPushUp: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  hangClean: {\n    targetMuscles: [\"Biceps Brachii\", \"Brachialis\", \"Brachioradialis\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\"],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"kettlebell\"],\n  },\n  hangSnatch: {\n    targetMuscles: [\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Quadriceps\",\n      \"Gluteus Maximus\",\n    ],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Erector Spinae\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Latissimus Dorsi\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n    ],\n    bodyParts: [\"Thighs\", \"Back\", \"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  hangingLegRaise: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"cable\"],\n  },\n  highKneeSkips: {\n    targetMuscles: [\"Quadriceps\", \"Hamstrings\", \"Gluteus Maximus\"],\n    synergistMuscles: [\n      \"Iliopsoas\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Tibialis Anterior\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Adductor Magnus\",\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n    ],\n    bodyParts: [\"Thighs\", \"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  highRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Erector Spinae\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  hipAbductor: {\n    targetMuscles: [\"Gluteus Maximus\", \"Gluteus Medius\"],\n    synergistMuscles: [\"Tensor Fasciae Latae\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\", \"cable\", \"band\"],\n  },\n  hipAdductor: {\n    targetMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Adductor Magnus\"],\n    synergistMuscles: [\"Pectineous\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"leverageMachine\", \"cable\", \"band\", \"bodyweight\"],\n  },\n  hipThrust: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Quadriceps\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"leverageMachine\", \"band\", \"bodyweight\"],\n  },\n  inclineBenchPress: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Sternal Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"smith\"],\n  },\n  inclineBenchPressWideGrip: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Sternal Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  inclineChestFly: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Deltoid Anterior\", \"Pectoralis Major Sternal Head\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"cable\", \"dumbbell\"],\n  },\n  inclineChestPress: {\n    targetMuscles: [\"Pectoralis Major Clavicular Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Sternal Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"leverageMachine\", \"band\", \"dumbbell\"],\n  },\n  inclineCurl: {\n    targetMuscles: [\"Biceps Brachii\"],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  inclineRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\", \"dumbbell\"],\n  },\n  invertedRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  isoLateralChestPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  isoLateralRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  jackknifeSitUp: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Iliopsoas\", \"Obliques\", \"Quadriceps\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  jumpRope: {\n    targetMuscles: [\"Soleus\", \"Gastrocnemius\", \"Quadriceps\", \"Hamstrings\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\", \"Obliques\", \"Tibialis Anterior\"],\n    bodyParts: [\"Thighs\", \"Calves\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  jumpSquat: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gastrocnemius\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\"],\n  },\n  jumpingJack: {\n    targetMuscles: [\n      \"Gluteus Maximus\",\n      \"Quadriceps\",\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n    ],\n    synergistMuscles: [\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Hamstrings\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Trapezius Upper Fibers\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kettlebellSwing: {\n    targetMuscles: [\"Deltoid Anterior\", \"Gluteus Maximus\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Hamstrings\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Soleus\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\"],\n    sortedEquipment: [\"dumbbell\", \"kettlebell\"],\n  },\n  kettlebellTurkishGetUp: {\n    targetMuscles: [\"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\", \"Quadriceps\", \"Gluteus Maximus\"],\n    synergistMuscles: [\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Latissimus Dorsi\",\n      \"Hamstrings\",\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Triceps Brachii\",\n      \"Erector Spinae\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\"],\n    sortedEquipment: [\"kettlebell\"],\n  },\n  kippingPullUp: {\n    targetMuscles: [\n      \"Latissimus Dorsi\",\n      \"Brachialis\",\n      \"Biceps Brachii\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    synergistMuscles: [\n      \"Deltoid Posterior\",\n      \"Brachioradialis\",\n      \"Pectoralis Major Sternal Head\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Iliopsoas\",\n      \"Tensor Fasciae Latae\",\n      \"Adductor Longus\",\n      \"Adductor Brevis\",\n      \"Erector Spinae\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kneeRaise: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kneelingPulldown: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Sternal Head\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"band\"],\n  },\n  kneestoElbows: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Iliopsoas\",\n      \"Obliques\",\n      \"Pectineous\",\n      \"Sartorius\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  latPulldown: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Levator Scapulae\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  lateralBoxJump: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\", \"Hamstrings\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Adductor Magnus\",\n      \"Gluteus Medius\",\n      \"Tensor Fasciae Latae\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  lateralRaise: {\n    targetMuscles: [\"Deltoid Lateral\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Serratus Anterior\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"leverageMachine\", \"band\", \"kettlebell\"],\n  },\n  legsUpBenchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  legCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Sartorius\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  legExtension: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\", \"band\"],\n  },\n  legPress: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"smith\", \"leverageMachine\"],\n  },\n  lunge: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"cable\"],\n  },\n  lyingBicepCurl: {\n    targetMuscles: [\"Biceps Brachii\"],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"leverageMachine\", \"cable\", \"ezbar\"],\n  },\n  lyingLegCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Sartorius\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\", \"band\"],\n  },\n  mountainClimber: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  muscleUp: {\n    targetMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Latissimus Dorsi\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    synergistMuscles: [],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  obliqueCrunch: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  overheadPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"ezbar\"],\n  },\n  overheadSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  pecDeck: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Pectoralis Major Clavicular Head\", \"Serratus Anterior\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  pendlayRow: {\n    targetMuscles: [\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Latissimus Dorsi\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    synergistMuscles: [\"Brachialis\", \"Brachioradialis\", \"Pectoralis Major Sternal Head\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  pistolSquat: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"kettlebell\", \"leverageMachine\", \"bodyweight\"],\n  },\n  plank: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  powerClean: {\n    targetMuscles: [\"Quadriceps\", \"Gluteus Maximus\", \"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Latissimus Dorsi\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Wrist Flexors\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  powerSnatch: {\n    targetMuscles: [\"Quadriceps\", \"Gluteus Maximus\", \"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Gastrocnemius\",\n      \"Soleus\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Latissimus Dorsi\",\n      \"Erector Spinae\",\n      \"Biceps Brachii\",\n      \"Wrist Flexors\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  preacherCurl: {\n    targetMuscles: [\"Brachialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachioradialis\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"ezbar\", \"leverageMachine\"],\n  },\n  pressUnder: {\n    targetMuscles: [\"Quadriceps\", \"Deltoid Anterior\", \"Deltoid Lateral\", \"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Erector Spinae\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Triceps Brachii\",\n      \"Biceps Brachii\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  pullUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Levator Scapulae\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\", \"bodyweight\", \"band\"],\n  },\n  pullover: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Deltoid Posterior\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Sternal Head\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  pushPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\", \"kettlebell\"],\n  },\n  pushUp: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\", \"band\"],\n  },\n  reverseCrunch: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Iliopsoas\", \"Obliques\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"cable\"],\n  },\n  reverseCurl: {\n    targetMuscles: [\"Brachioradialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Brachialis\"],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"band\"],\n  },\n  reverseFly: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"dumbbell\", \"leverageMachine\", \"band\"],\n  },\n  reverseGripConcentrationCurl: {\n    targetMuscles: [\"Brachialis\", \"Brachioradialis\"],\n    synergistMuscles: [\"Biceps Brachii\", \"Wrist Flexors\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  reverseLatPulldown: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  reverseLunge: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\", \"Gluteus Maximus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"cable\"],\n  },\n  reverseWristCurl: {\n    targetMuscles: [\"Wrist Extensors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  reversePlank: {\n    targetMuscles: [\"Gluteus Maximus\", \"Rectus Abdominis\", \"Erector Spinae\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Triceps Brachii\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  romanianDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Erector Spinae\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  reverseHyperextension: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"band\", \"bodyweight\", \"leverageMachine\"],\n  },\n  rowing: {\n    targetMuscles: [\"Quadriceps\", \"Latissimus Dorsi\", \"Erector Spinae\"],\n    synergistMuscles: [\n      \"Hamstrings\",\n      \"Gluteus Maximus\",\n      \"Biceps Brachii\",\n      \"Deltoid Anterior\",\n      \"Deltoid Lateral\",\n      \"Deltoid Posterior\",\n      \"Wrist Flexors\",\n      \"Rectus Abdominis\",\n      \"Obliques\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"cable\"],\n  },\n  russianTwist: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Erector Spinae\", \"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"dumbbell\", \"cable\"],\n  },\n  safetySquatBarSquat: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  seatedCalfRaise: {\n    targetMuscles: [\"Soleus\"],\n    synergistMuscles: [\"Gastrocnemius\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"leverageMachine\"],\n  },\n  seatedFrontRaise: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\"],\n  },\n  seatedLegCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Sartorius\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  seatedLegPress: {\n    targetMuscles: [\"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Soleus\"],\n    bodyParts: [\"Hips\", \"Thighs\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  seatedOverheadPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  seatedPalmsUpWristCurl: {\n    targetMuscles: [\"Wrist Flexors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  seatedRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Erector Spinae\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\", \"band\", \"leverageMachine\"],\n  },\n  seatedWideGripRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Erector Spinae\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  shoulderPress: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"leverageMachine\", \"band\", \"smith\"],\n  },\n  shoulderPressParallelGrip: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  shrug: {\n    targetMuscles: [\"Trapezius Upper Fibers\"],\n    synergistMuscles: [\"Levator Scapulae\", \"Trapezius Middle Fibers\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"leverageMachine\", \"band\", \"smith\"],\n  },\n  sideBend: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Erector Spinae\", \"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\", \"dumbbell\", \"band\"],\n  },\n  sideCrunch: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"band\", \"cable\"],\n  },\n  sideHipAbductor: {\n    targetMuscles: [\"Gluteus Medius\", \"Tensor Fasciae Latae\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\", \"barbell\", \"leverageMachine\"],\n  },\n  sideLyingClam: {\n    targetMuscles: [\"Gluteus Medius\"],\n    synergistMuscles: [\"Tensor Fasciae Latae\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  sidePlank: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegBridge: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegCalfRaise: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"leverageMachine\", \"bodyweight\", \"cable\"],\n  },\n  singleLegDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"dumbbell\", \"bodyweight\"],\n  },\n  singleLegGluteBridgeBench: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegGluteBridgeStraight: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegGluteBridgeBentKnee: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  singleLegHipThrust: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Quadriceps\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"bodyweight\", \"leverageMachine\"],\n  },\n  sissySquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  sitUp: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Iliopsoas\", \"Obliques\", \"Quadriceps\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"kettlebell\"],\n  },\n  slingShotBenchPress: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  skullcrusher: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"ezbar\"],\n  },\n  snatch: {\n    targetMuscles: [\"Deltoid Anterior\", \"Erector Spinae\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Deltoid Lateral\",\n      \"Gastrocnemius\",\n      \"Serratus Anterior\",\n      \"Soleus\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\", \"Thighs\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  snatchPull: {\n    targetMuscles: [\n      \"Erector Spinae\",\n      \"Gluteus Maximus\",\n      \"Hamstrings\",\n      \"Quadriceps\",\n      \"Latissimus Dorsi\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n    ],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Triceps Brachii\",\n      \"Wrist Flexors\",\n      \"Wrist Extensors\",\n    ],\n    bodyParts: [\"Back\", \"Hips\", \"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  splitSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Hips\", \"Thighs\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  splitJerk: {\n    targetMuscles: [\n      \"Deltoid Anterior\",\n      \"Deltoid Posterior\",\n      \"Deltoid Lateral\",\n      \"Triceps Brachii\",\n      \"Quadriceps\",\n      \"Gluteus Maximus\",\n      \"Erector Spinae\",\n    ],\n    synergistMuscles: [\n      \"Pectoralis Major Sternal Head\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Latissimus Dorsi\",\n      \"Hamstrings\",\n      \"Obliques\",\n      \"Rectus Abdominis\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Trapezius Upper Fibers\",\n      \"Adductor Magnus\",\n      \"Tensor Fasciae Latae\",\n      \"Wrist Extensors\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Hips\", \"Shoulders\", \"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  squat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"smith\", \"leverageMachine\"],\n  },\n  squatRow: {\n    targetMuscles: [\"Gluteus Maximus\", \"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Adductor Magnus\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n      \"Quadriceps\",\n      \"Soleus\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"band\"],\n  },\n  standingCalfRaise: {\n    targetMuscles: [\"Gastrocnemius\"],\n    synergistMuscles: [\"Soleus\"],\n    bodyParts: [\"Calves\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"leverageMachine\", \"bodyweight\", \"cable\"],\n  },\n  standingRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowCloseGrip: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Upper Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowRearDeltWithRope: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Lateral\",\n      \"Infraspinatus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowRearHorizontalDeltWithRope: {\n    targetMuscles: [\"Deltoid Posterior\"],\n    synergistMuscles: [\"Infraspinatus\", \"Teres Minor\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"cable\"],\n  },\n  standingRowVBar: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"cable\"],\n  },\n  stepUp: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"bodyweight\", \"band\"],\n  },\n  stiffLegDeadlift: {\n    targetMuscles: [\"Erector Spinae\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Hamstrings\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\"],\n  },\n  straightLegDeadlift: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Erector Spinae\", \"Gluteus Maximus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"barbell\", \"dumbbell\", \"band\", \"kettlebell\"],\n  },\n  sumoDeadlift: {\n    targetMuscles: [\"Erector Spinae\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  sumoDeadliftHighPull: {\n    targetMuscles: [\"Deltoid Lateral\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Gastrocnemius\",\n      \"Infraspinatus\",\n      \"Soleus\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  superman: {\n    targetMuscles: [\"Erector Spinae\"],\n    synergistMuscles: [\"Gluteus Maximus\", \"Hamstrings\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"dumbbell\"],\n  },\n  tBarRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Pectoralis Major Sternal Head\",\n      \"Teres Major\",\n      \"Teres Minor\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"leverageMachine\"],\n  },\n  thruster: {\n    targetMuscles: [\"Deltoid Anterior\", \"Gluteus Maximus\", \"Quadriceps\"],\n    synergistMuscles: [\n      \"Adductor Magnus\",\n      \"Deltoid Lateral\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Soleus\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Shoulders\", \"Thighs\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  toesToBar: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Iliopsoas\", \"Obliques\", \"Quadriceps\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  torsoRotation: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Erector Spinae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"cable\"],\n  },\n  trapBarDeadlift: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"trapbar\"],\n  },\n  tricepsDip: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"bodyweight\", \"leverageMachine\"],\n  },\n  tricepsExtension: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"band\", \"dumbbell\"],\n  },\n  tricepsPushdown: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"cable\"],\n  },\n  uprightRow: {\n    targetMuscles: [\"Deltoid Lateral\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Anterior\",\n      \"Infraspinatus\",\n      \"Serratus Anterior\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"barbell\", \"cable\", \"dumbbell\", \"band\"],\n  },\n  vUp: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Iliopsoas\", \"Obliques\", \"Pectineous\", \"Quadriceps\", \"Sartorius\", \"Tensor Fasciae Latae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\", \"band\", \"dumbbell\"],\n  },\n  widePullUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Levator Scapulae\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  wristCurl: {\n    targetMuscles: [\"Wrist Flexors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  wristRoller: {\n    targetMuscles: [\"Wrist Extensors\", \"Wrist Flexors\"],\n    synergistMuscles: [],\n    bodyParts: [\"Forearms\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  zercherSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Hips\"],\n    sortedEquipment: [\"barbell\"],\n  },\n  wallPushup: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  inclinePushup: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kneePushup: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  diamondPushup: {\n    targetMuscles: [\"Triceps Brachii\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\"],\n    bodyParts: [\"Upper Arms\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  pseudoPlanchePushup: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\"Deltoid Anterior\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  pikePushup: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Pectoralis Major Clavicular Head\", \"Serratus Anterior\", \"Triceps Brachii\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  ringDip: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  negativeDip: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Levator Scapulae\",\n      \"Pectoralis Major Clavicular Head\",\n      \"Serratus Anterior\",\n      \"Teres Major\",\n      \"Trapezius Middle Fibers\",\n      \"Triceps Brachii\",\n    ],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  verticalRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  wideRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  ringRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\n      \"Infraspinatus\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Pectoralis Major Sternal Head\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  tuckFrontLeverRow: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Deltoid Posterior\",\n      \"Rectus Abdominis\",\n      \"Brachialis\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  frontLeverRow: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Deltoid Posterior\",\n      \"Rectus Abdominis\",\n      \"Brachialis\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  scapularPullUp: {\n    targetMuscles: [\"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    synergistMuscles: [\"Latissimus Dorsi\", \"Levator Scapulae\", \"Serratus Anterior\", \"Teres Major\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  deadHang: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Wrist Flexors\"],\n    synergistMuscles: [\"Teres Major\", \"Trapezius Lower Fibers\", \"Trapezius Middle Fibers\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  negativePullup: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Infraspinatus\",\n      \"Levator Scapulae\",\n      \"Teres Major\",\n      \"Teres Minor\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  assistedSquat: {\n    targetMuscles: [\"Quadriceps\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Gluteus Maximus\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  shrimpSquat: {\n    targetMuscles: [\"Gluteus Maximus\"],\n    synergistMuscles: [\"Adductor Magnus\", \"Quadriceps\", \"Soleus\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  nordicCurl: {\n    targetMuscles: [\"Hamstrings\"],\n    synergistMuscles: [\"Gastrocnemius\", \"Gluteus Maximus\", \"Erector Spinae\"],\n    bodyParts: [\"Thighs\"],\n    sortedEquipment: [\"bodyweight\", \"band\"],\n  },\n  handstand: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Trapezius Upper Fibers\",\n      \"Triceps Brachii\",\n      \"Serratus Anterior\",\n      \"Rectus Abdominis\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  wallHandstand: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\n      \"Deltoid Lateral\",\n      \"Trapezius Upper Fibers\",\n      \"Triceps Brachii\",\n      \"Serratus Anterior\",\n      \"Rectus Abdominis\",\n    ],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  crowPose: {\n    targetMuscles: [\"Deltoid Anterior\"],\n    synergistMuscles: [\"Triceps Brachii\", \"Serratus Anterior\", \"Rectus Abdominis\", \"Wrist Flexors\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  dragonFlag: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Iliopsoas\", \"Erector Spinae\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  copenhagenPlank: {\n    targetMuscles: [\"Adductor Magnus\"],\n    synergistMuscles: [\"Adductor Brevis\", \"Adductor Longus\", \"Obliques\", \"Gluteus Medius\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  hangingKneeRaise: {\n    targetMuscles: [\"Iliopsoas\"],\n    synergistMuscles: [\n      \"Adductor Brevis\",\n      \"Adductor Longus\",\n      \"Pectineous\",\n      \"Rectus Abdominis\",\n      \"Sartorius\",\n      \"Tensor Fasciae Latae\",\n    ],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  archHang: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Deltoid Posterior\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  supportHold: {\n    targetMuscles: [\"Pectoralis Major Sternal Head\"],\n    synergistMuscles: [\n      \"Deltoid Anterior\",\n      \"Latissimus Dorsi\",\n      \"Serratus Anterior\",\n      \"Triceps Brachii\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n    ],\n    bodyParts: [\"Chest\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  pallofPress: {\n    targetMuscles: [\"Obliques\"],\n    synergistMuscles: [\"Rectus Abdominis\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"band\"],\n  },\n  renegadeRow: {\n    targetMuscles: [\"Latissimus Dorsi\", \"Obliques\"],\n    synergistMuscles: [\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Teres Major\",\n      \"Deltoid Posterior\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Rectus Abdominis\",\n    ],\n    bodyParts: [\"Back\", \"Waist\"],\n    sortedEquipment: [\"dumbbell\"],\n  },\n  ringAbRollout: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Latissimus Dorsi\", \"Serratus Anterior\", \"Deltoid Anterior\", \"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  kneelingRingAbRollout: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Latissimus Dorsi\", \"Serratus Anterior\", \"Deltoid Anterior\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  archerPullUp: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\n      \"Biceps Brachii\",\n      \"Brachialis\",\n      \"Brachioradialis\",\n      \"Deltoid Posterior\",\n      \"Teres Major\",\n      \"Trapezius Lower Fibers\",\n      \"Trapezius Middle Fibers\",\n      \"Wrist Flexors\",\n    ],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  skinTheCat: {\n    targetMuscles: [\"Latissimus Dorsi\"],\n    synergistMuscles: [\"Deltoid Posterior\", \"Teres Major\", \"Rectus Abdominis\", \"Iliopsoas\", \"Biceps Brachii\"],\n    bodyParts: [\"Back\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  hollowBodyHold: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Iliopsoas\", \"Quadriceps\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  deadBug: {\n    targetMuscles: [\"Rectus Abdominis\"],\n    synergistMuscles: [\"Obliques\", \"Iliopsoas\"],\n    bodyParts: [\"Waist\"],\n    sortedEquipment: [\"bodyweight\"],\n  },\n  shoulderPassThrough: {\n    targetMuscles: [\"Deltoid Anterior\", \"Deltoid Posterior\"],\n    synergistMuscles: [\"Deltoid Lateral\", \"Infraspinatus\", \"Teres Minor\", \"Trapezius Middle Fibers\"],\n    bodyParts: [\"Shoulders\"],\n    sortedEquipment: [\"band\"],\n  },\n};\n\nexport function equipmentToBarKey(equipment?: IEquipment): IBarKey | undefined {\n  switch (equipment) {\n    case \"barbell\":\n      return \"barbell\";\n    case \"dumbbell\":\n      return \"dumbbell\";\n    case \"ezbar\":\n      return \"ezbar\";\n    default:\n      return undefined;\n  }\n}\n\nexport function equipmentName(equipment: IEquipment | undefined, equipmentSettings?: IAllEquipment): string {\n  const equipmentData = equipment && equipmentSettings ? equipmentSettings[equipment] : undefined;\n  if (equipmentData?.name) {\n    return equipmentData.name.trim();\n  }\n  switch (equipment) {\n    case \"barbell\":\n      return \"Barbell\";\n    case \"cable\":\n      return \"Cable\";\n    case \"dumbbell\":\n      return \"Dumbbell\";\n    case \"smith\":\n      return \"Smith Machine\";\n    case \"band\":\n      return \"Band\";\n    case \"kettlebell\":\n      return \"Kettlebell\";\n    case \"bodyweight\":\n      return \"Bodyweight\";\n    case \"leverageMachine\":\n      return \"Leverage Machine\";\n    case \"medicineball\":\n      return \"Medicine Ball\";\n    case \"ezbar\":\n      return \"EZ Bar\";\n    case \"trapbar\":\n      return \"Trap Bar\";\n    default:\n      return \"\";\n  }\n}\n\nexport type IExerciseKind = \"core\" | \"pull\" | \"push\" | \"legs\" | \"upper\" | \"lower\";\n\nexport type IExercise = {\n  id: IExerciseId;\n  name: string;\n  defaultWarmup?: number;\n  equipment?: IEquipment;\n  defaultEquipment?: IEquipment;\n  types: IExerciseKind[];\n  onerm?: number;\n  startingWeightLb: IWeight;\n  startingWeightKg: IWeight;\n};\n\nexport function warmupValues(units: IUnit): Partial<Record<number, IProgramExerciseWarmupSet[]>> {\n  return {\n    10: [\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(60, \"lb\") : Weight_build(30, \"kg\"),\n        value: 0.3,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(30, \"lb\") : Weight_build(15, \"kg\"),\n        value: 0.5,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(10, \"lb\") : Weight_build(5, \"kg\"),\n        value: 0.8,\n      },\n    ],\n    45: [\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(120, \"lb\") : Weight_build(60, \"kg\"),\n        value: 0.3,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(90, \"lb\") : Weight_build(45, \"kg\"),\n        value: 0.5,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(45, \"lb\") : Weight_build(20, \"kg\"),\n        value: 0.8,\n      },\n    ],\n    95: [\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(150, \"lb\") : Weight_build(70, \"kg\"),\n        value: 0.3,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(125, \"lb\") : Weight_build(60, \"kg\"),\n        value: 0.5,\n      },\n      {\n        reps: 5,\n        threshold: units === \"lb\" ? Weight_build(95, \"lb\") : Weight_build(40, \"kg\"),\n        value: 0.8,\n      },\n    ],\n  };\n}\n\nfunction warmup45(weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] {\n  return warmup(warmupValues(settings.units)[45] || [])(weight, settings, exerciseType);\n}\n\nfunction warmup95(weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] {\n  return warmup(warmupValues(settings.units)[95] || [])(weight, settings, exerciseType);\n}\n\nfunction warmup10(weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] {\n  return warmup(warmupValues(settings.units)[10] || [])(weight, settings, exerciseType);\n}\n\nfunction warmup(\n  programExerciseWarmupSets: IProgramExerciseWarmupSet[],\n  shouldSkipThreshold: boolean = false\n): (weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType) => ISet[] {\n  return (weight: IWeight | undefined, settings: ISettings, exerciseType?: IExerciseType): ISet[] => {\n    let index = 0;\n    return programExerciseWarmupSets.reduce<ISet[]>((memo, programExerciseWarmupSet) => {\n      if (shouldSkipThreshold || (weight != null && Weight_gt(weight, programExerciseWarmupSet.threshold))) {\n        const value = programExerciseWarmupSet.value;\n        const unit = Equipment_getUnitOrDefaultForExerciseType(settings, exerciseType);\n        if (typeof value !== \"number\" || weight != null) {\n          const warmupWeight = typeof value === \"number\" ? Weight_multiply(weight!, value) : value;\n          const roundedWeight = Weight_roundConvertTo(warmupWeight, settings, unit, exerciseType);\n          memo.push({\n            vtype: \"set\",\n            index,\n            id: UidFactory_generateUid(6),\n            reps: programExerciseWarmupSet.reps,\n            isUnilateral: exerciseType ? Exercise_getIsUnilateral(exerciseType, settings) : false,\n            weight: roundedWeight,\n            originalWeight: warmupWeight,\n            isCompleted: false,\n          });\n          index += 1;\n        }\n      }\n      return memo;\n    }, []);\n  };\n}\n\nfunction warmupEmpty(weight: IWeight | undefined): ISet[] {\n  return [];\n}\n\nfunction maybeGetExercise(id: IExerciseId, customExercises: IAllCustomExercises): IExercise | undefined {\n  const custom = customExercises[id];\n  return custom != null\n    ? {\n        ...custom,\n        defaultWarmup: 45,\n        types: custom.types || [],\n        startingWeightKg: Weight_build(0, \"kg\"),\n        startingWeightLb: Weight_build(0, \"lb\"),\n      }\n    : allExercisesList[id];\n}\n\nfunction getExercise(id: IExerciseId, customExercises: IAllCustomExercises): IExercise {\n  const exercise = maybeGetExercise(id, customExercises);\n  return exercise != null ? exercise : allExercisesList.squat;\n}\n\nexport function Exercise_getMetadata(id: IExerciseId): IMetaExercises {\n  return metadata[id] || {};\n}\n\nexport function Exercise_exists(name: string, customExercises: IAllCustomExercises): boolean {\n  let exercise = ObjectUtils_keys(allExercisesList).filter((k) => allExercisesList[k].name === name)[0];\n  if (exercise == null) {\n    exercise = ObjectUtils_keys(customExercises).filter(\n      (k) => !customExercises[k]!.isDeleted && customExercises[k]!.name === name\n    )[0];\n  }\n  return !!exercise;\n}\n\nexport function Exercise_isCustom(id: string, customExercises: IAllCustomExercises): boolean {\n  return customExercises[id] != null;\n}\n\nexport function Exercise_buildName(name: string, settings: ISettings, label?: string, equipment?: IEquipment): string {\n  let str = name;\n  if (equipment) {\n    const allEquipment = Equipment_currentEquipment(settings);\n    str = `${name}, ${equipmentName(equipment, allEquipment)}`;\n  }\n  if (label) {\n    str = `${label}: ${str}`;\n  }\n  return str;\n}\n\nexport function Exercise_fullName(exercise: IExercise, settings: ISettings, label?: string): string {\n  const equipment =\n    exercise.equipment && exercise.defaultEquipment !== exercise.equipment ? exercise.equipment : undefined;\n  return Exercise_buildName(exercise.name, settings, label, equipment);\n}\n\nexport function Exercise_reverseName(exercise: IExercise, settings?: ISettings): string {\n  if (exercise.equipment) {\n    const allEquipment = settings ? Equipment_currentEquipment(settings) : {};\n    const equipment = equipmentName(exercise.equipment, allEquipment);\n    return `${equipment} ${exercise.name}`;\n  } else {\n    return exercise.name;\n  }\n}\n\nexport function Exercise_nameWithEquipment(exercise: IExercise, settings?: ISettings): string {\n  if (exercise.equipment) {\n    const allEquipment = settings ? Equipment_currentEquipment(settings) : {};\n    const equipment = equipmentName(exercise.equipment, allEquipment);\n    return `${exercise.name}, ${equipment}`;\n  } else {\n    return exercise.name;\n  }\n}\n\nexport function Exercise_searchNames(query: string, customExercises: IAllCustomExercises): string[] {\n  const allExercises = Exercise_allExpanded({});\n  const exerciseNames = allExercises\n    .filter((e) =>\n      StringUtils_fuzzySearch(\n        query.toLowerCase(),\n        `${e.name}${e.equipment ? `, ${equipmentName(e.equipment)}` : \"\"}`.toLowerCase()\n      )\n    )\n    .map((e) => `${e.name}${e.equipment ? `, ${equipmentName(e.equipment)}` : \"\"}`);\n  const customExerciseNames = ObjectUtils_values(customExercises)\n    .filter((ce) => (ce && !ce.isDeleted ? StringUtils_fuzzySearch(query.toLowerCase(), ce.name.toLowerCase()) : false))\n    .map((e) => e!.name);\n  const names = [...exerciseNames, ...customExerciseNames];\n  names.sort();\n  return names;\n}\n\nexport function Exercise_findById(id: IExerciseId, customExercises: IAllCustomExercises): IExercise | undefined {\n  return maybeGetExercise(id, customExercises);\n}\n\nfunction normalizeExerciseName(name: string): string {\n  return name.toLowerCase().replace(/\\s*,\\s*/g, \",\");\n}\n\ninterface ICustomExercisesNameIndex {\n  live: Map<string, IExerciseId>;\n  deleted: Map<string, IExerciseId>;\n}\n\n// Cache a normalized-name -> id index per customExercises object, since Exercise_findIdByName is called\n// once per exercise reference during program evaluation, and accounts can have hundreds of custom exercises.\nconst customExercisesNameIndexCache = new WeakMap<IAllCustomExercises, ICustomExercisesNameIndex>();\nfunction getCustomExercisesNameIndex(customExercises: IAllCustomExercises): ICustomExercisesNameIndex {\n  let index = customExercisesNameIndexCache.get(customExercises);\n  if (index == null) {\n    index = { live: new Map(), deleted: new Map() };\n    for (const ce of ObjectUtils_values(customExercises)) {\n      if (ce?.name && ce.id) {\n        const key = normalizeExerciseName(ce.name);\n        const map = ce.isDeleted ? index.deleted : index.live;\n        if (!map.has(key)) {\n          map.set(key, ce.id);\n        }\n      }\n    }\n    customExercisesNameIndexCache.set(customExercises, index);\n  }\n  return index;\n}\n\n// These characters are Liftoscript syntax — grammar separators (/{}()#[]|!) or the label\n// delimiter (:) — so a name containing them can't round-trip through planner text: replacing\n// an exercise with it would leave the program with a syntax error.\nconst forbiddenExerciseNameChars = /[/{}()#[\\]|!:\\t\\n\\r]/;\nconst forbiddenExerciseNameCharsAll = new RegExp(forbiddenExerciseNameChars.source, \"g\");\n\nexport function Exercise_nameError(name: string): string | undefined {\n  const trimmed = name.trim();\n  if (trimmed.length === 0) {\n    return \"Name cannot be empty\";\n  }\n  if (forbiddenExerciseNameChars.test(trimmed)) {\n    return \"Name cannot contain special characters: / { } ( ) # [ ] | ! :\";\n  }\n  return undefined;\n}\n\nexport function Exercise_sanitizeName(name: string): string {\n  const sanitized = name.replace(forbiddenExerciseNameCharsAll, \" \").replace(/\\s+/g, \" \").trim();\n  return sanitized || \"Exercise\";\n}\n\nexport function Exercise_findIdByName(name: string, customExercises: IAllCustomExercises): IExerciseId | undefined {\n  const index = getCustomExercisesNameIndex(customExercises);\n  const key = normalizeExerciseName(name);\n  // Live customs win over built-ins on name collision, so shipping a built-in with the same\n  // name as a user's existing custom exercise never silently re-points their programs/history.\n  // Deleted customs resolve last: they must not shadow a built-in (deleting the custom is the\n  // user's only way back to it), but a name matching nothing else should still resolve so\n  // history records and planner text referencing it keep displaying.\n  return index.live.get(key) || nameToIdMapping[name.toLowerCase()] || index.deleted.get(key);\n}\n\nexport function Exercise_get(type: IExerciseType, customExercises: IAllCustomExercises): IExercise {\n  const exercise = getExercise(type.id, customExercises);\n  return { ...exercise, equipment: type.equipment };\n}\n\nexport function Exercise_getNotes(type: IExerciseType, settings: ISettings): string | undefined {\n  return settings.exerciseData[Exercise_toKey(type)]?.notes;\n}\n\nexport function Exercise_onerm(type: IExerciseType, settings: ISettings): IWeight {\n  const rm = settings.exerciseData[Exercise_toKey(type)]?.rm1;\n  if (rm) {\n    return Weight_convertTo(rm, settings.units);\n  }\n  const exercise = Exercise_get(type, settings.exercises);\n  return settings.units === \"kg\" ? exercise.startingWeightKg : exercise.startingWeightLb;\n}\n\nexport function Exercise_defaultRounding(type: IExerciseType, settings: ISettings): number {\n  const units = Equipment_getUnitOrDefaultForExerciseType(settings, type);\n  return Math.max(0.1, settings.exerciseData[Exercise_toKey(type)]?.rounding ?? (units === \"kg\" ? 2.5 : 5));\n}\n\nexport function Exercise_find(type: IExerciseType, customExercises: IAllCustomExercises): IExercise | undefined {\n  const exercise = maybeGetExercise(type.id, customExercises);\n  return exercise ? { ...exercise, equipment: type.equipment } : undefined;\n}\n\nexport function Exercise_getById(id: IExerciseId, customExercises: IAllCustomExercises): IExercise {\n  const exercise = getExercise(id, customExercises);\n  return { ...exercise, equipment: exercise.defaultEquipment };\n}\n\nexport function Exercise_findByNameEquipment(\n  customExercises: IAllCustomExercises,\n  name: string,\n  equipment?: string\n): IExercise | undefined {\n  const exerciseId = Exercise_findIdByName(name, customExercises);\n  const exercise = exerciseId ? Exercise_findById(exerciseId, customExercises) : undefined;\n  if (exercise == null) {\n    return undefined;\n  }\n  return { ...exercise, equipment };\n}\n\nexport function Exercise_findByNameAndEquipment(\n  nameAndEquipment: string,\n  customExercises: IAllCustomExercises\n): IExercise | undefined {\n  const parts = nameAndEquipment.split(\",\").map((p) => p.trim());\n  let name: string | undefined;\n  let equipment: IEquipment | undefined | null;\n  if (parts.length > 1) {\n    const foundEquipment = equipments.filter(\n      (e) => equipmentName(e).toLowerCase() === parts[parts.length - 1].toLowerCase()\n    )[0];\n    if (foundEquipment != null) {\n      equipment = foundEquipment;\n      name = parts.slice(0, parts.length - 1).join(\", \");\n    } else {\n      equipment = null;\n    }\n  }\n  if (name == null) {\n    name = nameAndEquipment;\n  }\n  let exerciseId = Exercise_findIdByName(name, customExercises);\n  if (exerciseId != null && equipment !== null) {\n    // Users can have both \"X\" and \"X, <Equipment>\" custom exercises. Before custom exercises\n    // were included in the split-name lookup, \"X, <Equipment>\" resolved to the custom of that\n    // exact name (history is keyed by it), so an exact full-string custom match must beat the\n    // bare-name custom + parsed equipment interpretation. Built-in bare-name matches keep\n    // winning as they always did — flipping those would re-key history too.\n    const bareNameCustom = customExercises[exerciseId];\n    if (bareNameCustom != null) {\n      const index = getCustomExercisesNameIndex(customExercises);\n      const fullNameKey = normalizeExerciseName(nameAndEquipment);\n      // A deleted full-name custom loses only to a live bare-name custom; when the bare match\n      // is itself a tombstone, the exact full-name tombstone still wins so history keyed by it\n      // doesn't re-point.\n      const fullNameExerciseId =\n        index.live.get(fullNameKey) ?? (bareNameCustom.isDeleted ? index.deleted.get(fullNameKey) : undefined);\n      if (fullNameExerciseId != null && fullNameExerciseId !== exerciseId) {\n        const fullNameExercise = Exercise_findById(fullNameExerciseId, customExercises);\n        if (fullNameExercise != null) {\n          return { ...fullNameExercise };\n        }\n      }\n    }\n    const exercise = Exercise_findById(exerciseId, customExercises);\n    if (exercise != null) {\n      return { ...exercise, equipment: equipment || exercise.defaultEquipment };\n    }\n  } else {\n    exerciseId = Exercise_findIdByName(nameAndEquipment, customExercises);\n    if (exerciseId != null) {\n      const exercise = Exercise_findById(exerciseId, customExercises);\n      if (exercise != null) {\n        return { ...exercise };\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function Exercise_getIsUnilateral(exerciseType: IExerciseType, settings: ISettings): boolean {\n  const key = Exercise_toKey(exerciseType);\n  const exerciseData = settings.exerciseData[key];\n  if (exerciseData?.isUnilateral !== undefined) {\n    return exerciseData.isUnilateral;\n  }\n\n  switch (exerciseType.id) {\n    case \"bulgarianSplitSquat\":\n    case \"concentrationCurl\":\n    case \"reverseGripConcentrationCurl\":\n    case \"bentOverOneArmRow\":\n    case \"cableKickback\":\n    case \"cableTwist\":\n    case \"russianTwist\":\n    case \"lunge\":\n    case \"reverseLunge\":\n    case \"splitSquat\":\n    case \"stepUp\":\n    case \"pistolSquat\":\n    case \"singleLegBridge\":\n    case \"singleLegDeadlift\":\n    case \"sideBend\":\n    case \"sideCrunch\":\n    case \"sideHipAbductor\":\n    case \"sideLyingClam\":\n    case \"sidePlank\":\n    case \"singleLegBridge\":\n    case \"singleLegCalfRaise\":\n    case \"singleLegDeadlift\":\n    case \"singleLegGluteBridgeBench\":\n    case \"singleLegGluteBridgeStraight\":\n    case \"singleLegGluteBridgeBentKnee\":\n    case \"singleLegHipThrust\":\n      return true;\n    case \"bicepCurl\":\n    case \"wristCurl\":\n    case \"reverseWristCurl\":\n    case \"seatedPalmsUpWristCurl\":\n    case \"hammerCurl\":\n    case \"preacherCurl\":\n    case \"reverseCurl\":\n    case \"lyingBicepCurl\":\n    case \"inclineCurl\":\n      return exerciseType.equipment === \"dumbbell\";\n    default:\n      return false;\n  }\n}\n\n// The number of implements loaded per rep — orthogonal to unilaterality. Unilateral rep-summing\n// (left+right) accounts for the *sides*; this accounts for the *implements*. A dumbbell lunge is\n// both: worked one leg at a time (reps summed) AND holding two dumbbells (multiplier 2).\nexport function Exercise_getVolumeMultiplier(exerciseType: IExerciseType, settings: ISettings): number {\n  const key = Exercise_toKey(exerciseType);\n  const override = settings.exerciseData[key]?.volumeMultiplier;\n  if (override !== undefined) {\n    return override;\n  }\n  // Only dumbbells load two implements per rep at a per-implement displayed weight.\n  // Kettlebell is excluded on purpose: the default is a single bell (swing, goblet,\n  // turkish get up) — double-kettlebell users can override.\n  if (exerciseType.equipment !== \"dumbbell\") {\n    return 1;\n  }\n  switch (exerciseType.id) {\n    case \"arnoldPress\":\n    case \"overheadPress\":\n    case \"shoulderPress\":\n    case \"shoulderPressParallelGrip\":\n    case \"lateralRaise\":\n    case \"frontRaise\":\n    case \"seatedFrontRaise\":\n    case \"reverseFly\":\n    case \"uprightRow\":\n    case \"benchPress\":\n    case \"inclineBenchPress\":\n    case \"declineBenchPress\":\n    case \"inclineChestPress\":\n    case \"chestFly\":\n    case \"inclineChestFly\":\n    case \"aroundTheWorld\":\n    case \"bentOverRow\":\n    case \"chestSupportedRow\":\n    case \"inclineRow\":\n    case \"renegadeRow\":\n    case \"deadlift\":\n    case \"romanianDeadlift\":\n    case \"straightLegDeadlift\":\n    case \"stiffLegDeadlift\":\n    case \"shrug\":\n    case \"skullcrusher\":\n    // unilateral, but both dumbbells are loaded through the whole rep (reps are summed left+right on top)\n    case \"lunge\":\n    case \"reverseLunge\":\n    case \"splitSquat\":\n    case \"bulgarianSplitSquat\":\n    case \"stepUp\":\n      return 2;\n    default:\n      return 1;\n  }\n}\n\nexport function Exercise_findByName(name: string, customExercises: IAllCustomExercises): IExercise | undefined {\n  const exerciseId = Exercise_findIdByName(name.trim(), customExercises);\n  if (exerciseId != null) {\n    const exercise = Exercise_findById(exerciseId, customExercises);\n    if (exercise != null) {\n      return { ...exercise, equipment: exercise.defaultEquipment };\n    }\n  }\n  return undefined;\n}\n\nexport function Exercise_getByIds(ids: IExerciseId[], customExercises: IAllCustomExercises): IExercise[] {\n  return ids.map((id) => {\n    const exercise = getExercise(id, customExercises);\n    return { ...exercise, equipment: exercise.defaultEquipment };\n  });\n}\n\nexport function Exercise_all(customExercises: IAllCustomExercises): IExercise[] {\n  return ObjectUtils_keys(customExercises)\n    .filter((id) => !customExercises[id]?.isDeleted)\n    .map((id) => getExercise(id, customExercises))\n    .concat(\n      ObjectUtils_keys(allExercisesList).map((k) => ({\n        ...allExercisesList[k],\n        equipment: allExercisesList[k].defaultEquipment,\n      }))\n    );\n}\n\nexport function Exercise_allExpanded(customExercises: IAllCustomExercises): IExercise[] {\n  return ObjectUtils_keys(customExercises)\n    .filter((id) => !customExercises[id]?.isDeleted)\n    .map((id) => getExercise(id, customExercises))\n    .concat(\n      ObjectUtils_keys(allExercisesList).flatMap((k) => {\n        return CollectionUtils_compact(\n          equipments.map((equipment) => {\n            const exerciseType = { id: k, equipment };\n            return ExerciseImageUtils_exists(exerciseType, \"small\") ? { ...allExercisesList[k], equipment } : undefined;\n          })\n        );\n      })\n    );\n}\n\nexport function Exercise_toExternalUrl(type: IExerciseType): string {\n  return `/exercises/${Exercise_toUrlSlug(type)}`;\n}\n\nexport function Exercise_toUrlSlug(type: IExerciseType): string {\n  const possibleEquipments: Record<string, IEquipment> = {\n    barbell: \"barbell\",\n    cable: \"cable\",\n    dumbbell: \"dumbbell\",\n    smith: \"smith\",\n    band: \"band\",\n    kettlebell: \"kettlebell\",\n    bodyweight: \"bodyweight\",\n    leverageMachine: \"leverage-machine\",\n    medicineball: \"medicine-ball\",\n    ezbar: \"ez-bar\",\n    trapbar: \"trap-bar\",\n  };\n\n  const equipment = type.equipment ? possibleEquipments[type.equipment] : undefined;\n  const equipmentSlug = equipment ? `${equipment}-` : \"\";\n  return `${equipmentSlug}${StringUtils_dashcase(StringUtils_uncamelCase(type.id))}`;\n}\n\nexport function Exercise_fromUrlSlug(slug: string): IExerciseType | undefined {\n  // slug looks like leverage-machine-squat or barbell-bench-press\n  const possibleEquipments: Record<string, IEquipment> = {\n    barbell: \"barbell\",\n    cable: \"cable\",\n    dumbbell: \"dumbbell\",\n    smith: \"smith\",\n    band: \"band\",\n    kettlebell: \"kettlebell\",\n    bodyweight: \"bodyweight\",\n    \"leverage-machine\": \"leverageMachine\",\n    \"medicine-ball\": \"medicineball\",\n    \"ez-bar\": \"ezbar\",\n    \"trap-bar\": \"trapbar\",\n  };\n  let equipment: IEquipment | undefined = undefined;\n  const equipmentKey = ObjectUtils_keys(possibleEquipments).find((e) => slug.startsWith(e));\n  if (equipmentKey != null) {\n    equipment = possibleEquipments[equipmentKey];\n    slug = slug.slice(equipmentKey.length + 1);\n  }\n  const exerciseId = StringUtils_camelCase(StringUtils_undashcase(slug));\n  if (allExercisesList[exerciseId]) {\n    return { id: exerciseId as IExerciseId, equipment };\n  } else {\n    return undefined;\n  }\n}\n\nexport function Exercise_eq(a: IExerciseType, b: IExerciseType): boolean {\n  return a.id === b.id && a.equipment === b.equipment;\n}\n\nexport function Exercise_filterExercisesByNameAndType(\n  settings: ISettings,\n  filter: string,\n  filterTypes: string[],\n  isSubstitute: boolean,\n  exerciseType?: IExerciseType,\n  length?: number\n): IExercise[] {\n  let allExercises = Exercise_allExpanded({});\n  if (filter) {\n    allExercises = Exercise_filterExercises(allExercises, filter);\n  }\n  if (filterTypes && filterTypes.length > 0) {\n    allExercises = Exercise_filterExercisesByType(allExercises, filterTypes, settings);\n  }\n  allExercises = Exercise_sortExercises(allExercises, isSubstitute, settings, filterTypes, exerciseType);\n  if (length != null) {\n    allExercises = allExercises.slice(0, length);\n  }\n  return allExercises;\n}\n\nexport function Exercise_getWarmupSets(\n  exercise: IExerciseType,\n  weight: IWeight | undefined,\n  settings: ISettings,\n  programExerciseWarmupSets?: IProgramExerciseWarmupSet[]\n): ISet[] {\n  const ex = Exercise_get(exercise, settings.exercises);\n  if (programExerciseWarmupSets != null) {\n    return warmup(programExerciseWarmupSets, true)(weight, settings, exercise);\n  } else {\n    let warmupSets = warmupEmpty(weight);\n    if (ex.defaultWarmup === 10) {\n      warmupSets = warmup10(weight, settings, exercise);\n    } else if (ex.defaultWarmup === 45) {\n      warmupSets = warmup45(weight, settings, exercise);\n    } else if (ex.defaultWarmup === 95) {\n      warmupSets = warmup95(weight, settings, exercise);\n    }\n    return warmupSets;\n  }\n}\n\nexport function Exercise_defaultTargetMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n  const customExercise = settings.exercises[type.id];\n  if (customExercise) {\n    return customExercise.meta.targetMuscles;\n  } else {\n    const meta = Exercise_getMetadata(type.id);\n    return meta?.targetMuscles != null ? meta.targetMuscles : [];\n  }\n}\n\nexport function Exercise_targetMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n  const muscleMultipliers = settings.exerciseData[Exercise_toKey(type)]?.muscleMultipliers;\n  if (muscleMultipliers) {\n    return (ObjectUtils_keys(muscleMultipliers) as IMuscle[]).filter((m) => muscleMultipliers[m] === 1);\n  } else {\n    return Exercise_defaultTargetMuscles(type, settings);\n  }\n}\n\nexport function Exercise_defaultTargetMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n  const muscles = Exercise_defaultTargetMuscles(type, settings);\n  const allMuscleGroups = new Set<IScreenMuscle>();\n  for (const muscle of muscles) {\n    const muscleGroups = Muscle_getScreenMusclesFromMuscle(muscle, settings);\n    for (const muscleGroup of muscleGroups) {\n      allMuscleGroups.add(muscleGroup);\n    }\n  }\n  return Array.from(allMuscleGroups);\n}\n\nexport function Exercise_targetMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n  const muscles = Exercise_targetMuscles(type, settings);\n  const allMuscleGroups = new Set<IScreenMuscle>();\n  for (const muscle of muscles) {\n    const muscleGroups = Muscle_getScreenMusclesFromMuscle(muscle, settings);\n    for (const muscleGroup of muscleGroups) {\n      allMuscleGroups.add(muscleGroup);\n    }\n  }\n  return Array.from(allMuscleGroups);\n}\n\nexport function Exercise_defaultSynergistMuscleMultipliers(\n  type: IExerciseType,\n  settings: ISettings\n): IMuscleMultiplier[] {\n  const customExercise = settings.exercises[type.id];\n  if (customExercise) {\n    return customExercise.meta.synergistMuscles.map((m) => ({\n      muscle: m,\n      multiplier: settings.planner.synergistMultiplier,\n    }));\n  } else {\n    const meta = Exercise_getMetadata(type.id);\n    return meta?.synergistMuscles != null\n      ? meta.synergistMuscles.map((m) => {\n          return { muscle: m, multiplier: settings.planner.synergistMultiplier };\n        })\n      : [];\n  }\n}\n\nexport function Exercise_defaultSynergistMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n  return Exercise_defaultSynergistMuscleMultipliers(type, settings).map((m) => m.muscle);\n}\n\nexport function Exercise_synergistMuscleMultipliers(type: IExerciseType, settings: ISettings): IMuscleMultiplier[] {\n  const muscleMultipliers = settings.exerciseData[Exercise_toKey(type)]?.muscleMultipliers;\n  if (muscleMultipliers) {\n    return (ObjectUtils_keys(muscleMultipliers) as IMuscle[])\n      .filter((m) => (muscleMultipliers[m] ?? 0) < 1)\n      .map((m) => ({ muscle: m, multiplier: muscleMultipliers[m] ?? 0 }));\n  } else {\n    return Exercise_defaultSynergistMuscleMultipliers(type, settings);\n  }\n}\n\nexport function Exercise_synergistMuscles(type: IExerciseType, settings: ISettings): IMuscle[] {\n  const muscleMultipliers = settings.exerciseData[Exercise_toKey(type)]?.muscleMultipliers;\n  if (muscleMultipliers) {\n    return (ObjectUtils_keys(muscleMultipliers) as IMuscle[]).filter((m) => (muscleMultipliers[m] ?? 0) < 1);\n  } else {\n    return Exercise_defaultSynergistMuscles(type, settings);\n  }\n}\n\nexport function Exercise_defaultSynergistMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n  const muscles = Exercise_defaultSynergistMuscles(type, settings);\n  const allMuscleGroups = new Set<IScreenMuscle>();\n  for (const muscle of muscles) {\n    const muscleGroups = Muscle_getScreenMusclesFromMuscle(muscle, settings);\n    for (const muscleGroup of muscleGroups) {\n      allMuscleGroups.add(muscleGroup);\n    }\n  }\n  return Array.from(allMuscleGroups);\n}\n\nexport function Exercise_synergistMusclesGroupMultipliers(\n  type: IExerciseType,\n  settings: ISettings\n): Partial<Record<IScreenMuscle, number>> {\n  return Exercise_synergistMuscleMultipliers(type, settings).reduce<Partial<Record<IScreenMuscle, number>>>(\n    (memo, m) => {\n      for (const muscleGroup of Muscle_getScreenMusclesFromMuscle(m.muscle, settings)) {\n        if (memo[muscleGroup] == null || memo[muscleGroup] < m.multiplier) {\n          memo[muscleGroup] = m.multiplier;\n        }\n      }\n      return memo;\n    },\n    {}\n  );\n}\n\nexport function Exercise_synergistMusclesGroups(type: IExerciseType, settings: ISettings): IScreenMuscle[] {\n  const muscles = Exercise_synergistMuscles(type, settings);\n  const allMuscleGroups = new Set<IScreenMuscle>();\n  for (const muscle of muscles) {\n    const muscleGroups = Muscle_getScreenMusclesFromMuscle(muscle, settings);\n    for (const muscleGroup of muscleGroups) {\n      allMuscleGroups.add(muscleGroup);\n    }\n  }\n  return Array.from(allMuscleGroups);\n}\n\nexport function Exercise_toKey(type: IExerciseType): string {\n  return `${type.id}${type.equipment ? `_${type.equipment}` : \"\"}`;\n}\n\nexport function Exercise_fromKey(type: string): IExerciseType {\n  const [id, equipment] = type.split(\"_\");\n  return { id: id as IExerciseId, equipment: equipment };\n}\n\nexport function Exercise_defaultEquipment(\n  type: IExerciseId,\n  customExercises: IAllCustomExercises\n): IEquipment | undefined {\n  const priorities: Record<IEquipment, IEquipment[]> = {\n    barbell: [\"ezbar\", \"trapbar\", \"dumbbell\", \"kettlebell\"],\n    cable: [\"band\", \"leverageMachine\"],\n    dumbbell: [\"barbell\", \"kettlebell\", \"bodyweight\"],\n    smith: [\"leverageMachine\", \"dumbbell\", \"barbell\", \"kettlebell\", \"cable\"],\n    band: [\"cable\", \"bodyweight\", \"leverageMachine\", \"smith\"],\n    kettlebell: [\"dumbbell\", \"barbell\", \"cable\"],\n    bodyweight: [\"cable\", \"dumbbell\", \"barbell\", \"band\"],\n    leverageMachine: [\"smith\", \"cable\", \"dumbbell\", \"barbell\", \"kettlebell\"],\n    medicineball: [\"bodyweight\", \"cable\"],\n    ezbar: [\"barbell\", \"dumbbell\", \"cable\"],\n    trapbar: [\"barbell\", \"dumbbell\", \"cable\"],\n  };\n\n  const exercise = Exercise_getById(type, customExercises);\n  const bar = exercise.defaultEquipment || \"bodyweight\";\n  const sortedEquipment = Exercise_getMetadata(type).sortedEquipment || [];\n  let equipment: IEquipment | undefined = sortedEquipment.find((b) => b === bar);\n  equipment = equipment || (priorities[bar] || []).find((eqp) => sortedEquipment.indexOf(eqp) !== -1);\n  equipment = equipment || sortedEquipment[0];\n  return equipment;\n}\n\nexport function Exercise_similarRating(current: IExerciseType, e: IExercise, settings: ISettings): number {\n  const tm = Exercise_targetMuscles(current, settings);\n  const sm = Exercise_synergistMuscles(current, settings);\n  const etm = Exercise_targetMuscles(e, settings);\n  const esm = Exercise_synergistMuscles(e, settings);\n  let rating = 0;\n  if (e.id === current.id || (etm.length === 0 && esm.length === 0)) {\n    rating = -Infinity;\n  } else {\n    for (const muscle of etm) {\n      if (tm.indexOf(muscle) !== -1) {\n        rating += 60;\n      } else {\n        rating -= 30;\n      }\n      if (sm.indexOf(muscle) !== -1) {\n        rating += 20;\n      }\n    }\n    for (const muscle of tm) {\n      if (etm.indexOf(muscle) === -1) {\n        rating -= 30;\n      }\n    }\n    for (const muscle of esm) {\n      if (sm.indexOf(muscle) !== -1) {\n        rating += 30;\n      } else {\n        rating -= 15;\n      }\n      if (tm.indexOf(muscle) !== -1) {\n        rating += 10;\n      }\n    }\n    for (const muscle of sm) {\n      if (esm.indexOf(muscle) === -1) {\n        rating -= 15;\n      }\n    }\n    if (e.defaultEquipment === \"cable\" || e.defaultEquipment === \"leverageMachine\") {\n      rating -= 20;\n    }\n  }\n  return rating;\n}\n\nexport function Exercise_similar(type: IExerciseType, settings: ISettings): [IExercise, number][] {\n  const tm = Exercise_targetMuscles(type, settings);\n  const sm = Exercise_synergistMuscles(type, settings);\n  if (tm.length === 0 && sm.length === 0) {\n    return [];\n  }\n  const rated = Exercise_all(settings.exercises).map<[IExercise, number]>((e) => {\n    const rating = Exercise_similarRating(type, e, settings);\n    return [e, rating];\n  });\n  rated.sort((a, b) => b[1] - a[1]);\n  return rated.filter(([, r]) => r > 0);\n}\n\nexport function Exercise_sortedByScreenMuscle(muscle: IScreenMuscle, settings: ISettings): [IExercise, number][] {\n  const muscles = Muscle_getMusclesFromScreenMuscle(muscle, settings);\n\n  const rated = Exercise_all(settings.exercises).map<[IExercise, number]>((e) => {\n    let rating = 0;\n    const tm = Exercise_targetMuscles(e, settings);\n    const sm = Exercise_synergistMuscles(e, settings);\n    for (const m of tm) {\n      if (muscles.indexOf(m) !== -1) {\n        rating += 100;\n      }\n    }\n    for (const m of sm) {\n      if (muscles.indexOf(m) !== -1) {\n        rating += 10;\n      }\n    }\n    return [e, rating];\n  });\n  rated.sort((a, b) => b[1] - a[1]);\n  return rated.filter(([, r]) => r > 0);\n}\n\nexport function Exercise_createCustomExercise(\n  name: string,\n  tMuscles: IMuscle[],\n  sMuscles: IMuscle[],\n  types: IExerciseKind[],\n  smallImageUrl?: string,\n  largeImageUrl?: string\n): ICustomExercise {\n  const id = UidFactory_generateUid(8);\n  const newExercise: ICustomExercise = {\n    vtype: \"custom_exercise\",\n    id,\n    name,\n    isDeleted: false,\n    types,\n    smallImageUrl,\n    largeImageUrl,\n    meta: {\n      targetMuscles: tMuscles,\n      synergistMuscles: sMuscles,\n      bodyParts: [],\n      sortedEquipment: [],\n    },\n  };\n  return newExercise;\n}\n\nexport function Exercise_editCustomExercise(\n  exercise: ICustomExercise,\n  name: string,\n  tMuscles: IMuscle[],\n  sMuscles: IMuscle[],\n  types: IExerciseKind[],\n  smallImageUrl?: string,\n  largeImageUrl?: string\n): ICustomExercise {\n  const newExercise: ICustomExercise = {\n    ...exercise,\n    name,\n    types,\n    smallImageUrl,\n    largeImageUrl,\n    meta: { ...exercise.meta, targetMuscles: tMuscles, synergistMuscles: sMuscles },\n  };\n  return newExercise;\n}\n\nexport function Exercise_deleteCustomExercise(\n  allExercises: IAllCustomExercises,\n  exerciseId: IExerciseId\n): IAllCustomExercises {\n  const existingExercise = allExercises[exerciseId];\n  if (existingExercise) {\n    return { ...allExercises, [exerciseId]: { ...existingExercise, isDeleted: true } };\n  }\n  return allExercises;\n}\n\nexport function Exercise_upsertCustomExercise(\n  allExercises: IAllCustomExercises,\n  exercise: ICustomExercise\n): IAllCustomExercises {\n  exercise = { ...exercise, name: exercise.name.trim() };\n  const existingExercise = allExercises[exercise.id];\n  if (existingExercise) {\n    return { ...allExercises, [exercise.id]: { ...existingExercise, ...exercise, isDeleted: false } };\n  } else {\n    const sameNameDeletedExercise = ObjectUtils_values(allExercises).find(\n      (e) => e?.name === exercise.name && e.isDeleted\n    );\n    if (sameNameDeletedExercise) {\n      return {\n        ...allExercises,\n        [sameNameDeletedExercise.id]: {\n          ...sameNameDeletedExercise,\n          ...exercise,\n          id: sameNameDeletedExercise.id,\n          isDeleted: false,\n        },\n      };\n    } else {\n      return { ...allExercises, [exercise.id]: exercise };\n    }\n  }\n}\n\nexport function Exercise_applyCustomExerciseChange(\n  action: \"upsert\" | \"delete\",\n  exercise: ICustomExercise,\n  notes: string | undefined,\n  settings: ISettings,\n  program?: IProgram\n): { settings: ISettings; program?: IProgram } {\n  const oldExercise = settings.exercises[exercise.id];\n  const exercises =\n    action === \"upsert\"\n      ? Exercise_upsertCustomExercise(settings.exercises, exercise)\n      : Exercise_deleteCustomExercise(settings.exercises, exercise.id);\n  const newSettings = lb<ISettings>()\n    .p(\"exerciseData\")\n    .pi(exercise.id)\n    .p(\"notes\")\n    .set({ ...settings, exercises }, notes);\n  if (program && oldExercise && oldExercise.name !== exercise.name) {\n    return { settings: newSettings, program: Program_changeExerciseName(oldExercise.name, exercise.name, program, newSettings) };\n  }\n  return { settings: newSettings };\n}\n\nexport function Exercise_handleCustomExerciseChange(\n  dispatch: IDispatch,\n  action: \"upsert\" | \"delete\",\n  exercise: ICustomExercise,\n  notes: string | undefined,\n  settings: ISettings,\n  program?: IProgram\n): void {\n  const result = Exercise_applyCustomExerciseChange(action, exercise, notes, settings, program);\n  updateSettings(dispatch, lb<ISettings>().p(\"exercises\").record(result.settings.exercises), \"Create custom exercise\");\n  updateSettings(dispatch, lb<ISettings>().p(\"exerciseData\").pi(exercise.id).p(\"notes\").record(notes), \"Update notes\");\n  if (result.program) {\n    EditProgram_updateProgram(dispatch, result.program);\n  }\n}\n\nexport function Exercise_createOrUpdateCustomExercise(\n  allExercises: IAllCustomExercises,\n  name: string,\n  tMuscles: IMuscle[],\n  sMuscles: IMuscle[],\n  types: IExerciseKind[],\n  smallImageUrl?: string,\n  largeImageUrl?: string,\n  exercise?: ICustomExercise\n): IAllCustomExercises {\n  if (exercise != null) {\n    const newExercise = Exercise_editCustomExercise(\n      exercise,\n      name,\n      tMuscles,\n      sMuscles,\n      types,\n      smallImageUrl,\n      largeImageUrl\n    );\n    return { ...allExercises, [newExercise.id]: newExercise };\n  } else {\n    const deletedExerciseKey = ObjectUtils_keys(allExercises).find(\n      (k) => allExercises[k]?.isDeleted && allExercises[k]?.name === name\n    );\n    const deletedExercise = deletedExerciseKey != null ? allExercises[deletedExerciseKey] : undefined;\n    if (deletedExercise) {\n      return {\n        ...allExercises,\n        [deletedExercise.id]: {\n          ...deletedExercise,\n          name,\n          types,\n          smallImageUrl,\n          largeImageUrl,\n          isDeleted: false,\n          meta: {\n            targetMuscles: tMuscles,\n            bodyParts: [],\n            synergistMuscles: sMuscles,\n          },\n        },\n      };\n    } else {\n      const newExercise = Exercise_createCustomExercise(name, tMuscles, sMuscles, types, smallImageUrl, largeImageUrl);\n      return { ...allExercises, [newExercise.id]: newExercise };\n    }\n  }\n}\n\nexport function Exercise_filterExercises<T extends { name: string }>(allExercises: T[], filter: string): T[] {\n  return allExercises.filter((e) => StringUtils_fuzzySearch(filter.toLowerCase(), e.name.toLowerCase()));\n}\n\nfunction scoreTokenAgainstWords(\n  token: string,\n  words: string[],\n  fullText: string,\n  weights: [number, number, number]\n): number {\n  if (words.indexOf(token) !== -1) {\n    return weights[0];\n  }\n  for (const w of words) {\n    if (w.startsWith(token)) {\n      return weights[1];\n    }\n  }\n  if (fullText.indexOf(token) !== -1) {\n    return weights[2];\n  }\n  return 0;\n}\n\nfunction tokenizeQuery(query: string): { normalized: string; tokens: string[] } | undefined {\n  const tokens = query\n    .toLowerCase()\n    .split(/[^a-z0-9]+/)\n    .filter((t) => t.length > 0);\n  if (tokens.length === 0) {\n    return undefined;\n  }\n  return { normalized: tokens.join(\" \"), tokens };\n}\n\nfunction scoreExerciseAgainstTokens(\n  name: string,\n  equipment: string,\n  isDefaultEquipment: boolean,\n  normalizedQuery: string,\n  tokens: string[]\n): number | undefined {\n  const nameWords = name.split(/[\\s,]+/).filter((w) => w.length > 0);\n  const equipmentWords = equipment.split(/[\\s,]+/).filter((w) => w.length > 0);\n  const normalizedFullName = equipment ? `${nameWords.join(\" \")} ${equipmentWords.join(\" \")}` : nameWords.join(\" \");\n\n  let totalScore = 0;\n  for (const token of tokens) {\n    const nameScore = scoreTokenAgainstWords(token, nameWords, name, [1000, 500, 200]);\n    const equipmentScore = equipment ? scoreTokenAgainstWords(token, equipmentWords, equipment, [800, 400, 150]) : 0;\n    const best = Math.max(nameScore, equipmentScore);\n    if (best === 0) {\n      return undefined;\n    }\n    totalScore += best;\n  }\n\n  if (name === normalizedQuery || normalizedFullName === normalizedQuery) {\n    totalScore += 10000;\n  }\n  if (name.startsWith(normalizedQuery)) {\n    totalScore += 300;\n  }\n  if (tokens.indexOf(name) !== -1) {\n    totalScore += 1000;\n  }\n  if (equipment && isDefaultEquipment) {\n    totalScore += 50;\n  }\n  return totalScore;\n}\n\nexport function Exercise_matchesQuery<T extends { name: string; equipment?: IEquipment }>(\n  exercise: T,\n  query: string\n): boolean {\n  const parsed = tokenizeQuery(query);\n  if (!parsed) {\n    return true;\n  }\n  const name = exercise.name.toLowerCase();\n  const equipment = exercise.equipment ? equipmentName(exercise.equipment).toLowerCase() : \"\";\n  return scoreExerciseAgainstTokens(name, equipment, false, parsed.normalized, parsed.tokens) != null;\n}\n\nexport function Exercise_filterAndRankByQuery<\n  T extends { name: string; equipment?: IEquipment; defaultEquipment?: IEquipment },\n>(allExercises: T[], query: string): T[] {\n  const parsed = tokenizeQuery(query);\n  if (!parsed) {\n    return allExercises;\n  }\n  const { normalized, tokens } = parsed;\n\n  const scored: Array<{ exercise: T; score: number; name: string; fullName: string }> = [];\n  for (const e of allExercises) {\n    const name = e.name.toLowerCase();\n    const equipment = e.equipment ? equipmentName(e.equipment).toLowerCase() : \"\";\n    const isDefaultEquipment = !!e.equipment && !!e.defaultEquipment && e.equipment === e.defaultEquipment;\n    const score = scoreExerciseAgainstTokens(name, equipment, isDefaultEquipment, normalized, tokens);\n    if (score == null) {\n      continue;\n    }\n    const fullName = equipment ? `${name}, ${equipment}` : name;\n    scored.push({ exercise: e, score, name, fullName });\n  }\n\n  scored.sort((a, b) => {\n    if (b.score !== a.score) {\n      return b.score - a.score;\n    }\n    const byName = a.name.localeCompare(b.name);\n    if (byName !== 0) {\n      return byName;\n    }\n    return a.fullName.localeCompare(b.fullName);\n  });\n  return scored.map((s) => s.exercise);\n}\n\nexport function Exercise_filterAndRankCustomByQuery(\n  customExercises: IAllCustomExercises,\n  query: string\n): ICustomExercise[] {\n  const list = CollectionUtils_compact(ObjectUtils_values(customExercises)).filter((e) => !e.isDeleted);\n  const parsed = tokenizeQuery(query);\n  if (!parsed) {\n    return list;\n  }\n  const { normalized, tokens } = parsed;\n\n  const scored: Array<{ exercise: ICustomExercise; score: number; name: string }> = [];\n  for (const e of list) {\n    const name = e.name.toLowerCase();\n    const score = scoreExerciseAgainstTokens(name, \"\", false, normalized, tokens);\n    if (score == null) {\n      continue;\n    }\n    scored.push({ exercise: e, score, name });\n  }\n\n  scored.sort((a, b) => (b.score !== a.score ? b.score - a.score : a.name.localeCompare(b.name)));\n  return scored.map((s) => s.exercise);\n}\n\nexport function Exercise_sortExercises(\n  allExercises: IExercise[],\n  isSubstitute: boolean,\n  settings: ISettings,\n  filterTypes?: string[],\n  currentExerciseType?: IExerciseType\n): IExercise[] {\n  return CollectionUtils_sort(allExercises, (a, b) => {\n    const exerciseType = currentExerciseType;\n    if (isSubstitute && exerciseType) {\n      const aRating = Exercise_similarRating(exerciseType, a, settings);\n      const bRating = Exercise_similarRating(exerciseType, b, settings);\n      return bRating - aRating;\n    } else if (\n      filterTypes &&\n      Muscle_getAvailableMuscleGroups(settings)\n        .map((m) => m.toLowerCase())\n        .some((t) => filterTypes.map((ft) => ft.toLowerCase()).indexOf(t) !== -1)\n    ) {\n      const lowercaseFilterTypes = filterTypes.map((t) => t.toLowerCase());\n      const aTargetMuscleGroups = Exercise_targetMusclesGroups(a, settings);\n      const bTargetMuscleGroups = Exercise_targetMusclesGroups(b, settings);\n      if (\n        aTargetMuscleGroups.some((m) => lowercaseFilterTypes.indexOf(m) !== -1) &&\n        bTargetMuscleGroups.every((m) => lowercaseFilterTypes.indexOf(m) === -1)\n      ) {\n        return -1;\n      } else if (\n        bTargetMuscleGroups.some((m) => lowercaseFilterTypes.indexOf(m) !== -1) &&\n        aTargetMuscleGroups.every((m) => lowercaseFilterTypes.indexOf(m) === -1)\n      ) {\n        return 1;\n      } else {\n        return a.name.localeCompare(b.name);\n      }\n    } else {\n      return a.name.localeCompare(b.name);\n    }\n  });\n}\n\nexport function Exercise_filterExercisesByType<T extends IExerciseType>(\n  allExercises: T[],\n  filterTypes: string[],\n  settings: ISettings\n): T[] {\n  return allExercises.filter((e) => {\n    const exercise = Exercise_get(e, settings.exercises);\n    const targetMuscleGroups = Exercise_targetMusclesGroups(e, settings).map((m) => m.toLowerCase());\n    const synergistMuscleGroups = Exercise_synergistMusclesGroups(e, settings).map((m) => m.toLowerCase());\n    return filterTypes\n      .map((ft) => ft.toLowerCase())\n      .every((ft) => {\n        return (\n          targetMuscleGroups.indexOf(ft) !== -1 ||\n          synergistMuscleGroups.indexOf(ft) !== -1 ||\n          exercise.types.map((t) => t.toLowerCase()).indexOf(ft) !== -1 ||\n          equipmentName(e.equipment).toLowerCase() === ft\n        );\n      });\n  });\n}\n\nexport function Exercise_filterCustomExercises(\n  customExercises: IAllCustomExercises,\n  filter: string\n): IAllCustomExercises {\n  return ObjectUtils_filter(customExercises, (e, v) =>\n    v && !v.isDeleted ? StringUtils_fuzzySearch(filter.toLowerCase(), v.name.toLowerCase()) : false\n  );\n}\n\nexport function Exercise_filterCustomExercisesByType(filterTypes: string[], settings: ISettings): IAllCustomExercises {\n  return ObjectUtils_filter(settings.exercises, (_id, exercise) => {\n    if (!exercise || exercise.isDeleted) {\n      return false;\n    }\n    const targetMuscleGroups = Array.from(\n      new Set(\n        CollectionUtils_flat(exercise.meta.targetMuscles.map((m) => Muscle_getScreenMusclesFromMuscle(m, settings)))\n      )\n    ).map((m) => Muscle_getMuscleGroupName(m, settings));\n    const synergistMuscleGroups = Array.from(\n      new Set(\n        CollectionUtils_flat(exercise.meta.synergistMuscles.map((m) => Muscle_getScreenMusclesFromMuscle(m, settings)))\n      )\n    ).map((m) => Muscle_getMuscleGroupName(m, settings));\n    return filterTypes.every((ft) => {\n      return (\n        targetMuscleGroups.indexOf(ft) !== -1 ||\n        synergistMuscleGroups.indexOf(ft) !== -1 ||\n        (exercise.types || []).map(StringUtils_capitalize).indexOf(ft) !== -1\n      );\n    });\n  });\n}\n","import { IDayData, IPlannerProgram, IProgram, ISettings } from \"../types\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport {\n  Program_evaluate,\n  Program_evaluateCachedPlanner,\n  Program_getAllProgramExercises,\n  Program_getProgramExercise,\n} from \"./program\";\nimport {\n  ExerciseLiftoEditorDraft_create,\n  ExerciseLiftoEditorDraft_fromEditor,\n  ExerciseLiftoEditorDraft_pendingChange,\n  IExerciseLiftoEditorDraft,\n} from \"./exerciseLiftoEditorDraft\";\nimport {\n  IProgramExerciseSharedSection,\n  IProgramExerciseTextError,\n  ProgramExerciseText_apply,\n  ProgramExerciseText_blurb,\n  ProgramExerciseText_findDeclaration,\n  ProgramExerciseText_rebaseError,\n  ProgramExerciseText_sharedSections,\n} from \"./programExerciseText\";\nimport { IProgramExerciseSwap, IProgramExerciseSwapScope } from \"./programExerciseSwap\";\nimport {\n  ProgramExercisePreview_apply,\n  ProgramExercisePreview_materialize,\n  ProgramExercisePreview_target,\n} from \"./programExercisePreview\";\nimport { ProgramRewrite_changedKeys } from \"./programRewrite\";\nimport { PlannerProgram_generateFullText } from \"../pages/planner/models/plannerProgram\";\n\nexport type IExerciseDraftToProgramProgram = IProgram & { planner: IPlannerProgram };\n\n// The exercise the sheet is on: the day it was opened from, and the instance chip pressed since.\nexport interface IExerciseDraftToProgramTarget {\n  exerciseKey: string;\n  day: number;\n  selectedDayData: Required<IDayData> | undefined;\n}\n\n// Read off one evaluation of one planner, so a splice's target and its destination never disagree.\nexport interface IExerciseDraftToProgramSnapshot {\n  program: IExerciseDraftToProgramProgram;\n  instances: IPlannerProgramExercise[];\n  declarationDayData: Required<IDayData>;\n  currentExercise: IPlannerProgramExercise;\n  declaration: IPlannerProgramExercise;\n  sharedSections: IProgramExerciseSharedSection[];\n  blurb: string;\n  tappedDayData: Required<IDayData>;\n  settings: ISettings;\n}\n\nexport interface IExerciseDraftToProgramOptions {\n  swapScope: IProgramExerciseSwapScope;\n  detectSwap: (localBlurb: string, declaration: IPlannerProgramExercise) => IProgramExerciseSwap | undefined;\n}\n\nexport interface IExerciseDraftToProgramApplied {\n  swap: IProgramExerciseSwap | undefined;\n  applied: ReturnType<typeof ProgramExerciseText_apply>;\n}\n\nexport type IExerciseDraftToProgramPreview = { text: string } | { error: string };\n\nexport interface IExerciseDraftToProgramAnalysis {\n  error?: IProgramExerciseTextError;\n  preview?: IExerciseDraftToProgramPreview;\n}\n\nexport type IExerciseDraftToProgramWritten =\n  | { blurb: string; unchanged: true }\n  | { blurb: string; unchanged: false; planner: IPlannerProgram; draft: IExerciseLiftoEditorDraft };\n\nexport function ExerciseDraftToProgram_snapshot(\n  program: IExerciseDraftToProgramProgram,\n  target: IExerciseDraftToProgramTarget,\n  settings: ISettings\n): IExerciseDraftToProgramSnapshot | undefined {\n  const evaluated = Program_evaluateCachedPlanner(program, settings);\n  const programExercise = Program_getProgramExercise(target.day, evaluated, target.exerciseKey);\n  if (programExercise == null) {\n    return undefined;\n  }\n  const instances = Program_getAllProgramExercises(evaluated).filter(\n    (e) => e.key === target.exerciseKey && !e.isRepeat\n  );\n  const declarationDayData = ProgramExerciseText_findDeclaration(evaluated, programExercise).dayData;\n  const activeDayData = target.selectedDayData ?? declarationDayData;\n  const currentExercise = instances.find(\n    (e) => e.dayData.week === activeDayData.week && e.dayData.dayInWeek === activeDayData.dayInWeek\n  );\n  if (currentExercise == null) {\n    return undefined;\n  }\n  const declaration = ProgramExerciseText_findDeclaration(evaluated, currentExercise);\n  return {\n    program,\n    instances,\n    declarationDayData,\n    currentExercise,\n    declaration,\n    sharedSections: ProgramExerciseText_sharedSections(evaluated, declaration),\n    blurb: ProgramExerciseText_blurb(program.planner, declaration),\n    tappedDayData: ProgramExercisePreview_target(declaration, programExercise, target.selectedDayData).tappedDayData,\n    settings,\n  };\n}\n\n// Folded up to the live text so a hidden shared edit is still validated, and with the swap\n// applied so a renamed exercise's `...reuse` targets are not reported as broken.\nexport function ExerciseDraftToProgram_apply(\n  snapshot: IExerciseDraftToProgramSnapshot,\n  draft: IExerciseLiftoEditorDraft,\n  text: string,\n  options: IExerciseDraftToProgramOptions\n): IExerciseDraftToProgramApplied | undefined {\n  const trimmed = text.trim();\n  if (trimmed === \"\") {\n    return undefined;\n  }\n  const pending = ExerciseLiftoEditorDraft_pendingChange(\n    ExerciseLiftoEditorDraft_fromEditor(draft, trimmed),\n    snapshot.sharedSections\n  );\n  const localBlurb = pending.localBlurb.trim();\n  if (localBlurb === \"\") {\n    return undefined;\n  }\n  const swap = options.detectSwap(localBlurb, snapshot.declaration);\n  return {\n    swap,\n    applied: ProgramExerciseText_apply(\n      snapshot.program.planner,\n      snapshot.declaration,\n      localBlurb,\n      pending.sharedEdits,\n      swap,\n      options.swapScope,\n      snapshot.settings\n    ),\n  };\n}\n\nfunction keyAfterSwap(\n  snapshot: IExerciseDraftToProgramSnapshot,\n  result: IExerciseDraftToProgramApplied,\n  planner: IPlannerProgram\n): string {\n  if (result.swap == null) {\n    return snapshot.declaration.key;\n  }\n  return (\n    ProgramRewrite_changedKeys(snapshot.program.planner, planner, snapshot.settings)[snapshot.declaration.key] ??\n    snapshot.declaration.key\n  );\n}\n\nexport function ExerciseDraftToProgram_analyze(\n  snapshot: IExerciseDraftToProgramSnapshot | undefined,\n  draft: IExerciseLiftoEditorDraft,\n  text: string,\n  options: IExerciseDraftToProgramOptions,\n  withPreview: boolean\n): IExerciseDraftToProgramAnalysis {\n  const result = snapshot != null ? ExerciseDraftToProgram_apply(snapshot, draft, text, options) : undefined;\n  if (snapshot == null || result == null) {\n    return { preview: withPreview ? { error: \"There's nothing to resolve here yet.\" } : undefined };\n  }\n  if (\"error\" in result.applied) {\n    // notFound means the sheet lost track of the exercise, not that the user typed something\n    // wrong. The banner stays quiet and the save re-resolves from scratch.\n    return {\n      error: result.applied.notFound ? undefined : ProgramExerciseText_rebaseError(result.applied.error, text),\n      preview: withPreview ? { error: result.applied.error.message } : undefined,\n    };\n  }\n  if (!withPreview) {\n    return {};\n  }\n  const resolved = ProgramExercisePreview_materialize(\n    snapshot.program,\n    result.applied.planner,\n    snapshot.tappedDayData,\n    keyAfterSwap(snapshot, result, result.applied.planner),\n    snapshot.settings\n  );\n  return { preview: resolved != null ? { text: resolved } : { error: \"Couldn't resolve this exercise.\" } };\n}\n\nexport function ExerciseDraftToProgram_writePreview(\n  snapshot: IExerciseDraftToProgramSnapshot,\n  draft: IExerciseLiftoEditorDraft,\n  panelText: string,\n  options: IExerciseDraftToProgramOptions\n): IExerciseDraftToProgramWritten | { error: IProgramExerciseTextError } {\n  const folded = ExerciseDraftToProgram_apply(snapshot, draft, draft.localBlurb, options);\n  if (folded == null) {\n    return { error: { message: \"There's nothing to write here yet.\" } };\n  }\n  if (\"error\" in folded.applied) {\n    return { error: folded.applied.error };\n  }\n  const target = {\n    key: keyAfterSwap(snapshot, folded, folded.applied.planner),\n    dayData: snapshot.declaration.dayData,\n    tappedDayData: snapshot.tappedDayData,\n  };\n  const result = ProgramExercisePreview_apply(folded.applied.planner, target, panelText, snapshot.settings);\n  if (\"error\" in result) {\n    return result;\n  }\n  if (\n    PlannerProgram_generateFullText(result.planner.weeks) ===\n    PlannerProgram_generateFullText(snapshot.program.planner.weeks)\n  ) {\n    return { blurb: result.blurb, unchanged: true };\n  }\n  const written = Program_evaluate({ ...snapshot.program, planner: result.planner }, snapshot.settings);\n  const writtenDeclaration = Program_getAllProgramExercises(written).find(\n    (e) =>\n      e.key === target.key &&\n      !e.isRepeat &&\n      e.dayData.week === result.declarationDayData.week &&\n      e.dayData.dayInWeek === result.declarationDayData.dayInWeek\n  );\n  return {\n    blurb: result.blurb,\n    unchanged: false,\n    planner: result.planner,\n    draft: ExerciseLiftoEditorDraft_create(\n      result.blurb,\n      writtenDeclaration != null\n        ? ProgramExerciseText_sharedSections(written, writtenDeclaration)\n        : snapshot.sharedSections\n    ),\n  };\n}\n","import { IExerciseType, ISettings } from \"../types\";\nimport { Exercise_toUrlSlug } from \"./exercise\";\nconst availableSmallImages = new Set([\n  \"abwheel_bodyweight\",\n  \"arnoldpress_dumbbell\",\n  \"arnoldpress_kettlebell\",\n  \"aroundtheworld_dumbbell\",\n  \"backextension_bodyweight\",\n  \"backextension_leveragemachine\",\n  \"ballslams_medicineball\",\n  \"battleropes_bodyweight\",\n  \"behindtheneckpress_band\",\n  \"behindtheneckpress_barbell\",\n  \"behindtheneckpress_smith\",\n  \"benchdip_bodyweight\",\n  \"benchpress_band\",\n  \"benchpress_barbell\",\n  \"benchpress_cable\",\n  \"benchpress_dumbbell\",\n  \"benchpress_kettlebell\",\n  \"benchpress_smith\",\n  \"benchpressclosegrip_barbell\",\n  \"benchpressclosegrip_ezbar\",\n  \"benchpressclosegrip_smith\",\n  \"benchpresswidegrip_barbell\",\n  \"benchpresswidegrip_smith\",\n  \"bentoveronearmrow_dumbbell\",\n  \"bentoverrow_band\",\n  \"bentoverrow_barbell\",\n  \"bentoverrow_cable\",\n  \"bentoverrow_dumbbell\",\n  \"bentoverrow_leveragemachine\",\n  \"bentoverrow_smith\",\n  \"bicepcurl_band\",\n  \"bicepcurl_barbell\",\n  \"bicepcurl_cable\",\n  \"bicepcurl_dumbbell\",\n  \"bicepcurl_ezbar\",\n  \"bicepcurl_leveragemachine\",\n  \"bicyclecrunch_bodyweight\",\n  \"boxsquat_barbell\",\n  \"boxsquat_dumbbell\",\n  \"bulgariansplitsquat_dumbbell\",\n  \"cablecrossover_cable\",\n  \"cablecrunch_cable\",\n  \"cablekickback_cable\",\n  \"cablepullthrough_cable\",\n  \"cabletwist_band\",\n  \"cabletwist_barbell\",\n  \"cabletwist_bodyweight\",\n  \"cabletwist_cable\",\n  \"cabletwist_leveragemachine\",\n  \"calfpressonlegpress_leveragemachine\",\n  \"calfpressonseatedlegpress_leveragemachine\",\n  \"chestdip_bodyweight\",\n  \"chestfly_barbell\",\n  \"chestfly_cable\",\n  \"chestfly_dumbbell\",\n  \"chestfly_leveragemachine\",\n  \"chestpress_band\",\n  \"chestpress_leveragemachine\",\n  \"chinup_bodyweight\",\n  \"chinup_leveragemachine\",\n  \"clean_barbell\",\n  \"cleanandjerk_barbell\",\n  \"concentrationcurl_band\",\n  \"concentrationcurl_barbell\",\n  \"concentrationcurl_cable\",\n  \"concentrationcurl_dumbbell\",\n  \"crossbodycrunch_bodyweight\",\n  \"crunch_bodyweight\",\n  \"crunch_cable\",\n  \"crunch_leveragemachine\",\n  \"deadlift_band\",\n  \"deadlift_barbell\",\n  \"deadlift_cable\",\n  \"deadlift_dumbbell\",\n  \"deadlift_kettlebell\",\n  \"deadlift_leveragemachine\",\n  \"deadlift_smith\",\n  \"deadlifthighpull_barbell\",\n  \"declinebenchpress_dumbbell\",\n  \"declinebenchpress_smith\",\n  \"deficitdeadlift_barbell\",\n  \"deficitdeadlift_trapbar\",\n  \"ellipticalmachine_leveragemachine\",\n  \"facepull_band\",\n  \"flatkneeraise_bodyweight\",\n  \"flatlegraise_bodyweight\",\n  \"frontraise_band\",\n  \"frontraise_barbell\",\n  \"frontraise_bodyweight\",\n  \"frontraise_cable\",\n  \"frontraise_dumbbell\",\n  \"frontsquat_barbell\",\n  \"frontsquat_cable\",\n  \"frontsquat_dumbbell\",\n  \"frontsquat_kettlebell\",\n  \"frontsquat_smith\",\n  \"glutebridge_band\",\n  \"glutebridge_barbell\",\n  \"glutebridge_dumbbell\",\n  \"glutebridgemarch_bodyweight\",\n  \"glutekickback_band\",\n  \"glutekickback_cable\",\n  \"gobletsquat_dumbbell\",\n  \"gobletsquat_kettlebell\",\n  \"goodmorning_barbell\",\n  \"goodmorning_leveragemachine\",\n  \"goodmorning_smith\",\n  \"hacksquat_barbell\",\n  \"hacksquat_smith\",\n  \"hammercurl_band\",\n  \"hammercurl_cable\",\n  \"hammercurl_dumbbell\",\n  \"handstandpushup_bodyweight\",\n  \"hangclean_kettlebell\",\n  \"hanginglegraise_bodyweight\",\n  \"hanginglegraise_cable\",\n  \"highrow_cable\",\n  \"highrow_leveragemachine\",\n  \"hipabductor_band\",\n  \"hipabductor_bodyweight\",\n  \"hipabductor_cable\",\n  \"hipabductor_leveragemachine\",\n  \"hipadductor_leveragemachine\",\n  \"hipthrust_band\",\n  \"hipthrust_barbell\",\n  \"hipthrust_bodyweight\",\n  \"hipthrust_leveragemachine\",\n  \"inclinebenchpress_barbell\",\n  \"inclinebenchpress_cable\",\n  \"inclinebenchpress_dumbbell\",\n  \"inclinebenchpress_smith\",\n  \"inclinebenchpresswidegrip_barbell\",\n  \"inclinechestfly_cable\",\n  \"inclinechestfly_dumbbell\",\n  \"inclinechestpress_band\",\n  \"inclinechestpress_dumbbell\",\n  \"inclinechestpress_leveragemachine\",\n  \"inclinecurl_dumbbell\",\n  \"inclinerow_barbell\",\n  \"inclinerow_dumbbell\",\n  \"invertedrow_bodyweight\",\n  \"jackknifesitup_bodyweight\",\n  \"jumpsquat_barbell\",\n  \"jumpsquat_bodyweight\",\n  \"kettlebellswing_dumbbell\",\n  \"kettlebellswing_kettlebell\",\n  \"kneelingpulldown_band\",\n  \"kneestoelbows_bodyweight\",\n  \"lateralraise_band\",\n  \"lateralraise_cable\",\n  \"lateralraise_dumbbell\",\n  \"lateralraise_kettlebell\",\n  \"lateralraise_leveragemachine\",\n  \"latpulldown_cable\",\n  \"latpulldown_leveragemachine\",\n  \"legextension_band\",\n  \"legextension_leveragemachine\",\n  \"legpress_leveragemachine\",\n  \"legpress_smith\",\n  \"legsupbenchpress_barbell\",\n  \"lunge_barbell\",\n  \"lunge_bodyweight\",\n  \"lunge_cable\",\n  \"lunge_dumbbell\",\n  \"lyingbicepcurl_cable\",\n  \"lyingbicepcurl_dumbbell\",\n  \"lyinglegcurl_band\",\n  \"lyinglegcurl_leveragemachine\",\n  \"muscleup_bodyweight\",\n  \"obliquecrunch_bodyweight\",\n  \"overheadpress_barbell\",\n  \"overheadpress_dumbbell\",\n  \"overheadpress_ezbar\",\n  \"overheadsquat_barbell\",\n  \"overheadsquat_dumbbell\",\n  \"pecdeck_leveragemachine\",\n  \"pendlayrow_barbell\",\n  \"pistolsquat_bodyweight\",\n  \"pistolsquat_kettlebell\",\n  \"pistolsquat_leveragemachine\",\n  \"plank_bodyweight\",\n  \"preachercurl_barbell\",\n  \"preachercurl_dumbbell\",\n  \"preachercurl_ezbar\",\n  \"preachercurl_leveragemachine\",\n  \"pullover_barbell\",\n  \"pullover_dumbbell\",\n  \"pullup_band\",\n  \"pullup_bodyweight\",\n  \"pullup_leveragemachine\",\n  \"pushpress_barbell\",\n  \"pushpress_bodyweight\",\n  \"pushpress_dumbbell\",\n  \"pushpress_kettlebell\",\n  \"pushup_band\",\n  \"pushup_bodyweight\",\n  \"reversecrunch_bodyweight\",\n  \"reversecrunch_cable\",\n  \"reversecurl_band\",\n  \"reversecurl_barbell\",\n  \"reversecurl_cable\",\n  \"reversecurl_dumbbell\",\n  \"reversefly_band\",\n  \"reversefly_dumbbell\",\n  \"reversefly_leveragemachine\",\n  \"reversehyperextension_band\",\n  \"reversehyperextension_leveragemachine\",\n  \"reverselunge_barbell\",\n  \"reverselunge_bodyweight\",\n  \"reverselunge_dumbbell\",\n  \"reverselunge_kettlebell\",\n  \"reversewristcurl_barbell\",\n  \"reversewristcurl_dumbbell\",\n  \"reversewristcurl_ezbar\",\n  \"romaniandeadlift_barbell\",\n  \"romaniandeadlift_dumbbell\",\n  \"russiantwist_bodyweight\",\n  \"russiantwist_cable\",\n  \"russiantwist_dumbbell\",\n  \"safetysquatbarsquat_barbell\",\n  \"seatedcalfraise_barbell\",\n  \"seatedcalfraise_dumbbell\",\n  \"seatedcalfraise_leveragemachine\",\n  \"seatedfrontraise_barbell\",\n  \"seatedfrontraise_dumbbell\",\n  \"seatedlegcurl_leveragemachine\",\n  \"seatedlegpress_leveragemachine\",\n  \"seatedoverheadpress_barbell\",\n  \"seatedpalmsupwristcurl_dumbbell\",\n  \"seatedrow_band\",\n  \"seatedrow_cable\",\n  \"seatedrow_leveragemachine\",\n  \"seatedwidegriprow_cable\",\n  \"shoulderpress_band\",\n  \"shoulderpress_cable\",\n  \"shoulderpress_dumbbell\",\n  \"shoulderpress_leveragemachine\",\n  \"shoulderpress_smith\",\n  \"shoulderpressparallelgrip_dumbbell\",\n  \"shrug_band\",\n  \"shrug_barbell\",\n  \"shrug_cable\",\n  \"shrug_dumbbell\",\n  \"shrug_leveragemachine\",\n  \"shrug_smith\",\n  \"sidebend_band\",\n  \"sidebend_cable\",\n  \"sidebend_dumbbell\",\n  \"sidecrunch_band\",\n  \"sidecrunch_bodyweight\",\n  \"sidecrunch_cable\",\n  \"sidehipabductor_barbell\",\n  \"sidehipabductor_bodyweight\",\n  \"sidehipabductor_leveragemachine\",\n  \"sidelyingclam_bodyweight\",\n  \"sideplank_bodyweight\",\n  \"singlelegbridge_bodyweight\",\n  \"singlelegdeadlift_bodyweight\",\n  \"singlelegdeadlift_dumbbell\",\n  \"singlelegglutebridgebench_bodyweight\",\n  \"singlelegglutebridgebentknee_bodyweight\",\n  \"singlelegglutebridgestraight_bodyweight\",\n  \"singleleghipthrust_barbell\",\n  \"singleleghipthrust_bodyweight\",\n  \"singleleghipthrust_leveragemachine\",\n  \"sissysquat_bodyweight\",\n  \"situp_bodyweight\",\n  \"situp_kettlebell\",\n  \"skullcrusher_barbell\",\n  \"skullcrusher_cable\",\n  \"skullcrusher_dumbbell\",\n  \"skullcrusher_ezbar\",\n  \"snatch_dumbbell\",\n  \"splitsquat_band\",\n  \"splitsquat_barbell\",\n  \"splitsquat_bodyweight\",\n  \"splitsquat_dumbbell\",\n  \"splitsquat_kettlebell\",\n  \"squat_barbell\",\n  \"squat_bodyweight\",\n  \"squat_dumbbell\",\n  \"squat_leveragemachine\",\n  \"squat_smith\",\n  \"squatrow_band\",\n  \"standingcalfraise_barbell\",\n  \"standingcalfraise_bodyweight\",\n  \"standingcalfraise_cable\",\n  \"standingcalfraise_dumbbell\",\n  \"standingcalfraise_leveragemachine\",\n  \"standingrow_cable\",\n  \"standingrowclosegrip_cable\",\n  \"standingrowreardeltwithrope_cable\",\n  \"standingrowrearhorizontaldeltwithrope_cable\",\n  \"standingrowvbar_cable\",\n  \"stepup_band\",\n  \"stepup_barbell\",\n  \"stepup_bodyweight\",\n  \"stepup_dumbbell\",\n  \"stifflegdeadlift_band\",\n  \"stifflegdeadlift_barbell\",\n  \"stifflegdeadlift_dumbbell\",\n  \"straightlegdeadlift_band\",\n  \"straightlegdeadlift_barbell\",\n  \"straightlegdeadlift_dumbbell\",\n  \"straightlegdeadlift_kettlebell\",\n  \"sumodeadlift_barbell\",\n  \"sumodeadlifthighpull_barbell\",\n  \"superman_bodyweight\",\n  \"superman_dumbbell\",\n  \"tbarrow_leveragemachine\",\n  \"thruster_barbell\",\n  \"toestobar_bodyweight\",\n  \"trapbardeadlift_trapbar\",\n  \"tricepsdip_bodyweight\",\n  \"tricepsdip_leveragemachine\",\n  \"tricepsextension_band\",\n  \"tricepsextension_barbell\",\n  \"tricepsextension_cable\",\n  \"tricepsextension_dumbbell\",\n  \"tricepspushdown_cable\",\n  \"uprightrow_band\",\n  \"uprightrow_barbell\",\n  \"uprightrow_cable\",\n  \"uprightrow_dumbbell\",\n  \"vup_band\",\n  \"vup_bodyweight\",\n  \"vup_dumbbell\",\n  \"widepullup_bodyweight\",\n  \"wristcurl_barbell\",\n  \"wristcurl_dumbbell\",\n  \"wristcurl_ezbar\",\n  \"wristroller_bodyweight\",\n  \"zerchersquat_barbell\",\n  \"wallpushup_bodyweight\",\n  \"inclinepushup_bodyweight\",\n  \"kneepushup_bodyweight\",\n  \"diamondpushup_bodyweight\",\n  \"pseudoplanchepushup_bodyweight\",\n  \"pikepushup_bodyweight\",\n  \"ringdip_bodyweight\",\n  \"negativedip_bodyweight\",\n  \"verticalrow_bodyweight\",\n  \"widerow_bodyweight\",\n  \"ringrow_bodyweight\",\n  \"tuckfrontleverrow_bodyweight\",\n  \"frontleverrow_bodyweight\",\n  \"scapularpullup_bodyweight\",\n  \"deadhang_bodyweight\",\n  \"negativepullup_bodyweight\",\n  \"assistedsquat_bodyweight\",\n  \"shrimpsquat_bodyweight\",\n  \"nordiccurl_bodyweight\",\n  \"handstand_bodyweight\",\n  \"wallhandstand_bodyweight\",\n  \"crowpose_bodyweight\",\n  \"dragonflag_bodyweight\",\n  \"copenhagenplank_bodyweight\",\n  \"hangingkneeraise_bodyweight\",\n  \"archhang_bodyweight\",\n  \"supporthold_bodyweight\",\n  \"pallofpress_band\",\n  \"renegaderow_dumbbell\",\n  \"romaniandeadlift_bodyweight\",\n  \"bulgariansplitsquat_bodyweight\",\n  \"nordiccurl_band\",\n  \"inclinerow_bodyweight\",\n  \"reversehyperextension_bodyweight\",\n  \"ringabrollout_bodyweight\",\n  \"kneelingringabrollout_bodyweight\",\n  \"archerpullup_bodyweight\",\n  \"skinthecat_bodyweight\",\n  \"hollowbodyhold_bodyweight\",\n  \"deadbug_bodyweight\",\n  \"shoulderpassthrough_band\",\n]);\n\nconst availableLargeImages = new Set([\n  \"abwheel_bodyweight\",\n  \"arnoldpress_dumbbell\",\n  \"arnoldpress_kettlebell\",\n  \"aroundtheworld_dumbbell\",\n  \"backextension_bodyweight\",\n  \"backextension_leveragemachine\",\n  \"ballslams_medicineball\",\n  \"battleropes_bodyweight\",\n  \"behindtheneckpress_band\",\n  \"behindtheneckpress_barbell\",\n  \"behindtheneckpress_smith\",\n  \"benchdip_bodyweight\",\n  \"benchpress_band\",\n  \"benchpress_barbell\",\n  \"benchpress_cable\",\n  \"benchpress_dumbbell\",\n  \"benchpress_kettlebell\",\n  \"benchpress_smith\",\n  \"benchpressclosegrip_barbell\",\n  \"benchpressclosegrip_ezbar\",\n  \"benchpressclosegrip_smith\",\n  \"benchpresswidegrip_barbell\",\n  \"benchpresswidegrip_smith\",\n  \"bentoveronearmrow_dumbbell\",\n  \"bentoverrow_band\",\n  \"bentoverrow_barbell\",\n  \"bentoverrow_cable\",\n  \"bentoverrow_dumbbell\",\n  \"bentoverrow_leveragemachine\",\n  \"bentoverrow_smith\",\n  \"bicepcurl_band\",\n  \"bicepcurl_barbell\",\n  \"bicepcurl_cable\",\n  \"bicepcurl_dumbbell\",\n  \"bicepcurl_ezbar\",\n  \"bicepcurl_leveragemachine\",\n  \"bicyclecrunch_bodyweight\",\n  \"boxsquat_barbell\",\n  \"boxsquat_dumbbell\",\n  \"bulgariansplitsquat_dumbbell\",\n  \"cablecrossover_cable\",\n  \"cablecrunch_cable\",\n  \"cablekickback_cable\",\n  \"cablepullthrough_cable\",\n  \"cabletwist_band\",\n  \"cabletwist_barbell\",\n  \"cabletwist_bodyweight\",\n  \"cabletwist_cable\",\n  \"cabletwist_leveragemachine\",\n  \"calfpressonlegpress_leveragemachine\",\n  \"calfpressonseatedlegpress_leveragemachine\",\n  \"chestdip_bodyweight\",\n  \"chestfly_barbell\",\n  \"chestfly_cable\",\n  \"chestfly_dumbbell\",\n  \"chestfly_leveragemachine\",\n  \"chestpress_band\",\n  \"chestpress_leveragemachine\",\n  \"chinup_bodyweight\",\n  \"chinup_leveragemachine\",\n  \"clean_barbell\",\n  \"cleanandjerk_barbell\",\n  \"concentrationcurl_band\",\n  \"concentrationcurl_barbell\",\n  \"concentrationcurl_cable\",\n  \"concentrationcurl_dumbbell\",\n  \"crossbodycrunch_bodyweight\",\n  \"crunch_bodyweight\",\n  \"crunch_cable\",\n  \"crunch_leveragemachine\",\n  \"deadlift_band\",\n  \"deadlift_barbell\",\n  \"deadlift_cable\",\n  \"deadlift_dumbbell\",\n  \"deadlift_kettlebell\",\n  \"deadlift_leveragemachine\",\n  \"deadlift_smith\",\n  \"deadlifthighpull_barbell\",\n  \"declinebenchpress_dumbbell\",\n  \"declinebenchpress_smith\",\n  \"deficitdeadlift_barbell\",\n  \"deficitdeadlift_trapbar\",\n  \"ellipticalmachine_leveragemachine\",\n  \"facepull_band\",\n  \"flatkneeraise_bodyweight\",\n  \"flatlegraise_bodyweight\",\n  \"frontraise_band\",\n  \"frontraise_barbell\",\n  \"frontraise_bodyweight\",\n  \"frontraise_cable\",\n  \"frontraise_dumbbell\",\n  \"frontsquat_barbell\",\n  \"frontsquat_cable\",\n  \"frontsquat_dumbbell\",\n  \"frontsquat_kettlebell\",\n  \"frontsquat_smith\",\n  \"glutebridge_band\",\n  \"glutebridge_barbell\",\n  \"glutebridge_dumbbell\",\n  \"glutebridgemarch_bodyweight\",\n  \"glutekickback_band\",\n  \"glutekickback_cable\",\n  \"gobletsquat_dumbbell\",\n  \"gobletsquat_kettlebell\",\n  \"goodmorning_barbell\",\n  \"goodmorning_leveragemachine\",\n  \"goodmorning_smith\",\n  \"hacksquat_barbell\",\n  \"hacksquat_smith\",\n  \"hammercurl_band\",\n  \"hammercurl_cable\",\n  \"hammercurl_dumbbell\",\n  \"handstandpushup_bodyweight\",\n  \"hangclean_kettlebell\",\n  \"hanginglegraise_bodyweight\",\n  \"hanginglegraise_cable\",\n  \"highrow_cable\",\n  \"highrow_leveragemachine\",\n  \"hipabductor_band\",\n  \"hipabductor_bodyweight\",\n  \"hipabductor_cable\",\n  \"hipabductor_leveragemachine\",\n  \"hipadductor_leveragemachine\",\n  \"hipthrust_band\",\n  \"hipthrust_barbell\",\n  \"hipthrust_bodyweight\",\n  \"hipthrust_leveragemachine\",\n  \"inclinebenchpress_barbell\",\n  \"inclinebenchpress_cable\",\n  \"inclinebenchpress_dumbbell\",\n  \"inclinebenchpress_smith\",\n  \"inclinebenchpresswidegrip_barbell\",\n  \"inclinechestfly_cable\",\n  \"inclinechestfly_dumbbell\",\n  \"inclinechestpress_band\",\n  \"inclinechestpress_dumbbell\",\n  \"inclinechestpress_leveragemachine\",\n  \"inclinecurl_dumbbell\",\n  \"inclinerow_barbell\",\n  \"inclinerow_dumbbell\",\n  \"invertedrow_bodyweight\",\n  \"jackknifesitup_bodyweight\",\n  \"jumpsquat_barbell\",\n  \"jumpsquat_bodyweight\",\n  \"kettlebellswing_dumbbell\",\n  \"kettlebellswing_kettlebell\",\n  \"kneelingpulldown_band\",\n  \"kneestoelbows_bodyweight\",\n  \"lateralraise_band\",\n  \"lateralraise_cable\",\n  \"lateralraise_dumbbell\",\n  \"lateralraise_kettlebell\",\n  \"lateralraise_leveragemachine\",\n  \"latpulldown_cable\",\n  \"latpulldown_leveragemachine\",\n  \"legextension_band\",\n  \"legextension_leveragemachine\",\n  \"legpress_leveragemachine\",\n  \"legpress_smith\",\n  \"legsupbenchpress_barbell\",\n  \"lunge_barbell\",\n  \"lunge_bodyweight\",\n  \"lunge_cable\",\n  \"lunge_dumbbell\",\n  \"lyingbicepcurl_cable\",\n  \"lyingbicepcurl_dumbbell\",\n  \"lyinglegcurl_band\",\n  \"lyinglegcurl_leveragemachine\",\n  \"muscleup_bodyweight\",\n  \"obliquecrunch_bodyweight\",\n  \"overheadpress_barbell\",\n  \"overheadpress_dumbbell\",\n  \"overheadpress_ezbar\",\n  \"overheadsquat_barbell\",\n  \"overheadsquat_dumbbell\",\n  \"pecdeck_leveragemachine\",\n  \"pendlayrow_barbell\",\n  \"pistolsquat_bodyweight\",\n  \"pistolsquat_kettlebell\",\n  \"pistolsquat_leveragemachine\",\n  \"plank_bodyweight\",\n  \"preachercurl_barbell\",\n  \"preachercurl_dumbbell\",\n  \"preachercurl_ezbar\",\n  \"preachercurl_leveragemachine\",\n  \"pullover_barbell\",\n  \"pullover_dumbbell\",\n  \"pullup_band\",\n  \"pullup_bodyweight\",\n  \"pullup_leveragemachine\",\n  \"pushpress_barbell\",\n  \"pushpress_bodyweight\",\n  \"pushpress_dumbbell\",\n  \"pushpress_kettlebell\",\n  \"pushup_band\",\n  \"pushup_bodyweight\",\n  \"reversecrunch_bodyweight\",\n  \"reversecrunch_cable\",\n  \"reversecurl_band\",\n  \"reversecurl_barbell\",\n  \"reversecurl_cable\",\n  \"reversecurl_dumbbell\",\n  \"reversefly_band\",\n  \"reversefly_dumbbell\",\n  \"reversefly_leveragemachine\",\n  \"reversehyperextension_band\",\n  \"reversehyperextension_leveragemachine\",\n  \"reverselunge_barbell\",\n  \"reverselunge_bodyweight\",\n  \"reverselunge_dumbbell\",\n  \"reverselunge_kettlebell\",\n  \"reversewristcurl_barbell\",\n  \"reversewristcurl_dumbbell\",\n  \"reversewristcurl_ezbar\",\n  \"romaniandeadlift_barbell\",\n  \"romaniandeadlift_dumbbell\",\n  \"russiantwist_bodyweight\",\n  \"russiantwist_cable\",\n  \"russiantwist_dumbbell\",\n  \"safetysquatbarsquat_barbell\",\n  \"seatedcalfraise_barbell\",\n  \"seatedcalfraise_dumbbell\",\n  \"seatedcalfraise_leveragemachine\",\n  \"seatedfrontraise_barbell\",\n  \"seatedfrontraise_dumbbell\",\n  \"seatedlegcurl_leveragemachine\",\n  \"seatedlegpress_leveragemachine\",\n  \"seatedoverheadpress_barbell\",\n  \"seatedpalmsupwristcurl_dumbbell\",\n  \"seatedrow_band\",\n  \"seatedrow_cable\",\n  \"seatedrow_leveragemachine\",\n  \"seatedwidegriprow_cable\",\n  \"shoulderpress_band\",\n  \"shoulderpress_cable\",\n  \"shoulderpress_dumbbell\",\n  \"shoulderpress_leveragemachine\",\n  \"shoulderpress_smith\",\n  \"shoulderpressparallelgrip_dumbbell\",\n  \"shrug_band\",\n  \"shrug_barbell\",\n  \"shrug_cable\",\n  \"shrug_dumbbell\",\n  \"shrug_leveragemachine\",\n  \"shrug_smith\",\n  \"sidebend_band\",\n  \"sidebend_cable\",\n  \"sidebend_dumbbell\",\n  \"sidecrunch_band\",\n  \"sidecrunch_bodyweight\",\n  \"sidecrunch_cable\",\n  \"sidehipabductor_barbell\",\n  \"sidehipabductor_bodyweight\",\n  \"sidehipabductor_leveragemachine\",\n  \"sidelyingclam_bodyweight\",\n  \"sideplank_bodyweight\",\n  \"singlelegbridge_bodyweight\",\n  \"singlelegdeadlift_bodyweight\",\n  \"singlelegdeadlift_dumbbell\",\n  \"singlelegglutebridgebench_bodyweight\",\n  \"singlelegglutebridgebentknee_bodyweight\",\n  \"singlelegglutebridgestraight_bodyweight\",\n  \"singleleghipthrust_barbell\",\n  \"singleleghipthrust_bodyweight\",\n  \"singleleghipthrust_leveragemachine\",\n  \"sissysquat_bodyweight\",\n  \"situp_bodyweight\",\n  \"situp_kettlebell\",\n  \"skullcrusher_barbell\",\n  \"skullcrusher_cable\",\n  \"skullcrusher_dumbbell\",\n  \"skullcrusher_ezbar\",\n  \"snatch_dumbbell\",\n  \"splitsquat_band\",\n  \"splitsquat_barbell\",\n  \"splitsquat_bodyweight\",\n  \"splitsquat_dumbbell\",\n  \"splitsquat_kettlebell\",\n  \"squat_barbell\",\n  \"squat_bodyweight\",\n  \"squat_dumbbell\",\n  \"squat_leveragemachine\",\n  \"squat_smith\",\n  \"squatrow_band\",\n  \"standingcalfraise_barbell\",\n  \"standingcalfraise_bodyweight\",\n  \"standingcalfraise_cable\",\n  \"standingcalfraise_dumbbell\",\n  \"standingcalfraise_leveragemachine\",\n  \"standingrow_cable\",\n  \"standingrowclosegrip_cable\",\n  \"standingrowreardeltwithrope_cable\",\n  \"standingrowrearhorizontaldeltwithrope_cable\",\n  \"standingrowvbar_cable\",\n  \"stepup_band\",\n  \"stepup_barbell\",\n  \"stepup_bodyweight\",\n  \"stepup_dumbbell\",\n  \"stifflegdeadlift_band\",\n  \"stifflegdeadlift_barbell\",\n  \"stifflegdeadlift_dumbbell\",\n  \"straightlegdeadlift_band\",\n  \"straightlegdeadlift_barbell\",\n  \"straightlegdeadlift_dumbbell\",\n  \"straightlegdeadlift_kettlebell\",\n  \"sumodeadlift_barbell\",\n  \"sumodeadlifthighpull_barbell\",\n  \"superman_bodyweight\",\n  \"superman_dumbbell\",\n  \"tbarrow_leveragemachine\",\n  \"thruster_barbell\",\n  \"toestobar_bodyweight\",\n  \"trapbardeadlift_trapbar\",\n  \"tricepsdip_bodyweight\",\n  \"tricepsdip_leveragemachine\",\n  \"tricepsextension_band\",\n  \"tricepsextension_barbell\",\n  \"tricepsextension_cable\",\n  \"tricepsextension_dumbbell\",\n  \"tricepspushdown_cable\",\n  \"uprightrow_band\",\n  \"uprightrow_barbell\",\n  \"uprightrow_cable\",\n  \"uprightrow_dumbbell\",\n  \"vup_band\",\n  \"vup_bodyweight\",\n  \"vup_dumbbell\",\n  \"widepullup_bodyweight\",\n  \"wristcurl_barbell\",\n  \"wristcurl_dumbbell\",\n  \"wristcurl_ezbar\",\n  \"wristroller_bodyweight\",\n  \"zerchersquat_barbell\",\n  \"wallpushup_bodyweight\",\n  \"inclinepushup_bodyweight\",\n  \"kneepushup_bodyweight\",\n  \"diamondpushup_bodyweight\",\n  \"pseudoplanchepushup_bodyweight\",\n  \"pikepushup_bodyweight\",\n  \"ringdip_bodyweight\",\n  \"negativedip_bodyweight\",\n  \"verticalrow_bodyweight\",\n  \"widerow_bodyweight\",\n  \"ringrow_bodyweight\",\n  \"tuckfrontleverrow_bodyweight\",\n  \"frontleverrow_bodyweight\",\n  \"scapularpullup_bodyweight\",\n  \"deadhang_bodyweight\",\n  \"negativepullup_bodyweight\",\n  \"assistedsquat_bodyweight\",\n  \"shrimpsquat_bodyweight\",\n  \"nordiccurl_bodyweight\",\n  \"handstand_bodyweight\",\n  \"wallhandstand_bodyweight\",\n  \"crowpose_bodyweight\",\n  \"dragonflag_bodyweight\",\n  \"copenhagenplank_bodyweight\",\n  \"hangingkneeraise_bodyweight\",\n  \"archhang_bodyweight\",\n  \"supporthold_bodyweight\",\n  \"pallofpress_band\",\n  \"renegaderow_dumbbell\",\n  \"romaniandeadlift_bodyweight\",\n  \"bulgariansplitsquat_bodyweight\",\n  \"nordiccurl_band\",\n  \"inclinerow_bodyweight\",\n  \"reversehyperextension_bodyweight\",\n  \"ringabrollout_bodyweight\",\n  \"kneelingringabrollout_bodyweight\",\n  \"archerpullup_bodyweight\",\n  \"skinthecat_bodyweight\",\n  \"hollowbodyhold_bodyweight\",\n  \"deadbug_bodyweight\",\n  \"shoulderpassthrough_band\",\n]);\n\nexport function ExerciseImageUtils_id(type: IExerciseType): string {\n  const equipment = type.equipment || \"bodyweight\";\n  return `${type.id.toLowerCase()}_${(equipment || \"bodyweight\").toLowerCase()}`;\n}\n\nexport function ExerciseImageUtils_exists(type: IExerciseType, size: \"small\" | \"large\"): boolean {\n  return size === \"small\"\n    ? availableSmallImages.has(ExerciseImageUtils_id(type))\n    : availableLargeImages.has(ExerciseImageUtils_id(type));\n}\n\nexport function ExerciseImageUtils_existsCustom(\n  type: IExerciseType,\n  size: \"small\" | \"large\",\n  checkDomain: boolean,\n  settings?: ISettings\n): boolean {\n  const customExercise = settings?.exercises?.[type.id];\n  const imageUrl =\n    size === \"small\" ? customExercise?.smallImageUrl : (customExercise?.largeImageUrl ?? customExercise?.smallImageUrl);\n  return checkDomain ? !!(imageUrl?.startsWith(\"/\") || imageUrl?.includes(\"liftosaur.com\")) : !!imageUrl;\n}\n\nexport function ExerciseImageUtils_ogImageUrl(type: IExerciseType): string {\n  const key = Exercise_toUrlSlug(type);\n  return `/externalimages/exercises/ogimages/${key}.png`;\n}\n\nexport function ExerciseImageUtils_url(\n  type: IExerciseType,\n  size: \"small\" | \"large\",\n  settings?: ISettings\n): string | undefined {\n  if (ExerciseImageUtils_exists(type, size)) {\n    const src =\n      size === \"large\"\n        ? `/externalimages/exercises/full/large/${ExerciseImageUtils_id(type)}_full_large.png`\n        : `/externalimages/exercises/single/small/${ExerciseImageUtils_id(type)}_single_small.png`;\n    return src;\n  } else if (ExerciseImageUtils_existsCustom(type, size, false, settings)) {\n    const customExercise = settings?.exercises?.[type.id];\n    return size === \"large\"\n      ? (customExercise?.largeImageUrl ?? customExercise?.smallImageUrl)\n      : customExercise?.smallImageUrl;\n  } else {\n    return undefined;\n  }\n}\n","import {\n  IProgramExerciseSharedEdit,\n  IProgramExerciseSharedSection,\n  ProgramExerciseText_compose,\n  ProgramExerciseText_split,\n} from \"./programExerciseText\";\n\n// What the editor sheet will save, kept apart from whatever text the editor happens to be\n// mounted with. The two used to be the same value, which stopped being true once showing the\n// shared sections started remounting the editor with recomposed text: that text is derived from\n// a possibly-dirty draft, so measuring \"has anything changed\" against it always said no.\n//\n// The draft carries its own baselines — `originalLocalBlurb` and `baseline` are both captured\n// when the sheet opens and never move. Nothing that answers \"did this change?\" takes them as an\n// argument, so no caller can supply a different one and get a different answer.\nexport interface IExerciseLiftoEditorDraft {\n  // \"Blurb\" is the unit this sheet edits: the exercise's own line plus the `//` description\n  // lines above it that the evaluator attaches to it. \"Local\" is the other axis — this\n  // declaration's own text, as opposed to the shared properties below, which are written on\n  // another day's line and only spliced in on request.\n  originalLocalBlurb: string;\n  localBlurb: string;\n  // The shared sections as they were when the sheet opened.\n  baseline: IProgramExerciseSharedSection[];\n  // Only properties whose text actually differs from `baseline`. An untouched property is\n  // absent, so it can never be written back over a value someone else changed meanwhile.\n  sharedEdits: Record<string, string>;\n}\n\nexport function ExerciseLiftoEditorDraft_create(\n  originalLocalBlurb: string,\n  baseline: IProgramExerciseSharedSection[]\n): IExerciseLiftoEditorDraft {\n  return { originalLocalBlurb, localBlurb: originalLocalBlurb, baseline, sharedEdits: {} };\n}\n\n// Folds the editor's current document in. Shared sections that aren't in the text are hidden,\n// not deleted, so they keep whatever the draft already recorded. A section edited back to its\n// baseline drops out again, which is what lets the sheet go clean.\nexport function ExerciseLiftoEditorDraft_fromEditor(\n  draft: IExerciseLiftoEditorDraft,\n  text: string\n): IExerciseLiftoEditorDraft {\n  const split = ProgramExerciseText_split(text, draft.baseline);\n  const sharedEdits = { ...draft.sharedEdits };\n  for (const edit of split.sharedEdits) {\n    const original = draft.baseline.find((section) => section.property === edit.property);\n    if (original != null && edit.text === original.text) {\n      delete sharedEdits[edit.property];\n    } else {\n      sharedEdits[edit.property] = edit.text;\n    }\n  }\n  return { ...draft, localBlurb: split.localBlurb, sharedEdits };\n}\n\nexport function ExerciseLiftoEditorDraft_isDirty(draft: IExerciseLiftoEditorDraft): boolean {\n  return draft.localBlurb.trim() !== draft.originalLocalBlurb.trim() || Object.keys(draft.sharedEdits).length > 0;\n}\n\n// Everything the sheet will write, in one place — validation and save both go through this, so\n// there is no second expression of \"what will be saved\" to drift out of step with the first.\n//\n// `shared` decides only *where* each edit goes, never *whether* there is one: the save path\n// passes a freshly resolved set so edits land on the lines that declare the property now.\nexport function ExerciseLiftoEditorDraft_pendingChange(\n  draft: IExerciseLiftoEditorDraft,\n  shared: IProgramExerciseSharedSection[]\n): { localBlurb: string; sharedEdits: IProgramExerciseSharedEdit[] } {\n  const sharedEdits: IProgramExerciseSharedEdit[] = [];\n  for (const section of shared) {\n    const edited = draft.sharedEdits[section.property];\n    if (edited != null) {\n      sharedEdits.push({ property: section.property, owners: section.owners, text: edited });\n    }\n  }\n  return { localBlurb: draft.localBlurb, sharedEdits };\n}\n\n// The text a fresh editor mount should start from, which is the draft rendered for the current\n// visibility — never a baseline for anything.\nexport function ExerciseLiftoEditorDraft_mountText(draft: IExerciseLiftoEditorDraft, isSharedVisible: boolean): string {\n  return isSharedVisible\n    ? ProgramExerciseText_compose(\n        draft.localBlurb,\n        draft.baseline.map((section) => ({ text: draft.sharedEdits[section.property] ?? section.text }))\n      )\n    : draft.localBlurb.trimEnd();\n}\n","import { ILensRecordingPayload, lb } from \"lens-shmens\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { IState } from \"./state\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport {\n  IEvaluatedProgram,\n  Program_evaluate,\n  Program_evaluateCachedPlanner,\n  Program_getAllProgramExercises,\n} from \"./program\";\nimport {\n  ExerciseLiftoEditorDraft_isDirty,\n  ExerciseLiftoEditorDraft_pendingChange,\n  IExerciseLiftoEditorDraft,\n} from \"./exerciseLiftoEditorDraft\";\nimport { IProgramExerciseSharedEdit, ProgramExerciseText_apply } from \"./programExerciseText\";\nimport {\n  IProgramExerciseSwap,\n  IProgramExerciseSwapScope,\n  IProgramExerciseWorkoutRemap,\n  ProgramExerciseSwap_scope,\n  ProgramExerciseSwap_workoutRemap,\n} from \"./programExerciseSwap\";\nimport { ProgramRewrite_changedKeys } from \"./programRewrite\";\nimport { Progress_lbProgress, Progress_remapProgramExerciseId } from \"./progress\";\nimport { CollectionUtils_setBy } from \"../utils/collection\";\nimport {\n  ExerciseDraftToProgram_snapshot,\n  IExerciseDraftToProgramProgram,\n  IExerciseDraftToProgramTarget,\n} from \"./exerciseDraftToProgram\";\n\nexport interface IExerciseLiftoEditorSaveInput {\n  program: IExerciseDraftToProgramProgram | undefined;\n  target: IExerciseDraftToProgramTarget | undefined;\n  draft: IExerciseLiftoEditorDraft;\n  hasPendingPlanner: boolean;\n  isFromWorkout: boolean;\n  hasEditorDraft: boolean;\n  progress: IHistoryRecord | undefined;\n  cachedScope: IProgramExerciseSwapScope | undefined;\n  settings: ISettings;\n  detectSwap: (localBlurb: string, declaration: IPlannerProgramExercise) => IProgramExerciseSwap | undefined;\n}\n\nexport interface IExerciseLiftoEditorSavePrepared {\n  program: IExerciseDraftToProgramProgram;\n  saveEvaluated: IEvaluatedProgram;\n  declaration: IPlannerProgramExercise;\n  localBlurb: string;\n  sharedEdits: IProgramExerciseSharedEdit[];\n  swap: IProgramExerciseSwap | undefined;\n  isFromWorkout: boolean;\n  hasEditorDraft: boolean;\n  progress: IHistoryRecord | undefined;\n  settings: ISettings;\n}\n\nexport interface IExerciseLiftoEditorSavePlan {\n  updatedProgram: IExerciseDraftToProgramProgram;\n  destination: \"storage\" | \"editorDraft\";\n  mirrorToEditorDraft: boolean;\n  remap: (IProgramExerciseWorkoutRemap & { question: string }) | undefined;\n  labelNotice: string | undefined;\n  description: string;\n}\n\nexport type IExerciseLiftoEditorSaveDecision =\n  | { kind: \"close\" }\n  | { kind: \"alert\"; message: string; closes: boolean }\n  | { kind: \"askScope\"; declarations: number; prepared: IExerciseLiftoEditorSavePrepared }\n  | { kind: \"write\"; plan: IExerciseLiftoEditorSavePlan };\n\nexport function ExerciseLiftoEditorSave_decide(input: IExerciseLiftoEditorSaveInput): IExerciseLiftoEditorSaveDecision {\n  if (!ExerciseLiftoEditorDraft_isDirty(input.draft) && !input.hasPendingPlanner) {\n    return { kind: \"close\" };\n  }\n  // The program can be deleted, or removed by a sync, between the sheet opening and Save, and\n  // writing this copy back would recreate it.\n  if (input.program == null) {\n    return {\n      kind: \"alert\",\n      message: \"Couldn't find this program anymore, so the changes weren't saved.\",\n      closes: true,\n    };\n  }\n  // Resolved on the program about to be written, not on a render's copy: a stacked sheet may\n  // have moved which day declares the exercise or one of its shared sections. The sheet stays up\n  // when it is gone: there is unsaved text on screen, and dismissing it is the one outcome that\n  // loses it for good.\n  const snapshot =\n    input.target != null ? ExerciseDraftToProgram_snapshot(input.program, input.target, input.settings) : undefined;\n  if (snapshot == null) {\n    return {\n      kind: \"alert\",\n      message:\n        \"This exercise was changed somewhere else while you were editing it, so your changes weren't saved. Copy anything you want to keep, then close and reopen it.\",\n      closes: false,\n    };\n  }\n  const saveEvaluated = Program_evaluateCachedPlanner(input.program, input.settings);\n  const declaration = snapshot.declaration;\n  const pending = ExerciseLiftoEditorDraft_pendingChange(input.draft, snapshot.sharedSections);\n  const localBlurb = pending.localBlurb.trim();\n  if (localBlurb === \"\") {\n    return {\n      kind: \"alert\",\n      message: \"The exercise text is empty. Delete the exercise from the program screen instead.\",\n      closes: false,\n    };\n  }\n  const swap = input.detectSwap(localBlurb, declaration);\n  const prepared: IExerciseLiftoEditorSavePrepared = {\n    program: input.program,\n    saveEvaluated,\n    declaration,\n    localBlurb,\n    sharedEdits: pending.sharedEdits,\n    swap,\n    isFromWorkout: input.isFromWorkout,\n    hasEditorDraft: input.hasEditorDraft,\n    progress: input.progress,\n    settings: input.settings,\n  };\n  if (swap == null) {\n    return ExerciseLiftoEditorSave_withScope(prepared, \"all\");\n  }\n  const declarations = Math.max(snapshot.instances.length, 1);\n  const scope = ProgramExerciseSwap_scope(swap.isLadder, declarations, input.cachedScope);\n  if (scope === \"ask\") {\n    return { kind: \"askScope\", declarations, prepared };\n  }\n  return ExerciseLiftoEditorSave_withScope(prepared, scope);\n}\n\nexport type IExerciseLiftoEditorSaveScoped = Exclude<IExerciseLiftoEditorSaveDecision, { kind: \"askScope\" }>;\n\nexport function ExerciseLiftoEditorSave_withScope(\n  prepared: IExerciseLiftoEditorSavePrepared,\n  scope: IProgramExerciseSwapScope\n): IExerciseLiftoEditorSaveScoped {\n  const { program, declaration, swap, settings } = prepared;\n  const applied = ProgramExerciseText_apply(\n    program.planner,\n    declaration,\n    prepared.localBlurb,\n    prepared.sharedEdits,\n    swap,\n    scope,\n    settings\n  );\n  if (\"error\" in applied) {\n    return { kind: \"alert\", message: applied.error.message, closes: false };\n  }\n  const updatedProgram = { ...program, planner: applied.planner };\n  const newKey =\n    swap != null ? ProgramRewrite_changedKeys(program.planner, applied.planner, settings)[declaration.key] : undefined;\n  const updatedExercises =\n    swap != null && newKey != null ? Program_getAllProgramExercises(Program_evaluate(updatedProgram, settings)) : [];\n  const staysDraft = !prepared.isFromWorkout && prepared.hasEditorDraft;\n  const remap = staysDraft\n    ? undefined\n    : ProgramExerciseSwap_workoutRemap(\n        prepared.progress,\n        updatedProgram.id,\n        Program_getAllProgramExercises(prepared.saveEvaluated),\n        updatedExercises,\n        declaration.key,\n        newKey\n      );\n  const label =\n    swap != null && newKey != null && newKey !== swap.newKey\n      ? updatedExercises.find((e) => e.key === newKey)?.label\n      : undefined;\n  return {\n    kind: \"write\",\n    plan: {\n      updatedProgram,\n      destination: staysDraft ? \"editorDraft\" : \"storage\",\n      mirrorToEditorDraft: !staysDraft && prepared.hasEditorDraft,\n      remap:\n        remap != null\n          ? {\n              ...remap,\n              question: `You've already logged sets for ${declaration.name} in this workout. Switch them to ${\n                swap?.newFullName ?? \"the new exercise\"\n              } too?`,\n            }\n          : undefined,\n      labelNotice:\n        label != null && swap != null\n          ? `This program already has a ${swap.newFullName} somewhere else, so this one is labelled \"${label}\" to keep the two apart.`\n          : undefined,\n      description: staysDraft ? \"Update program from edit exercise\" : \"Save program changes\",\n    },\n  };\n}\n\nexport function ExerciseLiftoEditorSave_lenses(\n  plan: IExerciseLiftoEditorSavePlan,\n  remapAccepted: boolean\n): ILensRecordingPayload<IState>[] {\n  const program = plan.updatedProgram;\n  const editorDraftLens = lb<IState>().p(\"editProgramStates\").p(program.id).p(\"current\").p(\"program\").record(program);\n  if (plan.destination === \"editorDraft\") {\n    return [editorDraftLens];\n  }\n  const lenses: ILensRecordingPayload<IState>[] = [\n    lb<IState>()\n      .p(\"storage\")\n      .p(\"programs\")\n      .recordModify((programs) => CollectionUtils_setBy(programs, \"id\", program.id, program)),\n  ];\n  if (plan.mirrorToEditorDraft) {\n    lenses.push(editorDraftLens);\n  }\n  const remap = plan.remap;\n  if (remap != null && remapAccepted) {\n    lenses.push(\n      Progress_lbProgress(0).recordModify((p) => Progress_remapProgramExerciseId(p, remap.oldKey, remap.newKey))\n    );\n  }\n  return lenses;\n}\n","import { IStats, IUnit, IWeight } from \"../types\";\nimport { Food_entries, Food_entryTotals, Food_localDate, Food_shiftDate } from \"./food\";\n\n// Adaptive TDEE, in the spirit of MacroFactor: over a trailing window, energy out = average intake minus\n// the energy that went into (or came out of) body mass. The weight change is the least-squares slope of the\n// weigh-ins, so one salty dinner moves it far less than comparing the first and last weigh-in would.\n//\n// Days with no food entries count as \"not logged\" and drop out of the intake average; they don't count as 0.\n\nexport const Expenditure_kcalPerKg = 7700;\nexport const Expenditure_windowDays = 28;\nexport const Expenditure_minLoggedDays = 10;\nexport const Expenditure_minWeighIns = 4;\nexport const Expenditure_minWeighInSpanDays = 10;\n\nconst kgPerLb = 0.45359237;\n\n// Weight_convertTo rounds to the nearest 0.5 like a plate loader, which would swamp a weekly trend.\nexport function Expenditure_toKg(weight: IWeight): number {\n  return weight.unit === \"kg\" ? weight.value : weight.value * kgPerLb;\n}\n\nexport function Expenditure_fromKg(kg: number, unit: IUnit): number {\n  return unit === \"kg\" ? kg : kg / kgPerLb;\n}\n\nexport interface IExpenditureInputs {\n  // Logged kcal per local day, only for days with entries.\n  intake: Partial<Record<string, number>>;\n  // Average weigh-in in kg per local day.\n  weightsKg: Partial<Record<string, number>>;\n}\n\nexport interface IExpenditureEstimate {\n  endDate: string;\n  startDate: string;\n  tdee: number;\n  averageIntake: number;\n  loggedDays: number;\n  weighIns: number;\n  weightChangeKgPerWeek: number;\n}\n\nexport interface IExpenditureStatus {\n  estimate?: IExpenditureEstimate;\n  // What is still missing when there's no estimate, counted inside the current window.\n  loggedDays: number;\n  weighIns: number;\n  weighInSpanDays: number;\n}\n\nexport function Expenditure_inputs(stats: IStats): IExpenditureInputs {\n  const intake: Partial<Record<string, number>> = {};\n  for (const entry of Food_entries(stats)) {\n    intake[entry.value.date] = (intake[entry.value.date] ?? 0) + Food_entryTotals(entry.value).calories;\n  }\n  const sums: Partial<Record<string, { total: number; count: number }>> = {};\n  for (const w of stats.weight.weight || []) {\n    const date = Food_localDate(w.timestamp);\n    const kg = Expenditure_toKg(w.value);\n    const sum = sums[date] ?? { total: 0, count: 0 };\n    sums[date] = { total: sum.total + kg, count: sum.count + 1 };\n  }\n  const weightsKg: Partial<Record<string, number>> = {};\n  for (const date of Object.keys(sums)) {\n    const sum = sums[date]!;\n    weightsKg[date] = sum.total / sum.count;\n  }\n  return { intake, weightsKg };\n}\n\nfunction dayIndex(date: string): number {\n  const [y, m, d] = date.split(\"-\").map(Number);\n  return Math.round(Date.UTC(y, m - 1, d) / 86400000);\n}\n\nfunction slope(points: [number, number][]): number {\n  const n = points.length;\n  const meanX = points.reduce((memo, p) => memo + p[0], 0) / n;\n  const meanY = points.reduce((memo, p) => memo + p[1], 0) / n;\n  let num = 0;\n  let den = 0;\n  for (const [x, y] of points) {\n    num += (x - meanX) * (y - meanY);\n    den += (x - meanX) * (x - meanX);\n  }\n  return den === 0 ? 0 : num / den;\n}\n\n// The window ends on `endDate` and starts at the later of 28 days back and the first logged day in it,\n// so a new user's window grows from their first log instead of averaging weight over unlogged weeks.\nexport function Expenditure_estimate(inputs: IExpenditureInputs, endDate: string): IExpenditureStatus {\n  const windowStart = Food_shiftDate(endDate, -(Expenditure_windowDays - 1));\n  const dates: string[] = [];\n  for (let d = windowStart; d <= endDate; d = Food_shiftDate(d, 1)) {\n    dates.push(d);\n  }\n  const firstLogged = dates.find((d) => inputs.intake[d] != null);\n  const window = firstLogged ? dates.filter((d) => d >= firstLogged) : [];\n  const logged = window.filter((d) => inputs.intake[d] != null);\n  const weighIns = window.filter((d) => inputs.weightsKg[d] != null);\n  const weighInSpanDays = weighIns.length > 1 ? dayIndex(weighIns[weighIns.length - 1]) - dayIndex(weighIns[0]) : 0;\n  const status = { loggedDays: logged.length, weighIns: weighIns.length, weighInSpanDays };\n  if (\n    logged.length < Expenditure_minLoggedDays ||\n    weighIns.length < Expenditure_minWeighIns ||\n    weighInSpanDays < Expenditure_minWeighInSpanDays\n  ) {\n    return status;\n  }\n  const averageIntake = logged.reduce((memo, d) => memo + inputs.intake[d]!, 0) / logged.length;\n  const kgPerDay = slope(weighIns.map((d) => [dayIndex(d), inputs.weightsKg[d]!]));\n  return {\n    ...status,\n    estimate: {\n      startDate: window[0],\n      endDate,\n      tdee: Math.round(averageIntake - kgPerDay * Expenditure_kcalPerKg),\n      averageIntake: Math.round(averageIntake),\n      loggedDays: logged.length,\n      weighIns: weighIns.length,\n      weightChangeKgPerWeek: Math.round(kgPerDay * 7 * 100) / 100,\n    },\n  };\n}\n\n// Today's intake is still growing, so the current estimate ends yesterday.\nexport function Expenditure_current(stats: IStats, now: number): IExpenditureStatus {\n  return Expenditure_estimate(Expenditure_inputs(stats), Food_shiftDate(Food_localDate(now), -1));\n}\n\n// One estimate per day that has one, for graphing how the estimate moved.\nexport function Expenditure_series(\n  inputs: IExpenditureInputs,\n  startDate: string,\n  endDate: string\n): IExpenditureEstimate[] {\n  const result: IExpenditureEstimate[] = [];\n  for (let d = startDate; d <= endDate; d = Food_shiftDate(d, 1)) {\n    const estimate = Expenditure_estimate(inputs, d).estimate;\n    if (estimate) {\n      result.push(estimate);\n    }\n  }\n  return result;\n}\n","import {\n  foodMeals,\n  IFoodEntryValue,\n  IFoodIngredient,\n  IFoodItem,\n  IFoodMeal,\n  IFoodSource,\n  IMealTemplate,\n  IMealTemplateItem,\n  INutrients,\n  INutritionGoals,\n  IStats,\n  IStatsFoodEntry,\n  IStatsWaterEntry,\n} from \"../types\";\nimport {\n  FoodSearch_gramLabel,\n  FoodSearch_labelServings,\n  FoodSearch_sameBarcode,\n  IFoodDataIssues,\n  IFoodSearchResult,\n  IFoodServingOption,\n} from \"./foodSearch\";\n\nexport interface IFoodMealSummary {\n  meal: IFoodMeal;\n  entries: IStatsFoodEntry[];\n  totals: INutrients;\n}\n\nexport interface IFoodDaySummary {\n  date: string;\n  totals: INutrients;\n  meals: IFoodMealSummary[];\n}\n\nexport type IFoodMacroKey = \"calories\" | \"protein\" | \"carbs\" | \"fat\" | \"fiber\";\n\nexport interface IFoodRemaining {\n  key: IFoodMacroKey;\n  goal: number;\n  eaten: number;\n  remaining: number;\n}\n\nexport const Food_emptyNutrients: INutrients = { calories: 0, protein: 0, carbs: 0, fat: 0, fiber: 0 };\n\nexport const Food_mealNames: Record<IFoodMeal, string> = {\n  breakfast: \"Breakfast\",\n  lunch: \"Lunch\",\n  dinner: \"Dinner\",\n  snack: \"Snacks\",\n};\n\nexport function Food_scaleNutrients(nutrients: INutrients, factor: number): INutrients {\n  return {\n    calories: nutrients.calories * factor,\n    protein: nutrients.protein * factor,\n    carbs: nutrients.carbs * factor,\n    fat: nutrients.fat * factor,\n    fiber: (nutrients.fiber ?? 0) * factor,\n  };\n}\n\nexport function Food_sumNutrients(list: INutrients[]): INutrients {\n  return list.reduce<INutrients>(\n    (memo, n) => ({\n      calories: memo.calories + n.calories,\n      protein: memo.protein + n.protein,\n      carbs: memo.carbs + n.carbs,\n      fat: memo.fat + n.fat,\n      fiber: (memo.fiber ?? 0) + (n.fiber ?? 0),\n    }),\n    { ...Food_emptyNutrients }\n  );\n}\n\nexport function Food_entryTotals(entry: IFoodEntryValue): INutrients {\n  return Food_scaleNutrients(entry.perServing, entry.servings);\n}\n\nexport function Food_localDate(timestamp: number): string {\n  const d = new Date(timestamp);\n  const pad = (n: number): string => `${n}`.padStart(2, \"0\");\n  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport function Food_shiftDate(date: string, days: number): string {\n  const [year, month, day] = date.split(\"-\").map(Number);\n  return Food_localDate(new Date(year, month - 1, day + days, 12).getTime());\n}\n\nexport function Food_defaultMeal(hour: number): IFoodMeal {\n  if (hour < 11) {\n    return \"breakfast\";\n  } else if (hour < 15) {\n    return \"lunch\";\n  } else if (hour >= 17 && hour < 22) {\n    return \"dinner\";\n  }\n  return \"snack\";\n}\n\nexport function Food_entries(stats: IStats): IStatsFoodEntry[] {\n  return stats.food?.entries || [];\n}\n\nexport function Food_daySummary(stats: IStats, date: string): IFoodDaySummary {\n  const dayEntries = Food_entries(stats)\n    .filter((e) => e.value.date === date)\n    .sort((a, b) => a.timestamp - b.timestamp);\n  const meals = foodMeals.map((meal) => {\n    const entries = dayEntries.filter((e) => e.value.meal === meal);\n    return { meal, entries, totals: Food_sumNutrients(entries.map((e) => Food_entryTotals(e.value))) };\n  });\n  return { date, meals, totals: Food_sumNutrients(meals.map((m) => m.totals)) };\n}\n\nexport function Food_remaining(goals: INutritionGoals | undefined, totals: INutrients): IFoodRemaining[] {\n  const keys: IFoodMacroKey[] = [\"calories\", \"protein\", \"carbs\", \"fat\", \"fiber\"];\n  return keys.flatMap((key) => {\n    const goal = goals?.[key];\n    if (goal == null || goal <= 0) {\n      return [];\n    }\n    const eaten = totals[key] ?? 0;\n    return [{ key, goal, eaten, remaining: goal - eaten }];\n  });\n}\n\n// Entry ids are stat timestamps, and a synced stat delete removes the row named `${timestamp}_entries`,\n// so two entries logged in the same millisecond would share a row.\nexport function Food_newTimestamp(stats: IStats, now: number): number {\n  return Food_freeTimestamp(\n    Food_entries(stats).map((e) => e.timestamp),\n    now\n  );\n}\n\nexport function Food_freeTimestamp(timestamps: number[], now: number): number {\n  const taken = new Set(timestamps);\n  let ts = now;\n  while (taken.has(ts)) {\n    ts += 1;\n  }\n  return ts;\n}\n\nfunction recentKey(entry: IFoodEntryValue): string {\n  return [entry.foodId ?? \"\", entry.name.toLowerCase(), entry.brand ?? \"\", entry.servingLabel].join(\"|\");\n}\n\nexport function Food_recentEntries(stats: IStats, limit: number): IFoodEntryValue[] {\n  const seen = new Set<string>();\n  const result: IFoodEntryValue[] = [];\n  const sorted = [...Food_entries(stats)].sort((a, b) => b.timestamp - a.timestamp);\n  for (const entry of sorted) {\n    if (entry.value.source === \"quick\") {\n      continue;\n    }\n    const key = recentKey(entry.value);\n    if (!seen.has(key)) {\n      seen.add(key);\n      result.push(entry.value);\n      if (result.length >= limit) {\n        break;\n      }\n    }\n  }\n  return result;\n}\n\nexport function Food_recipePerServing(ingredients: IFoodIngredient[], recipeServings: number): INutrients {\n  const total = Food_sumNutrients(ingredients.map((i) => Food_scaleNutrients(i.perServing, i.servings)));\n  return Food_scaleNutrients(total, 1 / Math.max(recipeServings, 1));\n}\n\nexport function Food_entryFromItem(\n  item: IFoodItem,\n  args: { date: string; meal: IFoodMeal; servings?: number; grams?: number }\n): IFoodEntryValue | undefined {\n  const options = Food_selectionFromItem(item).servings;\n  const option = args.grams != null ? options.find((o) => o.label === FoodSearch_gramLabel) : options[0];\n  if (!option) {\n    return undefined;\n  }\n  return {\n    date: args.date,\n    meal: args.meal,\n    name: item.name,\n    ...(item.brand ? { brand: item.brand } : {}),\n    servings: args.grams ?? args.servings ?? 1,\n    servingLabel: option.label,\n    perServing: option.perServing,\n    source: item.source,\n    foodId: item.id,\n    ...(item.barcode ? { barcode: item.barcode } : {}),\n  };\n}\n\nexport function Food_recipeItem(args: {\n  existing?: IFoodItem;\n  id: string;\n  name: string;\n  ingredients: IFoodIngredient[];\n  recipeServings: number;\n  now: number;\n}): IFoodItem | undefined {\n  const { existing } = args;\n  const name = args.name.trim();\n  if (!name || args.ingredients.length === 0) {\n    return undefined;\n  }\n  return {\n    vtype: \"food_item\",\n    id: existing?.id ?? args.id,\n    name,\n    servingLabel: \"1 serving\",\n    perServing: Food_recipePerServing(args.ingredients, args.recipeServings),\n    source: \"recipe\",\n    ...(existing?.sourceId ? { sourceId: existing.sourceId } : {}),\n    ...(existing?.barcode ? { barcode: existing.barcode } : {}),\n    ingredients: args.ingredients,\n    recipeServings: args.recipeServings,\n    createdAt: existing?.createdAt ?? args.now,\n  };\n}\n\n// What the food picker hands back, whichever tab it came from: the food plus its serving choices.\nexport interface IFoodSelection {\n  name: string;\n  brand?: string;\n  source: IFoodSource;\n  sourceId?: string;\n  barcode?: string;\n  foodId?: string;\n  servings: IFoodServingOption[];\n  issues?: IFoodDataIssues;\n}\n\nexport function Food_selectionFromSearch(result: IFoodSearchResult): IFoodSelection {\n  return {\n    name: result.name,\n    ...(result.brand ? { brand: result.brand } : {}),\n    source: result.source,\n    sourceId: result.sourceId,\n    ...(result.barcode ? { barcode: result.barcode } : {}),\n    servings: result.servings,\n    ...(result.issues ? { issues: result.issues } : {}),\n  };\n}\n\nexport function Food_selectionFromItem(item: IFoodItem): IFoodSelection {\n  return {\n    name: item.name,\n    ...(item.brand ? { brand: item.brand } : {}),\n    source: item.source,\n    ...(item.sourceId ? { sourceId: item.sourceId } : {}),\n    ...(item.barcode ? { barcode: item.barcode } : {}),\n    foodId: item.id,\n    servings: FoodSearch_labelServings(item.servingLabel, item.servingGrams, item.perServing),\n  };\n}\n\nexport interface IFoodServingChoice {\n  optionIndex: number;\n  amountText: string;\n}\n\n// \"relog\" offers the saved copy's current numbers, logged unit first. \"edit\" keeps the entry's own\n// name and numbers selected, so an edit never re-prices history or undoes an MCP correction.\nexport function Food_selectionForEntry(\n  entry: IFoodEntryValue,\n  library: IFoodItem[],\n  mode: \"relog\" | \"edit\"\n): IFoodSelection {\n  const logged: IFoodSelection = {\n    name: entry.name,\n    ...(entry.brand ? { brand: entry.brand } : {}),\n    source: entry.source,\n    ...(entry.barcode ? { barcode: entry.barcode } : {}),\n    ...(entry.foodId ? { foodId: entry.foodId } : {}),\n    servings: [{ label: entry.servingLabel, perServing: entry.perServing }],\n  };\n  const item =\n    (entry.foodId ? library.find((i) => i.id === entry.foodId) : undefined) ??\n    (entry.barcode ? library.find((i) => FoodSearch_sameBarcode(i.barcode, entry.barcode)) : undefined);\n  if (!item) {\n    return logged;\n  }\n  const saved = Food_selectionFromItem(item);\n  const sameUnit = saved.servings.filter((s) => s.label === entry.servingLabel);\n  const otherUnits = saved.servings.filter((s) => s.label !== entry.servingLabel);\n  return mode === \"edit\"\n    ? { ...logged, servings: [...logged.servings, ...otherUnits] }\n    : { ...saved, servings: [...sameUnit, ...otherUnits] };\n}\n\nexport function Food_defaultAmount(option: IFoodServingOption): number {\n  return option.label === FoodSearch_gramLabel ? 100 : 1;\n}\n\nexport function Food_clampChoice(selection: IFoodSelection, choice: IFoodServingChoice): IFoodServingChoice {\n  const first = selection.servings[0];\n  if (choice.optionIndex < selection.servings.length || !first) {\n    return choice;\n  }\n  return { optionIndex: 0, amountText: `${Food_defaultAmount(first)}` };\n}\n\nexport function Food_entryFromSelection(\n  selection: IFoodSelection,\n  args: { optionIndex: number; amount: number; date: string; meal: IFoodMeal }\n): IFoodEntryValue {\n  const option = selection.servings[args.optionIndex] ?? selection.servings[0];\n  return {\n    date: args.date,\n    meal: args.meal,\n    name: selection.name,\n    ...(selection.brand ? { brand: selection.brand } : {}),\n    servings: args.amount,\n    servingLabel: option.label,\n    perServing: option.perServing,\n    source: selection.source,\n    ...(selection.foodId ? { foodId: selection.foodId } : {}),\n    ...(selection.barcode ? { barcode: selection.barcode } : {}),\n  };\n}\n\nexport function Food_ingredientFromSelection(\n  selection: IFoodSelection,\n  args: { optionIndex: number; amount: number }\n): IFoodIngredient {\n  const option = selection.servings[args.optionIndex] ?? selection.servings[0];\n  return {\n    name: selection.name,\n    servings: args.amount,\n    servingLabel: option.label,\n    perServing: option.perServing,\n    ...(selection.foodId ? { foodId: selection.foodId } : {}),\n  };\n}\n\n// Saving a looked-up food keeps the serving the user picked, so re-logging it later is one tap.\nexport function Food_itemFromSelection(\n  selection: IFoodSelection,\n  args: { optionIndex: number; id: string; now: number }\n): IFoodItem {\n  const option = selection.servings[args.optionIndex] ?? selection.servings[0];\n  const isGram = option.label === FoodSearch_gramLabel;\n  const servingGrams = isGram ? 100 : option.grams;\n  return {\n    vtype: \"food_item\",\n    id: args.id,\n    name: selection.name,\n    ...(selection.brand ? { brand: selection.brand } : {}),\n    servingLabel: isGram ? \"100 g\" : option.label,\n    ...(servingGrams && servingGrams > 0 ? { servingGrams } : {}),\n    perServing: isGram ? Food_scaleNutrients(option.perServing, 100) : option.perServing,\n    source: selection.source === \"quick\" ? \"custom\" : selection.source,\n    ...(selection.sourceId ? { sourceId: selection.sourceId } : {}),\n    ...(selection.barcode ? { barcode: selection.barcode } : {}),\n    createdAt: args.now,\n  };\n}\n\nexport function Food_searchLibrary(library: IFoodItem[], query: string): IFoodItem[] {\n  const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n  return library\n    .filter((item) => {\n      const haystack = `${item.name} ${item.brand ?? \"\"}`.toLowerCase();\n      return terms.every((t) => haystack.includes(t));\n    })\n    .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function Food_formatAmount(value: number): string {\n  return value >= 10 ? `${Math.round(value)}` : `${Math.round(value * 10) / 10}`;\n}\n\nexport function Food_parseNumber(text: string): number | undefined {\n  const value = Number(text.replace(\",\", \".\").trim());\n  return text.trim() !== \"\" && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\n// Copying keeps everything but the day (and the meal, when copying into a different one).\nexport function Food_copyValues(\n  entries: IStatsFoodEntry[],\n  args: { date: string; meal?: IFoodMeal }\n): IFoodEntryValue[] {\n  return [...entries]\n    .sort((a, b) => a.timestamp - b.timestamp)\n    .map((e) => ({ ...e.value, date: args.date, meal: args.meal ?? e.value.meal }));\n}\n\nfunction templateItem(value: IFoodEntryValue): IMealTemplateItem {\n  return {\n    name: value.name,\n    ...(value.brand ? { brand: value.brand } : {}),\n    servings: value.servings,\n    servingLabel: value.servingLabel,\n    perServing: value.perServing,\n    source: value.source,\n    ...(value.foodId ? { foodId: value.foodId } : {}),\n    ...(value.barcode ? { barcode: value.barcode } : {}),\n  };\n}\n\nexport function Food_templateFromEntries(\n  entries: IStatsFoodEntry[],\n  args: { id: string; name: string; meal?: IFoodMeal; now: number }\n): IMealTemplate {\n  return {\n    vtype: \"meal_template\",\n    id: args.id,\n    name: args.name,\n    ...(args.meal ? { meal: args.meal } : {}),\n    items: [...entries].sort((a, b) => a.timestamp - b.timestamp).map((e) => templateItem(e.value)),\n    createdAt: args.now,\n  };\n}\n\nexport function Food_entriesFromTemplate(\n  template: IMealTemplate,\n  args: { date: string; meal: IFoodMeal }\n): IFoodEntryValue[] {\n  return template.items.map((item) => ({ ...item, date: args.date, meal: args.meal }));\n}\n\nexport function Food_templateTotals(template: IMealTemplate): INutrients {\n  return Food_sumNutrients(template.items.map((i) => Food_scaleNutrients(i.perServing, i.servings)));\n}\n\n// Templates saved for this meal come first, then the rest by name.\nexport function Food_sortTemplates(templates: IMealTemplate[], meal: IFoodMeal): IMealTemplate[] {\n  return [...templates].sort((a, b) => {\n    const am = a.meal === meal ? 0 : 1;\n    const bm = b.meal === meal ? 0 : 1;\n    return am !== bm ? am - bm : a.name.localeCompare(b.name);\n  });\n}\n\nexport function Food_waterEntries(stats: IStats, date: string): IStatsWaterEntry[] {\n  return (stats.food?.water || []).filter((w) => w.value.date === date).sort((a, b) => a.timestamp - b.timestamp);\n}\n\nexport function Food_waterTotal(stats: IStats, date: string): number {\n  return Food_waterEntries(stats, date).reduce((memo, w) => memo + w.value.ml, 0);\n}\n\nexport function Food_formatWater(ml: number): string {\n  return ml >= 1000 ? `${Math.round(ml / 100) / 10} L` : `${Math.round(ml)} ml`;\n}\n","import { IFoodEntryValue, IFoodItem, IFoodMeal, IFoodSource, INutrients } from \"../types\";\nimport {\n  Food_entryFromSelection,\n  Food_parseNumber,\n  Food_scaleNutrients,\n  Food_selectionFromItem,\n  IFoodSelection,\n} from \"./food\";\nimport {\n  FoodSearch_gramLabel,\n  FoodSearch_labelServings,\n  IFoodDataIssues,\n  IFoodMacroGap,\n  IFoodSearchResult,\n  IFoodServingOption,\n} from \"./foodSearch\";\n\nconst macroKeys: IFoodMacroGap[] = [\"protein\", \"carbs\", \"fat\"];\n\nexport interface IFoodLabelForm {\n  name: string;\n  brand: string;\n  servingLabel: string;\n  servingGrams: string;\n  calories: string;\n  protein: string;\n  carbs: string;\n  fat: string;\n  fiber: string;\n}\n\nexport const FoodLabel_emptyForm: IFoodLabelForm = {\n  name: \"\",\n  brand: \"\",\n  servingLabel: \"\",\n  servingGrams: \"\",\n  calories: \"\",\n  protein: \"\",\n  carbs: \"\",\n  fat: \"\",\n  fiber: \"\",\n};\n\nfunction toText(value: number | undefined): string {\n  return value == null ? \"\" : `${Math.round(value * 100) / 100}`;\n}\n\nexport function FoodLabel_parse(\n  form: IFoodLabelForm\n): { servingLabel: string; servingGrams?: number; perServing: INutrients } | undefined {\n  const calories = Food_parseNumber(form.calories);\n  if (calories == null) {\n    return undefined;\n  }\n  const grams = Food_parseNumber(form.servingGrams);\n  const servingGrams = grams != null && grams > 0 ? grams : undefined;\n  return {\n    servingLabel: form.servingLabel.trim() || (servingGrams ? `${servingGrams} g` : \"1 serving\"),\n    ...(servingGrams ? { servingGrams } : {}),\n    perServing: {\n      calories,\n      protein: Food_parseNumber(form.protein) ?? 0,\n      carbs: Food_parseNumber(form.carbs) ?? 0,\n      fat: Food_parseNumber(form.fat) ?? 0,\n      fiber: Food_parseNumber(form.fiber) ?? 0,\n    },\n  };\n}\n\nexport function FoodLabel_per100(form: IFoodLabelForm): INutrients | undefined {\n  const label = FoodLabel_parse(form);\n  return label?.servingGrams ? Food_scaleNutrients(label.perServing, 100 / label.servingGrams) : undefined;\n}\n\nfunction labelServing(options: IFoodServingOption[]): IFoodServingOption | undefined {\n  const labelled = options.find((o) => o.label !== FoodSearch_gramLabel);\n  if (labelled) {\n    return labelled;\n  }\n  const perGram = options.find((o) => o.label === FoodSearch_gramLabel);\n  return perGram ? { label: \"100 g\", grams: 100, perServing: Food_scaleNutrients(perGram.perServing, 100) } : undefined;\n}\n\nfunction formFromServings(\n  food: { name: string; brand?: string },\n  options: IFoodServingOption[],\n  issues?: IFoodDataIssues\n): IFoodLabelForm {\n  const serving = labelServing(options);\n  const n = serving?.perServing;\n  const macro = (key: IFoodMacroGap): string => (issues?.missing?.includes(key) ? \"\" : toText(n?.[key]));\n  return {\n    name: food.name,\n    brand: food.brand ?? \"\",\n    servingLabel: serving?.label ?? \"\",\n    servingGrams: toText(serving?.grams),\n    calories: issues?.kilojoules ? \"\" : toText(n?.calories),\n    protein: macro(\"protein\"),\n    carbs: macro(\"carbs\"),\n    fat: macro(\"fat\"),\n    fiber: toText(n?.fiber),\n  };\n}\n\nexport function FoodLabel_formFromItem(\n  item: IFoodItem | undefined,\n  prefill: IFoodSearchResult | undefined\n): IFoodLabelForm {\n  if (item) {\n    return formFromServings(item, Food_selectionFromItem(item).servings);\n  }\n  return prefill ? formFromServings(prefill, prefill.servings, prefill.issues) : FoodLabel_emptyForm;\n}\n\nexport function FoodLabel_formFromSelection(selection: IFoodSelection): IFoodLabelForm {\n  return formFromServings(selection, selection.servings, selection.issues);\n}\n\n// A macro left blank stays flagged: a blank parses as 0, and saving that is the bug being fixed.\nexport function FoodLabel_applyToSelection(selection: IFoodSelection, form: IFoodLabelForm): IFoodSelection {\n  const label = FoodLabel_parse(form);\n  if (!label) {\n    return selection;\n  }\n  const { issues: _issues, ...rest } = selection;\n  const missing = macroKeys.filter((key) => Food_parseNumber(form[key]) == null);\n  return {\n    ...rest,\n    servings: FoodSearch_labelServings(label.servingLabel, label.servingGrams, label.perServing),\n    ...(missing.length > 0 ? { issues: { missing } } : {}),\n  };\n}\n\nexport function FoodLabel_selection(form: IFoodLabelForm, source: IFoodSource): IFoodSelection | undefined {\n  const label = FoodLabel_parse(form);\n  if (!label) {\n    return undefined;\n  }\n  const brand = form.brand.trim();\n  return {\n    name: form.name.trim() || \"Quick add\",\n    ...(brand ? { brand } : {}),\n    source,\n    servings: FoodSearch_labelServings(label.servingLabel, label.servingGrams, label.perServing),\n  };\n}\n\nexport function FoodLabel_itemFromForm(\n  form: IFoodLabelForm,\n  args: { existing?: IFoodItem; barcode?: string; id: string; now: number }\n): IFoodItem | undefined {\n  const label = FoodLabel_parse(form);\n  const name = form.name.trim();\n  if (!label || !name) {\n    return undefined;\n  }\n  const { existing } = args;\n  const brand = form.brand.trim();\n  const barcode = existing?.barcode ?? args.barcode;\n  return {\n    vtype: \"food_item\",\n    id: existing?.id ?? args.id,\n    name,\n    ...(brand ? { brand } : {}),\n    servingLabel: label.servingLabel,\n    ...(label.servingGrams ? { servingGrams: label.servingGrams } : {}),\n    perServing: label.perServing,\n    source: existing?.source ?? \"custom\",\n    ...(existing?.sourceId ? { sourceId: existing.sourceId } : {}),\n    ...(barcode ? { barcode } : {}),\n    createdAt: existing?.createdAt ?? args.now,\n  };\n}\n\nexport function FoodLabel_quickAdd(\n  form: IFoodLabelForm,\n  args: { date: string; meal: IFoodMeal; eatenGrams?: number; saveId?: string; now: number }\n): { entry: IFoodEntryValue; item?: IFoodItem } | undefined {\n  const selection = FoodLabel_selection(form, \"quick\");\n  if (!selection) {\n    return undefined;\n  }\n  const item = args.saveId ? FoodLabel_itemFromForm(form, { id: args.saveId, now: args.now }) : undefined;\n  const toLog = item ? Food_selectionFromItem(item) : selection;\n  const gramIndex = toLog.servings.findIndex((s) => s.label === FoodSearch_gramLabel);\n  const eatenGrams = args.eatenGrams != null && args.eatenGrams > 0 && gramIndex >= 0 ? args.eatenGrams : undefined;\n  const entry = Food_entryFromSelection(toLog, {\n    optionIndex: eatenGrams != null ? gramIndex : 0,\n    amount: eatenGrams ?? 1,\n    date: args.date,\n    meal: args.meal,\n  });\n  return { entry, ...(item ? { item } : {}) };\n}\n","import { IFoodEntryValue, IFoodItem, IFoodMeal } from \"../types\";\nimport {\n  Food_clampChoice,\n  Food_entryFromSelection,\n  Food_itemFromSelection,\n  Food_parseNumber,\n  IFoodSelection,\n  IFoodServingChoice,\n} from \"./food\";\nimport { FoodLabel_applyToSelection, FoodLabel_itemFromForm, FoodLabel_parse, IFoodLabelForm } from \"./foodLabel\";\nimport { FoodSearch_dataWarning } from \"./foodSearch\";\n\nexport interface IFoodPickView {\n  selection: IFoodSelection;\n  choice: IFoodServingChoice;\n  warning?: string;\n  canAdd: boolean;\n  canSave: boolean;\n}\n\nexport function FoodPick_view(\n  picked: IFoodSelection,\n  args: { labelForm?: IFoodLabelForm; choice: IFoodServingChoice }\n): IFoodPickView {\n  const selection = args.labelForm ? FoodLabel_applyToSelection(picked, args.labelForm) : picked;\n  const choice = Food_clampChoice(selection, args.choice);\n  const amount = Food_parseNumber(choice.amountText);\n  const labelDone = !args.labelForm || (!!FoodLabel_parse(args.labelForm) && !selection.issues);\n  const warning = FoodSearch_dataWarning(selection.issues);\n  return {\n    selection,\n    choice,\n    ...(warning ? { warning } : {}),\n    canAdd: amount != null && amount > 0 && labelDone,\n    canSave: !selection.foodId && !selection.issues,\n  };\n}\n\n// A fixed scan saves the label as typed. Food_itemFromSelection would turn a grams choice into \"100 g\".\nexport function FoodPick_confirm(\n  picked: IFoodSelection,\n  args: {\n    labelForm?: IFoodLabelForm;\n    choice: IFoodServingChoice;\n    saveId?: string;\n    date: string;\n    meal: IFoodMeal;\n    now: number;\n  }\n): { entry: IFoodEntryValue; item?: IFoodItem } | undefined {\n  const view = FoodPick_view(picked, args);\n  const amount = Food_parseNumber(view.choice.amountText);\n  if (!view.canAdd || amount == null) {\n    return undefined;\n  }\n  const { selection, choice } = view;\n  const item =\n    args.saveId && view.canSave\n      ? args.labelForm\n        ? FoodLabel_itemFromForm(args.labelForm, { barcode: picked.barcode, id: args.saveId, now: args.now })\n        : Food_itemFromSelection(selection, { optionIndex: choice.optionIndex, id: args.saveId, now: args.now })\n      : undefined;\n  const entry = Food_entryFromSelection(item ? { ...selection, foodId: item.id } : selection, {\n    optionIndex: choice.optionIndex,\n    amount,\n    date: args.date,\n    meal: args.meal,\n  });\n  return { entry, ...(item ? { item } : {}) };\n}\n","import { INutrients } from \"../types\";\n\nexport interface IFoodServingOption {\n  label: string;\n  grams?: number;\n  perServing: INutrients;\n}\n\nexport type IFoodMacroGap = \"protein\" | \"carbs\" | \"fat\";\n\nexport interface IFoodDataIssues {\n  missing?: IFoodMacroGap[];\n  kilojoules?: true;\n}\n\nexport interface IFoodSearchResult {\n  source: \"off\" | \"usda\";\n  sourceId: string;\n  name: string;\n  brand?: string;\n  barcode?: string;\n  servings: IFoodServingOption[];\n  issues?: IFoodDataIssues;\n}\n\n// One serving of this label means one gram (or millilitre), so the servings count is the amount typed.\nexport const FoodSearch_gramLabel = \"g\";\n\nconst kjPerKcal = 4.184;\nconst macroGaps: IFoodMacroGap[] = [\"protein\", \"carbs\", \"fat\"];\nconst pureFatKcalPer100g = 900;\n\n// Four decimals because the per-gram option multiplies back up: banana protein is 0.0109 g/g, and two\n// decimals would log 150 g as 1.5 g of protein instead of 1.6 g.\nfunction round(value: number): number {\n  return Math.round(value * 10000) / 10000;\n}\n\nfunction nutrientsPer(per100: INutrients, grams: number): INutrients {\n  const factor = grams / 100;\n  return {\n    calories: round(per100.calories * factor),\n    protein: round(per100.protein * factor),\n    carbs: round(per100.carbs * factor),\n    fat: round(per100.fat * factor),\n    fiber: round((per100.fiber ?? 0) * factor),\n  };\n}\n\nfunction weightServings(per100: INutrients, serving?: { label: string; grams: number }): IFoodServingOption[] {\n  const options: IFoodServingOption[] = [];\n  if (serving && serving.grams > 0) {\n    options.push({ label: serving.label, grams: serving.grams, perServing: nutrientsPer(per100, serving.grams) });\n  }\n  options.push({ label: FoodSearch_gramLabel, grams: 1, perServing: nutrientsPer(per100, 1) });\n  return options;\n}\n\nexport function FoodSearch_labelServings(\n  label: string,\n  grams: number | undefined,\n  perServing: INutrients\n): IFoodServingOption[] {\n  if (!grams || grams <= 0) {\n    return [{ label, perServing }];\n  }\n  return [\n    { label, grams, perServing },\n    { label: FoodSearch_gramLabel, grams: 1, perServing: nutrientsPer(perServing, 100 / grams) },\n  ];\n}\n\nfunction num(value: unknown): number | undefined {\n  const n = typeof value === \"string\" ? Number(value) : value;\n  return typeof n === \"number\" && Number.isFinite(n) ? n : undefined;\n}\n\nexport function FoodSearch_fromOpenFoodFacts(product: Record<string, unknown>): IFoodSearchResult | undefined {\n  const n = (product.nutriments || {}) as Record<string, unknown>;\n  const name = typeof product.product_name === \"string\" ? product.product_name.trim() : \"\";\n  const code = typeof product.code === \"string\" ? product.code : undefined;\n  const brands = Array.isArray(product.brands) ? product.brands.join(\", \") : product.brands;\n  const brand = typeof brands === \"string\" && brands.trim() ? brands.split(\",\")[0].trim() : undefined;\n  const pick = (suffix: \"_100g\" | \"_serving\"): { nutrients: INutrients; missing: IFoodMacroGap[] } | undefined => {\n    const kcal = num(n[`energy-kcal${suffix}`]) ?? (num(n[`energy${suffix}`]) ?? NaN) / kjPerKcal;\n    if (!Number.isFinite(kcal)) {\n      return undefined;\n    }\n    const macros: Record<IFoodMacroGap, number | undefined> = {\n      protein: num(n[`proteins${suffix}`]),\n      carbs: num(n[`carbohydrates${suffix}`]),\n      fat: num(n[`fat${suffix}`]),\n    };\n    return {\n      nutrients: {\n        calories: round(kcal),\n        protein: round(macros.protein ?? 0),\n        carbs: round(macros.carbs ?? 0),\n        fat: round(macros.fat ?? 0),\n        fiber: round(num(n[`fiber${suffix}`]) ?? 0),\n      },\n      missing: macroGaps.filter((key) => macros[key] == null),\n    };\n  };\n  if (!name || !code) {\n    return undefined;\n  }\n  const per100 = pick(\"_100g\");\n  const servingGrams = num(product.serving_quantity);\n  const servingLabel = typeof product.serving_size === \"string\" ? product.serving_size.trim() : \"\";\n  let servings: IFoodServingOption[];\n  let missing: IFoodMacroGap[];\n  let kilojoules = false;\n  if (per100) {\n    servings = weightServings(\n      per100.nutrients,\n      servingGrams ? { label: servingLabel || `1 serving (${servingGrams} g)`, grams: servingGrams } : undefined\n    );\n    missing = per100.missing;\n    kilojoules = per100.nutrients.calories > pureFatKcalPer100g;\n  } else {\n    const perServing = pick(\"_serving\");\n    if (!perServing) {\n      return undefined;\n    }\n    servings = [{ label: servingLabel || \"1 serving\", perServing: perServing.nutrients }];\n    missing = perServing.missing;\n  }\n  const issues: IFoodDataIssues = {\n    ...(missing.length > 0 ? { missing } : {}),\n    ...(kilojoules ? { kilojoules: true as const } : {}),\n  };\n  return {\n    source: \"off\",\n    sourceId: code,\n    name,\n    ...(brand ? { brand } : {}),\n    barcode: code,\n    servings,\n    ...(Object.keys(issues).length > 0 ? { issues } : {}),\n  };\n}\n\nconst usdaIds = { energy: [1008, 2047, 2048], protein: [1003], fat: [1004], carbs: [1005], fiber: [1079] };\n\nexport function FoodSearch_fromUsda(food: Record<string, unknown>): IFoodSearchResult | undefined {\n  const nutrients = (Array.isArray(food.foodNutrients) ? food.foodNutrients : []) as {\n    nutrientId?: number;\n    value?: number;\n    unitName?: string;\n  }[];\n  const find = (ids: number[]): { value: number; unit: string } | undefined => {\n    for (const id of ids) {\n      const hit = nutrients.find((x) => x.nutrientId === id && typeof x.value === \"number\");\n      if (hit) {\n        return { value: hit.value!, unit: (hit.unitName || \"\").toUpperCase() };\n      }\n    }\n    return undefined;\n  };\n  const energy = find(usdaIds.energy);\n  const description = typeof food.description === \"string\" ? food.description.trim() : \"\";\n  if (!energy || !description || food.fdcId == null) {\n    return undefined;\n  }\n  const per100: INutrients = {\n    calories: round(energy.unit === \"KJ\" ? energy.value / kjPerKcal : energy.value),\n    protein: round(find(usdaIds.protein)?.value ?? 0),\n    carbs: round(find(usdaIds.carbs)?.value ?? 0),\n    fat: round(find(usdaIds.fat)?.value ?? 0),\n    fiber: round(find(usdaIds.fiber)?.value ?? 0),\n  };\n  const unit = typeof food.servingSizeUnit === \"string\" ? food.servingSizeUnit.toUpperCase() : \"\";\n  const size = num(food.servingSize);\n  const household = typeof food.householdServingFullText === \"string\" ? food.householdServingFullText.trim() : \"\";\n  const servingGrams = size && (unit === \"G\" || unit === \"GRM\" || unit === \"ML\" || unit === \"MLT\") ? size : undefined;\n  const brand = [food.brandName, food.brandOwner].find((b) => typeof b === \"string\" && b.trim()) as string | undefined;\n  const barcode = typeof food.gtinUpc === \"string\" && food.gtinUpc ? food.gtinUpc : undefined;\n  return {\n    source: \"usda\",\n    sourceId: `${food.fdcId}`,\n    name: description,\n    ...(brand ? { brand: brand.trim() } : {}),\n    ...(barcode ? { barcode } : {}),\n    servings: weightServings(\n      per100,\n      servingGrams\n        ? { label: household ? `${household}` : `1 serving (${servingGrams} g)`, grams: servingGrams }\n        : undefined\n    ),\n  };\n}\n\ninterface IUsdaPortion {\n  amount?: number;\n  modifier?: string;\n  portionDescription?: string;\n  gramWeight?: number;\n  measureUnit?: { name?: string };\n}\n\nfunction usdaPortionLabel(portion: IUsdaPortion): string | undefined {\n  const description = portion.portionDescription?.trim();\n  if (description && description !== \"Quantity not specified\") {\n    return description;\n  }\n  const unit = portion.measureUnit?.name && portion.measureUnit.name !== \"undetermined\" ? portion.measureUnit.name : \"\";\n  const text = [portion.amount ?? 1, unit, portion.modifier?.trim()].filter(Boolean).join(\" \");\n  return text.trim() === `${portion.amount ?? 1}` ? undefined : text;\n}\n\n// The /food/{fdcId} detail response nests nutrient ids ({nutrient: {id}, amount}) and carries the\n// household portions (\"1 medium (118 g)\") that the search response leaves out.\nexport function FoodSearch_fromUsdaDetail(detail: Record<string, unknown>): IFoodSearchResult | undefined {\n  const nested = (Array.isArray(detail.foodNutrients) ? detail.foodNutrients : []) as {\n    nutrient?: { id?: number; unitName?: string };\n    amount?: number;\n  }[];\n  const base = FoodSearch_fromUsda({\n    ...detail,\n    foodNutrients: nested.map((n) => ({ nutrientId: n.nutrient?.id, value: n.amount, unitName: n.nutrient?.unitName })),\n  });\n  if (!base) {\n    return undefined;\n  }\n  const perGram = base.servings.find((s) => s.label === FoodSearch_gramLabel)!.perServing;\n  const portions = (Array.isArray(detail.foodPortions) ? detail.foodPortions : []) as IUsdaPortion[];\n  const portionOptions = portions.flatMap((p): IFoodServingOption[] => {\n    const label = usdaPortionLabel(p);\n    if (!label || !p.gramWeight || p.gramWeight <= 0) {\n      return [];\n    }\n    return [\n      {\n        label: `${label} (${Math.round(p.gramWeight)} g)`,\n        grams: p.gramWeight,\n        perServing: nutrientsPer(per100FromPerGram(perGram), p.gramWeight),\n      },\n    ];\n  });\n  const existing = base.servings.filter((s) => s.label !== FoodSearch_gramLabel);\n  return { ...base, servings: [...existing, ...portionOptions, base.servings[base.servings.length - 1]] };\n}\n\nfunction per100FromPerGram(perGram: INutrients): INutrients {\n  return {\n    calories: perGram.calories * 100,\n    protein: perGram.protein * 100,\n    carbs: perGram.carbs * 100,\n    fat: perGram.fat * 100,\n    fiber: (perGram.fiber ?? 0) * 100,\n  };\n}\n\nexport function FoodSearch_sameBarcode(a: string | undefined, b: string | undefined): boolean {\n  if (!a || !b) {\n    return false;\n  }\n  return a.replace(/^0+/, \"\") === b.replace(/^0+/, \"\");\n}\n\n// search.openfoodfacts.org returns 0 hits for a parenthesised group, so the user's operators are\n// removed instead and the default AND joins the words to the filter (tested 2026-10-27).\nexport function FoodSearch_offCanadaQuery(query: string): string | undefined {\n  const words = query\n    .replace(/[\":()[\\]{}^~*?\\\\/!]/g, \" \")\n    .split(/\\s+/)\n    .map((word) => word.replace(/^[+-]+/, \"\"))\n    .filter((word) => word && ![\"AND\", \"OR\", \"NOT\"].includes(word));\n  return words.length > 0 ? `${words.join(\" \")} countries_tags:\"en:canada\"` : undefined;\n}\n\nexport function FoodSearch_mergeCanadianFirst(\n  canada: IFoodSearchResult[],\n  global: IFoodSearchResult[]\n): IFoodSearchResult[] {\n  const seen = new Set(canada.map((r) => r.sourceId));\n  return [...canada, ...global.filter((r) => !seen.has(r.sourceId))];\n}\n\nexport function FoodSearch_pickBarcodeResult(\n  off: IFoodSearchResult | undefined,\n  usda: IFoodSearchResult | undefined\n): IFoodSearchResult | undefined {\n  if (off && !off.issues) {\n    return off;\n  }\n  if (usda && !usda.issues) {\n    return usda;\n  }\n  return off ?? usda;\n}\n\nfunction joinOr(words: string[]): string {\n  return words.length <= 1 ? words.join(\"\") : `${words.slice(0, -1).join(\", \")} or ${words[words.length - 1]}`;\n}\n\nexport function FoodSearch_dataWarning(issues: IFoodDataIssues | undefined): string | undefined {\n  const parts: string[] = [];\n  if (issues?.missing && issues.missing.length > 0) {\n    parts.push(`Open Food Facts has no ${joinOr(issues.missing)} value for this product.`);\n  }\n  if (issues?.kilojoules) {\n    parts.push(\"The calories look like kilojoules.\");\n  }\n  return parts.length > 0 ? `${parts.join(\" \")} Check the label.` : undefined;\n}\n\nexport function FoodSearch_formatServing(label: string, servings: number): string {\n  const amount = Math.round(servings * 100) / 100;\n  if (label === FoodSearch_gramLabel) {\n    return `${amount} g`;\n  }\n  return amount === 1 ? label : `${amount} × ${label}`;\n}\n","import { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState, updateState } from \"./state\";\nimport { IHearAboutUs } from \"../types\";\nimport { Thunk_log } from \"../ducks/thunks\";\nimport type { IHearAboutUsSource } from \"../components/hearAboutUs/hearAboutUsConfig\";\n\nfunction ensure(h: IHearAboutUs | undefined): IHearAboutUs {\n  return h ?? { requests: [] };\n}\n\nfunction buildResult(source: string, detail: string, freeform: string): NonNullable<IHearAboutUs[\"result\"]> {\n  const result: NonNullable<IHearAboutUs[\"result\"]> = { source, ts: Date.now() };\n  if (detail) {\n    result.detail = detail;\n  }\n  if (freeform) {\n    result.freeform = freeform;\n  }\n  return result;\n}\n\nfunction detailJson(source: string, detail: string, freeform: string): string {\n  const obj: Record<string, string> = { source };\n  if (detail) {\n    obj.detail = detail;\n  }\n  if (freeform) {\n    obj.freeform = freeform;\n  }\n  return JSON.stringify(obj);\n}\n\n// Persist the source the instant it's tapped (partial answer) and log it, so the choice survives a\n// skipped Step 2 or an app kill — critical for anonymous users whose IStorage never syncs.\nexport function HearAboutUs_selectSource(dispatch: IDispatch, source: IHearAboutUsSource): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"hearAboutUs\")\n        .recordModify((h) => ({ ...ensure(h), result: buildResult(source, \"\", \"\") })),\n    ],\n    \"Select hear-about-us source\"\n  );\n  dispatch(Thunk_log(\"ls-hear-about-us-answered\", detailJson(source, \"\", \"\")));\n}\n\nexport function HearAboutUs_updatePartial(dispatch: IDispatch, partial: { detail?: string; freeform?: string }): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"hearAboutUs\")\n        .recordModify((h) => {\n          const base = ensure(h);\n          if (base.result == null) {\n            return base;\n          }\n          return { ...base, result: { ...base.result, ...partial, ts: Date.now() } };\n        }),\n    ],\n    \"Update hear-about-us\"\n  );\n}\n\nexport function HearAboutUs_finalize(\n  dispatch: IDispatch,\n  payload: { source: IHearAboutUsSource; detail: string; freeform: string }\n): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"hearAboutUs\")\n        .recordModify((h) => ({ ...ensure(h), result: buildResult(payload.source, payload.detail, payload.freeform) })),\n      lb<IState>().p(\"toast\").record(\"Thanks, that really helps! 🙏\"),\n    ],\n    \"Finalize hear-about-us\"\n  );\n  dispatch(Thunk_log(\"ls-hear-about-us-answered\", detailJson(payload.source, payload.detail, payload.freeform)));\n}\n\nexport function HearAboutUs_logShown(dispatch: IDispatch): void {\n  dispatch(Thunk_log(\"ls-hear-about-us-shown\"));\n}\n\nexport function HearAboutUs_skip(dispatch: IDispatch): void {\n  dispatch(Thunk_log(\"ls-hear-about-us-skip\"));\n}\n\nexport function HearAboutUs_appendRequest(dispatch: IDispatch): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"hearAboutUs\")\n        .recordModify((h) => {\n          const base = ensure(h);\n          return { ...base, requests: [...base.requests, Date.now()] };\n        }),\n    ],\n    \"Hear-about-us maybe later\"\n  );\n}\n\nexport function HearAboutUs_markDone(dispatch: IDispatch): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"hearAboutUs\")\n        .recordModify((h) => ({ ...ensure(h), done: true })),\n    ],\n    \"Dismiss hear-about-us\"\n  );\n}\n","import { IHeartRateSource, INativeWorkoutMirroringEvent, IRawWorkoutMirroringEvent } from \"../utils/workoutMirroring\";\n\nexport const HeartRateReading_staleAfterMs = 15000;\n\nexport interface IHeartRateReading {\n  bpm: number;\n  measuredAt: number;\n  source: IHeartRateSource;\n}\n\nfunction parseSource(source: string | undefined): IHeartRateSource | undefined {\n  return source === \"watch\" || source === \"phone\" ? source : undefined;\n}\n\nexport function HeartRateReading_parseEvent(raw: IRawWorkoutMirroringEvent): INativeWorkoutMirroringEvent | undefined {\n  if (raw.type === \"source\") {\n    return { type: \"source\", source: parseSource(raw.source) };\n  }\n  if (raw.type === \"heartRate\") {\n    const source = parseSource(raw.source);\n    const bpm = raw.heartRate;\n    const measuredAt = raw.measuredAt;\n    if (source == null || bpm == null || measuredAt == null || !isFinite(bpm) || bpm <= 0) {\n      return undefined;\n    }\n    return { type: \"heartRate\", bpm: Math.round(bpm), measuredAt, source };\n  }\n  return undefined;\n}\n\nexport function HeartRateReading_apply(\n  prev: IHeartRateReading | undefined,\n  event: INativeWorkoutMirroringEvent\n): IHeartRateReading | undefined {\n  if (event.type === \"source\") {\n    return prev != null && prev.source === event.source ? prev : undefined;\n  }\n  if (prev != null && prev.source === event.source && event.measuredAt <= prev.measuredAt) {\n    return prev;\n  }\n  return { bpm: event.bpm, measuredAt: event.measuredAt, source: event.source };\n}\n\nexport function HeartRateReading_expiresAt(reading: IHeartRateReading | undefined): number | undefined {\n  return reading != null ? reading.measuredAt + HeartRateReading_staleAfterMs : undefined;\n}\n\nexport function HeartRateReading_visibleBpm(reading: IHeartRateReading | undefined, now: number): number | undefined {\n  const expiresAt = HeartRateReading_expiresAt(reading);\n  return reading != null && expiresAt != null && now < expiresAt ? reading.bpm : undefined;\n}\n","import {\n  Exercise_getIsUnilateral,\n  Exercise_getVolumeMultiplier,\n  Exercise_onerm,\n  Exercise_toKey,\n  Exercise_get,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroups,\n  Exercise_synergistMusclesGroupMultipliers,\n  Exercise_eq,\n  Exercise_fullName,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n} from \"./exercise\";\nimport { Progress_getEntryId, Progress_isCurrent } from \"./progress\";\nimport { CollectionUtils_sort, CollectionUtils_sortByExpr } from \"../utils/collection\";\n\nimport {\n  Weight_compare,\n  Weight_build,\n  Weight_convertTo,\n  Weight_getOneRepMax,\n  Weight_gt,\n  Weight_lt,\n  Weight_gte,\n  Weight_add,\n  Weight_eq,\n  Weight_multiply,\n} from \"./weight\";\nimport {\n  IHistoryEntry,\n  IHistoryEntryProgressSnapshot,\n  IHistoryRecord,\n  ISet,\n  IExerciseType,\n  IUnit,\n  IWeight,\n  IPercentage,\n  ISettings,\n  IScreenMuscle,\n  IIntervals,\n  IStorage,\n  IStats,\n  IProgramState,\n} from \"../types\";\nimport { Collector, ICollectorFn } from \"../utils/collector\";\nimport {\n  Reps_avgUnilateralCompletedReps,\n  Reps_volume,\n  Reps_isStarted,\n  Reps_setVolume,\n  Reps_isFinishedSet,\n} from \"./set\";\nimport { ProgramExercise_isUsingVariable } from \"./programExercise\";\nimport { IState, updateState } from \"./state\";\nimport { lb, lbu } from \"lens-shmens\";\nimport { ObjectUtils_keys, ObjectUtils_clone, ObjectUtils_isNotEmpty } from \"../utils/object\";\nimport { IDispatch } from \"../ducks/types\";\nimport { INativeEffect } from \"./nativeEffects\";\nimport memoize from \"micro-memoize\";\nimport { DateUtils_firstDayOfWeekTimestamp, DateUtils_formatYYYYMMDD } from \"../utils/date\";\nimport {\n  IEvaluatedProgram,\n  Program_getProgramExerciseForKeyAndDay,\n  Program_computeProgressStateChanges,\n} from \"./program\";\nimport {\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_currentDescription,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { Muscle_getAvailableMuscleGroups } from \"./muscle\";\n\nexport interface IHistoricalEntries {\n  last: { entry: IHistoryEntry; time: number };\n  max: { entry: IHistoryEntry; time: number };\n}\n\nexport interface IHistoryRecordAndEntry {\n  record: IHistoryRecord;\n  entry: IHistoryEntry;\n}\n\n// history id -> exercise key -> personal records\nexport type IPersonalRecords = Partial<Record<string, Partial<Record<string, IHistoryEntryPersonalRecords>>>>;\n\nexport interface IHistoryEntryPersonalRecords {\n  maxWeightSet?: ISet;\n  prevMaxWeightSet?: ISet;\n  max1RMSet?: ISet;\n  prevMax1RMSet?: ISet;\n}\n\nexport function History_generateId(timestamp: number): number {\n  return timestamp + Math.floor(Math.random() * 1000);\n}\n\nexport function History_deleteRecords(storage: IStorage, ids: number[]): IStorage {\n  const idSet = new Set(ids);\n  return { ...storage, history: storage.history.filter((h) => !idSet.has(h.id)) };\n}\n\nexport function History_createCustomEntry(exerciseType: IExerciseType, index: number): IHistoryEntry {\n  return {\n    vtype: \"history_entry\",\n    id: Progress_getEntryId(exerciseType),\n    index,\n    exercise: exerciseType,\n    sets: [],\n    warmupSets: [],\n  };\n}\n\nexport function History_finishProgramDay(\n  progress: IHistoryRecord,\n  settings: ISettings,\n  day: number,\n  program?: IEvaluatedProgram,\n  stats?: IStats,\n  forceEndTime: number = Date.now()\n): IHistoryRecord {\n  const { deletedProgramExercises, ui, ...historyRecord } = progress;\n  const updatedAt = forceEndTime;\n  const endTime = Progress_isCurrent(progress) ? forceEndTime : (progress.endTime ?? forceEndTime);\n  return {\n    ...historyRecord,\n    entries: historyRecord.entries.map((entry) => {\n      const originalUpdatePrints = entry.updatePrints;\n      const programExercise =\n        program && entry.programExerciseId\n          ? Program_getProgramExerciseForKeyAndDay(program, day, entry.programExerciseId)\n          : undefined;\n      if (Progress_isCurrent(progress)) {\n        const isUnilateral = Exercise_getIsUnilateral(entry.exercise, settings);\n        const { updatePrints, ...entryWithoutPrints } = entry;\n        entry = {\n          ...entryWithoutPrints,\n          sets: entry.sets.map((set) => {\n            return {\n              ...set,\n              completedReps: set.isCompleted ? set.completedReps : undefined,\n              completedRepsLeft: isUnilateral && set.isCompleted ? set.completedRepsLeft : undefined,\n              completedRpe: set.isCompleted ? set.completedRpe : undefined,\n              completedWeight: set.isCompleted ? set.completedWeight : undefined,\n            };\n          }),\n        };\n        if (programExercise != null) {\n          const state = PlannerProgramExercise_getState(programExercise);\n          const useRm1 = ProgramExercise_isUsingVariable(programExercise, \"rm1\");\n          const descriptionSnapshot = PlannerProgramExercise_currentDescription(programExercise);\n          const progressSnapshot = History_buildProgressSnapshot(\n            entry,\n            settings,\n            programExercise,\n            program,\n            stats,\n            progress.userPromptedStateVars?.[entry.programExerciseId ?? \"\"],\n            originalUpdatePrints\n          );\n          entry = {\n            ...entry,\n            state: { ...state },\n            vars: useRm1 ? { rm1: Exercise_onerm(programExercise.exerciseType, settings) } : {},\n            ...(descriptionSnapshot != null ? { descriptionSnapshot } : {}),\n            ...(progressSnapshot != null ? { progressSnapshot } : {}),\n          };\n        }\n      }\n      return entry;\n    }),\n    vtype: \"history_record\",\n    id: Progress_isCurrent(progress) ? progress.startTime : progress.id,\n    updatedAt: updatedAt,\n    timerSince: undefined,\n    timerMode: undefined,\n    setTimer: undefined,\n    setTimerGetReady: undefined,\n    intervals: History_pauseWorkout(progress.intervals),\n    ...(Progress_isCurrent(progress) ? { endTime } : {}),\n  };\n}\n\nfunction History_buildProgressSnapshot(\n  entry: IHistoryEntry,\n  settings: ISettings,\n  programExercise: IPlannerProgramExercise,\n  program?: IEvaluatedProgram,\n  stats?: IStats,\n  userPromptedStateVars?: IProgramState,\n  updatePrints?: (number | IWeight | IPercentage)[][]\n): IHistoryEntryProgressSnapshot | undefined {\n  const snapshot: IHistoryEntryProgressSnapshot = {};\n  if (program && stats) {\n    const changes = Program_computeProgressStateChanges(\n      entry,\n      programExercise.dayData,\n      settings,\n      programExercise,\n      program,\n      stats,\n      userPromptedStateVars\n    );\n    if (changes) {\n      const diffState = History_compactDiff(changes.diffState);\n      const diffVars = History_compactDiff(changes.diffVars);\n      if (ObjectUtils_isNotEmpty(diffState)) {\n        snapshot.diffState = diffState;\n      }\n      if (ObjectUtils_isNotEmpty(diffVars)) {\n        snapshot.diffVars = diffVars;\n      }\n      if (changes.prints.length > 0) {\n        snapshot.prints = changes.prints;\n      }\n    }\n  }\n  if (updatePrints && updatePrints.length > 0) {\n    snapshot.updatePrints = updatePrints;\n  }\n  return ObjectUtils_isNotEmpty(snapshot) ? snapshot : undefined;\n}\n\nfunction History_compactDiff(diff: Record<string, string | undefined>): Record<string, string> {\n  return ObjectUtils_keys(diff).reduce<Record<string, string>>((memo, key) => {\n    const value = diff[key];\n    if (value != null) {\n      memo[key] = value;\n    }\n    return memo;\n  }, {});\n}\n\nexport function History_getMaxWeightSetFromEntry(entry: IHistoryEntry): ISet | undefined {\n  return History_getMaxWeightSet(entry.sets);\n}\n\nexport function History_getMax1RMSetFromEntry(entry: IHistoryEntry): ISet | undefined {\n  return History_getMax1RMSet(entry.sets);\n}\n\n// A tie goes to more reps, then to the earlier set, as in the stable sort this replaced.\nfunction History_maxSetBy(sets: ISet[], weightOf: (set: ISet) => IWeight): ISet | undefined {\n  let best: ISet | undefined;\n  let bestWeight: IWeight | undefined;\n  for (const set of sets) {\n    if ((set.completedReps || 0) <= 0) {\n      continue;\n    }\n    const weight = weightOf(set);\n    if (best == null || bestWeight == null) {\n      best = set;\n      bestWeight = weight;\n      continue;\n    }\n    const weightDiff = Weight_compare(bestWeight, weight);\n    const beats =\n      weightDiff === 0 && set.completedReps && best.completedReps\n        ? best.completedReps - set.completedReps < 0\n        : weightDiff < 0;\n    if (beats) {\n      best = set;\n      bestWeight = weight;\n    }\n  }\n  return best;\n}\n\nexport function History_getMaxWeightSet(sets: ISet[]): ISet | undefined {\n  return History_maxSetBy(sets, (set) => set.completedWeight ?? set.weight ?? Weight_build(0, \"lb\"));\n}\n\nexport function History_getMax1RMSet(sets: ISet[]): ISet | undefined {\n  return History_maxSetBy(sets, (set) =>\n    Weight_getOneRepMax(\n      set.completedWeight ?? set.weight ?? Weight_build(0, \"lb\"),\n      Reps_avgUnilateralCompletedReps(set) || 0,\n      set.completedRpe ?? set.rpe ?? 10\n    )\n  );\n}\n\nexport function History_findAllPersonalRecords(\n  record: IHistoryRecord,\n  history: IHistoryRecord[]\n): Map<IExerciseType, ISet> {\n  const prs: Map<IExerciseType, ISet> = new Map();\n  for (const entry of record.entries) {\n    const set = History_findPersonalRecord(record.id, entry, history);\n    if (set != null) {\n      prs.set(entry.exercise, set);\n    }\n  }\n  return prs;\n}\n\nexport function History_findAllUsedExerciseTypes(history: IHistoryRecord[]): Partial<Record<string, IExerciseType>> {\n  const set: Partial<Record<string, IExerciseType>> = {};\n  for (const record of history) {\n    for (const entry of record.entries) {\n      set[Exercise_toKey(entry.exercise)] = entry.exercise;\n    }\n  }\n  return set;\n}\n\nexport function History_collectMinAndMaxTime(): ICollectorFn<IHistoryRecord, { minTime: number; maxTime: number }> {\n  return {\n    fn: (acc, hr) => {\n      if (acc.maxTime < hr.startTime) {\n        acc.maxTime = hr.startTime;\n      }\n      if (acc.minTime > hr.startTime) {\n        acc.minTime = hr.startTime;\n      }\n      return acc;\n    },\n    initial: { maxTime: 0, minTime: Infinity },\n  };\n}\n\nexport function History_collectProgramChangeTimes(): ICollectorFn<\n  IHistoryRecord,\n  {\n    currentProgram?: string;\n    changeProgramTimes: [number, string][];\n  }\n> {\n  return {\n    fn: (acc, hr) => {\n      if (!acc.currentProgram || acc.currentProgram !== hr.programName) {\n        acc.currentProgram = hr.programName;\n        acc.changeProgramTimes.push([new Date(Date.parse(hr.date)).getTime() / 1000, acc.currentProgram]);\n      }\n      return acc;\n    },\n    initial: { changeProgramTimes: [] },\n  };\n}\n\nexport function History_collectMuscleGroups(\n  settings: ISettings\n): ICollectorFn<IHistoryRecord, Record<IScreenMuscle | \"total\", [number[], number[], number[]]>> {\n  return {\n    fn: (acc, hr) => {\n      for (const entry of hr.entries) {\n        const exercise = Exercise_get(entry.exercise, settings.exercises);\n        const targetMuscleGroups = Exercise_targetMusclesGroups(exercise, settings);\n        const synergistMuscleGroups = Exercise_synergistMusclesGroups(exercise, settings);\n        const synergistMuscleGroupToMultiplier = Exercise_synergistMusclesGroupMultipliers(exercise, settings);\n        for (const muscleGroup of [...Muscle_getAvailableMuscleGroups(settings), \"total\"] as const) {\n          let multiplier = 0;\n          if (muscleGroup === \"total\") {\n            multiplier = 1;\n          } else if (targetMuscleGroups.indexOf(muscleGroup) !== -1) {\n            multiplier = 1;\n          } else if (synergistMuscleGroups.indexOf(muscleGroup) !== -1) {\n            multiplier = synergistMuscleGroupToMultiplier[muscleGroup] ?? settings.planner.synergistMultiplier;\n          }\n          if (multiplier === 0) {\n            continue;\n          }\n          acc[muscleGroup] = acc[muscleGroup] || [[], [], []];\n          const muscleGroupAcc = acc[muscleGroup];\n          const date = new Date(hr.startTime);\n          const lastTs = muscleGroupAcc[0][muscleGroupAcc[0]?.length - 1];\n          const finishedSets = entry.sets.filter((s) => (s.completedReps || 0) > 0);\n          if (lastTs == null) {\n            muscleGroupAcc[0].push(Math.round(date.getTime() / 1000));\n            muscleGroupAcc[1].push(0);\n            muscleGroupAcc[2].push(0);\n          } else {\n            const lastDate = new Date(lastTs * 1000);\n            const beginningOfWeekForDate = DateUtils_firstDayOfWeekTimestamp(date, settings.startWeekFromMonday);\n            const beginningOfWeekForLastDate = DateUtils_firstDayOfWeekTimestamp(\n              lastDate,\n              settings.startWeekFromMonday\n            );\n            if (beginningOfWeekForDate !== beginningOfWeekForLastDate) {\n              muscleGroupAcc[0].push(Math.round(date.getTime() / 1000));\n              muscleGroupAcc[1].push(0);\n              muscleGroupAcc[2].push(0);\n            }\n          }\n          muscleGroupAcc[1][muscleGroupAcc[1].length - 1] +=\n            Reps_volume(finishedSets, settings.units).value *\n            multiplier *\n            Exercise_getVolumeMultiplier(entry.exercise, settings);\n          muscleGroupAcc[2][muscleGroupAcc[2].length - 1] += finishedSets.length * multiplier;\n        }\n      }\n      return acc;\n    },\n    initial: {},\n  };\n}\n\nexport function History_collectAllUsedExerciseTypes(): ICollectorFn<\n  IHistoryRecord,\n  Partial<Record<string, IExerciseType>>\n> {\n  return {\n    fn: (acc, hr) => {\n      for (const entry of hr.entries) {\n        acc[Exercise_toKey(entry.exercise)] = entry.exercise;\n      }\n      return acc;\n    },\n    initial: {},\n  };\n}\n\nexport function History_collectAllHistoryRecordsOfExerciseType(\n  exerciseType: IExerciseType\n): ICollectorFn<IHistoryRecord, IHistoryRecord[]> {\n  return {\n    fn: (acc, hr) => {\n      const hasExercise = hr.entries.some((e) => Exercise_eq(e.exercise, exerciseType));\n      if (hasExercise) {\n        acc.push(hr);\n      }\n      return acc;\n    },\n    initial: [],\n  };\n}\n\nexport function History_collectLastEntry(\n  startTime: number,\n  exerciseType: IExerciseType\n): ICollectorFn<\n  IHistoryRecord,\n  { lastHistoryEntry?: IHistoryEntry; lastHistoryRecord?: IHistoryRecord; timestamp?: number }\n> {\n  return {\n    fn: (acc, hr) => {\n      const time = hr.endTime ?? hr.startTime;\n      if (time < startTime && (acc.timestamp == null || time > acc.timestamp)) {\n        const entry = hr.entries.find((e) => Exercise_eq(e.exercise, exerciseType) && Reps_isStarted(e.sets));\n        if (entry) {\n          acc = { lastHistoryEntry: entry, lastHistoryRecord: hr, timestamp: time };\n        }\n      }\n      return acc;\n    },\n    initial: {},\n  };\n}\n\nexport function History_collectLastNote(\n  startTime: number,\n  exerciseType: IExerciseType\n): ICollectorFn<IHistoryRecord, { lastNote?: string; timestamp?: number }> {\n  return {\n    fn: (acc, hr) => {\n      const time = hr.endTime ?? hr.startTime;\n      const twoMonthsAgo = startTime - 60 * 24 * 60 * 60 * 1000;\n      if (time < startTime && time > twoMonthsAgo && (acc.timestamp == null || time > acc.timestamp)) {\n        const entry = hr.entries.find((e) => Exercise_eq(e.exercise, exerciseType));\n        if (entry && entry.notes) {\n          acc = { lastNote: entry.notes, timestamp: time };\n        }\n      }\n      return acc;\n    },\n    initial: {},\n  };\n}\n\nexport interface IPrevExerciseData {\n  lastEntry?: IHistoryEntry;\n  lastEntryTimestamp?: number;\n  lastWarmupEntry?: IHistoryEntry;\n  lastWarmupEntryTimestamp?: number;\n  lastNote?: string;\n  lastNoteTimestamp?: number;\n  sameDayEntry?: IHistoryEntry;\n  sameDayTimestamp?: number;\n  bestByReps: Partial<Record<number, IPrevBestSet>>;\n  bestAmrap?: IPrevBestSet;\n  count: number;\n}\n\nexport interface IPrevBestSet {\n  set: ISet;\n  timestamp: number;\n}\n\nfunction History_amrapScore(set: ISet, weight: IWeight, reps: number): number {\n  return Weight_convertTo(Weight_getOneRepMax(weight, reps, set.completedRpe), \"lb\").value;\n}\n\nfunction History_bothSidesReps(set: ISet): number | undefined {\n  if (set.completedReps == null || set.completedRepsLeft == null) {\n    return set.completedReps;\n  }\n  return Math.min(set.completedReps, set.completedRepsLeft);\n}\n\nfunction History_recordBestSets(data: IPrevExerciseData, set: ISet, time: number): void {\n  const weight = set.completedWeight;\n  const reps = History_bothSidesReps(set);\n  if (!set.isCompleted || weight == null || reps == null || reps <= 0) {\n    return;\n  }\n  const byReps = data.bestByReps[reps];\n  const byRepsWeight = byReps?.set.completedWeight;\n  if (\n    byReps == null ||\n    byRepsWeight == null ||\n    Weight_gt(weight, byRepsWeight) ||\n    (Weight_eq(weight, byRepsWeight) && time > byReps.timestamp)\n  ) {\n    data.bestByReps[reps] = { set, timestamp: time };\n  }\n  if (set.isAmrap) {\n    const amrap = data.bestAmrap;\n    const amrapWeight = amrap?.set.completedWeight;\n    const amrapReps = amrap?.set.completedReps;\n    const score = History_amrapScore(set, weight, reps);\n    const amrapScore =\n      amrap != null && amrapWeight != null && amrapReps != null\n        ? History_amrapScore(amrap.set, amrapWeight, amrapReps)\n        : undefined;\n    if (amrapScore == null || score > amrapScore || (score === amrapScore && amrap != null && time > amrap.timestamp)) {\n      data.bestAmrap = { set, timestamp: time };\n    }\n  }\n}\n\nexport type IPrevExerciseSameDay = Pick<IHistoryRecord, \"programId\" | \"day\" | \"week\" | \"dayInWeek\">;\n\n// Records written before `week` and `dayInWeek` existed carry only the absolute `day`.\nfunction History_isSameProgramDay(record: IHistoryRecord, sameDay: IPrevExerciseSameDay): boolean {\n  if (record.programId !== sameDay.programId) {\n    return false;\n  }\n  if (record.week != null && record.dayInWeek != null && sameDay.week != null && sameDay.dayInWeek != null) {\n    return record.week === sameDay.week && record.dayInWeek === sameDay.dayInWeek;\n  }\n  return record.day === sameDay.day;\n}\n\n// One pass over the whole history producing, per exercise key, the data each workout-exercise card\n// needs for its first paint: the previous started entry (for \"last time\" set values), the recent\n// note, and how many past records contain the exercise. The workout screen builds this once and\n// shares it across all exercise tabs — replacing the per-card O(total history) scans (collectLastEntry\n// + collectLastNote + collectAllHistoryRecordsOfExerciseType) that were the dominant source of\n// mount-frame jank for users with large histories. Mirrors the semantics of those three collectors.\nexport function History_buildPrevExerciseData(\n  history: IHistoryRecord[],\n  beforeTime: number,\n  sameDay?: IPrevExerciseSameDay,\n  onlyKeys?: ReadonlySet<string>\n): Record<string, IPrevExerciseData> {\n  const twoMonthsAgo = beforeTime - 60 * 24 * 60 * 60 * 1000;\n  const result: Record<string, IPrevExerciseData> = {};\n  for (const hr of history) {\n    const time = hr.endTime ?? hr.startTime;\n    const isBefore = time < beforeTime;\n    const isSameDay = sameDay != null && History_isSameProgramDay(hr, sameDay);\n    const seenKeys = new Set<string>();\n    for (const entry of hr.entries) {\n      const key = Exercise_toKey(entry.exercise);\n      if (onlyKeys != null && !onlyKeys.has(key)) {\n        continue;\n      }\n      let data = result[key];\n      if (data == null) {\n        data = { count: 0, bestByReps: {} };\n        result[key] = data;\n      }\n      if (!seenKeys.has(key)) {\n        seenKeys.add(key);\n        data.count += 1;\n      }\n      if (\n        isBefore &&\n        Reps_isStarted(entry.sets) &&\n        (data.lastEntryTimestamp == null || time > data.lastEntryTimestamp)\n      ) {\n        data.lastEntry = entry;\n        data.lastEntryTimestamp = time;\n      }\n      if (\n        isBefore &&\n        Reps_isStarted(entry.warmupSets) &&\n        (data.lastWarmupEntryTimestamp == null || time > data.lastWarmupEntryTimestamp)\n      ) {\n        data.lastWarmupEntry = entry;\n        data.lastWarmupEntryTimestamp = time;\n      }\n      if (\n        isBefore &&\n        isSameDay &&\n        Reps_isStarted(entry.sets) &&\n        (data.sameDayTimestamp == null || time > data.sameDayTimestamp)\n      ) {\n        data.sameDayEntry = entry;\n        data.sameDayTimestamp = time;\n      }\n      if (isBefore) {\n        for (const set of entry.sets) {\n          History_recordBestSets(data, set, time);\n        }\n      }\n      if (\n        isBefore &&\n        entry.notes &&\n        time > twoMonthsAgo &&\n        (data.lastNoteTimestamp == null || time > data.lastNoteTimestamp)\n      ) {\n        data.lastNote = entry.notes;\n        data.lastNoteTimestamp = time;\n      }\n    }\n  }\n  return result;\n}\n\n// Same \"last started entry for this exercise\" question History_buildPrevExerciseData answers, but for\n// a single exercise the user just picked, so it doesn't pay for a map over every exercise they've ever\n// done. `excludeRecordId` skips the record being edited — when you edit a past workout, `progress` is\n// itself a history record, and without this it would seed its own weights from itself.\nexport function History_findLastEntryForExerciseType(\n  history: IHistoryRecord[],\n  exerciseType: IExerciseType,\n  excludeRecordId?: number\n): IHistoryEntry | undefined {\n  let result: IHistoryEntry | undefined;\n  let resultTime: number | undefined;\n  for (const hr of history) {\n    if (hr.id === excludeRecordId) {\n      continue;\n    }\n    const time = hr.endTime ?? hr.startTime;\n    if (resultTime != null && time <= resultTime) {\n      continue;\n    }\n    const entry = hr.entries.find((e) => Exercise_eq(e.exercise, exerciseType) && Reps_isStarted(e.sets));\n    if (entry != null) {\n      result = entry;\n      resultTime = time;\n    }\n  }\n  return result;\n}\n\nexport function History_collectWeightPersonalRecord(\n  exerciseType: IExerciseType,\n  unit: IUnit\n): ICollectorFn<IHistoryRecord, { maxWeight: IWeight; maxWeightHistoryRecord?: IHistoryRecord }> {\n  return {\n    fn: (acc, hr) => {\n      const entries = hr.entries.filter((e) => Exercise_eq(e.exercise, exerciseType));\n      const maxSet = History_getMaxWeightSet(entries.flatMap((e) => e.sets));\n      if (maxSet != null) {\n        const weight = maxSet.completedWeight ?? maxSet.weight ?? Weight_build(0, unit);\n        if (Weight_gt(weight, acc.maxWeight)) {\n          acc = { maxWeight: weight, maxWeightHistoryRecord: hr };\n        }\n      }\n      return acc;\n    },\n    initial: { maxWeight: Weight_build(0, unit) },\n  };\n}\n\nexport function History_collect1RMPersonalRecord(\n  exerciseType: IExerciseType,\n  unit: IUnit\n): ICollectorFn<IHistoryRecord, { max1RM: IWeight; max1RMHistoryRecord?: IHistoryRecord; max1RMSet?: ISet }> {\n  return {\n    fn: (acc, hr) => {\n      const entries = hr.entries.filter((e) => Exercise_eq(e.exercise, exerciseType));\n      const allSets = entries.flatMap((e) => e.sets);\n      const all1RMs = allSets.map<[ISet, IWeight]>((s) => [\n        s,\n        Weight_getOneRepMax(s.completedWeight ?? s.weight ?? Weight_build(0, unit), s.completedReps || 0),\n      ]);\n      const max1RM = CollectionUtils_sort(all1RMs, (a, b) => Weight_compare(b[1], a[1]))[0];\n      if (max1RM != null && Weight_gt(max1RM[1], acc.max1RM)) {\n        acc = { max1RM: max1RM[1], max1RMHistoryRecord: hr, max1RMSet: max1RM[0] };\n      }\n      return acc;\n    },\n    initial: { max1RM: Weight_build(0, unit) },\n  };\n}\n\nexport function History_findAllMaxSetsPerId(history: IHistoryRecord[]): Partial<Record<string, ISet>> {\n  const maxSets: Partial<Record<string, ISet>> = {};\n  for (const r of history) {\n    for (const e of r.entries) {\n      const entryMaxSet = History_getMaxWeightSetFromEntry(e);\n      const key = Exercise_toKey(e.exercise);\n      if (entryMaxSet != null && (entryMaxSet.completedReps || 0) > 0) {\n        if (maxSets[key] == null || Weight_lt(maxSets[key].weight || 0, entryMaxSet.weight ?? Weight_build(0, \"lb\"))) {\n          maxSets[key] = entryMaxSet;\n        }\n      }\n    }\n  }\n  return maxSets;\n}\n\nexport function History_getHistoryRecordsForTimerange(\n  history: IHistoryRecord[],\n  date: number,\n  type: \"month\" | \"week\" | \"day\",\n  startWeekFromMonday?: boolean\n): IHistoryRecord[] {\n  // For given date, get the start and end of the timerange, and return history records that fall within that range\n  const start = new Date(date);\n  const end = new Date(date);\n  if (type === \"month\") {\n    start.setDate(1);\n    end.setMonth(end.getMonth() + 1);\n    end.setDate(0);\n  } else if (type === \"week\") {\n    start.setDate(start.getDate() - start.getDay() + (startWeekFromMonday ? 1 : 0));\n    end.setDate(start.getDate() + 6);\n  } else if (type === \"day\") {\n    start.setHours(0, 0, 0, 0);\n  }\n  end.setHours(23, 59, 59, 999);\n  return history.filter((hr) => {\n    if (Progress_isCurrent(hr)) {\n      return false;\n    }\n    const recordDate = Date.parse(hr.date);\n    const startTime = new Date(recordDate);\n    return startTime >= start && startTime < end;\n  });\n}\n\nexport function History_getNumberOfPersonalRecords(history: IHistoryRecord[], prs: IPersonalRecords): number {\n  return history.reduce((memo, r) => {\n    return memo + ObjectUtils_keys(prs[r.id] || {})?.length;\n  }, 0);\n}\n\nexport function History_findMaxSet(exerciseType: IExerciseType, history: IHistoryRecord[]): ISet | undefined {\n  let maxSet: ISet | undefined = undefined;\n  for (const r of history) {\n    for (const e of r.entries) {\n      if (Exercise_eq(e.exercise, exerciseType)) {\n        const entryMaxSet = History_getMaxWeightSetFromEntry(e);\n        if (entryMaxSet != null && (entryMaxSet.completedReps || 0) > 0) {\n          if (\n            maxSet == null ||\n            Weight_gt(entryMaxSet.weight ?? Weight_build(0, \"lb\"), maxSet.weight ?? Weight_build(0, \"lb\"))\n          ) {\n            maxSet = entryMaxSet;\n          }\n        }\n      }\n    }\n  }\n  return maxSet;\n}\n\nexport function History_findPersonalRecord(\n  id: number,\n  entry: IHistoryEntry,\n  history: IHistoryRecord[]\n): ISet | undefined {\n  let isMax: boolean | undefined;\n  const entryMaxSet = History_getMaxWeightSetFromEntry(entry);\n  if (entryMaxSet != null && (entryMaxSet.completedReps || 0) > 0) {\n    for (const r of history) {\n      if (r.id < id) {\n        for (const e of r.entries) {\n          if (e.exercise.id === entry.exercise.id && e.exercise.equipment === entry.exercise.equipment) {\n            if (isMax == null) {\n              isMax = true;\n            }\n            const maxSet = History_getMaxWeightSetFromEntry(e);\n            if (\n              maxSet != null &&\n              Weight_gte(maxSet.weight ?? Weight_build(0, \"lb\"), entryMaxSet.weight ?? Weight_build(0, \"lb\"))\n            ) {\n              isMax = false;\n            }\n          }\n        }\n      }\n    }\n  } else {\n    isMax = false;\n  }\n  if (isMax == null || isMax === true) {\n    return entryMaxSet;\n  } else {\n    return undefined;\n  }\n}\n\nexport function History_totalRecordWeight(record: IHistoryRecord, settings: ISettings): IWeight {\n  return record.entries.reduce(\n    (memo, e) => Weight_add(memo, History_totalEntryWeight(e, settings)),\n    Weight_build(0, settings.units)\n  );\n}\n\nexport function History_totalRecordReps(record: IHistoryRecord): number {\n  return record.entries.reduce((memo, e) => memo + History_totalEntryReps(e), 0);\n}\n\nexport function History_totalRecordSets(record: IHistoryRecord): number {\n  return record.entries.reduce((memo, e) => memo + History_totalEntrySets(e), 0);\n}\n\nexport function History_totalEntryWeight(entry: IHistoryEntry, settings: ISettings): IWeight {\n  const unit = settings.units;\n  const volume = entry.sets\n    .filter((s) => (s.completedReps || 0) > 0)\n    .reduce((memo, set) => Weight_add(memo, Reps_setVolume(set, unit)), Weight_build(0, unit));\n  return Weight_multiply(volume, Exercise_getVolumeMultiplier(entry.exercise, settings));\n}\n\nexport function History_totalEntryReps(entry: IHistoryEntry): number {\n  return entry.sets.reduce((memo, set) => memo + (set.completedReps || 0), 0);\n}\n\nexport function History_totalEntrySets(entry: IHistoryEntry): number {\n  return History_getFinishedSets(entry).length;\n}\n\nexport function History_getStartedEntries(record: IHistoryRecord): IHistoryEntry[] {\n  return record.entries.filter((e) => e.sets.filter((s) => (s.completedReps || 0) > 0).length > 0);\n}\n\nexport function History_getFinishedSets(entry: IHistoryEntry): ISet[] {\n  return entry.sets.filter((s) => Reps_isFinishedSet(s));\n}\n\nexport function History_getHistoricalSameDay(\n  history: IHistoryRecord[],\n  progress: IHistoryRecord,\n  currentEntry: IHistoryEntry\n): IHistoryRecordAndEntry | undefined {\n  for (const record of history) {\n    if (record.day === progress.day) {\n      for (const entry of record.entries) {\n        if (\n          Exercise_eq(currentEntry.exercise, entry.exercise) &&\n          entry.sets.length > 0 &&\n          entry.sets.some((s) => (s.completedReps || 0) > 0)\n        ) {\n          return { record, entry };\n        }\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function History_getHistoricalLastDay(\n  history: IHistoryRecord[],\n  currentEntry: IHistoryEntry\n): IHistoryRecordAndEntry | undefined {\n  for (const record of history) {\n    for (const entry of record.entries) {\n      if (\n        Exercise_eq(currentEntry.exercise, entry.exercise) &&\n        entry.sets.length > 0 &&\n        entry.sets.some((s) => (s.completedReps || 0) > 0)\n      ) {\n        return { record, entry };\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function History_calories(historyRecord: IHistoryRecord): number {\n  const timeMs = History_workoutTime(historyRecord);\n  const minutes = Math.floor(timeMs / 60000);\n  return minutes * 6;\n}\n\nexport function History_getHistoricalAmrapSets(\n  history: IHistoryRecord[],\n  currentEntry: IHistoryEntry,\n  nextSet?: ISet\n): { last: [ISet, number]; max: [ISet, number] } | undefined {\n  if (!nextSet?.isAmrap) {\n    return undefined;\n  }\n  let last: [ISet, number] | undefined;\n  let max: [ISet, number] | undefined;\n  for (const record of history) {\n    for (const entry of record.entries) {\n      if (Exercise_eq(currentEntry.exercise, entry.exercise)) {\n        for (const set of entry.sets) {\n          if (\n            set.isAmrap &&\n            set.reps === nextSet.reps &&\n            Weight_eq(set.weight ?? Weight_build(0, \"lb\"), nextSet.weight ?? Weight_build(0, \"lb\"))\n          ) {\n            if (last == null) {\n              last = [set, record.startTime];\n            }\n            if (max == null || (set.completedReps || 0) > (max[0].completedReps || 0)) {\n              max = [set, record.startTime];\n            }\n          }\n        }\n      }\n    }\n  }\n  return last != null && max != null ? { last, max } : undefined;\n}\n\nexport function History_exportAsCSV(history: IHistoryRecord[], settings: ISettings): (string | number | null)[][] {\n  const lines: (string | number | null)[][] = [\n    [\n      \"Workout DateTime\",\n      \"Program\",\n      \"Day Name\",\n      \"Exercise\",\n      \"Is Warmup Set?\",\n      \"Required Reps\",\n      \"Completed Reps\",\n      \"Is AMRAP?\",\n      \"Required RPE\",\n      \"Completed RPE\",\n      \"Log RPE?\",\n      \"Required Weight Value\",\n      \"Required Weight Unit\",\n      \"Completed Weight Value\",\n      \"Completed Weight Unit\",\n      \"Ask Weight?\",\n      \"Completed Reps Time\",\n      \"Target Muscles\",\n      \"Synergist Muscles\",\n      \"Notes\",\n      \"Completed Reps Left\",\n      \"Required Set Time Seconds\",\n      \"Is Overflow Set Time?\",\n      \"Completed Set Time Seconds\",\n      \"Completed Set Time Left Seconds\",\n    ],\n  ];\n\n  for (const historyRecord of history) {\n    for (const entry of historyRecord.entries) {\n      const exercise = Exercise_get(entry.exercise, settings.exercises);\n      const setsWithWarmupFlag: [ISet, number][] = [\n        ...entry.warmupSets.map((s): [ISet, number] => [s, 1]),\n        ...entry.sets.map((s): [ISet, number] => [s, 0]),\n      ];\n      for (const [set, isWarmup] of setsWithWarmupFlag) {\n        lines.push([\n          historyRecord.date,\n          historyRecord.programName,\n          historyRecord.dayName,\n          Exercise_fullName(exercise, settings),\n          isWarmup,\n          set.reps ?? null,\n          set.completedReps ?? null,\n          set.isAmrap ? 1 : 0,\n          set.rpe ?? null,\n          set.completedRpe ?? null,\n          set.logRpe ? 1 : 0,\n          set.weight?.value ?? null,\n          set.weight?.unit ?? null,\n          set.completedWeight?.value ?? null,\n          set.completedWeight?.unit ?? null,\n          set.askWeight ? 1 : 0,\n          set.timestamp != null ? new Date(set.timestamp || 0).toISOString() : null,\n          Exercise_targetMuscles(exercise, settings).join(\",\"),\n          Exercise_synergistMuscles(exercise, settings).join(\",\"),\n          entry.notes ?? \"\",\n          set.completedRepsLeft ?? null,\n          set.setTimer ?? null,\n          set.isOverflowSetTimer ? 1 : 0,\n          set.completedSetTimer ?? null,\n          set.completedSetTimerLeft ?? null,\n        ]);\n      }\n    }\n  }\n\n  return lines;\n}\n\nexport function History_pauseWorkoutState(dispatch: IDispatch): void {\n  const lensGetters = { progress: lb<IState>().p(\"storage\").pi(\"progress\").get() };\n  updateState(\n    dispatch,\n    [\n      lbu<IState, typeof lensGetters>(lensGetters)\n        .p(\"storage\")\n        .pi(\"progress\")\n        .i(0)\n        .p(\"intervals\")\n        .recordModify((intervals, getters) => History_pauseWorkout(getters.progress?.[0].intervals)),\n    ],\n    \"Pause workout\"\n  );\n}\n\nexport function History_pauseWorkout(intervals?: IIntervals): IIntervals | undefined {\n  if (intervals && !History_isPaused(intervals)) {\n    const newIntervals = intervals ? ObjectUtils_clone(intervals) : [];\n    let lastInterval = newIntervals[newIntervals.length - 1];\n    if (lastInterval == null) {\n      lastInterval = [Date.now(), undefined];\n      newIntervals.push(lastInterval);\n    }\n    lastInterval[1] = Date.now();\n    return newIntervals;\n  } else {\n    return intervals;\n  }\n}\n\nexport function History_isPaused(intervals?: IIntervals): boolean {\n  return intervals ? intervals.length === 0 || intervals[intervals.length - 1][1] != null : false;\n}\n\nexport function History_resumeWorkout(\n  effects: INativeEffect[],\n  historyRecord: IHistoryRecord,\n  isPlayground: boolean,\n  reminder: number | undefined,\n  hasSubscription: boolean\n): IIntervals | undefined {\n  const intervals = historyRecord.intervals;\n  if (History_isPaused(intervals)) {\n    const isStart = !intervals || intervals.length === 0;\n    if (!isPlayground && Progress_isCurrent(historyRecord)) {\n      effects.push({ type: \"resumeWorkout\", reminder: reminder || 0, isStart, hasSubscription });\n    }\n    const newIntervals = intervals ? ObjectUtils_clone(intervals) : [];\n    newIntervals.push([Date.now(), undefined]);\n    return newIntervals;\n  } else {\n    return intervals;\n  }\n}\n\nexport function History_workoutTime(\n  historyRecord: Pick<IHistoryRecord, \"startTime\" | \"endTime\" | \"intervals\">\n): number {\n  const intervals = historyRecord.intervals || [[historyRecord.startTime, historyRecord.endTime || Date.now()]];\n  return intervals.reduce((memo, interval) => {\n    return memo + ((interval[1] || Date.now()) - interval[0]);\n  }, 0);\n}\n\nexport const History_getDateToHistory = memoize(\n  (history: IHistoryRecord[]): Partial<Record<string, IHistoryRecord>> => {\n    return history.reduce<Partial<Record<string, IHistoryRecord>>>((memo, hr) => {\n      memo[DateUtils_formatYYYYMMDD(hr.date)] = hr;\n      return memo;\n    }, {});\n  },\n  { maxSize: 10 }\n);\n\nexport const History_getPersonalRecords = memoize(\n  (history: IHistoryRecord[]): IPersonalRecords => {\n    const result: IPersonalRecords = {};\n    const sortedHistory = CollectionUtils_sortByExpr(history, (hr) => hr.endTime ?? hr.startTime);\n    const max1RMSets: Partial<Record<string, ISet | undefined>> = {};\n    const maxWeightSets: Partial<Record<string, ISet | undefined>> = {};\n    for (const record of sortedHistory) {\n      for (const entry of record.entries) {\n        const key = Exercise_toKey(entry.exercise);\n\n        const thisMaxWeightSet = History_getMaxWeightSetFromEntry(entry);\n        const thisMaxWeight = thisMaxWeightSet\n          ? (thisMaxWeightSet.completedWeight ?? thisMaxWeightSet.weight)\n          : undefined;\n        const lastMaxWeight = maxWeightSets[key]?.completedWeight ?? maxWeightSets[key]?.weight;\n        if (thisMaxWeight != null && (lastMaxWeight == null || Weight_gt(thisMaxWeight, lastMaxWeight))) {\n          const prevMaxWeightSet = maxWeightSets[key];\n          maxWeightSets[key] = thisMaxWeightSet;\n          result[record.id] = result[record.id] || {};\n          result[record.id]![key] = result[record.id]![key] || {};\n          result[record.id]![key]!.prevMaxWeightSet = prevMaxWeightSet;\n          result[record.id]![key]!.maxWeightSet = thisMaxWeightSet;\n        }\n\n        const thisMax1RMSet = History_getMax1RMSetFromEntry(entry);\n        const thisMax1RM = thisMax1RMSet\n          ? Weight_getOneRepMax(\n              thisMax1RMSet.completedWeight ?? thisMax1RMSet.weight ?? Weight_build(0, \"lb\"),\n              Reps_avgUnilateralCompletedReps(thisMax1RMSet) || 0,\n              thisMax1RMSet.completedRpe ?? thisMax1RMSet.rpe\n            )\n          : undefined;\n        const lastMax1RMSet = max1RMSets[key];\n        const lastMax1RM = lastMax1RMSet\n          ? Weight_getOneRepMax(\n              lastMax1RMSet.completedWeight ?? lastMax1RMSet.weight ?? Weight_build(0, \"lb\"),\n              lastMax1RMSet ? Reps_avgUnilateralCompletedReps(lastMax1RMSet) || 0 : 0,\n              lastMax1RMSet.completedRpe ?? lastMax1RMSet.rpe\n            )\n          : undefined;\n        if (thisMax1RM != null && (lastMax1RM == null || Weight_gt(thisMax1RM, lastMax1RM))) {\n          const prevMax1RMSet = max1RMSets[key];\n          max1RMSets[key] = thisMax1RMSet;\n          result[record.id] = result[record.id] || {};\n          result[record.id]![key] = result[record.id]![key] || {};\n          result[record.id]![key]!.prevMax1RMSet = prevMax1RMSet;\n          result[record.id]![key]!.max1RMSet = thisMax1RMSet;\n        }\n      }\n    }\n    return result;\n  },\n  { maxSize: 10 }\n);\n\nexport interface IGraphsAggregates {\n  sortedHistory: IHistoryRecord[];\n  muscleGroupsData: Record<IScreenMuscle | \"total\", [number[], number[], number[]]>;\n  programChangeTimes: { currentProgram?: string; changeProgramTimes: [number, string][] };\n}\n\n// Aggregates used by the Graphs screen. Memoized by history+settings refs (lens-shmens\n// gives us stable refs for unchanged subtrees), so this returns instantly across screen\n// mount/unmount cycles. Also called from App.native.tsx during idle time to warm the\n// cache so the first Graphs visit is fast.\nexport const History_getGraphsAggregates = memoize(\n  (history: IHistoryRecord[], settings: ISettings): IGraphsAggregates => {\n    const sortedHistory = CollectionUtils_sort(history, (a, b) => {\n      return new Date(Date.parse(a.date)).getTime() - new Date(Date.parse(b.date)).getTime();\n    });\n    const [muscleGroupsData, programChangeTimes] = Collector.build(sortedHistory)\n      .addFn(History_collectMuscleGroups(settings))\n      .addFn(History_collectProgramChangeTimes())\n      .run();\n    return { sortedHistory, muscleGroupsData, programChangeTimes };\n  },\n  { maxSize: 5 }\n);\n\nexport interface IHomeWeekData {\n  firstDayOfWeeks: number[];\n  firstDayOfWeekToHistoryRecord: Partial<Record<number, IHistoryRecord>>;\n  historyRecordDateToFirstDayOfWeek: Partial<Record<number, number>>;\n}\n\nfunction buildHomeWeekData(history: IHistoryRecord[], startWeekFromMonday: boolean): IHomeWeekData {\n  const firstDayOfWeeksSet: Set<number> = new Set();\n  const historyRecordDateToFirstDayOfWeek: Partial<Record<number, number>> = {};\n  const firstDayOfWeekToHistoryRecord: Partial<Record<number, IHistoryRecord>> = {};\n  for (const record of history) {\n    if (!Progress_isCurrent(record)) {\n      const firstDayOfWeek = DateUtils_firstDayOfWeekTimestamp(record.endTime ?? record.startTime, startWeekFromMonday);\n      if (firstDayOfWeekToHistoryRecord[firstDayOfWeek] == null) {\n        firstDayOfWeekToHistoryRecord[firstDayOfWeek] = record;\n      }\n      firstDayOfWeeksSet.add(firstDayOfWeek);\n      historyRecordDateToFirstDayOfWeek[record.id] = firstDayOfWeek;\n    }\n  }\n  if (firstDayOfWeeksSet.size === 0) {\n    const today = new Date();\n    const firstDayOfWeek = DateUtils_firstDayOfWeekTimestamp(today.getTime(), startWeekFromMonday);\n    firstDayOfWeeksSet.add(firstDayOfWeek);\n  }\n  return {\n    firstDayOfWeeks: CollectionUtils_sort(Array.from(firstDayOfWeeksSet)),\n    historyRecordDateToFirstDayOfWeek,\n    firstDayOfWeekToHistoryRecord,\n  };\n}\n\nexport interface IHomeAggregates {\n  sortedHistoryDesc: IHistoryRecord[];\n  weeksData: IHomeWeekData;\n  prs: IPersonalRecords;\n}\n\nexport const History_getHomeAggregates = memoize(\n  (history: IHistoryRecord[], startWeekFromMonday: boolean): IHomeAggregates => {\n    const sortedHistoryDesc = CollectionUtils_sort(history, (a, b) => {\n      return new Date(Date.parse(b.date)).getTime() - new Date(Date.parse(a.date)).getTime();\n    });\n    const weeksData = buildHomeWeekData(sortedHistoryDesc, startWeekFromMonday);\n    const prs = History_getPersonalRecords(history);\n    return { sortedHistoryDesc, weeksData, prs };\n  },\n  { maxSize: 3 }\n);\n","import { IAllCustomExercises, ICustomExercise, IHistoryRecord, IImportSession, IStorage } from \"../types\";\nimport { CollectionUtils_sortBy, CollectionUtils_uniqBy } from \"../utils/collection\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { Exercise_deleteCustomExercise } from \"./exercise\";\nimport { History_deleteRecords } from \"./history\";\n\nconst maxImportSessions = 5;\n\nexport interface IAppliedImport {\n  history: IHistoryRecord[];\n  exercises: IAllCustomExercises;\n  importSessions: IImportSession[];\n}\n\nexport function ImportSession_apply(\n  storage: IStorage,\n  historyRecords: IHistoryRecord[],\n  customExercises: Record<string, ICustomExercise>,\n  source: IImportSession[\"source\"]\n): IAppliedImport {\n  const existingIds = new Set(storage.history.map((r) => r.id));\n  const history = CollectionUtils_sortBy(CollectionUtils_uniqBy(storage.history.concat(historyRecords), \"id\"), \"id\");\n  const addedHistoryIds = history.filter((r) => !existingIds.has(r.id)).map((r) => r.id);\n  const addedCustomExerciseIds = Object.keys(customExercises).filter((k) => storage.settings.exercises[k] == null);\n  // Only add custom exercises that don't already exist - an existing one with the same id may have\n  // been renamed/edited locally, and overwriting it would be silent and unrecoverable (undo can't\n  // restore it because it's excluded from the receipt as a pre-existing id).\n  const exercises = { ...storage.settings.exercises };\n  for (const id of addedCustomExerciseIds) {\n    exercises[id] = customExercises[id];\n  }\n  const session: IImportSession = {\n    vtype: \"import_session\",\n    id: UidFactory_generateUid(8),\n    timestamp: Date.now(),\n    source,\n    historyRecordIds: addedHistoryIds,\n    customExerciseIds: addedCustomExerciseIds,\n    workoutCount: addedHistoryIds.length,\n  };\n  return {\n    history,\n    exercises,\n    importSessions: [...(storage.importSessions ?? []), session].slice(-maxImportSessions),\n  };\n}\n\nexport function ImportSession_findEditedRecordIds(storage: IStorage, session: IImportSession): number[] {\n  const importedIds = new Set(session.historyRecordIds);\n  return storage.history\n    .filter((r) => importedIds.has(r.id) && r.updatedAt != null && r.updatedAt > session.timestamp)\n    .map((r) => r.id);\n}\n\nexport function ImportSession_undo(storage: IStorage, sessionId: string): IStorage | undefined {\n  const session = (storage.importSessions ?? []).find((s) => s.id === sessionId);\n  if (session == null) {\n    return undefined;\n  }\n  const undone = History_deleteRecords(storage, session.historyRecordIds);\n  let exercises = undone.settings.exercises;\n  for (const exerciseId of session.customExerciseIds) {\n    if (!isExerciseReferenced(undone, exerciseId)) {\n      exercises = Exercise_deleteCustomExercise(exercises, exerciseId);\n    }\n  }\n  return {\n    ...undone,\n    settings: { ...undone.settings, exercises },\n    importSessions: (undone.importSessions ?? []).filter((s) => s.id !== sessionId),\n  };\n}\n\nfunction isExerciseReferenced(storage: IStorage, exerciseId: string): boolean {\n  const exercise = storage.settings.exercises[exerciseId];\n  if (exercise == null) {\n    return false;\n  }\n  if (storage.history.concat(storage.progress).some((r) => r.entries.some((e) => e.exercise.id === exerciseId))) {\n    return true;\n  }\n  const name = exercise.name.toLowerCase();\n  return storage.programs.some((p) =>\n    (p.planner?.weeks ?? []).some((w) => w.days.some((d) => d.exerciseText.toLowerCase().includes(name)))\n  );\n}\n","import { ILength, ILengthUnit } from \"../types\";\n\nconst prebuiltLengths: Partial<Record<string, ILength>> = {};\n\nexport function Length_print(length: ILength): string {\n  return `${length.value}${Length_printUnit(length.unit)}`;\n}\n\nexport function Length_printUnit(lengthUnit: ILengthUnit): string {\n  return lengthUnit === \"in\" ? '\"' : lengthUnit;\n}\n\nexport function Length_build(value: number, unit: ILengthUnit): ILength {\n  const key = `${value}_${unit}`;\n  const prebuiltLength = prebuiltLengths[key];\n  if (prebuiltLength != null) {\n    return prebuiltLength;\n  } else {\n    const v = { value: typeof value === \"string\" ? parseFloat(value) : value, unit };\n    prebuiltLengths[`${value}_${unit}`] = v;\n    return v;\n  }\n}\n\nexport function Length_is(object: unknown): object is ILength {\n  const objLen = object as ILength;\n  return (\n    objLen &&\n    typeof objLen === \"object\" &&\n    \"unit\" in objLen &&\n    \"value\" in objLen &&\n    (objLen.unit === \"cm\" || objLen.unit === \"in\")\n  );\n}\n\nexport function Length_add(length: ILength, value: ILength): ILength {\n  return Length_operation(length, value, (a, b) => a + b);\n}\n\nexport function Length_subtract(length: ILength, value: ILength): ILength {\n  return Length_operation(length, value, (a, b) => a - b);\n}\n\nexport function Length_multiply(length: ILength, value: ILength): ILength {\n  return Length_operation(length, value, (a, b) => a * b);\n}\n\nexport function Length_divide(length: ILength, value: ILength): ILength {\n  return Length_operation(length, value, (a, b) => a / b);\n}\n\nexport function Length_gt(length: ILength, value: ILength): boolean {\n  return comparison(length, value, (a, b) => a > b);\n}\n\nexport function Length_lt(length: ILength, value: ILength): boolean {\n  return comparison(length, value, (a, b) => a < b);\n}\n\nexport function Length_gte(length: ILength, value: ILength): boolean {\n  return comparison(length, value, (a, b) => a >= b);\n}\n\nexport function Length_lte(length: ILength, value: ILength): boolean {\n  return comparison(length, value, (a, b) => a <= b);\n}\n\nexport function Length_eq(length: ILength, value: ILength): boolean {\n  return comparison(length, value, (a, b) => a === b);\n}\n\nexport function Length_eqeq(length: ILength, value: ILength): boolean {\n  return length.value === value.value && length.unit === value.unit;\n}\n\nexport function Length_convertTo(length: ILength, unit: ILengthUnit): ILength {\n  if (length.unit === unit) {\n    return length;\n  } else if (length.unit === \"in\" && unit === \"cm\") {\n    return Length_build(parseFloat((length.value * 2.54).toFixed(2)), unit);\n  } else {\n    return Length_build(parseFloat((length.value / 2.54).toFixed(2)), unit);\n  }\n}\n\nexport function Length_compare(a: ILength, b: ILength): number {\n  return a.value - Length_convertTo(b, a.unit).value;\n}\n\nexport function Length_compareReverse(a: ILength, b: ILength): number {\n  return Length_convertTo(b, a.unit).value - a.value;\n}\n\nfunction comparison(length: ILength, value: ILength, op: (a: number, b: number) => boolean): boolean {\n  return op(length.value, Length_convertTo(value, length.unit).value);\n}\n\nexport function Length_operation(length: ILength, value: ILength, op: (a: number, b: number) => number): ILength {\n  return Length_build(op(length.value, Length_convertTo(value, length.unit).value), length.unit);\n}\n","import {\n  IEvaluatedProgram,\n  IEvaluatedProgramDay,\n  Program_getProgramDayUsedExercises,\n  Program_nextHistoryEntry,\n} from \"./program\";\nimport {\n  Exercise_toKey,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n  Exercise_synergistMusclesGroupMultipliers,\n} from \"./exercise\";\nimport {\n  ObjectUtils_keys,\n  ObjectUtils_findMaxValue,\n  ObjectUtils_combinedKeys,\n  ObjectUtils_clone,\n} from \"../utils/object\";\nimport { ISettings, IMuscle, IDayData, IScreenMuscle, IStats, screenMuscles, IMuscleGroupsSettings } from \"../types\";\nimport { StringUtils_dashcase, StringUtils_capitalize } from \"../utils/string\";\nimport { IPlannerProgramExerciseWithType } from \"../pages/planner/models/types\";\nimport { SetUtils_areEqual } from \"../utils/setUtils\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\n\nexport type IScreenMusclePointsColl = Partial<Record<IScreenMuscle, number>>;\n\nexport interface IScreenMusclePoints {\n  strength: IScreenMusclePointsColl;\n  hypertrophy: IScreenMusclePointsColl;\n}\n\nexport type IExercisePointsColl = Partial<Record<string, IScreenMusclePointsColl>>;\n\nexport interface IExercisePoints {\n  strength: IExercisePointsColl;\n  hypertrophy: IExercisePointsColl;\n}\n\nexport interface IUnifiedPoints {\n  screenMusclePoints: IScreenMusclePointsColl;\n  exercisePoints: IExercisePointsColl;\n}\n\nexport interface IPoints {\n  screenMusclePoints: IScreenMusclePoints;\n  exercisePoints: IExercisePoints;\n}\n\nconst screenMuscleToMuscleMapping: Record<IScreenMuscle, IMuscle[]> = {\n  shoulders: [\n    \"Deltoid Anterior\",\n    \"Deltoid Lateral\",\n    \"Deltoid Posterior\",\n    \"Infraspinatus\",\n    \"Teres Major\",\n    \"Teres Minor\",\n  ],\n  triceps: [\"Triceps Brachii\"],\n  back: [\n    \"Erector Spinae\",\n    \"Latissimus Dorsi\",\n    \"Levator Scapulae\",\n    \"Trapezius Lower Fibers\",\n    \"Trapezius Middle Fibers\",\n    \"Trapezius Upper Fibers\",\n    \"Sternocleidomastoid\",\n    \"Splenius\",\n  ],\n  abs: [\"Obliques\", \"Rectus Abdominis\", \"Iliopsoas\"],\n  glutes: [\"Gluteus Maximus\", \"Gluteus Medius\", \"Tensor Fasciae Latae\"],\n  hamstrings: [\"Adductor Magnus\", \"Adductor Brevis\", \"Adductor Longus\", \"Hamstrings\"],\n  quadriceps: [\"Adductor Brevis\", \"Adductor Longus\", \"Pectineous\", \"Quadriceps\", \"Sartorius\"],\n  chest: [\"Pectoralis Major Clavicular Head\", \"Pectoralis Major Sternal Head\", \"Serratus Anterior\"],\n  biceps: [\"Biceps Brachii\", \"Brachialis\"],\n  calves: [\"Gastrocnemius\", \"Soleus\", \"Tibialis Anterior\"],\n  forearms: [\"Brachioradialis\", \"Wrist Extensors\", \"Wrist Flexors\"],\n};\n\nexport function Muscle_getEmptyScreenMusclesPoints(): IScreenMusclePointsColl {\n  return {\n    shoulders: 0,\n    triceps: 0,\n    back: 0,\n    abs: 0,\n    glutes: 0,\n    hamstrings: 0,\n    quadriceps: 0,\n    chest: 0,\n    biceps: 0,\n    calves: 0,\n    forearms: 0,\n  };\n}\n\nexport function Muscle_imageUrl(muscle: IMuscle): string {\n  return `/externalimages/muscles/muscle-${StringUtils_dashcase(muscle)}.jpeg`;\n}\n\nfunction normalize(obj: IScreenMusclePointsColl, maxValue: number): IScreenMusclePointsColl {\n  return ObjectUtils_keys(obj).reduce<IScreenMusclePointsColl>((memo, key) => {\n    memo[key] = (obj[key] || 0) / maxValue;\n    return memo;\n  }, {});\n}\n\nexport function Muscle_normalizePoints(points: IPoints): IPoints {\n  const maxValues = {\n    strength: ObjectUtils_findMaxValue(points.screenMusclePoints.strength),\n    hypertrophy: ObjectUtils_findMaxValue(points.screenMusclePoints.hypertrophy),\n  };\n  return {\n    screenMusclePoints: {\n      strength: normalize(points.screenMusclePoints.strength, maxValues.strength),\n      hypertrophy: normalize(points.screenMusclePoints.hypertrophy, maxValues.hypertrophy),\n    },\n    exercisePoints: {\n      strength: ObjectUtils_keys(points.exercisePoints.strength).reduce<IExercisePointsColl>((memo, key) => {\n        memo[key] = normalize(points.exercisePoints.strength[key]!, maxValues.strength);\n        return memo;\n      }, {}),\n      hypertrophy: ObjectUtils_keys(points.exercisePoints.hypertrophy).reduce<IExercisePointsColl>((memo, key) => {\n        memo[key] = normalize(points.exercisePoints.hypertrophy[key]!, maxValues.hypertrophy);\n        return memo;\n      }, {}),\n    },\n  };\n}\n\nexport function Muscle_normalizeUnifiedPoints(points: IUnifiedPoints): IUnifiedPoints {\n  const maxValues = ObjectUtils_findMaxValue(points.screenMusclePoints);\n  return {\n    screenMusclePoints: normalize(points.screenMusclePoints, maxValues),\n    exercisePoints: ObjectUtils_keys(points.exercisePoints).reduce<IExercisePointsColl>((memo, key) => {\n      memo[key] = normalize(points.exercisePoints[key]!, maxValues);\n      return memo;\n    }, {}),\n  };\n}\n\nexport function Muscle_combinePoints(points: IPoints): IPoints {\n  return {\n    screenMusclePoints: {\n      strength: ObjectUtils_keys(points.screenMusclePoints.strength).reduce<IScreenMusclePointsColl>((memo, key) => {\n        memo[key] = (memo[key] || 0) + points.screenMusclePoints.strength[key]!;\n        return memo;\n      }, {}),\n      hypertrophy: {},\n    },\n    exercisePoints: {\n      strength: {},\n      hypertrophy: {},\n    },\n  };\n}\n\nexport function Muscle_getScreenMusclesFromMuscle(muscle: IMuscle, settings: ISettings): (IScreenMuscle | string)[] {\n  const availableMuscleGroups = Muscle_getAvailableMuscleGroups(settings);\n  const matchingMuscleGroups = availableMuscleGroups.filter((mg) => {\n    const muscles = settings.muscleGroups.data[mg]?.muscles ?? screenMuscleToMuscleMapping[mg as IScreenMuscle] ?? [];\n    return muscles.includes(muscle);\n  });\n  return matchingMuscleGroups;\n}\n\nexport function Muscle_getMuscleGroupName(muscleGroup: IScreenMuscle, settings: ISettings): string {\n  return settings.muscleGroups.data[muscleGroup]?.name ?? StringUtils_capitalize(muscleGroup);\n}\n\nexport function Muscle_isDefaultMuscles(muscleGroup: IScreenMuscle, muscles: IMuscle[]): boolean {\n  const defaultMuscles = screenMuscleToMuscleMapping[muscleGroup as IScreenMuscle] ?? [];\n  return SetUtils_areEqual(new Set(defaultMuscles), new Set(muscles));\n}\n\nexport function Muscle_getAvailableMuscleGroups(settings: ISettings): IScreenMuscle[] {\n  return [\n    ...screenMuscles.filter((sm) => !settings.muscleGroups.data[sm]?.isHidden),\n    ...Object.keys(settings.muscleGroups.data).filter((k) => !(screenMuscles as readonly string[]).includes(k)),\n  ];\n}\n\nexport function Muscle_getBuiltinMuscleGroups(): IScreenMuscle[] {\n  return screenMuscles;\n}\n\nexport function Muscle_getHiddenMuscleGroups(settings: ISettings): IScreenMuscle[] {\n  return [...screenMuscles.filter((sm) => settings.muscleGroups.data[sm]?.isHidden)];\n}\n\nexport function Muscle_getMusclesFromScreenMuscle(muscleGroup: IScreenMuscle | string, settings: ISettings): IMuscle[] {\n  const availableMuscleGroups = Muscle_getAvailableMuscleGroups(settings);\n  if (!availableMuscleGroups.includes(muscleGroup)) {\n    return [];\n  }\n  return (\n    settings.muscleGroups.data[muscleGroup]?.muscles ?? screenMuscleToMuscleMapping[muscleGroup as IScreenMuscle] ?? []\n  );\n}\n\nexport function Muscle_isBuiltInMuscleGroup(muscleGroup: IScreenMuscle | string): boolean {\n  return (screenMuscles as readonly string[]).includes(muscleGroup);\n}\n\nexport function Muscle_getPointsForProgram(program: IEvaluatedProgram, stats: IStats, settings: ISettings): IPoints {\n  const screenMusclePoints: IScreenMusclePoints = {\n    strength: {},\n    hypertrophy: {},\n  };\n  const exercisePoints: IExercisePoints = {\n    strength: {},\n    hypertrophy: {},\n  };\n\n  return program.weeks[0].days.reduce(\n    (memo, day) => mergePoints(memo, Muscle_getPointsForDay(program, day, stats, settings)),\n    {\n      screenMusclePoints,\n      exercisePoints,\n    }\n  );\n}\n\nexport function Muscle_getPointsForDay(\n  program: IEvaluatedProgram,\n  programDay: IEvaluatedProgramDay,\n  stats: IStats,\n  settings: ISettings\n): IPoints {\n  const screenMusclePoints: IScreenMusclePoints = {\n    strength: {},\n    hypertrophy: {},\n  };\n  const exercisePoints: IExercisePoints = {\n    strength: {},\n    hypertrophy: {},\n  };\n\n  const dayExercises = Program_getProgramDayUsedExercises(programDay);\n  return dayExercises.reduce(\n    (memo, exercise) => {\n      return mergePoints(memo, Muscle_getPointsForExercise(program, exercise, programDay.dayData, settings, stats));\n    },\n    { screenMusclePoints, exercisePoints }\n  );\n}\n\nexport function Muscle_getUnifiedPointsForDay(\n  program: IEvaluatedProgram,\n  programDay: IEvaluatedProgramDay,\n  stats: IStats,\n  settings: ISettings\n): IUnifiedPoints {\n  const screenMusclePoints: IScreenMusclePointsColl = {};\n  const exercisePoints: IExercisePointsColl = {};\n\n  const dayExercises = Program_getProgramDayUsedExercises(programDay);\n  return dayExercises.reduce(\n    (memo, exercise) => {\n      return mergeUnifiedPoints(\n        memo,\n        Muscle_getUnifiedPointsForExercise(program, exercise, programDay.dayData, settings, stats)\n      );\n    },\n    { screenMusclePoints, exercisePoints }\n  );\n}\n\nexport function Muscle_getUnifiedPointsForExercise(\n  program: IEvaluatedProgram,\n  programExercise: IPlannerProgramExerciseWithType,\n  dayData: IDayData,\n  settings: ISettings,\n  stats: IStats\n): IUnifiedPoints {\n  const screenMusclePoints: IScreenMusclePointsColl = {};\n  const exercisePoints: IExercisePointsColl = {};\n\n  const id = Exercise_toKey(programExercise.exerciseType);\n  const historyEntry = Program_nextHistoryEntry(program, dayData, 0, programExercise, stats, settings);\n  const targetMuscles = Exercise_targetMuscles(programExercise.exerciseType, settings);\n  const synergistMuscles = Exercise_synergistMuscles(programExercise.exerciseType, settings);\n  const screenTargetMuscles = Array.from(\n    new Set(targetMuscles.flatMap((t) => Muscle_getScreenMusclesFromMuscle(t, settings)))\n  );\n  const screenSynergistMuscles = Array.from(\n    new Set(synergistMuscles.flatMap((t) => Muscle_getScreenMusclesFromMuscle(t, settings)))\n  );\n  const synergistMuscleGroupToMultiplier = Exercise_synergistMusclesGroupMultipliers(\n    programExercise.exerciseType,\n    settings\n  );\n  for (const _set of historyEntry.sets) {\n    for (const muscle of screenTargetMuscles) {\n      screenMusclePoints[muscle] = screenMusclePoints[muscle] || 0;\n      screenMusclePoints[muscle]! += 100;\n      exercisePoints[id] = exercisePoints[id] || {};\n      exercisePoints[id]![muscle] = exercisePoints[id]![muscle] || 0;\n      exercisePoints[id]![muscle]! += 100;\n    }\n    for (const muscle of screenSynergistMuscles) {\n      screenMusclePoints[muscle] = screenMusclePoints[muscle] || 0;\n      screenMusclePoints[muscle]! +=\n        (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier) * 100;\n      exercisePoints[id] = exercisePoints[id] || {};\n      exercisePoints[id]![muscle] = exercisePoints[id]![muscle] || 0;\n      exercisePoints[id]![muscle]! +=\n        (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier) * 100;\n    }\n  }\n  return { screenMusclePoints, exercisePoints };\n}\n\nexport function Muscle_getPointsForExercise(\n  program: IEvaluatedProgram,\n  programExercise: IPlannerProgramExerciseWithType,\n  dayData: IDayData,\n  settings: ISettings,\n  stats: IStats\n): IPoints {\n  const screenMusclePoints: IScreenMusclePoints = {\n    strength: {},\n    hypertrophy: {},\n  };\n  const exercisePoints: IExercisePoints = {\n    strength: {},\n    hypertrophy: {},\n  };\n\n  const id = Exercise_toKey(programExercise.exerciseType);\n  const historyEntry = Program_nextHistoryEntry(program, dayData, 0, programExercise, stats, settings);\n  const targetMuscles = Exercise_targetMuscles(programExercise.exerciseType, settings);\n  const synergistMuscles = Exercise_synergistMuscles(programExercise.exerciseType, settings);\n  const synergistMuscleGroupToMultiplier = Exercise_synergistMusclesGroupMultipliers(\n    programExercise.exerciseType,\n    settings\n  );\n  const screenTargetMuscles = Array.from(\n    new Set(targetMuscles.flatMap((t) => Muscle_getScreenMusclesFromMuscle(t, settings)))\n  );\n  const screenSynergistMuscles = Array.from(\n    new Set(synergistMuscles.flatMap((t) => Muscle_getScreenMusclesFromMuscle(t, settings)))\n  );\n  for (const set of historyEntry.sets) {\n    if ((set.reps ?? 0) >= 8) {\n      for (const muscle of screenTargetMuscles) {\n        screenMusclePoints.hypertrophy[muscle] = screenMusclePoints.hypertrophy[muscle] || 0;\n        screenMusclePoints.hypertrophy[muscle]! += 100;\n        exercisePoints.hypertrophy[id] = exercisePoints.hypertrophy[id] || {};\n        exercisePoints.hypertrophy[id]![muscle] = exercisePoints.hypertrophy[id]![muscle] || 0;\n        exercisePoints.hypertrophy[id]![muscle]! += 100;\n      }\n      for (const muscle of screenSynergistMuscles) {\n        screenMusclePoints.hypertrophy[muscle] = screenMusclePoints.hypertrophy[muscle] || 0;\n        screenMusclePoints.hypertrophy[muscle]! +=\n          100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n        exercisePoints.hypertrophy[id] = exercisePoints.hypertrophy[id] || {};\n        exercisePoints.hypertrophy[id]![muscle] = exercisePoints.hypertrophy[id]![muscle] || 0;\n        exercisePoints.hypertrophy[id]![muscle]! +=\n          100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n      }\n    } else {\n      for (const muscle of screenTargetMuscles) {\n        screenMusclePoints.strength[muscle] = screenMusclePoints.strength[muscle] || 0;\n        screenMusclePoints.strength[muscle]! += 100;\n        exercisePoints.strength[id] = exercisePoints.strength[id] || {};\n        exercisePoints.strength[id]![muscle] = exercisePoints.strength[id]![muscle] || 0;\n        exercisePoints.strength[id]![muscle]! += 100;\n      }\n      for (const muscle of screenSynergistMuscles) {\n        screenMusclePoints.strength[muscle] = screenMusclePoints.strength[muscle] || 0;\n        screenMusclePoints.strength[muscle]! +=\n          100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n        exercisePoints.strength[id] = exercisePoints.strength[id] || {};\n        exercisePoints.strength[id]![muscle] = exercisePoints.strength[id]![muscle] || 0;\n        exercisePoints.strength[id]![muscle]! +=\n          100 * (synergistMuscleGroupToMultiplier[muscle] ?? settings.planner.synergistMultiplier);\n      }\n    }\n  }\n  return { screenMusclePoints, exercisePoints };\n}\n\nexport function Muscle_mergeScreenMusclePoints(\n  a: IScreenMusclePointsColl,\n  b: IScreenMusclePointsColl\n): IScreenMusclePointsColl {\n  return ObjectUtils_combinedKeys(a, b).reduce<IScreenMusclePointsColl>((memo, screenMuscle) => {\n    const oldValue = a[screenMuscle] || 0;\n    const newValue = b[screenMuscle] || 0;\n    memo[screenMuscle] = oldValue + newValue;\n    return memo;\n  }, {});\n}\n\nexport function Muscle_createMuscleGroup(\n  muscleGroupSettings: IMuscleGroupsSettings,\n  name: string\n): IMuscleGroupsSettings {\n  const id = UidFactory_generateUid(8);\n  return { ...muscleGroupSettings, data: { ...muscleGroupSettings.data, [id]: { name, muscles: [] } } };\n}\n\nexport function Muscle_updateMuscleGroup(\n  muscleGroupSettings: IMuscleGroupsSettings,\n  muscleGroup: IScreenMuscle,\n  muscles: IMuscle[]\n): IMuscleGroupsSettings {\n  const isDefault = Muscle_isDefaultMuscles(muscleGroup, muscles);\n  const newMuscleGroups = ObjectUtils_clone(muscleGroupSettings);\n  if (isDefault) {\n    delete newMuscleGroups.data[muscleGroup]?.muscles;\n  } else {\n    newMuscleGroups.data = newMuscleGroups.data || {};\n    newMuscleGroups.data[muscleGroup] = newMuscleGroups.data[muscleGroup] || {};\n    newMuscleGroups.data[muscleGroup].muscles = muscles;\n  }\n  return newMuscleGroups;\n}\n\nexport function Muscle_deleteMuscleGroup(\n  muscleGroupSettings: IMuscleGroupsSettings,\n  muscleGroup: IScreenMuscle\n): IMuscleGroupsSettings {\n  const isBuiltin = Muscle_isBuiltInMuscleGroup(muscleGroup);\n  if (isBuiltin) {\n    return {\n      ...muscleGroupSettings,\n      data: {\n        ...muscleGroupSettings.data,\n        [muscleGroup]: { ...muscleGroupSettings.data[muscleGroup], isHidden: true },\n      },\n    };\n  } else {\n    const newMuscleGroups = ObjectUtils_clone(muscleGroupSettings);\n    delete newMuscleGroups.data[muscleGroup];\n    return newMuscleGroups;\n  }\n}\n\nexport function Muscle_restoreMuscleGroup(\n  muscleGroupSettings: IMuscleGroupsSettings,\n  muscleGroup: IScreenMuscle\n): IMuscleGroupsSettings {\n  const newMuscleGroups = ObjectUtils_clone(muscleGroupSettings);\n  newMuscleGroups.data = newMuscleGroups.data || {};\n  newMuscleGroups.data[muscleGroup] = newMuscleGroups.data[muscleGroup] || {};\n  newMuscleGroups.data[muscleGroup].isHidden = false;\n  return newMuscleGroups;\n}\n\nfunction mergeExercisePoints(a: IExercisePointsColl, b: IExercisePointsColl): IExercisePointsColl {\n  return ObjectUtils_combinedKeys(a, b).reduce<IExercisePointsColl>((memo, exerciseId) => {\n    const points1 = a[exerciseId] || {};\n    const points2 = b[exerciseId] || {};\n    memo[exerciseId] = Muscle_mergeScreenMusclePoints(points1, points2);\n    return memo;\n  }, {});\n}\n\nfunction mergePoints(oldPoints: IPoints, newPoints: IPoints): IPoints {\n  return {\n    screenMusclePoints: {\n      strength: Muscle_mergeScreenMusclePoints(\n        oldPoints.screenMusclePoints.strength,\n        newPoints.screenMusclePoints.strength\n      ),\n      hypertrophy: Muscle_mergeScreenMusclePoints(\n        oldPoints.screenMusclePoints.hypertrophy,\n        newPoints.screenMusclePoints.hypertrophy\n      ),\n    },\n    exercisePoints: {\n      strength: mergeExercisePoints(oldPoints.exercisePoints.strength, newPoints.exercisePoints.strength),\n      hypertrophy: mergeExercisePoints(oldPoints.exercisePoints.hypertrophy, newPoints.exercisePoints.hypertrophy),\n    },\n  };\n}\n\nfunction mergeUnifiedPoints(oldPoints: IUnifiedPoints, newPoints: IUnifiedPoints): IUnifiedPoints {\n  return {\n    screenMusclePoints: Muscle_mergeScreenMusclePoints(oldPoints.screenMusclePoints, newPoints.screenMusclePoints),\n    exercisePoints: mergeExercisePoints(oldPoints.exercisePoints, newPoints.exercisePoints),\n  };\n}\n","import { ILiveActivityState } from \"../utils/liveActivityState\";\nimport { INativeTimerStartParams, ITimerBridge } from \"../utils/timerBridge\";\nimport { IWatchBridge } from \"../utils/watchBridge\";\nimport { IWorkoutBridge } from \"../utils/workoutBridge\";\nimport { IWorkoutMirroring } from \"../utils/workoutMirroring\";\n\nexport type INativeEffect =\n  | { type: \"startTimer\"; params: INativeTimerStartParams }\n  | { type: \"stopTimer\" }\n  | { type: \"updateLiveActivity\"; state: ILiveActivityState }\n  | { type: \"resumeWorkout\"; reminder: number; isStart: boolean; hasSubscription: boolean }\n  | { type: \"pauseWorkout\" }\n  | { type: \"discardWorkout\" };\n\nexport interface INativeEffectBridges {\n  timer: ITimerBridge;\n  workout: IWorkoutBridge;\n  watch: IWatchBridge;\n  mirroring: IWorkoutMirroring;\n}\n\nexport function NativeEffects_withoutWatchWorkout(effects: readonly INativeEffect[]): INativeEffect[] {\n  return effects.map((effect) =>\n    effect.type === \"resumeWorkout\" && effect.hasSubscription ? { ...effect, hasSubscription: false } : effect\n  );\n}\n\nexport function NativeEffects_apply(bridges: INativeEffectBridges, effects: readonly INativeEffect[]): void {\n  for (const effect of effects) {\n    switch (effect.type) {\n      case \"startTimer\":\n        bridges.timer.startTimer(effect.params);\n        break;\n      case \"stopTimer\":\n        bridges.timer.stopTimer();\n        break;\n      case \"updateLiveActivity\":\n        bridges.workout.updateLiveActivity(effect.state);\n        break;\n      case \"resumeWorkout\":\n        bridges.workout.resumeWorkout({\n          reminder: effect.reminder,\n          isStart: effect.isStart,\n          hasSubscription: effect.hasSubscription,\n        });\n        break;\n      case \"pauseWorkout\":\n        bridges.workout.pauseWorkout();\n        break;\n      case \"discardWorkout\":\n        bridges.workout.discardWorkout();\n        break;\n      default:\n        exhausted(effect);\n    }\n  }\n}\n\nfunction exhausted(effect: never): never {\n  throw new Error(`Unhandled native effect: ${JSON.stringify(effect)}`);\n}\n","import { INutritionGraphId, IStats, IUnit } from \"../types\";\nimport { Food_entries, Food_entryTotals, Food_localDate, Food_shiftDate } from \"./food\";\nimport { Expenditure_fromKg, Expenditure_inputs, Expenditure_series, Expenditure_toKg } from \"./expenditure\";\n\nexport const NutritionGraph_avgDays = 7;\n\nexport interface INutritionGraphData {\n  // [x seconds, daily value, trailing average, expenditure estimate]; one column per logged day.\n  data: [number[], number[], (number | null)[], (number | null)[]];\n  // Bodyweight in the user's units over the same days, for the chart under it.\n  bodyweight: [number[], number[]];\n}\n\nexport function NutritionGraph_name(id: INutritionGraphId): string {\n  return id === \"nutritionCalories\" ? \"Calories\" : \"Protein\";\n}\n\nexport function NutritionGraph_units(id: INutritionGraphId): string {\n  return id === \"nutritionCalories\" ? \"kcal\" : \"g\";\n}\n\n// Days are plotted at local noon so a day's point sits in the middle of its tick.\nfunction noonSeconds(date: string): number {\n  const [y, m, d] = date.split(\"-\").map(Number);\n  return new Date(y, m - 1, d, 12).getTime() / 1000;\n}\n\nfunction r1(value: number): number {\n  return Math.round(value * 10) / 10;\n}\n\n// Today is left out: a half-logged day reads as a crash in intake and drags the average down with it.\nexport function NutritionGraph_data(\n  stats: IStats,\n  id: INutritionGraphId,\n  units: IUnit,\n  today: string\n): INutritionGraphData {\n  const key = id === \"nutritionCalories\" ? \"calories\" : \"protein\";\n  const byDate: Partial<Record<string, number>> = {};\n  for (const entry of Food_entries(stats)) {\n    byDate[entry.value.date] = (byDate[entry.value.date] ?? 0) + Food_entryTotals(entry.value)[key];\n  }\n  const dates = Object.keys(byDate)\n    .filter((d) => d < today)\n    .sort();\n  const data: INutritionGraphData[\"data\"] = [[], [], [], []];\n  if (dates.length === 0) {\n    return { data, bodyweight: [[], []] };\n  }\n  const expenditure =\n    id === \"nutritionCalories\"\n      ? new Map(\n          Expenditure_series(Expenditure_inputs(stats), dates[0], dates[dates.length - 1]).map((e) => [\n            e.endDate,\n            e.tdee,\n          ])\n        )\n      : undefined;\n  for (const date of dates) {\n    // Trailing average over the logged days among the last 7, so unlogged days don't drag it to 0.\n    const window: number[] = [];\n    for (let i = 0; i < NutritionGraph_avgDays; i++) {\n      const value = byDate[Food_shiftDate(date, -i)];\n      if (value != null) {\n        window.push(value);\n      }\n    }\n    data[0].push(noonSeconds(date));\n    data[1].push(Math.round(byDate[date]!));\n    data[2].push(r1(window.reduce((memo, v) => memo + v, 0) / window.length));\n    data[3].push(expenditure?.get(date) ?? null);\n  }\n  const first = dates[0];\n  const last = dates[dates.length - 1];\n  const weights = (stats.weight.weight || [])\n    .map((w) => ({ date: Food_localDate(w.timestamp), timestamp: w.timestamp, value: w.value }))\n    .filter((w) => w.date >= first && w.date <= last)\n    .sort((a, b) => a.timestamp - b.timestamp);\n  const bodyweight: [number[], number[]] = [\n    weights.map((w) => w.timestamp / 1000),\n    weights.map((w) => r1(Expenditure_fromKg(Expenditure_toKg(w.value), units))),\n  ];\n  return { data, bodyweight };\n}\n","import { IState } from \"./state\";\nimport { WhatsNew_doesHaveNewUpdates } from \"./whatsnew\";\n\nexport type IOnloadModal = \"whatsnew\" | \"hearaboutus\";\n\nconst HEAR_ABOUT_US_COOLDOWN_MS = 1000 * 60 * 60 * 24 * 7;\n\nexport function OnloadModal_shouldShowWhatsNew(state: IState): boolean {\n  return state.storage.whatsNew != null && WhatsNew_doesHaveNewUpdates(state.storage.whatsNew);\n}\n\nexport function OnloadModal_shouldShowHearAboutUs(state: IState): boolean {\n  if (state.storage.currentProgramId == null) {\n    return false;\n  }\n  const hearAboutUs = state.storage.hearAboutUs;\n  const requests = hearAboutUs?.requests ?? [];\n  const lastRequest = requests[requests.length - 1];\n  return (\n    hearAboutUs?.result == null &&\n    !hearAboutUs?.done &&\n    requests.length < 3 &&\n    (lastRequest == null || Date.now() - lastRequest > HEAR_ABOUT_US_COOLDOWN_MS)\n  );\n}\n\nexport function OnloadModal_getNext(state: IState): IOnloadModal | undefined {\n  if (OnloadModal_shouldShowWhatsNew(state)) {\n    return \"whatsnew\";\n  }\n  if (OnloadModal_shouldShowHearAboutUs(state)) {\n    return \"hearaboutus\";\n  }\n  return undefined;\n}\n","import { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IPlannerEvalResult, IPlannerTopLineItem } from \"../pages/planner/plannerExerciseEvaluator\";\nimport { IEvaluatedProgramWeek } from \"./program\";\nexport function PP_iterate2(\n  evaluatedWeeks: IEvaluatedProgramWeek[],\n  cb: (\n    exercise: IPlannerProgramExercise,\n    weekIndex: number,\n    dayInWeekIndex: number,\n    dayIndex: number,\n    exerciseIndex: number\n  ) => boolean | void\n): void {\n  let dayIndex = 0;\n  for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n    const week = evaluatedWeeks[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.days.length; dayInWeekIndex++) {\n      const day = week.days[dayInWeekIndex];\n      for (let exerciseIndex = 0; exerciseIndex < day.exercises.length; exerciseIndex++) {\n        const exercise = day.exercises[exerciseIndex];\n        const shouldReturn = cb(exercise, weekIndex, dayInWeekIndex, dayIndex, exerciseIndex);\n        if (!!shouldReturn) {\n          return;\n        }\n      }\n      dayIndex += 1;\n    }\n  }\n}\n\n// Walks the exercise lines of a program's source text rather than its evaluated exercises. The\n// week/day/dayIndex it yields line up with PP_iterate2, since both the top line map and the\n// evaluated weeks are built one-to-one from planner.weeks.\nexport function PP_iterateTopLineExercises(\n  groupedTopLines: IPlannerTopLineItem[][][][],\n  cb: (line: IPlannerTopLineItem, weekIndex: number, dayInWeekIndex: number, dayIndex: number) => boolean | void\n): void {\n  let dayIndex = 0;\n  for (let weekIndex = 0; weekIndex < groupedTopLines.length; weekIndex++) {\n    const week = groupedTopLines[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex++) {\n      for (const group of week[dayInWeekIndex]) {\n        for (const line of group) {\n          if (line.type !== \"exercise\") {\n            continue;\n          }\n          const shouldReturn = cb(line, weekIndex, dayInWeekIndex, dayIndex);\n          if (!!shouldReturn) {\n            return;\n          }\n        }\n      }\n      dayIndex += 1;\n    }\n  }\n}\n\nexport function PP_iterate(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  cb: (\n    exercise: IPlannerProgramExercise,\n    weekIndex: number,\n    dayInWeekIndex: number,\n    dayIndex: number,\n    exerciseIndex: number\n  ) => boolean | void\n): void {\n  let dayIndex = 0;\n  for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n    const week = evaluatedWeeks[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex++) {\n      const day = week[dayInWeekIndex];\n      if (day.success) {\n        for (let exerciseIndex = 0; exerciseIndex < day.data.length; exerciseIndex++) {\n          const exercise = day.data[exerciseIndex];\n          const shouldReturn = cb(exercise, weekIndex, dayInWeekIndex, dayIndex, exerciseIndex);\n          if (!!shouldReturn) {\n            return;\n          }\n        }\n      }\n      dayIndex += 1;\n    }\n  }\n}\n","import {\n  allExercisesList,\n  warmupValues,\n  Exercise_eq,\n  Exercise_getIsUnilateral,\n  Exercise_getWarmupSets,\n  Exercise_toKey,\n  Exercise_onerm,\n  Exercise_findById,\n  Exercise_get,\n  Exercise_fullName,\n} from \"./exercise\";\nimport { ScriptRunner } from \"../parser\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport {\n  IScriptBindings,\n  Progress_getEntryId,\n  Progress_runUpdateScriptForEntry,\n  Progress_createScriptBindings,\n  Progress_createScriptFunctions,\n  Progress_getDayData,\n} from \"./progress\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IEither } from \"../utils/types\";\nimport {\n  Weight_is,\n  Weight_build,\n  Weight_isPct,\n  Weight_buildPct,\n  Weight_eq,\n  Weight_roundTo005,\n  Weight_convertTo,\n  Weight_display,\n  Weight_printOrNumber,\n} from \"./weight\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { IState, updateState } from \"./state\";\nimport {\n  IProgram,\n  IStorage,\n  IProgramExercise,\n  ISettings,\n  IHistoryEntry,\n  IExerciseType,\n  IProgramState,\n  ISet,\n  IHistoryRecord,\n  IWeight,\n  IProgramExerciseVariation,\n  IUnit,\n  IDayData,\n  IExerciseData,\n  IStats,\n  IShortDayData,\n} from \"../types\";\nimport {\n  ObjectUtils_omit,\n  ObjectUtils_clone,\n  ObjectUtils_diff,\n  ObjectUtils_keys,\n  ObjectUtils_isEqual,\n  ObjectUtils_pick,\n  ObjectUtils_diffPaths,\n} from \"../utils/object\";\nimport { Exporter_toFile } from \"../utils/exporter\";\nimport { DateUtils_formatYYYYMMDD } from \"../utils/date\";\nimport { ICustomExercise, IProgramContentSettings, IPlannerProgram, IPercentage, IScriptErrorHandler } from \"../types\";\nimport {\n  ProgramExercise_applyVariables,\n  ProgramExercise_doesUse1RM,\n  ProgramExercise_doesUseRPE,\n} from \"./programExercise\";\nimport { Thunk_pushScreen } from \"../ducks/thunks\";\nimport { WorkoutTimeEstimate_dayMs } from \"./workoutTimeEstimate\";\nimport type { INavigateOpts } from \"../navigation/navigationService\";\nimport { getLatestMigrationVersion } from \"../migrations/migrations\";\nimport { Encoder_encodeIntoUrl } from \"../utils/encoder\";\nimport { StringUtils_pluralize, StringUtils_hashString } from \"../utils/string\";\nimport { ILiftoscriptEvaluatorUpdate } from \"../liftoscriptEvaluator\";\nimport { ProgramToPlanner } from \"./programToPlanner\";\nimport {\n  IExportedPlannerProgram,\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseWithType,\n  IReuseCandidate,\n} from \"../pages/planner/models/types\";\nimport memoize from \"micro-memoize\";\nimport { PlannerProgram_switchToUnit } from \"../pages/planner/models/plannerProgram\";\nimport {\n  IByExercise,\n  IByTag,\n  PlannerEvaluator_forceEvaluate,\n  PlannerEvaluator_evaluate,\n  PlannerEvaluator_changeExerciseName,\n} from \"../pages/planner/plannerEvaluator\";\nimport { PlannerKey_fromFullName } from \"../pages/planner/plannerKey\";\nimport { PP_iterate2, PP_iterate } from \"./pp\";\nimport {\n  PlannerProgramExercise_currentEvaluatedSetVariation,\n  PlannerProgramExercise_programWarmups,\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_currentEvaluatedSetVariationIndex,\n  PlannerProgramExercise_currentExerciseVariationIndex,\n  PlannerProgramExercise_currentDescriptionIndex,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_createExerciseFromEntry,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { CollectionUtils_sortBy, CollectionUtils_uniqBy } from \"../utils/collection\";\nimport { IPlannerEvalResult, PlannerSyntaxError } from \"../pages/planner/plannerExerciseEvaluator\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { Service } from \"../api/service\";\nimport { EditProgram_initPlannerState } from \"./editProgram\";\nimport { ProgramSet_getEvaluatedWeight } from \"./programSet\";\nimport { Stats_getCurrentMovingAverageBodyweight } from \"./stats\";\n\ndeclare let __HOST__: string;\n\nconst encodedProgramHashToShortUrl: Partial<Record<string, string>> = {};\n\nexport interface IProgramIndexEntry {\n  id: string;\n  name: string;\n  author: string;\n  authorUrl: string;\n  url: string;\n  shortDescription: string;\n  description?: string;\n  isMultiweek: boolean;\n  tags: string[];\n  frequency?: number;\n  age?: string;\n  duration?: string;\n  goal?: string;\n  exercises?: IExerciseType[];\n  equipment?: string[];\n  exercisesRange?: [number, number];\n  weeksCount?: number;\n  datePublished?: string;\n  dateModified?: string;\n}\n\nexport interface IExportedProgram {\n  program: IProgram;\n  customExercises: Partial<Record<string, ICustomExercise>>;\n  version: string;\n  settings: IProgramContentSettings;\n}\n\nexport interface IEvaluatedProgramWeek {\n  name: string;\n  description?: string;\n  days: IEvaluatedProgramDay[];\n}\n\nexport interface IEvaluatedProgramDay {\n  name: string;\n  dayData: Required<IDayData>;\n  description?: string;\n  exercises: IPlannerProgramExercise[];\n}\n\nexport interface IEvaluatedProgramError {\n  error: PlannerSyntaxError;\n  dayData: Required<IDayData>;\n}\n\nexport interface IEvaluatedProgram {\n  type: \"evaluatedProgram\";\n  id: string;\n  planner: IPlannerProgram;\n  name: string;\n  nextDay: number;\n  errors: IEvaluatedProgramError[];\n  weeks: IEvaluatedProgramWeek[];\n  states: IByTag<IProgramState>;\n}\nexport type IEProgram = IProgram | IEvaluatedProgram;\n\nexport type IProgramMode = \"planner\" | \"update\";\nexport const emptyProgramId = \"emptyprogram\";\n\nfunction isEvaluatedProgram(program: IEProgram): program is IEvaluatedProgram {\n  return \"type\" in program && program.type === \"evaluatedProgram\";\n}\n\nexport function ev(program: IEProgram, settings: ISettings): IEvaluatedProgram {\n  if (isEvaluatedProgram(program)) {\n    return program;\n  } else {\n    return Program_evaluate(program, settings);\n  }\n}\n\nexport function Program_getProgram(state: IState, id?: string): IProgram | undefined {\n  if (id === emptyProgramId) {\n    return Program_createEmptyProgram();\n  } else {\n    return state.storage.programs.find((p) => p.id === id);\n  }\n}\n\nexport function Program_getFullProgram(state: IState, id?: string): IProgram | undefined {\n  const program = Program_getProgram(state, id);\n  if (program) {\n    return Program_fullProgram(program, state.storage.settings);\n  } else {\n    return undefined;\n  }\n}\n\nexport function Program_cleanPlannerProgram(program: IProgram): IProgram {\n  const planner = program.planner;\n  if (planner != null) {\n    const newPlanner = {\n      ...planner,\n      weeks: planner.weeks.map((w) => ({\n        ...ObjectUtils_omit(w, [\"id\"]),\n        days: w.days.map((d) => ({\n          ...ObjectUtils_omit(d, [\"id\"]),\n        })),\n      })),\n    };\n    return {\n      ...program,\n      planner: newPlanner,\n      exercises: [],\n      days: [],\n      weeks: [],\n    };\n  } else {\n    return program;\n  }\n}\n\nexport function Program_isEmpty(program?: IProgram | IEvaluatedProgram): boolean {\n  return program?.id === emptyProgramId;\n}\n\nexport const Program_uses1RM = memoize(\n  (program: IEvaluatedProgram): boolean => {\n    const allExercises = Program_getAllProgramExercises(program);\n    return allExercises.some((e) => ProgramExercise_doesUse1RM(e));\n  },\n  { maxSize: 10 }\n);\n\nexport const Program_usesRPE = memoize(\n  (program: IEvaluatedProgram): boolean => {\n    const allExercises = Program_getAllProgramExercises(program);\n    return allExercises.some((e) => ProgramExercise_doesUseRPE(e));\n  },\n  { maxSize: 10 }\n);\n\nexport function Program_getProgramExercisesFromExerciseType(\n  program: IEvaluatedProgram,\n  exerciseType: IExerciseType\n): IPlannerProgramExercise[] {\n  return Program_getAllUsedProgramExercises(program).filter((p) => Exercise_eq(p.exerciseType, exerciseType));\n}\n\nexport function Program_getProgramIndex(state: IState, id: string): number {\n  return state.storage.programs.findIndex((p) => p.id === id);\n}\n\nexport function Program_getCurrentProgram(storage: IStorage): IProgram | undefined {\n  return storage.programs.filter((p) => p.id === storage.currentProgramId)[0];\n}\n\nexport function Program_storageToExportedProgram(storage: IStorage, programId: string): IExportedProgram | undefined {\n  const program = storage.programs.find((p) => p.id === programId);\n  if (!program) {\n    return undefined;\n  }\n  const settings = storage.settings;\n  return {\n    program: Program_cleanPlannerProgram(program),\n    customExercises: settings.exercises,\n    version: storage.version,\n    settings: settings,\n  };\n}\n\nexport function Program_nextHistoryEntry(\n  program: IEvaluatedProgram,\n  dayData: IDayData,\n  index: number,\n  programExercise: IPlannerProgramExerciseWithType,\n  stats: IStats,\n  settings: ISettings\n): IHistoryEntry {\n  const exercise = programExercise.exerciseType;\n  const programSets = PlannerProgramExercise_currentEvaluatedSetVariation(programExercise)?.sets;\n  const warmupSets = PlannerProgramExercise_programWarmups(programExercise, settings);\n  const sets: ISet[] = [];\n  for (let i = 0; i < programSets.length; i++) {\n    const programSet = programSets[i];\n    const minReps =\n      programSet.minrep != null && programSet.minrep !== programSet.maxrep ? programSet.minrep : undefined;\n    const weight = ProgramSet_getEvaluatedWeight(programSet, programExercise.exerciseType, settings);\n    sets.push({\n      vtype: \"set\",\n      id: UidFactory_generateUid(6),\n      reps: programSet.maxrep,\n      index: i,\n      minReps,\n      weight,\n      isUnilateral: Exercise_getIsUnilateral(exercise, settings),\n      rpe: programSet.rpe,\n      timer: programSet.timer,\n      setTimer: programSet.setTimer,\n      isOverflowSetTimer: programSet.isOverflowSetTimer,\n      auto: programSet.auto,\n      logRpe: programSet.logRpe,\n      askWeight: programSet.askWeight,\n      originalWeight: programSet.weight,\n      isAmrap: programSet.isAmrap,\n      label: programSet.label,\n      isCompleted: false,\n      programSetIndex: i,\n    });\n  }\n\n  const entry: IHistoryEntry = {\n    vtype: \"history_entry\",\n    id: Progress_getEntryId(exercise, programExercise.label),\n    index,\n    exercise: exercise,\n    programExerciseId: programExercise.key,\n    sets,\n    superset: programExercise.superset?.name,\n    warmupSets: Exercise_getWarmupSets(exercise, sets[0]?.weight, settings, warmupSets),\n  };\n  try {\n    return Progress_runUpdateScriptForEntry(entry, dayData, programExercise, program.states, -1, settings, stats);\n  } catch (error) {\n    console.error(error);\n    return entry;\n  }\n}\n\nexport function Program_stateValue(\n  state: IProgramState,\n  key: string,\n  value?: string\n): number | IWeight | IPercentage | undefined {\n  if (value == null) {\n    return undefined;\n  }\n  const numValue = parseFloat(value);\n  const oldValue = state[key];\n  if (oldValue == null) {\n    return numValue;\n  } else if (Weight_is(oldValue)) {\n    return Weight_build(numValue, oldValue.unit);\n  } else if (Weight_isPct(oldValue)) {\n    return Weight_buildPct(numValue);\n  } else {\n    return numValue;\n  }\n}\n\nexport function Program_nextHistoryRecord(\n  aProgram: IProgram,\n  settings: ISettings,\n  stats: IStats,\n  dayIndex?: number\n): IHistoryRecord {\n  const program = Program_evaluate(aProgram, settings);\n  return Program_nextHistoryRecordFromEvaluated(program, settings, stats, dayIndex);\n}\n\n// The canonical order of a day's exercises. `order` is not a position — it defaults to 0 and only carries a\n// value when the text disambiguates with `Squat[order]`, so this is document order with those markers floated\n// into place. Everything that needs a day's order goes through here rather than sorting for itself: a workout\n// reconciled mid-session has to end up in the same order as one freshly started from the same program.\nexport function Program_getDayExercisesInOrder(\n  program: IEvaluatedProgram,\n  day: number\n): IPlannerProgramExerciseWithType[] {\n  const programDay = Program_getProgramDay(program, day);\n  return CollectionUtils_sortBy(programDay ? Program_getProgramDayUsedExercises(programDay) : [], \"order\");\n}\n\nexport function Program_getDayExerciseKeys(program: IEvaluatedProgram, day: number): string[] {\n  return Program_getDayExercisesInOrder(program, day).map((e) => e.key);\n}\n\nexport function Program_nextHistoryRecordFromEvaluated(\n  program: IEvaluatedProgram,\n  settings: ISettings,\n  stats: IStats,\n  dayIndex?: number\n): IHistoryRecord {\n  const day = Math.max(1, Math.min(Program_numberOfDays(program), Math.max(1, (dayIndex || program.nextDay) ?? 0)));\n  const dayData = Program_getDayData(program, day);\n  const { week, dayInWeek } = dayData;\n\n  const fullDayName = Program_getDayName(program, day);\n  const now = Date.now();\n  const sortedDayExercises = Program_getDayExercisesInOrder(program, day);\n  const entries = sortedDayExercises.map((exercise, i) => {\n    return Program_nextHistoryEntry(program, dayData, i, exercise, stats, settings);\n  });\n  return {\n    vtype: \"progress\",\n    id: 0,\n    date: new Date().toISOString(),\n    programId: program.id,\n    programName: program.name,\n    intervals: [],\n    day,\n    week,\n    dayInWeek,\n    dayName: fullDayName,\n    startTime: now,\n    updatedAt: now,\n    entries,\n    ui: {},\n  };\n}\n\nexport function Program_getSupersetGroups(\n  evaluatedProgram: IEvaluatedProgram,\n  dayData: IShortDayData,\n  excludeExercise?: IPlannerProgramExercise\n): Partial<Record<string, IPlannerProgramExerciseWithType[]>> {\n  const programDay = Program_getProgramDay(\n    evaluatedProgram,\n    Program_getDayNumber(evaluatedProgram, dayData.week, dayData.dayInWeek)\n  );\n  const dayExercises = programDay ? Program_getProgramDayUsedExercises(programDay) : [];\n  const groups: Partial<Record<string, IPlannerProgramExerciseWithType[]>> = {};\n  for (const exercise of dayExercises) {\n    if (exercise.superset != null) {\n      if (!groups[exercise.superset.name]) {\n        groups[exercise.superset.name] = [];\n      }\n      if (exercise.key !== excludeExercise?.key) {\n        groups[exercise.superset.name]!.push(exercise);\n      }\n    }\n  }\n  return groups;\n}\n\nexport function Program_getSupersetExercises(\n  evalutedProgram: IEvaluatedProgram,\n  plannerExercise: IPlannerProgramExercise\n): IPlannerProgramExerciseWithType[] {\n  if (plannerExercise.superset == null) {\n    return [];\n  }\n  const dayData = plannerExercise.dayData;\n  const programDay = Program_getProgramDay(evalutedProgram, dayData.day);\n  const dayExercises = programDay ? Program_getProgramDayUsedExercises(programDay) : [];\n  const result = dayExercises.filter((e) => e.superset?.name === plannerExercise.superset?.name);\n  return result;\n}\n\nexport function Program_runExerciseFinishDayScript(\n  entry: IHistoryEntry,\n  dayData: IDayData,\n  settings: ISettings,\n  state: IProgramState,\n  otherStates: IByExercise<IProgramState>,\n  programExercise: IPlannerProgramExercise,\n  stats: IStats,\n  userPromptedStateVars?: IProgramState\n): IEither<\n  {\n    state: IProgramState;\n    bindings: IScriptBindings;\n    updates: ILiftoscriptEvaluatorUpdate[];\n    prints: [number | IPercentage | IWeight][];\n  },\n  string\n> {\n  const script = PlannerProgramExercise_getProgressScript(programExercise) || \"\";\n  const setVariationIndex = PlannerProgramExercise_currentEvaluatedSetVariationIndex(programExercise);\n  const descriptionIndex = PlannerProgramExercise_currentDescriptionIndex(programExercise);\n  const exerciseVariationIndex = PlannerProgramExercise_currentExerciseVariationIndex(programExercise);\n\n  const bindings = Progress_createScriptBindings(\n    dayData,\n    entry,\n    settings,\n    programExercise.evaluatedSetVariations[setVariationIndex]?.sets.length ?? 0,\n    Stats_getCurrentMovingAverageBodyweight(stats, settings),\n    undefined,\n    setVariationIndex + 1,\n    descriptionIndex + 1,\n    exerciseVariationIndex + 1\n  );\n  const fns = Progress_createScriptFunctions(settings);\n  let updates: ILiftoscriptEvaluatorUpdate[] = [];\n  const newState: IProgramState = ObjectUtils_clone({ ...state, ...userPromptedStateVars });\n\n  const fnContext = { exerciseType: entry.exercise, unit: settings.units, prints: [] };\n  try {\n    const runner = new ScriptRunner(\n      script,\n      newState,\n      ObjectUtils_clone(otherStates),\n      bindings,\n      fns,\n      settings.units,\n      fnContext,\n      \"planner\"\n    );\n    runner.execute();\n    updates = runner.getUpdates();\n  } catch (e) {\n    if (e instanceof SyntaxError) {\n      return { success: false, error: e.message };\n    } else {\n      throw e;\n    }\n  }\n\n  const stateDiff = { ...entry.state, ...ObjectUtils_diff(state, newState) };\n  return { success: true, data: { state: stateDiff, updates, bindings, prints: fnContext.prints } };\n}\n\nexport function Program_runFinishDayScript(\n  programExercise: IPlannerProgramExercise,\n  program: IEvaluatedProgram,\n  dayData: IDayData,\n  entry: IHistoryEntry,\n  settings: ISettings,\n  stats: IStats,\n  userPromptedStateVars?: IProgramState\n): IEither<\n  {\n    state: IProgramState;\n    otherStates: Record<number, IProgramState>;\n    updates: ILiftoscriptEvaluatorUpdate[];\n    bindings: IScriptBindings;\n  },\n  string\n> {\n  const state = PlannerProgramExercise_getState(programExercise);\n  const setVariationIndex = PlannerProgramExercise_currentEvaluatedSetVariationIndex(programExercise);\n  const descriptionIndex = PlannerProgramExercise_currentDescriptionIndex(programExercise);\n  const exerciseVariationIndex = PlannerProgramExercise_currentExerciseVariationIndex(programExercise);\n  const bindings = Progress_createScriptBindings(\n    dayData,\n    entry,\n    settings,\n    programExercise.evaluatedSetVariations[setVariationIndex]?.sets.length ?? 0,\n    Stats_getCurrentMovingAverageBodyweight(stats, settings),\n    undefined,\n    setVariationIndex + 1,\n    descriptionIndex + 1,\n    exerciseVariationIndex + 1\n  );\n  const fns = Progress_createScriptFunctions(settings);\n\n  const newState: IProgramState = {\n    ...state,\n    ...userPromptedStateVars,\n  };\n  const otherStates = ObjectUtils_clone(program.states);\n\n  const script = PlannerProgramExercise_getProgressScript(programExercise) || \"\";\n  let updates: ILiftoscriptEvaluatorUpdate[] = [];\n  try {\n    const runner = new ScriptRunner(\n      script,\n      newState,\n      otherStates,\n      bindings,\n      fns,\n      settings.units,\n      { exerciseType: programExercise.exerciseType, unit: settings.units, prints: [] },\n      \"planner\"\n    );\n    runner.execute();\n    updates = runner.getUpdates();\n  } catch (e) {\n    if (e instanceof SyntaxError) {\n      return { success: false, error: e.message };\n    } else {\n      throw e;\n    }\n  }\n\n  const diffOtherStates = ObjectUtils_keys(otherStates).reduce<IByTag<IProgramState>>((memo, key) => {\n    if (!ObjectUtils_isEqual(otherStates[key], program.states[key])) {\n      const diffState = ObjectUtils_keys(otherStates[key]).reduce<IProgramState>((memo2, key2) => {\n        const oldValue = program.states[key]?.[key2];\n        if (oldValue == null || !Weight_eq(otherStates[key][key2], oldValue)) {\n          memo2[key2] = otherStates[key][key2];\n        }\n        return memo2;\n      }, {});\n      memo[key] = diffState;\n    }\n    return memo;\n  }, {});\n\n  const stateDiff = ObjectUtils_diff(state, newState);\n  return { success: true, data: { state: stateDiff, otherStates: diffOtherStates, updates, bindings } };\n}\n\nexport function Program_dayAverageTimeMs(program: IEvaluatedProgram, settings: ISettings): number {\n  const dayApproxTimes: number[] = [];\n  for (const week of program.weeks) {\n    for (const day of week.days) {\n      dayApproxTimes.push(Program_dayApproxTimeMs(day, settings));\n    }\n  }\n  return dayApproxTimes.reduce((acc, t) => acc + t, 0) / dayApproxTimes.length;\n}\n\nexport function Program_dayApproxTimeMs(programDay: IEvaluatedProgramDay, settings: ISettings): number {\n  const exercises = Program_getProgramDayUsedExercises(programDay).map((e) => ({\n    superset: e.superset?.name,\n    isUnilateral: Exercise_getIsUnilateral(e.exerciseType, settings),\n    sets: (PlannerProgramExercise_currentEvaluatedSetVariation(e)?.sets ?? []).map((set) => ({\n      reps: set.maxrep,\n      timer: set.timer,\n      setTimer: set.setTimer,\n      auto: set.auto,\n    })),\n  }));\n  return WorkoutTimeEstimate_dayMs(exercises, {\n    rest: settings.timers.workout || 0,\n    superset: settings.timers.superset ?? undefined,\n  });\n}\n\nexport function Program_getProgramExerciseForKeyAndShortDayData(\n  program: IEvaluatedProgram,\n  dayData: IShortDayData,\n  key: string\n): IPlannerProgramExerciseWithType | undefined {\n  const day = Program_getDayNumber(program, dayData.week, dayData.dayInWeek);\n  return Program_getProgramExerciseForKeyAndDay(program, day, key);\n}\n\nexport function Program_getProgramExerciseForKeyAndDay(\n  program: IEvaluatedProgram,\n  day: number,\n  key: string\n): IPlannerProgramExerciseWithType | undefined {\n  const programDay = program ? Program_getProgramDay(program, day) : undefined;\n  const dayExercises = programDay ? Program_getProgramDayUsedExercises(programDay) : [];\n  let programExercise = dayExercises.find((pe) => pe.key === key);\n  if (programExercise == null) {\n    const allExercises = program ? Program_getAllProgramExercisesWithType(program) : [];\n    programExercise = allExercises.find((pe) => pe.key === key);\n    if (programExercise != null) {\n      programExercise = { ...programExercise, dayData: Program_getDayData(program, day) };\n    }\n  }\n  return programExercise;\n}\n\nexport function Program_runAllFinishDayScripts(\n  program: IProgram,\n  progress: IHistoryRecord,\n  stats: IStats,\n  settings: ISettings,\n  onError?: IScriptErrorHandler\n): { program: IProgram; exerciseData: IExerciseData } {\n  const exerciseData: IExerciseData = {};\n  const newEvaluatedProgram = Program_forceEvaluate(program, settings);\n  const dayData = Progress_getDayData(progress);\n  const programDay = Program_getProgramDay(newEvaluatedProgram, progress.day);\n  if (!programDay) {\n    return { program, exerciseData };\n  }\n  for (const entry of progress.entries) {\n    if (entry != null && !entry.isSuppressed && entry.sets.some((s) => s.isCompleted)) {\n      const programExercise =\n        program && entry.programExerciseId\n          ? Program_getProgramExerciseForKeyAndDay(newEvaluatedProgram, dayData.day, entry.programExerciseId)\n          : undefined;\n      if (programExercise) {\n        const newStateResult = Program_runFinishDayScript(\n          programExercise,\n          newEvaluatedProgram,\n          dayData,\n          entry,\n          settings,\n          stats,\n          progress.userPromptedStateVars?.[programExercise.key]\n        );\n        if (newStateResult.success) {\n          const { state, updates, bindings, otherStates } = newStateResult.data;\n          const exerciseKey = Exercise_toKey(entry.exercise);\n          const onerm = Exercise_onerm(entry.exercise, settings);\n          if (!Weight_eq(bindings.rm1, onerm)) {\n            exerciseData[exerciseKey] = { rm1: Weight_roundTo005(bindings.rm1) };\n          }\n          PP_iterate2(newEvaluatedProgram.weeks, (exercise) => {\n            if (exercise.key === programExercise.key && exercise.progress) {\n              exercise.progress.state = { ...exercise.progress.state, ...entry.state, ...state };\n            }\n          });\n          ProgramExercise_applyVariables(programExercise.key, newEvaluatedProgram, updates, settings);\n          for (const key of ObjectUtils_keys(otherStates || {})) {\n            PP_iterate2(newEvaluatedProgram.weeks, (exercise) => {\n              if (exercise.tags?.includes(Number(key)) && exercise.progress) {\n                exercise.progress.state = { ...exercise.progress.state, ...otherStates[key] };\n              }\n            });\n          }\n        } else {\n          const message = `There was an error executing progress script: ${newStateResult.error}`;\n          if (onError) {\n            onError(message);\n          } else {\n            Dialog_alert(message);\n          }\n        }\n      }\n    }\n  }\n  const theNextDay = Program_nextDay(newEvaluatedProgram, progress.day);\n  const newPlanner = new ProgramToPlanner(newEvaluatedProgram, settings).convertToPlanner();\n  const newProgram = ObjectUtils_clone(program);\n  newProgram.nextDay = theNextDay;\n  newProgram.planner = newPlanner;\n\n  return {\n    program: newProgram,\n    exerciseData,\n  };\n}\n\nexport function Program_createVariation(useStateWeight?: boolean): IProgramExerciseVariation {\n  return {\n    sets: [\n      {\n        repsExpr: \"5\",\n        weightExpr: useStateWeight ? \"state.weight\" : \"0lb\",\n        isAmrap: false,\n      },\n    ],\n  };\n}\n\nexport function Program_createExercise(units: IUnit): IProgramExercise {\n  const defaultWarmup = warmupValues(units)[45];\n  return {\n    name: \"Squat\",\n    id: UidFactory_generateUid(8),\n    variations: [Program_createVariation(true)],\n    exerciseType: {\n      id: \"squat\",\n      equipment: \"barbell\",\n    },\n    state: {\n      weight: units === \"kg\" ? allExercisesList.squat.startingWeightKg : allExercisesList.squat.startingWeightLb,\n    },\n    warmupSets: defaultWarmup,\n    finishDayExpr: \"\",\n    variationExpr: \"1\",\n    descriptions: [\"\"],\n    stateMetadata: {},\n    reuseLogic: { selected: undefined, states: {} },\n  };\n}\n\nexport function Program_previewProgram(dispatch: IDispatch, programId: string, showCustomPrograms: boolean): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>().p(\"previewProgram\").record({\n        id: programId,\n        showCustomPrograms,\n      }),\n    ],\n    \"Preview program\"\n  );\n  dispatch(Thunk_pushScreen(\"programPreview\"));\n}\n\nexport function Program_createEmptyProgram(): IProgram {\n  return {\n    vtype: \"program\",\n    exercises: [],\n    id: emptyProgramId,\n    name: \"Ad-Hoc Workout\",\n    description: \"\",\n    url: \"\",\n    author: \"\",\n    nextDay: 1,\n    days: [],\n    weeks: [],\n    isMultiweek: false,\n    planner: {\n      vtype: \"planner\",\n      name: \"Ad-Hoc Workout\",\n      weeks: [{ name: \"\", days: [{ name: \"\", exerciseText: \"\" }] }],\n    },\n    tags: [],\n  };\n}\n\nexport function Program_cloneProgram(dispatch: IDispatch, program: IProgram, settings: ISettings): void {\n  const newProgramId = UidFactory_generateUid(8);\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"programs\")\n        .recordModify((programs) => {\n          const newProgram = { ...program, clonedAt: Date.now(), id: newProgramId };\n          if (newProgram.planner) {\n            newProgram.planner = PlannerProgram_switchToUnit(newProgram.planner, settings);\n          }\n          return [...programs, newProgram];\n        }),\n      lb<IState>().p(\"storage\").p(\"currentProgramId\").record(newProgramId),\n    ],\n    \"Clone program\"\n  );\n}\n\nexport function Program_selectProgram(dispatch: IDispatch, programId: string): void {\n  updateState(dispatch, [lb<IState>().p(\"storage\").p(\"currentProgramId\").record(programId)], \"Select program\");\n}\n\nexport function Program_selectProgramAndGoHome(dispatch: IDispatch, programId: string): void {\n  Program_selectProgram(dispatch, programId);\n  dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n}\n\nexport function Program_getAllProgramExercises(evaluatedProgram: IEvaluatedProgram): IPlannerProgramExercise[] {\n  return evaluatedProgram.weeks.flatMap((w) => w.days.flatMap((d) => d.exercises));\n}\n\nexport function Program_getAllUsedProgramExercises(\n  evaluatedProgram: IEvaluatedProgram\n): IPlannerProgramExerciseWithType[] {\n  const used = Program_getAllProgramExercises(evaluatedProgram).filter((e) => !e.notused && e.exerciseType != null);\n  return used as IPlannerProgramExerciseWithType[];\n}\n\nexport function Program_getAllProgramExercisesWithType(\n  evaluatedProgram: IEvaluatedProgram\n): IPlannerProgramExerciseWithType[] {\n  const used = Program_getAllProgramExercises(evaluatedProgram).filter((e) => e.exerciseType != null);\n  return used as IPlannerProgramExerciseWithType[];\n}\n\nexport function Program_getProgramExerciseByTypeWeekAndDay(\n  evaluatedProgram: IEvaluatedProgram,\n  exerciseType: IExerciseType,\n  week: number,\n  dayInWeek: number\n): IPlannerProgramExercise | undefined {\n  let exercise: IPlannerProgramExercise | undefined;\n  PP_iterate2(evaluatedProgram.weeks, (e, weekIndex, dayInWeekIndex) => {\n    if (\n      weekIndex + 1 === week &&\n      dayInWeekIndex + 1 === dayInWeek &&\n      e.exerciseType &&\n      Exercise_eq(e.exerciseType, exerciseType)\n    ) {\n      exercise = e;\n      return true;\n    }\n    return false;\n  });\n  return exercise;\n}\n\nfunction Program_emptyEvaluatedProgram(program: IProgram): IEvaluatedProgram {\n  return {\n    type: \"evaluatedProgram\",\n    id: program.id,\n    planner: {\n      vtype: \"planner\",\n      name: program.name,\n      weeks: [{ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] }],\n    },\n    name: program.name,\n    errors: [],\n    nextDay: program.nextDay,\n    weeks: [\n      {\n        name: \"Week 1\",\n        days: [\n          {\n            name: \"Day 1\",\n            dayData: { day: 1, week: 1, dayInWeek: 1 },\n            exercises: [],\n          },\n        ],\n      },\n    ],\n    states: {},\n  };\n}\n\n// The half of an evaluation that comes from the planner alone. Split out because it is all some\n// surfaces need: an evaluated program's id, name and nextDay are fields it carries, not inputs to\n// working out what its weeks contain.\nfunction Program_buildWeeks(\n  planner: IPlannerProgram,\n  evaluatedWeeks: IPlannerEvalResult[][]\n): { weeks: IEvaluatedProgramWeek[]; errors: IEvaluatedProgramError[] } {\n  let dayNum = 0;\n  const errors: IEvaluatedProgramError[] = [];\n  const weeks = planner.weeks.map((week, weekIndex) => {\n    const evaluatedWeek = evaluatedWeeks[weekIndex];\n    const days = week.days.map((day, dayInWeekIndex) => {\n      dayNum += 1;\n      const evaluatedDay = evaluatedWeek[dayInWeekIndex];\n      const dayData = {\n        day: dayNum,\n        week: weekIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n      };\n      const evaluatedExercises = CollectionUtils_sortBy(evaluatedDay.success ? evaluatedDay.data : [], \"order\");\n      if (!evaluatedDay.success) {\n        errors.push({ error: evaluatedDay.error, dayData });\n      }\n      return {\n        name: day.name,\n        description: day.description,\n        dayData,\n        exercises: evaluatedExercises,\n      };\n    });\n    return { name: week.name, description: week.description, days };\n  });\n  return { weeks, errors };\n}\n\n// Evaluating a planner on its own, for surfaces that only ever have one. Planner in, weeks out —\n// no program required, because none of it is used to work them out.\nexport function Program_evaluatePlannerWeeks(planner: IPlannerProgram, settings: ISettings): IEvaluatedProgramWeek[] {\n  const { evaluatedWeeks } = PlannerEvaluator_evaluate(planner, settings);\n  return Program_buildWeeks(planner, evaluatedWeeks).weeks;\n}\n\n// Which exercise a name refers to *in this planner*, for an action that has just built one and\n// needs the key that is valid in it. Resolved here rather than against whatever evaluation the\n// caller had lying around: that one predates the edit being folded in, so after a rename it\n// answers with a key the new planner no longer has — or with the wrong exercise entirely.\n//\n// Day-by-day, so a syntax error on one day costs only that day. A whole-document parse is\n// all-or-nothing, and using one here would take the action away from every line in the program\n// because of an unfinished one somewhere else.\nexport function Program_findPlannerExercise(\n  planner: IPlannerProgram,\n  settings: ISettings,\n  fullName: string\n): IPlannerProgramExercise | undefined {\n  const key = PlannerKey_fromFullName(fullName, settings.exercises);\n  for (const week of Program_evaluatePlannerWeeks(planner, settings)) {\n    for (const day of week.days) {\n      const exercise = day.exercises.find((e) => e.key === key);\n      if (exercise != null) {\n        return exercise;\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction Program_buildEvaluatedProgram(\n  program: IProgram,\n  planner: IPlannerProgram,\n  evaluatedWeeks: IPlannerEvalResult[][]\n): IEvaluatedProgram {\n  const { weeks, errors } = Program_buildWeeks(planner, evaluatedWeeks);\n  const states: IByTag<IProgramState> = {};\n  PP_iterate(evaluatedWeeks, (exercise) => {\n    for (const tag of exercise.tags) {\n      states[tag] = { ...states[tag], ...PlannerProgramExercise_getState(exercise) };\n    }\n  });\n  return {\n    type: \"evaluatedProgram\",\n    id: program.id,\n    errors,\n    planner,\n    name: program.name,\n    nextDay: program.nextDay,\n    weeks,\n    states,\n  };\n}\n\nexport function Program_forceEvaluate(program: IProgram, settings: ISettings): IEvaluatedProgram {\n  const planner = program.planner;\n  if (!planner) {\n    return Program_emptyEvaluatedProgram(program);\n  }\n  const { evaluatedWeeks } = PlannerEvaluator_forceEvaluate(planner, settings);\n  return Program_buildEvaluatedProgram(program, planner, evaluatedWeeks);\n}\n\n// Reuses the content-memoized planner evaluation that the edit screen already computed for its render,\n// so edit dispatches don't re-parse the whole program. The planner evaluation may be cached/shared, so\n// callers that mutate the returned exercises MUST clone first. Not interchangeable with Program_forceEvaluate,\n// which guarantees a fresh recompute.\nfunction Program_evaluateCachedPlannerImpl(program: IProgram, settings: ISettings): IEvaluatedProgram {\n  const planner = program.planner;\n  if (!planner) {\n    return Program_emptyEvaluatedProgram(program);\n  }\n  const { evaluatedWeeks } = PlannerEvaluator_evaluate(planner, settings);\n  return Program_buildEvaluatedProgram(program, planner, evaluatedWeeks);\n}\n\nexport const Program_evaluateCachedPlanner = memoize(Program_evaluateCachedPlannerImpl, { maxSize: 10 });\n\nexport function Program_getNumberOfExerciseInstances(program: IEvaluatedProgram, exerciseKey: string): number {\n  let count = 0;\n  PP_iterate2(program.weeks, (exercise) => {\n    if (exercise.key === exerciseKey) {\n      count += 1;\n    }\n  });\n  return count;\n}\n\nexport function Program_changeExerciseName(from: string, to: string, program: IProgram, settings: ISettings): IProgram {\n  const planner = program.planner;\n  if (!planner) {\n    return program;\n  }\n  return {\n    ...program,\n    planner: {\n      ...planner,\n      weeks: planner.weeks.map((week) => {\n        return {\n          ...week,\n          days: week.days.map((day) => {\n            return {\n              ...day,\n              exerciseText: PlannerEvaluator_changeExerciseName(day.exerciseText, from, to, settings),\n            };\n          }),\n        };\n      }),\n    },\n  };\n}\n\nexport function Program_numberOfDays(program: IEvaluatedProgram): number {\n  return program.weeks.reduce((memo, week) => memo + week.days.length, 0);\n}\n\nexport function Program_weeksRange(program: IEvaluatedProgram): string | undefined {\n  return program.weeks.length > 1\n    ? `${program.weeks.length} ${StringUtils_pluralize(\"week\", program.weeks.length)}`\n    : \"\";\n}\n\nexport function Program_daysRange(program: IEvaluatedProgram): string {\n  const minDays = Math.min(...program.weeks.map((w) => w.days.length));\n  const maxDays = Math.max(...program.weeks.map((w) => w.days.length));\n  if (minDays === maxDays) {\n    return `${minDays} ${StringUtils_pluralize(\"day\", minDays)} per week`;\n  } else {\n    return `${minDays}-${maxDays} days per week`;\n  }\n}\n\nexport function Program_exerciseRange(program: IEvaluatedProgram): string {\n  const days = program.weeks.flatMap((w) => w.days);\n  const minExs = Math.min(...days.map((d) => Program_getProgramDayUsedExercises(d).length));\n  const maxExs = Math.max(...days.map((d) => Program_getProgramDayUsedExercises(d).length));\n  return Program_exerciseRangeFormat(minExs, maxExs);\n}\n\nexport function Program_exerciseRangeFormat(minExs: number, maxExs: number): string {\n  if (minExs === maxExs) {\n    return `${minExs} ${StringUtils_pluralize(\"exercise\", minExs)} per day`;\n  } else {\n    return `${minExs}-${maxExs} exercises per day`;\n  }\n}\n\nexport function Program_getWeekFromDay(program: IEvaluatedProgram, day: number): number {\n  let daysTotal = 0;\n  for (let i = 0; i < program.weeks.length; i += 1) {\n    const weekDays = program.weeks[i].days.length;\n    daysTotal += weekDays;\n    if (daysTotal >= day) {\n      return i + 1;\n    }\n  }\n  return 1;\n}\n\nexport function Program_getDayNumber(\n  program: IPlannerProgram | IEvaluatedProgram,\n  week: number,\n  dayInWeek: number\n): number {\n  let dayIndex = 1;\n  for (let w = 0; w < program.weeks.length; w += 1) {\n    for (let d = 0; d < program.weeks[w].days.length; d += 1) {\n      if (w === week - 1 && d === dayInWeek - 1) {\n        return dayIndex;\n      }\n      dayIndex += 1;\n    }\n  }\n  return -1;\n}\n\nexport function Program_getExerciseTypesForWeekDay(\n  program: IEvaluatedProgram,\n  week: number,\n  day: number\n): IExerciseType[] {\n  const exerciseTypes: IExerciseType[] = [];\n  PP_iterate2(program.weeks, (exercise, weekIndex, dayInWeekIndex) => {\n    if (weekIndex + 1 === week && dayInWeekIndex + 1 === day) {\n      const exType = exercise.exerciseType;\n      if (exType && !exerciseTypes.some((et) => Exercise_eq(et, exType))) {\n        exerciseTypes.push(exType);\n      }\n    }\n  });\n  return exerciseTypes;\n}\n\nexport function Program_getDayData(program: IEvaluatedProgram, day: number): Required<IDayData> {\n  return {\n    day,\n    week: Program_getWeekFromDay(program, day),\n    dayInWeek: Program_getDayInWeek(program, day),\n  };\n}\n\nexport function Program_getDayInWeek(program: IEvaluatedProgram, day: number): number {\n  let daysTotal = 0;\n  for (const week of program.weeks) {\n    daysTotal += week.days.length;\n    if (daysTotal >= day) {\n      return day - (daysTotal - week.days.length);\n    }\n  }\n  return 1;\n}\n\nexport function Program_getDayName(program: IEvaluatedProgram, day: number): string {\n  const dayData = Program_getDayData(program, day);\n  const programDay = Program_getProgramDay(program, day);\n  const week = program.weeks[(dayData.week || 1) - 1];\n  const isMultiweek = program.weeks.length > 1 && week != null;\n  return `${isMultiweek ? `${week.name} - ` : \"\"}${programDay?.name}`;\n}\n\nexport function Program_getListOfDays(program: IEvaluatedProgram): [string, string][] {\n  const days: [string, string][] = [];\n  const isReallyMultiweek = program.weeks.length > 1;\n  let dayIndex = 0;\n  for (const week of program.weeks) {\n    for (const day of week.days) {\n      dayIndex += 1;\n      days.push([`${dayIndex}`, `${isReallyMultiweek ? `${week.name} - ` : \"\"}${day.name}`]);\n    }\n  }\n  return days;\n}\n\nexport function Program_getProgramWeek(program: IEvaluatedProgram, day?: number): IEvaluatedProgramWeek {\n  return program.weeks[Program_getWeekFromDay(program, day || 1) - 1] || program.weeks[0];\n}\n\nexport function Program_getProgramDay(program: IEvaluatedProgram, day: number): IEvaluatedProgramDay | undefined {\n  let aDay = 0;\n  for (const week of program.weeks || []) {\n    for (const d of week.days) {\n      aDay += 1;\n      if (day === aDay) {\n        return d;\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function Program_getProgramDayExercises(programDay: IEvaluatedProgramDay): IPlannerProgramExerciseWithType[] {\n  const list = programDay.exercises.filter((e) => e.exerciseType != null);\n  return list as IPlannerProgramExerciseWithType[];\n}\n\nexport function Program_getProgramDayUsedExercises(\n  programDay: IEvaluatedProgramDay\n): IPlannerProgramExerciseWithType[] {\n  const list = programDay.exercises.filter((e) => !e.notused && e.exerciseType != null);\n  return list as IPlannerProgramExerciseWithType[];\n}\n\nexport function Program_applyEvaluatedProgram(\n  program: IProgram,\n  evaluatedProgram: IEvaluatedProgram,\n  settings: ISettings\n): IProgram {\n  const newProgram = ObjectUtils_clone(program);\n  newProgram.planner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n  newProgram.nextDay = evaluatedProgram.nextDay;\n  return newProgram;\n}\n\nexport function Program_getProgramExercise(\n  day: number,\n  program?: IEvaluatedProgram,\n  key?: string\n): IPlannerProgramExercise | undefined {\n  if (key == null || program == null) {\n    return undefined;\n  }\n  const programDay = Program_getProgramDay(program, day);\n  return programDay?.exercises.find((e) => e.key === key);\n}\n\nexport function Program_getFirstProgramExercise(\n  program?: IEvaluatedProgram,\n  key?: string\n): IPlannerProgramExercise | undefined {\n  if (key == null || program == null) {\n    return undefined;\n  }\n  return Program_getAllProgramExercises(program).find((e) => e.key === key || e.fullName === key);\n}\n\nexport function Program_getProgramExerciseFromDay(\n  programDay?: IEvaluatedProgramDay,\n  key?: string\n): IPlannerProgramExercise | undefined {\n  if (key == null || programDay == null) {\n    return undefined;\n  }\n  return programDay?.exercises.find((e) => e.key === key);\n}\n\nexport function Program_getEvaluatedExercise(\n  program: IProgram,\n  day: number,\n  key: string,\n  settings: ISettings\n): IPlannerProgramExercise | undefined {\n  const { weeks: evaluatedWeeks } = Program_evaluate(program, settings);\n  let plannerProgramExercise: IPlannerProgramExercise | undefined;\n  PP_iterate2(evaluatedWeeks, (exercise, weekIndex, dayInWeekIndex, dayIndex) => {\n    if (dayIndex === day - 1 && exercise.key === key) {\n      plannerProgramExercise = exercise;\n      return true;\n    } else {\n      return undefined;\n    }\n  });\n  return plannerProgramExercise;\n}\n\nexport function Program_nextDay(program: IEvaluatedProgram, day?: number): number {\n  const nd = (day != null ? day % Program_numberOfDays(program) : 0) + 1;\n  return isNaN(nd) ? 1 : nd;\n}\n\nexport function Program_editAction(dispatch: IDispatch, program: IProgram, opts?: INavigateOpts): void {\n  const plannerState = EditProgram_initPlannerState(program.id, program);\n  updateState(\n    dispatch,\n    [lb<IState>().p(\"editProgramStates\").p(program.id).record(plannerState)],\n    \"Set edit program state\"\n  );\n  dispatch(Thunk_pushScreen(\"editProgram\", { programId: program.id }, opts));\n}\n\nexport function Program_exportProgramToFile(program: IProgram, settings: ISettings, version: string): void {\n  const payload = Program_exportProgram(program, settings, version);\n  Exporter_toFile(\n    `liftosaur_${program.name.replace(/\\s+/g, \"-\")}_${DateUtils_formatYYYYMMDD(Date.now())}.json`,\n    JSON.stringify(payload, null, 2)\n  );\n}\n\nexport async function Program_exportProgramToLink(\n  program: IProgram,\n  settings: ISettings,\n  version: string\n): Promise<string> {\n  const payload = Program_exportProgram(program, settings, version);\n  const url = await Encoder_encodeIntoUrl(JSON.stringify(payload), __HOST__);\n  url.pathname = \"/program\";\n  return url.toString();\n}\n\nexport function Program_exportProgram(program: IProgram, settings: ISettings, version?: string): IExportedProgram {\n  const aFullProgram = Program_evaluate(program, settings);\n  const customExerciseIds = Program_getAllProgramExercises(aFullProgram).reduce<string[]>((memo, programExercise) => {\n    const id = programExercise.exerciseType?.id;\n    if (id) {\n      const isBuiltIn = !!Exercise_findById(id, {});\n      if (!isBuiltIn) {\n        memo.push(id);\n      }\n    }\n    return memo;\n  }, []);\n\n  const customExercises = ObjectUtils_pick(settings.exercises, customExerciseIds);\n  return {\n    customExercises,\n    program,\n    version: version || getLatestMigrationVersion(),\n    settings: ObjectUtils_pick(settings, [\"units\", \"timers\", \"planner\"]),\n  };\n}\n\nexport function Program_exportedPlannerProgramToExportedProgram(\n  exportedPlannerProgram: IExportedPlannerProgram,\n  aNextDay?: number\n): IExportedProgram {\n  const program = {\n    ...Program_create(exportedPlannerProgram.program.name, exportedPlannerProgram.id),\n    planner: exportedPlannerProgram.program,\n  };\n  if (aNextDay != null) {\n    program.nextDay = aNextDay;\n  }\n  const exportedProgram: IExportedProgram = {\n    customExercises: exportedPlannerProgram.settings.exercises,\n    program,\n    version: exportedPlannerProgram.version,\n    settings: {\n      timers: {\n        workout: exportedPlannerProgram.settings.timer,\n      },\n      planner: exportedPlannerProgram.plannerSettings,\n    },\n  };\n  return exportedProgram;\n}\n\nexport function Program_create(name: string, id?: string): IProgram {\n  return {\n    vtype: \"program\" as const,\n    id: id || UidFactory_generateUid(8),\n    name: name,\n    url: \"\",\n    author: \"\",\n    shortDescription: \"\",\n    description: \"\",\n    nextDay: 1,\n    weeks: [],\n    isMultiweek: false,\n    days: [{ id: UidFactory_generateUid(8), name: \"Day 1\", exercises: [] }],\n    exercises: [],\n    tags: [],\n    clonedAt: Date.now(),\n  };\n}\n\nexport function Program_isChanged(aProgram: IProgram, bProgram: IProgram): boolean {\n  const { ...cleanedAProgram } = aProgram;\n  const { ...cleanedBProgram } = bProgram;\n  const changed = !ObjectUtils_isEqual(cleanedAProgram, cleanedBProgram);\n  if (changed) {\n    const paths = ObjectUtils_diffPaths(cleanedAProgram, cleanedBProgram);\n    return paths.some((p) => {\n      return !p.match(/exercises.\\d+.state/) && !p.match(/exercises.\\d+.reuseLogic\\.states/) && !p.match(/nextDay/);\n    });\n  }\n  return false;\n}\n\nexport async function Program_toUrl(\n  program: IProgram,\n  settings: ISettings,\n  client: Window[\"fetch\"],\n  userId?: string\n): Promise<string> {\n  const exportedProgram = Program_exportProgram(program, settings);\n  const baseUrl = UrlUtils_build(\n    \"/planner\",\n    typeof window !== \"undefined\" && window.location?.href ? window.location.href : \"https://www.liftosaur.com\"\n  );\n  const json = JSON.stringify(exportedProgram);\n  const hash = StringUtils_hashString(json);\n  const encodedUrl = await Encoder_encodeIntoUrl(json, baseUrl.toString());\n  const encodedProgramUrl = encodedUrl.toString();\n  if (encodedProgramHashToShortUrl[hash]) {\n    return encodedProgramHashToShortUrl[hash];\n  } else {\n    const service = new Service(client);\n    const shortUrl = await service.postShortUrl(encodedProgramUrl, \"p\", settings.affiliateEnabled ? userId : undefined);\n    encodedProgramHashToShortUrl[hash] = shortUrl;\n    return shortUrl;\n  }\n}\n\nexport function Program_createFromHistoryRecord(\n  programName: string,\n  record: IHistoryRecord,\n  settings: ISettings\n): IProgram {\n  const dayData = { week: 1, day: 1, dayInWeek: 1 };\n  const program: IProgram = {\n    ...Program_create(programName),\n    planner: {\n      vtype: \"planner\",\n      name: programName,\n      weeks: [{ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] }],\n    },\n  };\n  const evaluatedProgram = Program_evaluate(program, settings);\n  const planner = program.planner!;\n  planner.weeks[0].days[0].exerciseText = record.entries\n    .map((entry) => {\n      const exercise = Exercise_get(entry.exercise, settings.exercises);\n      return Exercise_fullName(exercise, settings);\n    })\n    .join(\"\\n\");\n  const newDay: IEvaluatedProgramDay = {\n    dayData: dayData,\n    name: \"Day 1\",\n    exercises: record.entries.map((e, i) => {\n      return PlannerProgramExercise_createExerciseFromEntry(e, dayData, settings, i);\n    }),\n  };\n  evaluatedProgram.weeks[0].days[0] = newDay;\n  const newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n  const newProgram = {\n    ...ObjectUtils_clone(program),\n    planner: newPlanner,\n  };\n  return newProgram;\n}\n\nexport function Program_addDayFromHistoryRecord(\n  program: IProgram,\n  afterDay: number,\n  record: IHistoryRecord,\n  settings: ISettings\n): { program: IProgram; dayData: Required<IDayData> } {\n  const evaluatedProgram = Program_evaluate(program, settings);\n  const dayData = Program_getDayData(evaluatedProgram, afterDay);\n  const newDayData = { week: dayData.week, day: dayData.day + 1, dayInWeek: dayData.dayInWeek + 1 };\n  const newDay: IEvaluatedProgramDay = {\n    dayData: newDayData,\n    name: `Day ${dayData.day + 1}`,\n    exercises: record.entries.map((e, i) => {\n      return PlannerProgramExercise_createExerciseFromEntry(e, newDayData, settings, i);\n    }),\n  };\n  evaluatedProgram.weeks[dayData.week - 1].days.splice(dayData.dayInWeek, 0, newDay);\n  evaluatedProgram.planner.weeks[dayData.week - 1].days.splice(dayData.dayInWeek, 0, {\n    name: newDay.name,\n    exerciseText: newDay.exercises.map((e) => e.fullName).join(\"\\n\"),\n  });\n  const newPlanner = new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner();\n  const newProgram = {\n    ...ObjectUtils_clone(program),\n    planner: newPlanner,\n  };\n  return { program: newProgram, dayData: newDayData };\n}\n\nexport function Program_getReuseSetsCandidates(\n  key: string,\n  evaluatedProgram: IEvaluatedProgram,\n  dayData: Required<IDayData>\n): Record<string, IReuseCandidate> {\n  const result: Record<string, IReuseCandidate> = {};\n  PP_iterate2(evaluatedProgram.weeks, (exercise, weekIndex, dayInWeekIndex) => {\n    if (\n      exercise.key === key &&\n      ((dayData.week === weekIndex + 1 && dayData.dayInWeek === dayInWeekIndex + 1) || exercise.isRepeat)\n    ) {\n      return;\n    }\n    if (exercise.reuse != null || exercise.progress?.reuse != null || exercise.update?.reuse != null) {\n      return;\n    }\n    let reuseSetCandidate = result[exercise.key];\n    if (!reuseSetCandidate) {\n      reuseSetCandidate = {\n        exercise,\n        weekAndDays: {},\n      };\n      result[exercise.key] = reuseSetCandidate;\n    }\n    reuseSetCandidate.weekAndDays[weekIndex + 1] = reuseSetCandidate.weekAndDays[weekIndex + 1] || new Set<number>();\n    reuseSetCandidate.weekAndDays[weekIndex + 1].add(dayInWeekIndex + 1);\n  });\n  return result;\n}\n\nexport function Program_getScriptReuseCandidates(\n  key: string,\n  notused: boolean,\n  evaluatedProgram: IEvaluatedProgram,\n  type: \"progress\" | \"update\"\n): string[] {\n  const result: Record<string, string> = {};\n  PP_iterate2(evaluatedProgram.weeks, (exercise) => {\n    if (exercise.key === key) {\n      return;\n    }\n    const script = type === \"progress\" ? exercise.progress : exercise.update;\n    if (!script || script.type !== \"custom\" || (!(!notused && exercise.notused) && script.reuse)) {\n      return;\n    }\n    result[exercise.fullName] = exercise.fullName;\n  });\n  return Object.keys(result);\n}\n\nexport function Program_getReusingSetsExercises(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise[] {\n  const exercises: IPlannerProgramExercise[] = [];\n  PP_iterate2(evaluatedProgram.weeks, (e) => {\n    if (\n      e.reuse?.exercise?.key === programExercise.key &&\n      e.reuse?.exercise.dayData.week === programExercise.dayData.week &&\n      e.reuse?.exercise.dayData.dayInWeek === programExercise.dayData.dayInWeek\n    ) {\n      exercises.push(e);\n    }\n  });\n  return exercises;\n}\n\nexport function Program_getReusingDescriptionsExercises(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise[] {\n  const exercises: IPlannerProgramExercise[] = [];\n  PP_iterate2(evaluatedProgram.weeks, (e) => {\n    if (\n      e.descriptions.reuse?.exercise?.key === programExercise.key &&\n      e.descriptions.reuse?.exercise.dayData.week === programExercise.dayData.week &&\n      e.descriptions.reuse?.exercise.dayData.dayInWeek === programExercise.dayData.dayInWeek\n    ) {\n      exercises.push(e);\n    }\n  });\n  return exercises;\n}\n\nexport function Program_getReusingCustomProgressExercises(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise[] {\n  const exercises: IPlannerProgramExercise[] = [];\n  PP_iterate2(evaluatedProgram.weeks, (e) => {\n    if (e.progress?.type === \"custom\" && e.progress?.reuse?.fullName === programExercise.fullName) {\n      exercises.push(e);\n    }\n  });\n  return exercises;\n}\n\nexport function Program_getReusingSetProgressExercises(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise[] {\n  const exercises: IPlannerProgramExercise[] = [];\n  PP_iterate2(evaluatedProgram.weeks, (e) => {\n    if (e.reuse?.fullName === programExercise.fullName && e.progress) {\n      exercises.push(e);\n    }\n  });\n  return exercises;\n}\n\nexport function Program_getReusingProgressExercises(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise[] {\n  const reusingCustomProgressExercises = Program_getReusingCustomProgressExercises(evaluatedProgram, programExercise);\n  const reusingSetProgressExercises = Program_getReusingSetProgressExercises(evaluatedProgram, programExercise);\n  const exercises = CollectionUtils_uniqBy(\n    [...reusingCustomProgressExercises, ...reusingSetProgressExercises],\n    \"fullName\"\n  );\n  return exercises;\n}\n\nexport function Program_getReusingUpdateExercises(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise[] {\n  const exercises: IPlannerProgramExercise[] = [];\n  PP_iterate2(evaluatedProgram.weeks, (e) => {\n    if (e.reuse?.fullName === programExercise.fullName) {\n      exercises.push(e);\n    }\n  });\n  return exercises;\n}\n\nexport const Program_fullProgram = memoize(\n  (program: IProgram, settings: ISettings): IProgram => {\n    return program;\n  },\n  { maxSize: 10 }\n);\n\nexport const Program_evaluate = memoize(Program_forceEvaluate, { maxSize: 10 });\n\nexport function Program_getDiffState(\n  state: IProgramState,\n  newState: IProgramState,\n  units: IUnit\n): Record<string, string | undefined> {\n  return ObjectUtils_keys(state).reduce<Record<string, string | undefined>>((memo, key) => {\n    const oldValue = state[key];\n    const newValue = newState[key];\n    if (newValue != null && !Weight_eq(oldValue, newValue)) {\n      const oldValueStr = Weight_display(Weight_convertTo(oldValue as number, units));\n      const newValueStr = Weight_display(Weight_convertTo(newValue as number, units));\n      memo[key] = `${oldValueStr} -> ${newValueStr}`;\n    }\n    return memo;\n  }, {});\n}\n\nexport function Program_getDiffVars(\n  entry: IHistoryEntry,\n  updates: ILiftoscriptEvaluatorUpdate[],\n  bindings: IScriptBindings,\n  settings: ISettings\n): Record<string, string | undefined> {\n  const diffVars: Record<string, string | undefined> = {};\n  if (bindings.rm1 != null) {\n    const oldOnerm = Exercise_onerm(entry.exercise, settings);\n    if (!Weight_eq(oldOnerm, bindings.rm1)) {\n      diffVars[\"1 RM\"] = `${Weight_display(Weight_convertTo(oldOnerm, settings.units))} -> ${Weight_display(\n        Weight_convertTo(bindings.rm1, settings.units)\n      )}`;\n    }\n  }\n  for (const update of updates) {\n    const key = update.type;\n    const value = update.value;\n    const target = value.target;\n    while (target[0] === \"*\") {\n      target.shift();\n    }\n    const keyStr = `${key}${target.length > 0 ? `[${target.join(\":\")}]` : \"\"}`;\n    diffVars[keyStr] = `${value.op !== \"=\" ? `${value.op} ` : \"\"}${Weight_printOrNumber(value.value)}`;\n  }\n  return diffVars;\n}\n\nexport interface IProgressStateChanges {\n  diffState: Record<string, string | undefined>;\n  diffVars: Record<string, string | undefined>;\n  prints: (number | IWeight | IPercentage)[][];\n}\n\nexport function Program_computeProgressStateChanges(\n  entry: IHistoryEntry,\n  dayData: IDayData,\n  settings: ISettings,\n  programExercise: IPlannerProgramExercise,\n  program: IEvaluatedProgram,\n  stats: IStats,\n  userPromptedStateVars?: IProgramState\n): IProgressStateChanges | undefined {\n  const state = PlannerProgramExercise_getState(programExercise);\n  const result = Program_runExerciseFinishDayScript(\n    entry,\n    dayData,\n    settings,\n    state,\n    program.states,\n    programExercise,\n    stats,\n    userPromptedStateVars\n  );\n  if (!result.success) {\n    return undefined;\n  }\n  const { state: newState, updates, bindings } = result.data;\n  return {\n    diffState: Program_getDiffState(state, newState, settings.units),\n    diffVars: Program_getDiffVars(entry, updates, bindings, settings),\n    prints: result.data.prints,\n  };\n}\n\nexport function Program_getEvaluatedProgramFromState(state: IState): IEvaluatedProgram | undefined {\n  const program = Program_getCurrentProgram(state.storage);\n  return program ? Program_evaluate(program, state.storage.settings) : undefined;\n}\n","import {\n  PlannerProgram_evaluate,\n  PlannerProgram_replaceExercise,\n  PlannerProgram_thrownErrorMessage,\n} from \"../pages/planner/models/plannerProgram\";\nimport { PlannerEvaluator_changeExerciseName } from \"../pages/planner/plannerEvaluator\";\nimport type { IPlannerEvalResult } from \"../pages/planner/plannerExerciseEvaluator\";\nimport type { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport type { IDayData, IExerciseType, IPlannerProgram, ISettings } from \"../types\";\nimport type { IProgramExerciseSwapScope } from \"./programExerciseSwap\";\nimport { ProgramExerciseText_cleanErrorMessage, type IProgramExerciseTextError } from \"./programExerciseText\";\n\nexport interface IProgramDayTextRename {\n  oldKey: string;\n  newKey: string;\n  // Set when the new name collided with another exercise in the program and was labelled apart,\n  // which is worth telling the user — a label they didn't type appearing in their program is\n  // otherwise unexplainable.\n  label?: string;\n}\n\nexport interface IProgramDayTextIdentityChange {\n  oldName: string;\n  newName: string;\n  // How many days declare the exercise being changed. Above one, \"this day\" and \"everywhere\"\n  // are different edits and only the caller can say which was meant.\n  declarations: number;\n  // A ladder's rungs live in the text and are applied as written, so scope doesn't reach it —\n  // asking which days to apply it to would be asking a question whose answer is then ignored.\n  isLadder: boolean;\n}\n\nexport interface IProgramDayTextApplied {\n  planner: IPlannerProgram;\n  // Declarations whose identity changed, so a caller holding an in-progress workout can carry\n  // logged sets across. Only ever populated for an unambiguous change — see detectIdentityChange.\n  renames: IProgramDayTextRename[];\n}\n\ninterface IDayLocation {\n  weekIndex: number;\n  dayIndex: number;\n}\n\n// The mechanical half of an apply, on its own for the live view: a sheet showing what the draft\n// currently evaluates to wants the splice without the renames and program-wide rewrites, which\n// only make sense once the user commits.\nexport function ProgramDayText_replace(\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  exerciseText: string\n): IPlannerProgram {\n  return withDayText(planner, { weekIndex: dayData.week - 1, dayIndex: dayData.dayInWeek - 1 }, exerciseText);\n}\n\nfunction withDayText(planner: IPlannerProgram, location: IDayLocation, exerciseText: string): IPlannerProgram {\n  return {\n    ...planner,\n    weeks: planner.weeks.map((week, weekIndex) =>\n      weekIndex !== location.weekIndex\n        ? week\n        : {\n            ...week,\n            days: week.days.map((day, dayIndex) => (dayIndex !== location.dayIndex ? day : { ...day, exerciseText })),\n          }\n    ),\n  };\n}\n\n// The evaluator throws on some malformed programs rather than returning a result, and a program\n// that was already broken before this edit is not something the edit has to answer for — so a\n// failure to evaluate is an absent baseline, not an error.\nfunction evaluateWeeks(planner: IPlannerProgram, settings: ISettings): IPlannerEvalResult[][] | undefined {\n  try {\n    return PlannerProgram_evaluate(planner, settings).evaluatedWeeks;\n  } catch (e) {\n    return undefined;\n  }\n}\n\nfunction errorAt(weeks: IPlannerEvalResult[][], location: IDayLocation): IProgramExerciseTextError | undefined {\n  const result = weeks[location.weekIndex]?.[location.dayIndex];\n  return result != null && !result.success\n    ? {\n        message: ProgramExerciseText_cleanErrorMessage(result.error.message),\n        from: result.error.from,\n        to: result.error.to,\n      }\n    : undefined;\n}\n\nfunction exercisesAt(weeks: IPlannerEvalResult[][] | undefined, location: IDayLocation): IPlannerProgramExercise[] {\n  const result = weeks?.[location.weekIndex]?.[location.dayIndex];\n  return result != null && result.success ? result.data : [];\n}\n\n// An error this edit is responsible for: one on a day that evaluated cleanly beforehand. A day\n// that was already failing stays the user's problem to fix where they made it, not a reason to\n// refuse an unrelated edit somewhere else. Day text edits can't add or remove days, so the two\n// evaluations are index-comparable.\nfunction introducedError(\n  before: IPlannerEvalResult[][] | undefined,\n  after: IPlannerEvalResult[][]\n): IProgramExerciseTextError | undefined {\n  if (before == null) {\n    return undefined;\n  }\n  for (let weekIndex = 0; weekIndex < after.length; weekIndex += 1) {\n    for (let dayIndex = 0; dayIndex < after[weekIndex].length; dayIndex += 1) {\n      const now = after[weekIndex][dayIndex];\n      const was = before[weekIndex]?.[dayIndex];\n      if (now != null && !now.success && was != null && was.success) {\n        return { message: ProgramExerciseText_cleanErrorMessage(now.error.message) };\n      }\n    }\n  }\n  return undefined;\n}\n\n// Which declaration became which. Derived from the day's key sets rather than tracked as the\n// user types, so it can only answer where the answer is unambiguous: exactly one key gone and\n// exactly one arrived. Any richer edit — two exercises swapped at once, one replaced while\n// another is added — has several readings, and guessing wrong would migrate a workout's logged\n// sets onto the wrong exercise. There the edit still goes through; nothing is carried over.\nfunction detectIdentityChange(\n  before: IPlannerProgramExercise[],\n  after: IPlannerProgramExercise[]\n): { removed: IPlannerProgramExercise; added: IPlannerProgramExercise } | undefined {\n  const beforeKeys = new Set(before.map((e) => e.key));\n  const afterKeys = new Set(after.map((e) => e.key));\n  const removed = before.filter((e) => !afterKeys.has(e.key));\n  const added = after.filter((e) => !beforeKeys.has(e.key));\n  return removed.length === 1 && added.length === 1 ? { removed: removed[0], added: added[0] } : undefined;\n}\n\n// What the caller has to know before it can call apply: whether this edit changes which\n// exercise a line is, and — because that is the only case where the answer matters — on how\n// many days that exercise is declared. One declaration and the two scopes are the same edit.\nexport function ProgramDayText_identityChange(\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  newText: string,\n  settings: ISettings\n): IProgramDayTextIdentityChange | undefined {\n  const location = { weekIndex: dayData.week - 1, dayIndex: dayData.dayInWeek - 1 };\n  const before = evaluateWeeks(planner, settings);\n  const after = evaluateWeeks(withDayText(planner, location, newText), settings);\n  const detected = detectIdentityChange(exercisesAt(before, location), exercisesAt(after, location));\n  if (detected == null || before == null) {\n    return undefined;\n  }\n  let declarations = 0;\n  for (const week of before) {\n    for (const day of week) {\n      if (day.success && day.data.some((e) => e.key === detected.removed.key && !e.isRepeat)) {\n        declarations += 1;\n      }\n    }\n  }\n  return {\n    oldName: detected.removed.fullName,\n    newName: detected.added.fullName,\n    declarations,\n    isLadder:\n      (detected.removed.exerciseVariations?.length ?? 0) > 1 || (detected.added.exerciseVariations?.length ?? 0) > 1,\n  };\n}\n\n// Turning a day's edited text into a new program. The whole-day counterpart of\n// ProgramExerciseText_apply, and it owes the same guarantees that one already makes: an exercise\n// whose identity changes has every `...reuse` aimed at it rewritten to follow, a name that\n// collides with another exercise in the program is labelled apart rather than quietly merged\n// into it, and an edit that breaks a day it doesn't touch is refused rather than saved.\n//\n// A whole day is a looser edit than one declaration, so the identity change it can follow is\n// narrower — see detectIdentityChange. What it will not do is guess.\nexport function ProgramDayText_apply(\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  newText: string,\n  settings: ISettings,\n  scope: IProgramExerciseSwapScope = \"all\"\n): IProgramDayTextApplied | { error: IProgramExerciseTextError } {\n  const location = { weekIndex: dayData.week - 1, dayIndex: dayData.dayInWeek - 1 };\n  if (planner.weeks[location.weekIndex]?.days[location.dayIndex] == null) {\n    return { error: { message: \"Couldn't find this day in the program anymore, so the changes weren't saved.\" } };\n  }\n\n  const before = evaluateWeeks(planner, settings);\n  const spliced = withDayText(planner, location, newText);\n  let after: IPlannerEvalResult[][];\n  try {\n    after = PlannerProgram_evaluate(spliced, settings).evaluatedWeeks;\n  } catch (e) {\n    return { error: { message: ProgramExerciseText_cleanErrorMessage(PlannerProgram_thrownErrorMessage(e)) } };\n  }\n  // This day's own error first: it's the text the user is looking at, and its offsets point\n  // into it.\n  const ownError = errorAt(after, location);\n  if (ownError != null) {\n    return { error: ownError };\n  }\n\n  const detected = detectIdentityChange(exercisesAt(before, location), exercisesAt(after, location));\n  // A ladder's rungs are its identity, and replaceExercise collapses a multi-variation exercise\n  // onto a single current one — which would delete rungs the user can see in their own text. The\n  // replace exists here to rewrite `...reuse` references, and a multi-variation exercise can't be\n  // a reuse target in the first place, so for a ladder there's nothing it would buy. The text is\n  // the source of truth; the identity change is still reported so logged sets follow it.\n  const isLadder =\n    (detected?.removed.exerciseVariations?.length ?? 0) > 1 || (detected?.added.exerciseVariations?.length ?? 0) > 1;\n  let result = spliced;\n  let renames: IProgramDayTextRename[] = [];\n  if (detected != null && isLadder) {\n    renames = [{ oldKey: detected.removed.key, newKey: detected.added.key }];\n  } else if (detected != null) {\n    // Same two steps, in the same order, as an exercise-sheet swap: the edit is spliced with the\n    // old exercise still named — which keeps the program valid, in particular every `...reuse`\n    // aimed at it — and only then replaced at the program level, which is what rewrites those\n    // references, collapses a ladder onto the new target and de-conflicts a colliding name.\n    //\n    // Reverting by name over the day's whole text rather than by locating the line: it keeps\n    // every other edit the user made in the same pass, and anything else they wrote naming the\n    // new exercise is renamed straight back by the replace below.\n    const reverted = PlannerEvaluator_changeExerciseName(newText, detected.added.name, detected.removed.name, settings);\n    const withOldName = withDayText(planner, location, reverted);\n    const target: IExerciseType | string = detected.added.exerciseType ?? detected.added.name;\n    try {\n      result = PlannerProgram_replaceExercise(\n        withOldName,\n        detected.removed.key,\n        detected.added.label,\n        target,\n        settings,\n        scope === \"one\" ? dayData : undefined\n      );\n    } catch (e) {\n      // replaceExercise evaluates internally and throws syntax errors rather than returning them.\n      return { error: { message: ProgramExerciseText_cleanErrorMessage(PlannerProgram_thrownErrorMessage(e)) } };\n    }\n    // The key it actually landed on, which is not always the one the user typed: a collision\n    // gets a label suffix, and that changes the key the workout's logged sets have to follow.\n    const settled = exercisesAt(evaluateWeeks(result, settings), location).find(\n      (e) => !exercisesAt(before, location).some((old) => old.key === e.key)\n    );\n    renames = [{ oldKey: detected.removed.key, newKey: settled?.key ?? detected.added.key, label: settled?.label }];\n  }\n\n  let final: IPlannerEvalResult[][];\n  try {\n    final = result === spliced ? after : PlannerProgram_evaluate(result, settings).evaluatedWeeks;\n  } catch (e) {\n    return { error: { message: ProgramExerciseText_cleanErrorMessage(PlannerProgram_thrownErrorMessage(e)) } };\n  }\n  const brokeElsewhere = introducedError(before, final);\n  if (brokeElsewhere != null) {\n    return { error: brokeElsewhere };\n  }\n  return { planner: result, renames };\n}\n","import { IProgramState, IProgramExerciseWarmupSet, ISettings, IProgramSet, IPercentage } from \"../types\";\nimport { IEvaluatedProgram, Program_getProgramDayExercises } from \"./program\";\nimport { ProgramSet_isEligibleForInferredWeight, ProgramSet_getEvaluatedWeight } from \"./programSet\";\nimport { IWeight } from \"../types\";\nimport { ObjectUtils_keys, ObjectUtils_values, ObjectUtils_clone } from \"../utils/object\";\nimport { Weight_print, Weight_printOrNumber, Weight_isPct, Weight_build, Weight_applyOp, Weight_is } from \"./weight\";\nimport { Exercise_onerm } from \"./exercise\";\nimport { CollectionUtils_compact, CollectionUtils_sortBy } from \"../utils/collection\";\nimport { ScriptRunner } from \"../parser\";\nimport { IAssignmentOp, ILiftoscriptEvaluatorUpdate } from \"../liftoscriptEvaluator\";\nimport { MathUtils_applyOp } from \"../utils/math\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExerciseWithType,\n} from \"../pages/planner/models/types\";\nimport {\n  PlannerProgramExercise_getStateMetadata,\n  PlannerProgramExercise_sets,\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_getUpdateScript,\n  PlannerProgramExercise_currentEvaluatedSetVariationIndex,\n  PlannerProgramExercise_currentExerciseVariationIndex,\n  PlannerProgramExercise_currentDescriptionIndex,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { PP_iterate2 } from \"./pp\";\n\nexport interface IWeightChange {\n  originalWeight: IWeight | IPercentage;\n  weight: IWeight | IPercentage;\n  current: boolean;\n}\n\nexport interface IProgramExerciseExample {\n  title: string;\n  description: string;\n  sets: IProgramSet[];\n  state: IProgramState;\n  finishDayExpr: string;\n  rules: {\n    sets: \"keep\" | \"replace\";\n    reps: \"keep\" | \"keep_if_has_vars\" | \"replace\";\n    weight: \"keep\" | \"keep_if_has_vars\" | \"replace\";\n  };\n}\n\nexport function ProgramExercise_hasUserPromptedVars(programExercise: IPlannerProgramExercise): boolean {\n  const stateMetadata = PlannerProgramExercise_getStateMetadata(programExercise) || {};\n  return ObjectUtils_keys(stateMetadata).some((key) => stateMetadata[key]?.userPrompted);\n}\n\nexport function ProgramExercise_getQuickAddSets(programExercise: IPlannerProgramExercise): boolean {\n  return PlannerProgramExercise_sets(programExercise).some((set) => !!set.repRange?.isQuickAddSet);\n}\n\nexport function ProgramExercise_getEnableRpe(programExercise: IPlannerProgramExercise): boolean {\n  return PlannerProgramExercise_sets(programExercise).some((set) => set.rpe != null);\n}\n\nfunction warmupSetToKey(set: IProgramExerciseWarmupSet): string {\n  return `${set.reps}-${Weight_print(set.threshold)}-${Weight_printOrNumber(set.value)}`;\n}\n\nexport function ProgramExercise_groupWarmupsSets(\n  sets: IProgramExerciseWarmupSet[]\n): [IProgramExerciseWarmupSet, number][] {\n  let lastKey: string | undefined;\n  const groups: [IProgramExerciseWarmupSet, number][] = [];\n  for (const set of sets) {\n    const key = warmupSetToKey(set);\n    if (lastKey == null || lastKey !== key) {\n      groups.push([set, 0]);\n    }\n    groups[groups.length - 1][1] += 1;\n    lastKey = key;\n  }\n  return groups;\n}\n\nexport function ProgramExercise_doesUse1RM(programExercise: IPlannerProgramExercise): boolean {\n  const usesPercentageWeights = programExercise.evaluatedSetVariations.some((v) => {\n    return v.sets.some((set) => {\n      return Weight_isPct(set.weight) || ProgramSet_isEligibleForInferredWeight(set);\n    });\n  });\n  const usesRM1Var = ProgramExercise_isUsingVariable(programExercise, \"rm1\");\n  return usesPercentageWeights || usesRM1Var;\n}\n\nexport function ProgramExercise_doesUseRPE(programExercise: IPlannerProgramExercise): boolean {\n  if (programExercise.globals.logRpe || programExercise.globals.rpe != null) {\n    return true;\n  }\n  return programExercise.evaluatedSetVariations.some((v) => {\n    return v.sets.some((set) => set.logRpe || set.rpe != null);\n  });\n}\n\nexport function ProgramExercise_isUsingVariable(programExercise: IPlannerProgramExercise, name: string): boolean {\n  const expressions = CollectionUtils_compact([\n    PlannerProgramExercise_getProgressScript(programExercise),\n    PlannerProgramExercise_getUpdateScript(programExercise),\n  ]);\n  return expressions.some((e) => ScriptRunner.hasKeyword(e, name));\n}\n\nexport function ProgramExercise_weightChanges(program: IEvaluatedProgram, programExerciseKey: string): IWeightChange[] {\n  const results: Record<string, IWeightChange> = {};\n  PP_iterate2(program.weeks, (exercise) => {\n    if (exercise.key === programExerciseKey) {\n      const currentVariationIndex = PlannerProgramExercise_currentEvaluatedSetVariationIndex(exercise);\n      for (let variationIndex = 0; variationIndex < exercise.evaluatedSetVariations.length; variationIndex += 1) {\n        const variation = exercise.evaluatedSetVariations[variationIndex];\n        for (let setIndex = 0; setIndex < variation.sets.length; setIndex += 1) {\n          const set = variation.sets[setIndex];\n          if (set.weight) {\n            const key = Weight_print(set.weight);\n            results[key] = {\n              originalWeight: set.weight,\n              weight: set.weight,\n              current: results[key]?.current || variationIndex + 1 === currentVariationIndex,\n            };\n          }\n        }\n      }\n    }\n  });\n  return CollectionUtils_sortBy(ObjectUtils_values(results), \"current\", true);\n}\n\nexport function ProgramExercise_applyVariables(\n  programExerciseKey: string,\n  program: IEvaluatedProgram,\n  updates: ILiftoscriptEvaluatorUpdate[],\n  settings: ISettings\n): void {\n  for (const update of updates) {\n    const key = update.type;\n    const value = update.value;\n    const target = value.target;\n    const [week, day, variation, set] = target;\n    let dayIndex = 0;\n    for (let weekIndex = 0; weekIndex < program.weeks.length; weekIndex += 1) {\n      const programWeek = program.weeks[weekIndex];\n      for (let dayInWeekIndex = 0; dayInWeekIndex < programWeek.days.length; dayInWeekIndex += 1) {\n        const programDay = programWeek.days[dayInWeekIndex];\n        const dayExercises = Program_getProgramDayExercises(programDay);\n        for (const exercise of dayExercises) {\n          if (exercise.key !== programExerciseKey) {\n            continue;\n          }\n          for (let variationIndex = 0; variationIndex < exercise.evaluatedSetVariations.length; variationIndex += 1) {\n            const setVariation = exercise.evaluatedSetVariations[variationIndex];\n            const sets = setVariation.sets;\n            if (\n              (week === \"*\" || week === weekIndex + 1) &&\n              (day === \"*\" || day === dayInWeekIndex + 1) &&\n              (variation === \"*\" || variation === variationIndex + 1)\n            ) {\n              if (key === \"numberOfSets\" && typeof value.value === \"number\") {\n                const newValue = MathUtils_applyOp(sets.length, value.value, value.op);\n                const defaultSet: IPlannerProgramExerciseEvaluatedSet = {\n                  maxrep: 1,\n                  weight: Weight_build(100, \"lb\"),\n                  logRpe: false,\n                  isAmrap: false,\n                  isQuickAddSet: false,\n                  askWeight: false,\n                };\n                const lastSet = sets[sets.length - 1] || defaultSet;\n                sets.splice(newValue);\n                for (let i = sets.length; i < newValue; i += 1) {\n                  sets.push(ObjectUtils_clone(lastSet));\n                }\n              }\n            }\n            for (let setIndex = 0; setIndex < sets.length; setIndex += 1) {\n              if (\n                (week === \"*\" || week === weekIndex + 1) &&\n                (day === \"*\" || day === dayInWeekIndex + 1) &&\n                (variation === \"*\" || variation === variationIndex + 1) &&\n                (set === \"*\" || set === setIndex + 1)\n              ) {\n                if (key === \"RPE\") {\n                  operation(exercise, sets[setIndex], settings, \"rpe\", value.value, value.op);\n                } else if (key === \"reps\") {\n                  operation(exercise, sets[setIndex], settings, \"maxrep\", value.value, value.op);\n                } else if (key === \"minReps\") {\n                  operation(exercise, sets[setIndex], settings, \"minrep\", value.value, value.op);\n                } else if (key === \"timers\") {\n                  operation(exercise, sets[setIndex], settings, \"timer\", value.value, value.op);\n                } else if (key === \"setTime\") {\n                  operation(exercise, sets[setIndex], settings, \"setTimer\", value.value, value.op);\n                } else if (key === \"weights\") {\n                  operation(exercise, sets[setIndex], settings, \"weight\", value.value, value.op);\n                } else if (key === \"amraps\") {\n                  operation(exercise, sets[setIndex], settings, \"isAmrap\", value.value, value.op);\n                } else if (key === \"logrpes\") {\n                  operation(exercise, sets[setIndex], settings, \"logRpe\", value.value, value.op);\n                } else if (key === \"askweights\") {\n                  operation(exercise, sets[setIndex], settings, \"askWeight\", value.value, value.op);\n                }\n              }\n            }\n          }\n          if ((week === \"*\" || week === weekIndex + 1) && (day === \"*\" || day === dayInWeekIndex + 1)) {\n            if (key === \"setVariationIndex\" && typeof update.value.value === \"number\") {\n              let indexValue: number;\n              if (update.value.op === \"=\") {\n                indexValue = update.value.value - 1;\n              } else {\n                const currentSetVariationIndex = PlannerProgramExercise_currentEvaluatedSetVariationIndex(exercise);\n                indexValue = Weight_applyOp(\n                  undefined,\n                  currentSetVariationIndex,\n                  update.value.value,\n                  update.value.op\n                ) as number;\n              }\n              indexValue = indexValue % exercise.evaluatedSetVariations.length;\n              exercise.evaluatedSetVariations.forEach((s) => (s.isCurrent = false));\n              const sv = exercise.evaluatedSetVariations[indexValue];\n              if (sv != null) {\n                sv.isCurrent = true;\n              }\n            } else if (key === \"exerciseVariationIndex\" && typeof update.value.value === \"number\") {\n              const variations = exercise.exerciseVariations ?? [];\n              if (variations.length > 0) {\n                let indexValue: number;\n                if (update.value.op === \"=\") {\n                  indexValue = update.value.value - 1;\n                } else {\n                  const currentExerciseVariationIndex = PlannerProgramExercise_currentExerciseVariationIndex(exercise);\n                  indexValue = Weight_applyOp(\n                    undefined,\n                    currentExerciseVariationIndex,\n                    update.value.value,\n                    update.value.op\n                  ) as number;\n                }\n                indexValue = ((indexValue % variations.length) + variations.length) % variations.length;\n                variations.forEach((v) => (v.isCurrent = false));\n                const nextVariation = variations[indexValue];\n                if (nextVariation != null) {\n                  nextVariation.isCurrent = true;\n                  if (nextVariation.exerciseType != null) {\n                    exercise.exerciseType = nextVariation.exerciseType;\n                  }\n                }\n              }\n            } else if (key === \"descriptionIndex\" && typeof update.value.value === \"number\") {\n              let indexValue: number;\n              if (update.value.op === \"=\") {\n                indexValue = update.value.value - 1;\n              } else {\n                const currentDescriptionIndex = PlannerProgramExercise_currentDescriptionIndex(exercise);\n                indexValue = Weight_applyOp(\n                  undefined,\n                  currentDescriptionIndex,\n                  update.value.value,\n                  update.value.op\n                ) as number;\n              }\n              indexValue = indexValue % exercise.descriptions.values.length;\n              exercise.descriptions.values.forEach((s) => (s.isCurrent = false));\n              const d = exercise.descriptions.values[indexValue];\n              if (d != null) {\n                d.isCurrent = true;\n              }\n            }\n          }\n        }\n        dayIndex += 1;\n      }\n    }\n  }\n}\n\nfunction operation(\n  programExercise: IPlannerProgramExerciseWithType,\n  set: IPlannerProgramExerciseEvaluatedSet,\n  settings: ISettings,\n  key: \"maxrep\" | \"minrep\" | \"weight\" | \"rpe\" | \"timer\" | \"setTimer\" | \"logRpe\" | \"isAmrap\" | \"askWeight\",\n  value: IWeight | IPercentage | number,\n  op: IAssignmentOp\n): void {\n  if (op === \"=\") {\n    if (key === \"weight\" && (Weight_is(value) || Weight_isPct(value))) {\n      set[key] = value;\n    } else if (\n      typeof value === \"number\" &&\n      (key === \"maxrep\" || key === \"minrep\" || key === \"timer\" || key === \"setTimer\" || key === \"rpe\")\n    ) {\n      set[key] = value;\n    } else if (typeof value === \"number\" && (key === \"askWeight\" || key === \"isAmrap\" || key === \"logRpe\")) {\n      set[key] = value !== 0;\n    }\n  } else {\n    const onerm = Exercise_onerm(programExercise.exerciseType, settings);\n    let oldValue = typeof set[key] === \"boolean\" ? (set[key] ? 1 : 0) : set[key];\n    if (oldValue == null && ProgramSet_isEligibleForInferredWeight(set)) {\n      const inferredWeight = ProgramSet_getEvaluatedWeight(set, programExercise.exerciseType, settings);\n      oldValue = inferredWeight;\n    }\n    const newValue = Weight_applyOp(onerm, oldValue ?? 0, value, op);\n    if (key === \"weight\" && (Weight_is(newValue) || Weight_isPct(newValue))) {\n      set[key] = newValue;\n    } else if (\n      typeof newValue === \"number\" &&\n      (key === \"maxrep\" || key === \"minrep\" || key === \"timer\" || key === \"setTimer\" || key === \"rpe\")\n    ) {\n      set[key] = newValue;\n    } else if (typeof newValue === \"number\" && (key === \"askWeight\" || key === \"isAmrap\" || key === \"logRpe\")) {\n      set[key] = newValue !== 0;\n    }\n  }\n}\n","import { Exercise_fullName, Exercise_get } from \"./exercise\";\nimport { PlannerProgram_replaceExercise } from \"../pages/planner/models/plannerProgram\";\nimport { ObjectUtils_clone } from \"../utils/object\";\nimport {\n  EditProgramUiHelpers_changeAllInstances,\n  EditProgramUiHelpers_duplicateCurrentInstance,\n} from \"../components/editProgram/editProgramUi/editProgramUiHelpers\";\nimport { ProgramRewrite_changedKeys } from \"./programRewrite\";\nimport type { IExercisePickerSelectedExercise, IPlannerProgram, ISettings, IShortDayData } from \"../types\";\nimport type { IPlannerProgramExercise } from \"../pages/planner/models/types\";\n\nexport type IProgramExercisePickerChange = \"one\" | \"all\" | \"duplicate\" | \"variationAdd\" | \"variationEdit\";\n\nexport interface IProgramExercisePickerResult {\n  planner: IPlannerProgram;\n  description: string;\n  isAdd: boolean;\n  newKey?: string;\n}\n\nexport function ProgramExercisePickerChange_apply(args: {\n  planner: IPlannerProgram;\n  settings: ISettings;\n  selectedExercises: IExercisePickerSelectedExercise[];\n  plannerExercise: IPlannerProgramExercise | undefined;\n  dayData: IShortDayData;\n  change: IProgramExercisePickerChange;\n  variationIndex: number | undefined;\n}): IProgramExercisePickerResult | undefined {\n  const { planner, settings, selectedExercises, plannerExercise, dayData, change, variationIndex } = args;\n  const selectedExercise = selectedExercises[0];\n  if (!selectedExercise) {\n    return undefined;\n  }\n  const newExerciseType = selectedExercise.type === \"template\" ? selectedExercise.name : selectedExercise.exerciseType;\n  const newLabel = \"label\" in selectedExercise ? selectedExercise.label : undefined;\n  const dayInProgram = { week: dayData.week, dayInWeek: dayData.dayInWeek, day: 1 };\n\n  if (plannerExercise == null) {\n    return addExercises(planner, settings, selectedExercises, dayData);\n  }\n  if (change === \"variationAdd\" || change === \"variationEdit\") {\n    const isTemplatePick = typeof newExerciseType === \"string\";\n    if (isTemplatePick || newExerciseType == null) {\n      return undefined;\n    }\n    const exercise = Exercise_get(newExerciseType, settings.exercises);\n    const newPlanner = EditProgramUiHelpers_changeAllInstances(planner, plannerExercise.key, settings, true, (ex) => {\n      const variations = ex.exerciseVariations ?? [];\n      if (change === \"variationAdd\") {\n        variations.push({ exerciseType: newExerciseType, name: exercise.name, isCurrent: false });\n      } else if (variationIndex != null && variations[variationIndex] != null) {\n        variations[variationIndex] = {\n          exerciseType: newExerciseType,\n          name: exercise.name,\n          isCurrent: variations[variationIndex].isCurrent,\n        };\n      }\n      ex.exerciseVariations = variations;\n      // A lone rung serializes via ex.exerciseType, so keep it aligned with the current variation.\n      const current = variations.find((v) => v.isCurrent);\n      if (current?.exerciseType != null) {\n        ex.exerciseType = current.exerciseType;\n      }\n    });\n    return withNewKey(planner, newPlanner, plannerExercise, settings, \"Change exercise variation\");\n  }\n  if (change === \"one\") {\n    const newPlanner = PlannerProgram_replaceExercise(\n      planner,\n      plannerExercise.key,\n      newLabel,\n      newExerciseType,\n      settings,\n      dayInProgram\n    );\n    return { planner: newPlanner, description: \"Replace one exercise in planner\", isAdd: false };\n  }\n  if (change === \"duplicate\") {\n    const newPlanner = EditProgramUiHelpers_duplicateCurrentInstance(\n      planner,\n      dayInProgram,\n      plannerExercise.fullName,\n      newLabel,\n      newExerciseType,\n      settings\n    );\n    return { planner: newPlanner, description: \"Duplicate exercise in planner\", isAdd: false };\n  }\n  const newPlanner = PlannerProgram_replaceExercise(planner, plannerExercise.key, newLabel, newExerciseType, settings);\n  return withNewKey(planner, newPlanner, plannerExercise, settings, \"Replace all exercises in planner\");\n}\n\nfunction withNewKey(\n  planner: IPlannerProgram,\n  newPlanner: IPlannerProgram,\n  plannerExercise: IPlannerProgramExercise,\n  settings: ISettings,\n  description: string\n): IProgramExercisePickerResult {\n  const newKey = ProgramRewrite_changedKeys(planner, newPlanner, settings)[plannerExercise.key];\n  return { planner: newPlanner, description, isAdd: false, newKey: newKey ?? undefined };\n}\n\nfunction addExercises(\n  planner: IPlannerProgram,\n  settings: ISettings,\n  selectedExercises: IExercisePickerSelectedExercise[],\n  dayData: IShortDayData\n): IProgramExercisePickerResult | undefined {\n  const newPlanner = ObjectUtils_clone(planner);\n  const day = newPlanner.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1];\n  const exerciseText = day?.exerciseText;\n  if (day == null || exerciseText == null) {\n    return undefined;\n  }\n  const newLines = selectedExercises.reduce<string[]>((acc, selected) => {\n    const exerciseType = selected.type === \"template\" ? selected.name : selected.exerciseType;\n    const label = \"label\" in selected ? selected.label : undefined;\n    let fullName: string | undefined;\n    if (typeof exerciseType === \"string\") {\n      fullName = `${label ? `${label}: ` : \"\"}${exerciseType} / used: none`;\n    } else if (exerciseType != null) {\n      fullName = Exercise_fullName(Exercise_get(exerciseType, settings.exercises), settings, label);\n    }\n    return fullName != null ? [...acc, `${fullName} / 1x1 100${settings.units}`] : acc;\n  }, []);\n  if (newLines.length === 0) {\n    return undefined;\n  }\n  const added = newLines.join(\"\\n\");\n  day.exerciseText = exerciseText.trim() ? exerciseText + `\\n${added}` : added;\n  return {\n    planner: newPlanner,\n    description: `Add ${newLines.length > 1 ? `${newLines.length} exercises` : \"exercise\"} to exercise text`,\n    isAdd: true,\n  };\n}\n","import { IDayData, IPlannerProgram, IProgram, ISettings } from \"../types\";\nimport { IEvaluatedProgram, Program_create, Program_evaluate, Program_evaluateCachedPlanner } from \"./program\";\nimport { ProgramToPlanner } from \"./programToPlanner\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport {\n  PlannerEvaluator_evaluateDay,\n  PlannerEvaluator_fillEvaluatedSetVariations,\n} from \"../pages/planner/plannerEvaluator\";\nimport {\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_getUpdateScript,\n  PlannerProgramExercise_warmups,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { PP_iterate2 } from \"./pp\";\nimport { ProgramRewrite_instances, ProgramRewrite_repeatWeeks } from \"./programRewrite\";\nimport {\n  IProgramExerciseTextError,\n  ProgramExerciseText_blurb,\n  ProgramExerciseText_cleanErrorMessage,\n  ProgramExerciseText_findDeclaration,\n} from \"./programExerciseText\";\nimport { ObjectUtils_isEqual } from \"../utils/object\";\n\n// What an exercise line actually means, for a reader who can't hold the program in their head:\n// the same declaration with its `...reuse` resolved and the properties declared on other weeks\n// folded in. Built from the planner the sheet would save, not from the stored program, so it\n// follows unsaved edits.\nexport function ProgramExercisePreview_materialize(\n  program: IProgram,\n  planner: IPlannerProgram,\n  dayData: Required<IDayData>,\n  key: string,\n  settings: ISettings\n): string | undefined {\n  // The evaluator throws on some drafts (a reuse pointing at a week that doesn't exist), and a\n  // preview is never worth taking the sheet down for.\n  try {\n    // Cached rather than forced: the caller has just spliced and validated this exact planner, and\n    // the planner evaluation is memoized on content — so this reuses that work instead of\n    // evaluating the whole program a second time per keystroke. Read-only, as that cache is shared.\n    const evaluatedProgram = Program_evaluateCachedPlanner({ ...program, planner }, settings);\n    // The selected instance, not the declaration: `...t3` means a different exercise in each\n    // week, so a later week resolves to different sets than the line's own week does.\n    const day = evaluatedProgram.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1];\n    const exercise = day?.exercises.find((e) => e.key === key);\n    return exercise != null\n      ? new ProgramToPlanner(evaluatedProgram, settings).materializeExercise(exercise)\n      : undefined;\n  } catch (e) {\n    return undefined;\n  }\n}\n\nexport interface IProgramExercisePreviewTarget {\n  key: string;\n  // Where the declaration is written.\n  dayData: Required<IDayData>;\n  // Which week's resolution the panel shows.\n  tappedDayData: Required<IDayData>;\n}\n\nexport function ProgramExercisePreview_target(\n  declaration: IPlannerProgramExercise,\n  programExercise: IPlannerProgramExercise | undefined,\n  selectedDayData: Required<IDayData> | undefined,\n  key: string = declaration.key\n): IProgramExercisePreviewTarget {\n  const isTappedRepeat =\n    selectedDayData == null &&\n    programExercise?.isRepeat === true &&\n    declaration.repeating.includes(programExercise.dayData.week);\n  return {\n    key,\n    dayData: declaration.dayData,\n    tappedDayData: isTappedRepeat && programExercise != null ? programExercise.dayData : declaration.dayData,\n  };\n}\n\nexport interface IProgramExercisePreviewApplied {\n  planner: IPlannerProgram;\n  blurb: string;\n  // Where the tapped week's declaration is in the written program. The same as the target's\n  // dayData unless the writer split a repeat bracket at the tapped week.\n  declarationDayData: Required<IDayData>;\n}\n\nfunction sameValue<T>(a: T | undefined, b: T | undefined): boolean {\n  if (a == null || b == null) {\n    return a == null && b == null;\n  }\n  return ObjectUtils_isEqual(a, b);\n}\n\ninterface ISharedChanges {\n  warmups: boolean;\n  progress: boolean;\n  update: boolean;\n  usedCleared: boolean;\n}\n\n// The materialized line spells every inherited value out, so the parsed line carries the reuse\n// target's warmups, script and state as its own. Only a value that differs from what the tapped\n// instance resolves to is an edit. Judged against the tapped instance alone: another week may\n// resolve differently on its own (`progress: none`, a different `...t1`), and that is not the\n// user's edit.\nfunction sharedChanges(tapped: IPlannerProgramExercise, own: IPlannerProgramExercise): ISharedChanges {\n  const resolvedProgress = tapped.progress ?? tapped.reuse?.exercise?.progress;\n  const progressUnchanged =\n    own.progress?.type === resolvedProgress?.type &&\n    own.progress?.script === PlannerProgramExercise_getProgressScript(tapped) &&\n    (own.progress == null || sameValue(own.progress.state, PlannerProgramExercise_getState(tapped)));\n  const resolvedUpdate = tapped.update ?? tapped.reuse?.exercise?.update;\n  const updateUnchanged =\n    own.update?.type === resolvedUpdate?.type && own.update?.script === PlannerProgramExercise_getUpdateScript(tapped);\n  return {\n    warmups: !sameValue(own.warmupSets, PlannerProgramExercise_warmups(tapped)),\n    progress: !progressUnchanged,\n    update: !updateUnchanged,\n    usedCleared: tapped.notused === true && !own.notused,\n  };\n}\n\nfunction applySharedChanges(\n  instance: IPlannerProgramExercise,\n  own: IPlannerProgramExercise,\n  changes: ISharedChanges\n): void {\n  if (changes.warmups) {\n    instance.warmupSets = own.warmupSets;\n  }\n  if (changes.progress) {\n    instance.progress = own.progress;\n  }\n  if (changes.update) {\n    instance.update = own.update;\n  }\n  // `used: none` is hoisted onto every instance, so one left standing hides the exercise again.\n  if (changes.usedCleared) {\n    instance.notused = false;\n  }\n}\n\nfunction applyOwn(instance: IPlannerProgramExercise, own: IPlannerProgramExercise): void {\n  instance.setVariations = own.setVariations;\n  instance.globals = own.globals;\n  instance.notused = own.notused;\n  instance.superset = own.superset;\n  instance.tags = own.tags;\n  PlannerEvaluator_fillEvaluatedSetVariations(instance);\n}\n\nfunction instanceAt(\n  evaluated: IEvaluatedProgram,\n  dayData: Required<IDayData>,\n  key: string\n): IPlannerProgramExercise | undefined {\n  return evaluated.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1]?.exercises.find((e) => e.key === key);\n}\n\nexport function ProgramExercisePreview_apply(\n  planner: IPlannerProgram,\n  target: IProgramExercisePreviewTarget,\n  panelText: string,\n  settings: ISettings\n): IProgramExercisePreviewApplied | { error: IProgramExerciseTextError } {\n  const parsed = PlannerEvaluator_evaluateDay({ name: \"\", exerciseText: panelText }, target.dayData, settings);\n  if (!parsed.success) {\n    return {\n      error: {\n        message: ProgramExerciseText_cleanErrorMessage(parsed.error.message),\n        from: parsed.error.from,\n        to: parsed.error.to,\n      },\n    };\n  }\n  const own = parsed.data[0];\n  if (own == null || parsed.data.length !== 1) {\n    return { error: { message: \"The preview holds one exercise.\" } };\n  }\n  if (own.key !== target.key) {\n    return { error: { message: \"Change the exercise on the line above. The preview keeps its name.\" } };\n  }\n  let missing: string | undefined;\n  const result = ProgramRewrite_instances(planner, settings, (evaluated) => {\n    const declaration = instanceAt(evaluated, target.dayData, target.key);\n    const tapped = instanceAt(evaluated, target.tappedDayData, target.key);\n    if (declaration == null || tapped == null) {\n      missing = \"Couldn't find this exercise in the program anymore.\";\n      return;\n    }\n    const weeks = new Set(ProgramRewrite_repeatWeeks(evaluated, declaration.dayData, declaration.fullName));\n    // The panel shows one week's resolution of `...t1`. A repeat sibling that resolves to the same\n    // sets gets the same own values; one that resolves differently keeps its line, and the writer\n    // splits the repeat rather than pinning this week's sets onto it.\n    const tappedResolution = tapped.evaluatedSetVariations;\n    const changes = sharedChanges(tapped, own);\n    PP_iterate2(evaluated.weeks, (instance, weekIndex, dayInWeekIndex) => {\n      if (instance.key !== target.key) {\n        return;\n      }\n      applySharedChanges(instance, own, changes);\n      const isSibling = weeks.has(weekIndex + 1) && dayInWeekIndex + 1 === declaration.dayData.dayInWeek;\n      if (isSibling && ObjectUtils_isEqual(instance.evaluatedSetVariations, tappedResolution)) {\n        applyOwn(instance, own);\n      }\n    });\n  });\n  if (missing != null) {\n    return { error: { message: missing } };\n  }\n  if (\"error\" in result) {\n    return { error: { message: ProgramExerciseText_cleanErrorMessage(result.error.message) } };\n  }\n  // The tapped week's declaration, found again in the written program: a repeat that resolved\n  // differently is its own declaration after the writer splits the bracket, and the sheet has to\n  // follow it there rather than rebase onto the line the bracket left behind.\n  const written = Program_evaluate({ ...Program_create(\"Temp\"), planner: result.planner }, settings);\n  const writtenTapped = instanceAt(written, target.tappedDayData, target.key);\n  if (writtenTapped == null) {\n    return { error: { message: \"Couldn't find this exercise after writing the preview.\" } };\n  }\n  const writtenDeclaration = ProgramExerciseText_findDeclaration(written, writtenTapped);\n  return {\n    planner: result.planner,\n    blurb: ProgramExerciseText_blurb(result.planner, writtenDeclaration),\n    declarationDayData: writtenDeclaration.dayData,\n  };\n}\n","import { IDayData, IExerciseType, IHistoryRecord, IPlannerProgram, ISettings } from \"../types\";\nimport { Progress_hasCompletedSetsForProgramExerciseId } from \"./progress\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseVariation } from \"../pages/planner/models/types\";\nimport {\n  PlannerProgram_replaceExercise,\n  PlannerProgram_thrownErrorMessage,\n} from \"../pages/planner/models/plannerProgram\";\nimport { PlannerKey_fromFullName } from \"../pages/planner/plannerKey\";\nimport { PlannerExerciseEvaluator } from \"../pages/planner/plannerExerciseEvaluator\";\nimport { PlannerProgramExercise_shortNameFromFullName } from \"../pages/planner/models/plannerProgramExercise\";\nimport { Exercise_findByNameAndEquipment } from \"./exercise\";\nimport { EditProgramUiHelpers_changeAllInstances } from \"../components/editProgram/editProgramUi/editProgramUiHelpers\";\n\nexport type IProgramExerciseSwapScope = \"one\" | \"all\";\n\n// With one declaration \"this day\" and \"everywhere\" are the same edit, and scoping to a day\n// would break a declaration that repeats into other weeks. A ladder change reaches every\n// instance too, the rungs being the exercise's identity, so asking would ignore the answer.\nexport function ProgramExerciseSwap_scope(\n  isLadder: boolean,\n  declarations: number,\n  cached: IProgramExerciseSwapScope | undefined\n): IProgramExerciseSwapScope | \"ask\" {\n  if (isLadder || declarations < 2) {\n    return \"all\";\n  }\n  return cached ?? \"ask\";\n}\n\n// The syntactic half of a name, produced by the editor's parser (LiftoEditorBrain). Kept as a\n// structural type so the model layer doesn't depend on the editor.\nexport interface IProgramExerciseParsedName {\n  fullName: string;\n  start: number;\n  end: number;\n  usedNone: boolean;\n  variations: { text: string; isCurrent: boolean }[];\n}\n\nexport interface IProgramExerciseSwap {\n  oldKey: string;\n  newKey: string;\n  oldFullName: string;\n  newFullName: string;\n  // Where the full name sits in the edited text, so the caller can put the old one back and\n  // keep every other edit the user made in the same pass.\n  start: number;\n  end: number;\n  // A ladder (`Squat | Front Squat`) is part of the exercise's identity and has to stay the\n  // same on every instance, so it never takes the per-instance path.\n  isLadder: boolean;\n  label: string | undefined;\n  variations: IPlannerProgramExerciseVariation[];\n}\n\n// The grammar has already separated the rungs and the `!` current marker; what is left is\n// resolution against the exercise database, which is what needs settings.\nfunction resolveVariations(\n  parsed: IProgramExerciseParsedName,\n  settings: ISettings\n): { label: string | undefined; variations: IPlannerProgramExerciseVariation[] } {\n  let label: string | undefined;\n  const variations = parsed.variations.map((variation, index) => {\n    const parts = PlannerExerciseEvaluator.extractNameParts(variation.text, settings.exercises);\n    if (index === 0) {\n      label = parts.label;\n    }\n    const exerciseType = Exercise_findByNameAndEquipment(\n      PlannerProgramExercise_shortNameFromFullName(variation.text, settings),\n      settings.exercises\n    );\n    return { exerciseType, name: parts.name, isCurrent: variation.isCurrent };\n  });\n  return { label, variations };\n}\n\nexport interface IProgramExerciseIdentity {\n  exerciseType: IExerciseType | undefined;\n  label: string | undefined;\n  templateName: string | undefined;\n}\n\n// Which exercise a blurb names *right now*, read from its text rather than from whatever the\n// screen was opened on — a swap changes the name long before it reaches the program, and\n// until then anything keyed off the old exercise (the picker's selection, equipment-aware\n// weight stepping) is answering about an exercise that is no longer written down. Every field\n// is always present so the result can overwrite a stale one by spreading.\nexport function ProgramExerciseSwap_identity(\n  parsed: IProgramExerciseParsedName,\n  settings: ISettings\n): IProgramExerciseIdentity {\n  const { label, variations } = resolveVariations(parsed, settings);\n  const current = variations.find((v) => v.isCurrent) ?? variations[0];\n  return {\n    exerciseType: current?.exerciseType,\n    label,\n    templateName: current?.exerciseType == null ? current?.name : undefined,\n  };\n}\n\n// Does this text still describe the same exercise the declaration is for? Answers with what\n// changed when it doesn't, and with `undefined` when it does — including when the new name\n// resolves to nothing, where the evaluator's own \"Unknown exercise\" is the better message.\nexport function ProgramExerciseSwap_detect(\n  parsed: IProgramExerciseParsedName,\n  declaration: IPlannerProgramExercise,\n  settings: ISettings\n): IProgramExerciseSwap | undefined {\n  const newKey = PlannerKey_fromFullName(parsed.fullName, settings.exercises);\n  if (newKey === declaration.key) {\n    return undefined;\n  }\n  const { label, variations } = resolveVariations(parsed, settings);\n  // A name with no exercise behind it only makes sense for a template: `used: none` on a name\n  // that isn't a real exercise. That combination is the one thing that can never enter a\n  // workout and never progresses, so it never de-reuses, and it is matched by name alone.\n  // `used: none` on a *real* exercise is just a regular exercise kept out of the day — it\n  // resolves like any other, and never reaches this check.\n  // Judged on the edited text alone, never on what the declaration used to be: dropping\n  // `used: none` while renaming is how a template stops being one, and reading the old value\n  // would put it back.\n  if (variations.some((v) => v.exerciseType == null) && !parsed.usedNone) {\n    return undefined;\n  }\n  return {\n    oldKey: declaration.key,\n    newKey,\n    oldFullName: declaration.fullName,\n    newFullName: parsed.fullName,\n    start: parsed.start,\n    end: parsed.end,\n    isLadder: variations.length > 1 || (declaration.exerciseVariations?.length ?? 0) > 1,\n    label,\n    variations,\n  };\n}\n\n// The text with the swap taken back out: the user's other edits stay, the name goes back to\n// what the program still has. Splicing this keeps the program valid (in particular every\n// `...reuse` pointed at the old name), which is what lets the swap run as a program-level\n// operation on top instead of as a text edit that breaks its own references.\nexport function ProgramExerciseSwap_revertedText(text: string, swap: IProgramExerciseSwap): string {\n  return text.slice(0, swap.start) + swap.oldFullName + text.slice(swap.end);\n}\n\n// Ranges the evaluator reports against the reverted text, rebased onto the text the editor\n// is actually showing.\nexport function ProgramExerciseSwap_rebaseRange(\n  range: { from: number; to: number },\n  swap: IProgramExerciseSwap\n): { from: number; to: number } {\n  const delta = swap.newFullName.length - swap.oldFullName.length;\n  const shift = (offset: number): number => (offset >= swap.start + swap.oldFullName.length ? offset + delta : offset);\n  return { from: shift(range.from), to: shift(range.to) };\n}\n\nexport interface IProgramExerciseWorkoutRemap {\n  oldKey: string;\n  newKey: string;\n  // Sets are already logged against this exercise, so converting them is the user's call.\n  needsConfirmation: boolean;\n}\n\n// Whether an ongoing workout should follow a swap. It tracks the program by exercise key, so\n// a swap that isn't carried over silently detaches the entry — but only the declaration the\n// workout is actually following should move it. Asking merely whether the new key is on the\n// workout's day is not enough: that exercise may have been sitting there all along, untouched\n// by a swap that happened on another day, and remapping then points a live entry at an\n// unrelated declaration. So the test is that the old exercise *left* this day and the new one\n// took its place.\nexport function ProgramExerciseSwap_workoutRemap(\n  progress: IHistoryRecord | undefined,\n  programId: string,\n  exercisesBeforeSwap: IPlannerProgramExercise[],\n  exercisesAfterSwap: IPlannerProgramExercise[],\n  oldKey: string,\n  newKey: string | undefined\n): IProgramExerciseWorkoutRemap | undefined {\n  if (newKey == null || newKey === oldKey || progress == null || progress.programId !== programId) {\n    return undefined;\n  }\n  const onWorkoutDay = (exercises: IPlannerProgramExercise[], key: string): boolean =>\n    exercises.some((e) => e.key === key && e.dayData.day === progress.day);\n  const replacedOnWorkoutDay =\n    onWorkoutDay(exercisesBeforeSwap, oldKey) &&\n    !onWorkoutDay(exercisesAfterSwap, oldKey) &&\n    onWorkoutDay(exercisesAfterSwap, newKey);\n  // Entries the user swapped by hand keep their own exercise, so they are not remappable and\n  // must not make the workout look affected when they are all there is.\n  const hasRemappableEntry = progress.entries.some((e) => e.programExerciseId === oldKey && !e.changed);\n  if (!replacedOnWorkoutDay || !hasRemappableEntry) {\n    return undefined;\n  }\n  return {\n    oldKey,\n    newKey,\n    needsConfirmation: Progress_hasCompletedSetsForProgramExerciseId(progress, oldKey),\n  };\n}\n\n// Applies the swap to the program itself, so reuse references follow the rename, ladders stay\n// identical across instances, and a name that collides with another exercise gets de-conflicted.\nexport function ProgramExerciseSwap_apply(\n  planner: IPlannerProgram,\n  swap: IProgramExerciseSwap,\n  scope: IProgramExerciseSwapScope,\n  dayData: Required<IDayData>,\n  settings: ISettings\n): { planner: IPlannerProgram } | { error: string } {\n  try {\n    if (swap.isLadder) {\n      return {\n        planner: EditProgramUiHelpers_changeAllInstances(planner, swap.oldKey, settings, false, (exercise) => {\n          // The rungs are identity and must match everywhere, but *which* rung an instance is\n          // on is its own progression — overwriting that would quietly walk other weeks back\n          // to the first rung. Only the edited instance takes the markers from the new text;\n          // the rest keep theirs, as long as the ladder still has the same rungs to keep them on.\n          const previous = exercise.exerciseVariations ?? [];\n          const isEdited = exercise.dayData.week === dayData.week && exercise.dayData.dayInWeek === dayData.dayInWeek;\n          const keepsOwnCurrent = !isEdited && previous.length === swap.variations.length;\n          exercise.exerciseVariations = swap.variations.map((v, i) => ({\n            ...v,\n            isCurrent: keepsOwnCurrent ? (previous[i]?.isCurrent ?? v.isCurrent) : v.isCurrent,\n          }));\n          exercise.label = swap.label;\n          // A lone rung serializes via exerciseType, so keep it aligned with this instance's current.\n          const current = exercise.exerciseVariations.find((v) => v.isCurrent) ?? exercise.exerciseVariations[0];\n          if (current?.exerciseType != null) {\n            exercise.exerciseType = current.exerciseType;\n          }\n        }),\n      };\n    }\n    const target: IExerciseType | string = swap.variations[0]?.exerciseType ?? swap.variations[0]?.name ?? \"\";\n    return {\n      planner: PlannerProgram_replaceExercise(\n        planner,\n        swap.oldKey,\n        swap.label,\n        target,\n        settings,\n        scope === \"one\" ? dayData : undefined\n      ),\n    };\n  } catch (e) {\n    // replaceExercise evaluates internally and throws syntax errors rather than returning them.\n    return { error: PlannerProgram_thrownErrorMessage(e) };\n  }\n}\n","import { IPlannerProgram, ISettings } from \"../types\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { PlannerProgram_evaluate, PlannerProgram_thrownErrorMessage } from \"../pages/planner/models/plannerProgram\";\nimport type { IPlannerEvalResult } from \"../pages/planner/plannerExerciseEvaluator\";\nimport { parser as plannerExerciseParser } from \"../pages/planner/plannerExerciseParser\";\nimport { PlannerNodeName } from \"../pages/planner/plannerExerciseStyles\";\nimport { PlannerEvaluator_hoistedProperties } from \"../pages/planner/plannerEvaluator\";\nimport { IPlannerDocumentBlockSpan, PlannerDocument_blockSpans } from \"../pages/planner/models/plannerDocument\";\nimport { CollectionUtils_compact } from \"../utils/collection\";\nimport { IEvaluatedProgram, Program_getAllProgramExercises } from \"./program\";\nimport {\n  IProgramExerciseSwap,\n  IProgramExerciseSwapScope,\n  ProgramExerciseSwap_apply,\n  ProgramExerciseSwap_rebaseRange,\n  ProgramExerciseSwap_revertedText,\n} from \"./programExerciseSwap\";\n\n// Errors inside the edited exercise carry blurb-local from/to so the editor can tint the\n// offending span; errors elsewhere in the program are message-only.\nexport interface IProgramExerciseTextError {\n  message: string;\n  from?: number;\n  to?: number;\n}\n\nexport function ProgramExerciseText_rebaseError(\n  error: IProgramExerciseTextError,\n  text: string\n): IProgramExerciseTextError {\n  if (error.from == null || error.to == null) {\n    return error;\n  }\n  const leading = text.length - text.trimStart().length;\n  return { ...error, from: error.from + leading, to: error.to + leading };\n}\n\n// Where the exercise's source text physically lives: repeat instances carry the\n// declaration's text/line but their own dayData, so anchor edits to the non-repeat\n// declaration that repeats into the opened week.\nexport function ProgramExerciseText_findDeclaration(\n  evaluatedProgram: IEvaluatedProgram,\n  programExercise: IPlannerProgramExercise\n): IPlannerProgramExercise {\n  if (!programExercise.isRepeat) {\n    return programExercise;\n  }\n  return (\n    Program_getAllProgramExercises(evaluatedProgram).find(\n      (e) => e.key === programExercise.key && !e.isRepeat && e.repeating.includes(programExercise.dayData.week)\n    ) ?? programExercise\n  );\n}\n\n// Where this declaration physically sits in its day. Found by line and confirmed by text:\n// identical exercise lines repeat across weeks and days, and a declaration resolved before an\n// edit landed can name a line that now holds something else — which is exactly what tells a\n// sheet its exercise moved out from under it.\nfunction declarationSpan(\n  planner: IPlannerProgram,\n  declaration: IPlannerProgramExercise\n): { dayText: string; span: IPlannerDocumentBlockSpan } | undefined {\n  const dayText = planner.weeks[declaration.dayData.week - 1]?.days[declaration.dayData.dayInWeek - 1]?.exerciseText;\n  if (dayText == null) {\n    return undefined;\n  }\n  // Trimmed on both sides, because `declaration.text` is: the span keeps whatever trailing\n  // spaces the line was written with, and those are not a difference in the exercise.\n  const span = PlannerDocument_blockSpans(dayText).find(\n    (s) => s.line === declaration.line && dayText.slice(s.exerciseFrom, s.to).trim() === declaration.text\n  );\n  return span != null ? { dayText, span } : undefined;\n}\n\n// What editing \"an exercise\" actually covers: the `//` description lines the evaluator attaches\n// to it, plus its own line(s). A surface showing only `declaration.text` hides half of what the\n// user wrote about this exercise — and one that saves only that line leaves the descriptions\n// stranded above whatever ends up there next.\n//\n// Read off the day's source rather than rebuilt from `descriptions.values`: those have already\n// had their `//`, their `!` marker and their indentation stripped, so they can't be spliced back.\nexport function ProgramExerciseText_blurb(planner: IPlannerProgram, declaration: IPlannerProgramExercise): string {\n  const found = declarationSpan(planner, declaration);\n  return found != null ? found.dayText.slice(found.span.from, found.span.to) : declaration.text;\n}\n\n// Which properties an instance in a later week is governed by even though its own line never\n// mentions them — the thing that makes editing one line a lie about the exercise.\n//\n// Derived from the evaluator's own list rather than restated, so adding a property to\n// fillSingleProperties reaches the sheet instead of quietly not doing so. `used` is hoisted but\n// deliberately not surfaced: `used: none` marks an exercise as a template that appears in no\n// workout, so it barely coexists with real instances, and it carries no value to edit from\n// another week — a caption about it would be unactionable noise.\nexport const ProgramExerciseText_sharedProperties: string[] = PlannerEvaluator_hoistedProperties.filter(\n  (property) => property !== \"used\"\n);\n\ninterface IExerciseSection {\n  property: string;\n  // The section on its own, with any trailing line continuation dropped — it's a readability\n  // wrapper for where the section currently sits, and carrying it into a recomposed line would\n  // leave a \"\\\" with nothing continuing after it.\n  text: string;\n  start: number;\n  // Past the continuation's newline where there is one, so removing the section doesn't leave a\n  // dangling line break that ends the exercise early.\n  end: number;\n  // The \"/\" introducing the section — removing a section has to take its separator with it.\n  separatorStart: number;\n  // `progress: none` and friends. Only progress gets an exemption from being program-wide\n  // (plannerEvaluator only registers `type !== \"none\"`), so this is what tells a genuine\n  // per-day override apart from a declaration.\n  isNone: boolean;\n}\n\n// Whether a section is the kind the evaluator hoists to the whole exercise. A `progress: none`\n// is not: it is a per-day opt-out that lives on the day it's written, so routing it to the\n// declaring week would overwrite that week's real progression with \"none\".\nfunction isSharedDeclaration(section: IExerciseSection): boolean {\n  return !(section.property === \"progress\" && section.isNone);\n}\n\nfunction exerciseSections(text: string): IExerciseSection[] {\n  const exercise = plannerExerciseParser.parse(text).topNode.getChild(PlannerNodeName.ExerciseExpression);\n  if (exercise == null) {\n    return [];\n  }\n  const sections: IExerciseSection[] = [];\n  let separatorStart: number | undefined;\n  for (let node = exercise.firstChild; node != null; node = node.nextSibling) {\n    if (node.name === PlannerNodeName.SectionSeparator) {\n      separatorStart = node.from;\n      continue;\n    }\n    if (node.name !== PlannerNodeName.ExerciseSection) {\n      continue;\n    }\n    const nameNode = node.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n    if (nameNode != null) {\n      let trimmed = node.to;\n      while (\n        trimmed > node.from &&\n        (text[trimmed - 1] === \" \" || text[trimmed - 1] === \"\\n\" || text[trimmed - 1] === \"\\r\")\n      ) {\n        trimmed -= 1;\n      }\n      const isContinued = text[trimmed - 1] === \"\\\\\";\n      let textEnd = isContinued ? trimmed - 1 : trimmed;\n      while (textEnd > node.from && text[textEnd - 1] === \" \") {\n        textEnd -= 1;\n      }\n      sections.push({\n        property: text.slice(nameNode.from, nameNode.to),\n        text: text.slice(node.from, textEnd),\n        start: node.from,\n        end: isContinued ? node.to : trimmed,\n        separatorStart: separatorStart ?? node.from,\n        isNone: node.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.None) != null,\n      });\n    }\n    separatorStart = undefined;\n  }\n  return sections;\n}\n\nfunction isSameDeclaration(a: IPlannerProgramExercise, b: IPlannerProgramExercise): boolean {\n  return a.dayData.week === b.dayData.week && a.dayData.dayInWeek === b.dayData.dayInWeek && a.line === b.line;\n}\n\n// Cutting a section out leaves the space that preceded its separator behind.\nfunction cutSection(text: string, section: IExerciseSection): string {\n  let start = section.separatorStart;\n  while (start > 0 && text[start - 1] === \" \") {\n    start -= 1;\n  }\n  return text.slice(0, start) + text.slice(section.end);\n}\n\nexport interface IProgramExerciseSharedSection {\n  property: string;\n  text: string;\n  // Every declaration that physically carries this property, not just the first. The evaluator\n  // allows the same property on several days as long as the arguments match, so rewriting one\n  // and leaving the rest is exactly what makes them disagree.\n  owners: IPlannerProgramExercise[];\n}\n\nexport interface IProgramExerciseSharedEdit {\n  property: string;\n  owners: IPlannerProgramExercise[];\n  text: string;\n}\n\nexport interface IProgramExerciseSharedRange {\n  property: string;\n  start: number;\n  end: number;\n}\n\n// Which shared properties govern this declaration without being written on it, and which line\n// does hold each. Only other declarations of the same key count: an exercise that inherits\n// `progress` through `...reuse` gets it from a different key entirely, and rewriting that from\n// here would edit an exercise the user isn't looking at.\nexport function ProgramExerciseText_sharedSections(\n  evaluatedProgram: IEvaluatedProgram,\n  declaration: IPlannerProgramExercise\n): IProgramExerciseSharedSection[] {\n  const own = new Set(exerciseSections(declaration.text).map((s) => s.property));\n  const missing = ProgramExerciseText_sharedProperties.filter((p) => !own.has(p));\n  if (missing.length === 0) {\n    return [];\n  }\n  const found: IProgramExerciseSharedSection[] = [];\n  for (const sibling of Program_getAllProgramExercises(evaluatedProgram)) {\n    if (sibling.key !== declaration.key || sibling.isRepeat || isSameDeclaration(sibling, declaration)) {\n      continue;\n    }\n    for (const section of exerciseSections(sibling.text)) {\n      if (!missing.includes(section.property) || !isSharedDeclaration(section)) {\n        continue;\n      }\n      const existing = found.find((f) => f.property === section.property);\n      if (existing == null) {\n        found.push({ property: section.property, text: section.text, owners: [sibling] });\n      } else if (!existing.owners.some((owner) => isSameDeclaration(owner, sibling))) {\n        existing.owners.push(sibling);\n      }\n    }\n  }\n  return found.sort(\n    (a, b) =>\n      ProgramExerciseText_sharedProperties.indexOf(a.property) -\n      ProgramExerciseText_sharedProperties.indexOf(b.property)\n  );\n}\n\nexport function ProgramExerciseText_compose(localBlurb: string, shared: { text: string }[]): string {\n  return shared.reduce((acc, section) => `${acc} / ${section.text}`, localBlurb.trimEnd());\n}\n\n// The inverse of compose, but keyed on the property rather than on where compose put it: after\n// freeform typing the sections can be anywhere, and a shared property belongs to its owner no\n// matter where in this text it ends up — including when the user adds one that was never\n// composed in.\n//\n// An absent section always means untouched, never removed: removing a shared property is not\n// something this sheet offers (the editor hides the delete affordance for them), so a section\n// that isn't in the text is simply one that is currently hidden. That is what lets the collapsed\n// default — where none of them are in the text — save without wiping anything.\nexport function ProgramExerciseText_split(\n  text: string,\n  shared: IProgramExerciseSharedSection[]\n): { localBlurb: string; sharedEdits: IProgramExerciseSharedEdit[] } {\n  if (shared.length === 0) {\n    return { localBlurb: text, sharedEdits: [] };\n  }\n  const sections = exerciseSections(text).filter(isSharedDeclaration);\n  const sharedEdits = CollectionUtils_compact(\n    shared.map((s) => {\n      const found = sections.find((section) => section.property === s.property);\n      return found != null ? { property: s.property, owners: s.owners, text: found.text } : undefined;\n    })\n  );\n  let localBlurb = text;\n  const cuts = sections\n    .filter((section) => shared.some((s) => s.property === section.property))\n    .sort((a, b) => b.start - a.start);\n  for (const cut of cuts) {\n    localBlurb = cutSection(localBlurb, cut);\n  }\n  return { localBlurb, sharedEdits };\n}\n\nexport function ProgramExerciseText_sharedRanges(text: string, properties: string[]): IProgramExerciseSharedRange[] {\n  return exerciseSections(text)\n    .filter((section) => properties.includes(section.property) && isSharedDeclaration(section))\n    .map((section) => ({ property: section.property, start: section.separatorStart, end: section.end }));\n}\n\nfunction rewriteSharedSections(ownerText: string, edits: IProgramExerciseSharedEdit[]): string {\n  const sections = exerciseSections(ownerText);\n  const changes = edits\n    .map((edit) => ({ edit, section: sections.find((s) => s.property === edit.property) }))\n    .filter(\n      (change): change is { edit: IProgramExerciseSharedEdit; section: IExerciseSection } => change.section != null\n    )\n    .sort((a, b) => b.section.start - a.section.start);\n  let result = ownerText;\n  for (const { edit, section } of changes) {\n    if (edit.text !== section.text) {\n      // Replaces up to the trimmed text end, so a section written with a trailing line\n      // continuation keeps it and the line after it still belongs to this exercise.\n      result = result.slice(0, section.start) + edit.text + result.slice(section.start + section.text.length);\n    }\n  }\n  return result;\n}\n\n// One rewrite per physical line, carrying every property that line declares.\nfunction groupByOwner(\n  edits: IProgramExerciseSharedEdit[]\n): { owner: IPlannerProgramExercise; edits: IProgramExerciseSharedEdit[] }[] {\n  const groups: { owner: IPlannerProgramExercise; edits: IProgramExerciseSharedEdit[] }[] = [];\n  for (const edit of edits) {\n    for (const owner of edit.owners) {\n      const group = groups.find((g) => isSameDeclaration(g.owner, owner));\n      if (group != null) {\n        group.edits.push(edit);\n      } else {\n        groups.push({ owner, edits: [edit] });\n      }\n    }\n  }\n  return groups;\n}\n\n// Identical exercise lines commonly appear in several weeks (repeated weeks written out), so\n// the replacement targets the declaration's own span rather than a search for its text — which\n// could match the same line further down the day and rewrite an exercise nobody was editing.\n//\n// `scope` says how far the replacement reaches: editing the exercise replaces the whole blurb,\n// descriptions included, while a shared property rewritten on another day's line touches that\n// line alone and leaves that day's descriptions where they are.\nexport function ProgramExerciseText_replaceInPlanner(\n  planner: IPlannerProgram,\n  declaration: IPlannerProgramExercise,\n  newText: string,\n  scope: \"blurb\" | \"exercise\"\n): { planner: IPlannerProgram; dayTextOffset: number } | undefined {\n  const found = declarationSpan(planner, declaration);\n  if (found == null) {\n    return undefined;\n  }\n  const { dayText, span } = found;\n  const at = scope === \"blurb\" ? span.from : span.exerciseFrom;\n  const newExerciseText = dayText.slice(0, at) + newText + dayText.slice(span.to);\n  const weekIndex = declaration.dayData.week - 1;\n  const dayIndex = declaration.dayData.dayInWeek - 1;\n  const newWeeks = planner.weeks.map((w, wi) =>\n    wi === weekIndex\n      ? { ...w, days: w.days.map((d, di) => (di === dayIndex ? { ...d, exerciseText: newExerciseText } : d)) }\n      : w\n  );\n  return { planner: { ...planner, weeks: newWeeks }, dayTextOffset: at };\n}\n\nexport function ProgramExerciseText_cleanErrorMessage(message: string): string {\n  return message.replace(/\\s*\\(\\d+:\\d+\\)$/, \"\");\n}\n\nfunction findEvalError(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  edited: { weekIndex: number; dayIndex: number; from: number; to: number }\n): IProgramExerciseTextError | undefined {\n  let firstOutside: IProgramExerciseTextError | undefined;\n  for (let wi = 0; wi < evaluatedWeeks.length; wi += 1) {\n    for (let di = 0; di < evaluatedWeeks[wi].length; di += 1) {\n      const result = evaluatedWeeks[wi][di];\n      if (!result.success) {\n        const error = result.error;\n        const isInEdited =\n          wi === edited.weekIndex && di === edited.dayIndex && error.from >= edited.from && error.to <= edited.to;\n        if (isInEdited) {\n          return {\n            message: ProgramExerciseText_cleanErrorMessage(error.message),\n            from: error.from - edited.from,\n            to: error.to - edited.from,\n          };\n        }\n        firstOutside = firstOutside ?? {\n          message: `Week ${wi + 1}, Day ${di + 1}: ${ProgramExerciseText_cleanErrorMessage(error.message)}`,\n        };\n      }\n    }\n  }\n  return firstOutside;\n}\n\n// The evaluator can throw outright on drafts it never sees from saved programs (e.g. a\n// reuse pointing at a week that doesn't exist) — and live validation feeds it every\n// keystroke, so a throw must become an error result, not a crash.\nfunction evaluatePlannerSafely(\n  planner: IPlannerProgram,\n  settings: ISettings,\n  edited: { weekIndex: number; dayIndex: number; from: number; to: number }\n): IProgramExerciseTextError | undefined {\n  try {\n    const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n    return findEvalError(evaluatedWeeks, edited);\n  } catch (e) {\n    return { message: ProgramExerciseText_cleanErrorMessage(PlannerProgram_thrownErrorMessage(e)) };\n  }\n}\n\n// Turning one exercise's edited text into a new program, used both to save and to validate.\n// Ordinary edits are a splice; an edit that changes *which exercise this is* gets spliced with\n// the old name still in place — keeping the program valid, in particular every `...reuse`\n// aimed at it — and then swapped at the program level, which is what rewrites those\n// references, keeps ladders identical across instances and de-conflicts a colliding name.\n//\n// `localBlurb` is this declaration's whole blurb — its `//` description lines as well as its\n// exercise line — and replaces all of it. Not just the line: the descriptions belong to the\n// exercise, so a surface editing one edits both. Edits to shared properties are the exception,\n// and land on the lines that declare them; those go first so the local splice's returned offset\n// — which error ranges are mapped against — is measured against a planner nothing else will move.\nexport function ProgramExerciseText_apply(\n  planner: IPlannerProgram,\n  declaration: IPlannerProgramExercise,\n  localBlurb: string,\n  sharedEdits: IProgramExerciseSharedEdit[],\n  swap: IProgramExerciseSwap | undefined,\n  scope: IProgramExerciseSwapScope,\n  settings: ISettings\n): { planner: IPlannerProgram } | { error: IProgramExerciseTextError; notFound?: boolean } {\n  const splicedText = swap != null ? ProgramExerciseSwap_revertedText(localBlurb, swap) : localBlurb;\n  let withShared = planner;\n  for (const group of groupByOwner(sharedEdits)) {\n    const newOwnerText = rewriteSharedSections(group.owner.text, group.edits);\n    if (newOwnerText === group.owner.text) {\n      continue;\n    }\n    const replacedOwner = ProgramExerciseText_replaceInPlanner(withShared, group.owner, newOwnerText, \"exercise\");\n    if (replacedOwner == null) {\n      return {\n        error: { message: \"Couldn't find this exercise in the program anymore, so the changes weren't saved.\" },\n        notFound: true,\n      };\n    }\n    withShared = replacedOwner.planner;\n  }\n  const replaced = ProgramExerciseText_replaceInPlanner(withShared, declaration, splicedText, \"blurb\");\n  if (replaced == null) {\n    return {\n      error: { message: \"Couldn't find this exercise in the program anymore, so the changes weren't saved.\" },\n      notFound: true,\n    };\n  }\n  const spliceError = evaluatePlannerSafely(replaced.planner, settings, {\n    weekIndex: declaration.dayData.week - 1,\n    dayIndex: declaration.dayData.dayInWeek - 1,\n    from: replaced.dayTextOffset,\n    to: replaced.dayTextOffset + splicedText.length,\n  });\n  if (spliceError != null) {\n    // The user sees the new name; the evaluator saw the old one, so in-blurb ranges are off\n    // by the difference in length.\n    return {\n      error:\n        swap != null && spliceError.from != null && spliceError.to != null\n          ? { ...spliceError, ...ProgramExerciseSwap_rebaseRange({ from: spliceError.from, to: spliceError.to }, swap) }\n          : spliceError,\n    };\n  }\n  if (swap == null) {\n    return { planner: replaced.planner };\n  }\n  const applied = ProgramExerciseSwap_apply(replaced.planner, swap, scope, declaration.dayData, settings);\n  if (\"error\" in applied) {\n    return { error: { message: ProgramExerciseText_cleanErrorMessage(applied.error) } };\n  }\n  // The swap rewrites the whole program, so anything it broke is reported without a range —\n  // there is nothing in this blurb to point at.\n  const evalError = evaluatePlannerSafely(applied.planner, settings, {\n    weekIndex: -1,\n    dayIndex: -1,\n    from: 0,\n    to: 0,\n  });\n  return evalError != null ? { error: evalError } : { planner: applied.planner };\n}\n","import { IPlannerProgram, ISettings, IShortDayData } from \"../types\";\nimport { IEvaluatedProgram, Program_create, Program_evaluateCachedPlanner } from \"./program\";\nimport { ProgramToPlanner } from \"./programToPlanner\";\nimport { PlannerEvaluator_evaluate, PlannerEvaluator_getFirstError } from \"../pages/planner/plannerEvaluator\";\nimport { PlannerProgram_evaluate, PlannerProgram_thrownErrorMessage } from \"../pages/planner/models/plannerProgram\";\nimport { ObjectUtils_clone } from \"../utils/object\";\n\n// Pairing by array index would report a rename for every exercise a reorder shifted, and the\n// day's order shifts on its own: `used: none` and repeat-materialized exercises sort ahead.\nexport function ProgramRewrite_changedKeys(\n  oldPlanner: IPlannerProgram,\n  newPlanner: IPlannerProgram,\n  settings: ISettings\n): Partial<Record<string, string>> {\n  const { evaluatedWeeks: oldEvaluatedWeeks } = PlannerProgram_evaluate(oldPlanner, settings);\n  const { evaluatedWeeks: newEvaluatedWeeks } = PlannerProgram_evaluate(newPlanner, settings);\n  const changedKeys: Partial<Record<string, string>> = {};\n  for (let weekIndex = 0; weekIndex < oldEvaluatedWeeks.length; weekIndex++) {\n    const oldWeek = oldEvaluatedWeeks[weekIndex];\n    const newWeek = newEvaluatedWeeks[weekIndex];\n    if (oldWeek == null || newWeek == null) {\n      continue;\n    }\n    for (let dayInWeekIndex = 0; dayInWeekIndex < oldWeek.length; dayInWeekIndex++) {\n      const oldDay = oldWeek[dayInWeekIndex];\n      const newDay = newWeek[dayInWeekIndex];\n      if (oldDay == null || newDay == null || !oldDay.success || !newDay.success) {\n        continue;\n      }\n      const newKeys = new Set(newDay.data.map((e) => e.key));\n      const oldKeys = new Set(oldDay.data.map((e) => e.key));\n      const removed = oldDay.data.filter((e) => !newKeys.has(e.key));\n      const added = newDay.data.filter((e) => !oldKeys.has(e.key));\n      for (let i = 0; i < removed.length; i++) {\n        const newExercise = added[i];\n        if (newExercise != null) {\n          changedKeys[removed[i].key] = newExercise.key;\n        }\n      }\n    }\n  }\n  return changedKeys;\n}\n\nexport interface IProgramRewriteError {\n  message: string;\n}\n\nexport type IProgramRewriteResult = { planner: IPlannerProgram } | { error: IProgramRewriteError };\n\n// One program edit made on the evaluated model: `mutate` changes the instances it wants on a\n// clone, ProgramToPlanner prints the whole program, and the result is evaluated once more so a\n// rewrite that the evaluator rejects never reaches the caller as a planner.\nexport function ProgramRewrite_instances(\n  planner: IPlannerProgram,\n  settings: ISettings,\n  mutate: (evaluated: IEvaluatedProgram) => void,\n  options: { validate?: boolean } = {}\n): IProgramRewriteResult {\n  let evaluated: IEvaluatedProgram;\n  try {\n    evaluated = ObjectUtils_clone(Program_evaluateCachedPlanner({ ...Program_create(\"Temp\"), planner }, settings));\n  } catch (e) {\n    return { error: { message: PlannerProgram_thrownErrorMessage(e) } };\n  }\n  mutate(evaluated);\n  let rewritten: IPlannerProgram;\n  try {\n    rewritten = new ProgramToPlanner(evaluated, settings).convertToPlanner();\n  } catch (e) {\n    return { error: { message: PlannerProgram_thrownErrorMessage(e) } };\n  }\n  if (options.validate === false) {\n    return { planner: rewritten };\n  }\n  const error = ProgramRewrite_validate(rewritten, settings);\n  return error != null ? { error } : { planner: rewritten };\n}\n\nexport function ProgramRewrite_validate(\n  planner: IPlannerProgram,\n  settings: ISettings\n): IProgramRewriteError | undefined {\n  try {\n    const error = PlannerEvaluator_getFirstError(PlannerEvaluator_evaluate(planner, settings).evaluatedWeeks);\n    return error != null ? { message: error.message } : undefined;\n  } catch (e) {\n    return { message: PlannerProgram_thrownErrorMessage(e) };\n  }\n}\n\n// The declaration's own week plus every week a `Squat[1-4]` bracket repeats it into.\nexport function ProgramRewrite_repeatWeeks(\n  evaluated: IEvaluatedProgram,\n  dayData: IShortDayData,\n  fullName: string,\n  ignoreRepeats: boolean = false\n): number[] {\n  const day = evaluated.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1];\n  const weeks: Set<number> = new Set();\n  weeks.add(dayData.week);\n  const exercise = day?.exercises.find((e) => e.fullName === fullName);\n  if (!ignoreRepeats && exercise != null) {\n    for (const repeating of exercise.repeating) {\n      weeks.add(repeating);\n    }\n  }\n  return Array.from(weeks);\n}\n","import { IPlannerProgramExerciseEvaluatedSet } from \"../pages/planner/models/types\";\nimport { IExerciseType, IProgramSet, ISettings, IWeight } from \"../types\";\nimport { Equipment_getUnitOrDefaultForExerciseType } from \"./equipment\";\nimport { Weight_evaluateWeight, Weight_rpePct, Weight_roundConvertTo } from \"./weight\";\n\nexport function ProgramSet_group(sets: IProgramSet[]): IProgramSet[][] {\n  return sets.reduce<IProgramSet[][]>(\n    (memo, set) => {\n      let lastGroup = memo[memo.length - 1];\n      const last = lastGroup[lastGroup.length - 1];\n      if (\n        last != null &&\n        (last.weightExpr !== set.weightExpr ||\n          last.repsExpr !== set.repsExpr ||\n          last.isAmrap !== set.isAmrap ||\n          last.rpeExpr !== set.rpeExpr ||\n          last.logRpe !== set.logRpe)\n      ) {\n        memo.push([]);\n        lastGroup = memo[memo.length - 1];\n      }\n      lastGroup.push(set);\n      return memo;\n    },\n    [[]]\n  );\n}\n\nexport function ProgramSet_isEligibleForInferredWeight(set: IPlannerProgramExerciseEvaluatedSet): boolean {\n  return set.weight == null && set.maxrep != null && set.rpe != null;\n}\n\nexport function ProgramSet_getEvaluatedWeight(\n  programSet: IPlannerProgramExerciseEvaluatedSet,\n  exerciseType: IExerciseType,\n  settings: ISettings\n): IWeight | undefined {\n  const originalWeight = programSet.weight;\n  const unit = Equipment_getUnitOrDefaultForExerciseType(settings, exerciseType);\n  const evaluatedWeight = originalWeight\n    ? Weight_evaluateWeight(originalWeight, exerciseType, settings)\n    : ProgramSet_isEligibleForInferredWeight(programSet) && programSet.maxrep != null && programSet.rpe != null\n      ? Weight_evaluateWeight(Weight_rpePct(programSet.maxrep, programSet.rpe), exerciseType, settings)\n      : undefined;\n  return evaluatedWeight ? Weight_roundConvertTo(evaluatedWeight, settings, unit, exerciseType) : undefined;\n}\n","import {\n  PlannerProgram_generateFullText,\n  PlannerProgram_topLineItems,\n  PlannerProgram_groupedTopLines,\n  PlannerProgram_compact,\n} from \"../pages/planner/models/plannerProgram\";\nimport {\n  IDayData,\n  IPercentage,\n  IPlannerProgram,\n  IPlannerProgramDay,\n  IPlannerProgramWeek,\n  ISettings,\n  IWeight,\n} from \"../types\";\nimport { n } from \"../utils/math\";\nimport { Dialog_alert } from \"../utils/dialog\";\nimport { ObjectUtils_isEqual, ObjectUtils_entries, ObjectUtils_keys } from \"../utils/object\";\nimport {\n  Weight_eqNull,\n  Weight_eq,\n  Weight_zero,\n  Weight_print,\n  Weight_buildPct,\n  Weight_build,\n  Weight_printNull,\n} from \"./weight\";\nimport {\n  PlannerProgramExercise_currentEvaluatedSetVariationIndex,\n  PlannerProgramExercise_getOnlyChangedState,\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_getStateMetadata,\n  PlannerProgramExercise_getUpdateScript,\n  PlannerProgramExercise_sets,\n  PlannerProgramExercise_warmups,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExerciseEvaluatedSetVariation,\n  IPlannerProgramExerciseWarmupSet,\n} from \"../pages/planner/models/types\";\nimport { IEvaluatedProgram, Program_getProgramExercise } from \"./program\";\nimport { Exercise_get, Exercise_fullName, Exercise_buildName } from \"./exercise\";\nimport { CollectionUtils_compact } from \"../utils/collection\";\nimport { PP_iterate2, PP_iterateTopLineExercises } from \"./pp\";\nimport { PlannerKey_fromFullName, PlannerKey_fromPlannerExercise } from \"../pages/planner/plannerKey\";\nimport { IPlannerTopLineItem } from \"../pages/planner/plannerExerciseEvaluator\";\n\ninterface IPlannerToProgram2Globals {\n  weight?: IWeight | IPercentage;\n  rpe?: number;\n  timer?: number;\n  setTimer?: number;\n  isOverflowSetTimer?: boolean;\n  logRpe?: boolean;\n  askWeight?: boolean;\n}\n\ntype IDereuseDecision = \"sets\" | \"weight\" | \"rpe\" | \"timer\" | \"setTimer\" | \"progress\" | \"update\";\n\ntype IShareablePropertyName = \"progress\" | \"update\" | \"warmup\" | \"id\";\ninterface IPropertyCandidate {\n  location: string;\n  exercise: IPlannerProgramExercise;\n  isOrigin: boolean;\n}\n// Where a shared property gets printed, and which instance it's read from. Those differ because\n// the removed editProgramExercise UI edited shared properties on the first instance only.\n// TODO: nothing edits that way now, so drop 'exercise' and read the property off the origin instance.\ntype IPropertyTarget = { location: string; exercise: IPlannerProgramExercise };\ntype IPropertyTargets = Record<IShareablePropertyName, Record<string, IPropertyTarget>>;\ntype IPropertyCandidates = Record<IShareablePropertyName, Record<string, IPropertyCandidate[]>>;\n\nexport interface IPlannerToProgramConvertOpts {\n  renameMapping?: Record<string, { to: string; dayData?: Required<IDayData> }>;\n  reorder?: { dayData: Required<IDayData>; fromIndex: number; toIndex: number }[];\n  add?: { dayData: Required<IDayData>; index: number; fullName: string }[];\n}\n\nexport class ProgramToPlanner {\n  constructor(\n    private readonly program: IEvaluatedProgram,\n    private readonly settings: ISettings\n  ) {}\n\n  private getCurrentDescriptionExercise(\n    key: string,\n    weekIndex: number,\n    dayInWeekIndex: number\n  ): IPlannerProgramExercise | undefined {\n    return this.program.weeks[weekIndex]?.days[dayInWeekIndex]?.exercises?.find((e) => e.key === key);\n  }\n\n  private isInheritedDescription(exercise: IPlannerProgramExercise, weekIndex: number, dayInWeekIndex: number): boolean {\n    for (let i = weekIndex - 1; i >= 0; i -= 1) {\n      const day = this.program.weeks[i]?.days[dayInWeekIndex];\n      if (day == null) {\n        return false;\n      }\n      const lastWeekExercise = day.exercises.find((e) => e.key === exercise.key);\n      if (lastWeekExercise != null) {\n        return (\n          exercise.descriptions.reuse?.fullName === lastWeekExercise.descriptions.reuse?.fullName &&\n          ObjectUtils_isEqual(exercise.descriptions.values, lastWeekExercise.descriptions.values)\n        );\n      }\n    }\n    return false;\n  }\n\n  private getCurrentDescriptionIndex(key: string, weekIndex: number, dayInWeekIndex: number): number {\n    const exercise = this.getCurrentDescriptionExercise(key, weekIndex, dayInWeekIndex);\n    const descriptions = exercise?.descriptions.values || [];\n    const index = descriptions.findIndex((s) => s.isCurrent);\n    return index === -1 ? 0 : index;\n  }\n\n  private shouldReuseSets(programExercise: IPlannerProgramExercise): boolean {\n    return !!programExercise.reuse;\n  }\n\n  private getDereuseDecisions(programExercise: IPlannerProgramExercise): IDereuseDecision[] {\n    const dereuseDecisions: Set<IDereuseDecision> = new Set();\n    const reuseExercise = programExercise.reuse?.exercise;\n    if (!reuseExercise) {\n      return Array.from(dereuseDecisions);\n    }\n    const globals = this.getGlobals(programExercise);\n    const reusedGlobals = this.getGlobals(reuseExercise);\n    if (programExercise.evaluatedSetVariations.length !== reuseExercise.evaluatedSetVariations.length) {\n      dereuseDecisions.add(\"sets\");\n    }\n    if (\n      PlannerProgramExercise_currentEvaluatedSetVariationIndex(programExercise) !==\n      PlannerProgramExercise_currentEvaluatedSetVariationIndex(reuseExercise)\n    ) {\n      dereuseDecisions.add(\"sets\");\n    }\n    if (reuseExercise.progress != null || programExercise.progress != null) {\n      if (\n        programExercise.progress == null ||\n        programExercise.progress.type !== reuseExercise.progress?.type ||\n        (programExercise.progress.reuse\n          ? programExercise.progress.reuse?.fullName !== reuseExercise.fullName\n          : programExercise.progress.script !== reuseExercise.progress.script) ||\n        Object.keys(PlannerProgramExercise_getOnlyChangedState(programExercise)).length > 0\n      ) {\n        dereuseDecisions.add(\"progress\");\n      }\n    }\n    if (reuseExercise.update != null || programExercise.update != null) {\n      if (\n        programExercise.update == null ||\n        (programExercise.update.reuse\n          ? programExercise.update.reuse?.fullName !== reuseExercise.fullName\n          : programExercise.update.script !== reuseExercise.update?.script)\n      ) {\n        dereuseDecisions.add(\"update\");\n      }\n    }\n    if (programExercise.evaluatedSetVariations.length === reuseExercise.evaluatedSetVariations.length) {\n      for (let i = 0; i < programExercise.evaluatedSetVariations.length; i += 1) {\n        const programVariation = programExercise.evaluatedSetVariations[i];\n        const reuseVariation = reuseExercise.evaluatedSetVariations[i];\n        if (programVariation.sets.length !== reuseVariation.sets.length) {\n          dereuseDecisions.add(\"sets\");\n        }\n        for (let j = 0; j < programVariation.sets.length; j += 1) {\n          const programSet = programVariation.sets[j];\n          const reuseSet = reuseVariation.sets[j];\n          if (programSet.maxrep !== reuseSet?.maxrep || programSet.minrep !== reuseSet?.minrep) {\n            dereuseDecisions.add(\"sets\");\n          }\n          if (\n            reuseSet\n              ? !Weight_eqNull(programSet.weight, reuseSet.weight) || programSet.askWeight !== reuseSet.askWeight\n              : !Weight_eq(globals.weight || Weight_zero, reusedGlobals.weight || Weight_zero) ||\n                globals.askWeight !== reusedGlobals.askWeight\n          ) {\n            if (globals.weight != null) {\n              dereuseDecisions.add(\"weight\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n          if (\n            reuseSet\n              ? programSet.rpe !== reuseSet.rpe || programSet.logRpe !== reuseSet.logRpe\n              : globals.rpe !== reusedGlobals.rpe || globals.logRpe !== reusedGlobals.logRpe\n          ) {\n            if (globals.rpe != null) {\n              dereuseDecisions.add(\"rpe\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n          if (reuseSet ? programSet.timer !== reuseSet.timer : globals.timer !== reusedGlobals.timer) {\n            if (globals.timer != null) {\n              dereuseDecisions.add(\"timer\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n          if (\n            programSet.setTimer !== reuseSet?.setTimer ||\n            !!programSet.isOverflowSetTimer !== !!reuseSet?.isOverflowSetTimer\n          ) {\n            if (globals.setTimer != null) {\n              dereuseDecisions.add(\"setTimer\");\n            } else {\n              dereuseDecisions.add(\"sets\");\n            }\n          }\n        }\n      }\n    }\n    return Array.from(dereuseDecisions);\n  }\n\n  private reorderGroupedTopLine(\n    groupedTopLine: IPlannerTopLineItem[][][][],\n    reorders: IPlannerToProgramConvertOpts[\"reorder\"]\n  ): IPlannerTopLineItem[][][][] {\n    if (!reorders) {\n      return groupedTopLine;\n    }\n    for (const reorder of reorders) {\n      const groupedDay = groupedTopLine[reorder.dayData.week - 1]?.[reorder.dayData.dayInWeek - 1];\n      if (groupedDay) {\n        const indexMap = groupedDay.reduce<{ result: Record<number, number>; i: number }>(\n          ({ result, i }, group, index) => {\n            const exercise = group.find((item) => item.type === \"exercise\");\n            if (exercise && !exercise.notused) {\n              result[i] = index;\n              i += 1;\n            }\n            return { result, i };\n          },\n          { result: {}, i: 0 }\n        ).result;\n        const from = groupedDay[indexMap[reorder.fromIndex]];\n        if (from) {\n          groupedDay.splice(indexMap[reorder.fromIndex], 1);\n          groupedDay.splice(indexMap[reorder.toIndex], 0, from);\n        }\n      }\n    }\n    return groupedTopLine;\n  }\n\n  private addGroupedTopLine(\n    groupedTopLine: IPlannerTopLineItem[][][][],\n    adds: IPlannerToProgramConvertOpts[\"add\"]\n  ): IPlannerTopLineItem[][][][] {\n    if (!adds) {\n      return groupedTopLine;\n    }\n    for (const add of adds) {\n      const groupedDay = groupedTopLine[add.dayData.week - 1]?.[add.dayData.dayInWeek - 1];\n      if (groupedDay) {\n        groupedDay.splice(add.index, 0, [\n          { type: \"exercise\", value: PlannerKey_fromFullName(add.fullName, this.settings.exercises) },\n        ]);\n      }\n    }\n    return groupedTopLine;\n  }\n\n  private getRenamedValue(\n    opts: IPlannerToProgramConvertOpts,\n    line: IPlannerTopLineItem,\n    weekIndex: number,\n    dayInWeekIndex: number\n  ): string {\n    const renamedValue = opts.renameMapping?.[line.value];\n    if (\n      renamedValue &&\n      (!renamedValue.dayData ||\n        (renamedValue.dayData.week === weekIndex + 1 && renamedValue.dayData.dayInWeek === dayInWeekIndex + 1))\n    ) {\n      return renamedValue.to;\n    } else {\n      return line.value;\n    }\n  }\n\n  private addExerciseDescriptions(\n    exercise: IPlannerProgramExercise | undefined,\n    weekIndex: number,\n    dayInWeekIndex: number,\n    addedCurrentDescription: boolean\n  ): { lines: string[]; addedCurrentDescription: boolean } | undefined {\n    if (!exercise) {\n      return undefined;\n    }\n    if (\n      exercise?.descriptions.reuse == null ||\n      !ObjectUtils_isEqual(\n        exercise.descriptions.values || [],\n        exercise.descriptions.reuse.exercise?.descriptions.values || []\n      )\n    ) {\n      const lines: string[] = [];\n      const currentIndex = this.getCurrentDescriptionIndex(exercise.key, weekIndex, dayInWeekIndex);\n      for (let i = 0; i < exercise.descriptions.values.length; i += 1) {\n        if (i > 0) {\n          lines.push(\"\");\n        }\n        const description = exercise.descriptions.values[i];\n        const parts = description.value.split(\"\\n\");\n        for (const part of parts) {\n          if (currentIndex !== 0 && currentIndex === i && !addedCurrentDescription) {\n            lines.push(`// ! ${part}`);\n            addedCurrentDescription = true;\n          } else {\n            lines.push(`// ${part}`);\n          }\n        }\n      }\n      return { lines, addedCurrentDescription };\n    } else if (exercise?.descriptions.reuse?.exercise) {\n      const reusedExercise = exercise.descriptions.reuse.exercise;\n      const reusedDayData = reusedExercise.dayData;\n      const currentWeekReusedExercisesCount = this.program.weeks[weekIndex]?.days.filter((day) => {\n        return day.exercises.some((e) => e.key === reusedExercise.key);\n      }).length;\n      if (currentWeekReusedExercisesCount === 1 && reusedDayData.week === weekIndex + 1) {\n        return { lines: [`// ...${reusedExercise.fullName}`], addedCurrentDescription };\n      } else {\n        return {\n          lines: [`// ...${reusedExercise.fullName}[${reusedDayData.week}:${reusedDayData.dayInWeek}]`],\n          addedCurrentDescription,\n        };\n      }\n    } else {\n      return undefined;\n    }\n  }\n\n  private addPropertyCandidate(\n    candidates: Record<string, IPropertyCandidate[]>,\n    key: string,\n    candidate: IPropertyCandidate\n  ): void {\n    candidates[key] = candidates[key] || [];\n    candidates[key].push(candidate);\n  }\n\n  // 'progress'/'update'/'warmup' are shared across every instance of an exercise, so they're printed\n  // only once. Authors deliberately place bulky blocks away from the top of the program (e.g. on the\n  // last week), so print them back where they were written instead of on the first instance.\n  // A repeat-materialized copy carries the original's syntax points, so it's excluded from being the\n  // origin - otherwise every week a `[1-3]` line spans would claim to be where it was written.\n  private getPropertyTargets(\n    groupedTopLineMap: IPlannerTopLineItem[][][][],\n    opts: IPlannerToProgramConvertOpts\n  ): IPropertyTargets {\n    const candidates: IPropertyCandidates = { progress: {}, update: {}, warmup: {}, id: {} };\n    PP_iterateTopLineExercises(groupedTopLineMap, (line, weekIndex, dayInWeekIndex, dayIndex) => {\n      const value = this.getRenamedValue(opts, line, weekIndex, dayInWeekIndex);\n      const exercise = Program_getProgramExercise(dayIndex + 1, this.program, value);\n      if (exercise == null) {\n        return;\n      }\n      const location = `${weekIndex}_${dayInWeekIndex}`;\n      const dereuseDecisions = this.shouldReuseSets(exercise) ? this.getDereuseDecisions(exercise) : [];\n      const progress = exercise.progress;\n      if (\n        progress != null &&\n        progress.type !== \"none\" &&\n        (progress.reuse || progress.script) &&\n        (!exercise.reuse || dereuseDecisions.includes(\"progress\"))\n      ) {\n        this.addPropertyCandidate(candidates.progress, exercise.key, {\n          location,\n          exercise,\n          isOrigin: exercise.points.progressPoint != null && !exercise.isRepeat,\n        });\n      }\n      const update = exercise.update;\n      if (\n        update != null &&\n        (update.reuse || update.script) &&\n        (!exercise.reuse || dereuseDecisions.includes(\"update\"))\n      ) {\n        this.addPropertyCandidate(candidates.update, exercise.key, {\n          location,\n          exercise,\n          isOrigin: exercise.points.updatePoint != null && !exercise.isRepeat,\n        });\n      }\n      if (exercise.warmupSets != null) {\n        this.addPropertyCandidate(candidates.warmup, exercise.key, {\n          location,\n          exercise,\n          isOrigin: exercise.points.warmupPoint != null && !exercise.isRepeat,\n        });\n      }\n      if ((exercise.tags || []).length > 0) {\n        this.addPropertyCandidate(candidates.id, exercise.key, {\n          location,\n          exercise,\n          isOrigin: exercise.points.idPoint != null && !exercise.isRepeat,\n        });\n      }\n    });\n    const targets: IPropertyTargets = { progress: {}, update: {}, warmup: {}, id: {} };\n    for (const property of ObjectUtils_keys(candidates)) {\n      for (const key of ObjectUtils_keys(candidates[property])) {\n        const list = candidates[property][key];\n        const origin = list.find((c) => c.isOrigin) || list[0];\n        if (origin != null) {\n          targets[property][key] = { location: origin.location, exercise: list[0].exercise };\n        }\n      }\n    }\n    return targets;\n  }\n\n  private getPropertySource(\n    targets: IPropertyTargets,\n    property: IShareablePropertyName,\n    key: string,\n    weekIndex: number,\n    dayInWeekIndex: number,\n    fallback: IPlannerProgramExercise\n  ): IPlannerProgramExercise | undefined {\n    const target = targets[property][key];\n    if (target == null) {\n      return fallback;\n    }\n    return target.location === `${weekIndex}_${dayInWeekIndex}` ? target.exercise : undefined;\n  }\n\n  public convertToPlanner(opts: IPlannerToProgramConvertOpts = {}): IPlannerProgram {\n    const plannerWeeks: IPlannerProgramWeek[] = [];\n    const plannerProgram = this.program.planner;\n    if (this.program.errors.length > 0) {\n      const error = this.program.errors[0];\n      const msg = `There's an error during evaluating a program, week ${error.dayData.week}, day: ${error.dayData.dayInWeek}. Please fix it to proceed.\\n\\n${error.error.toString()}`;\n      console.log(PlannerProgram_generateFullText(plannerProgram.weeks));\n      Dialog_alert(msg);\n      throw error.error;\n    }\n    const topLineMap = PlannerProgram_topLineItems(plannerProgram, this.settings);\n    let groupedTopLineMap = PlannerProgram_groupedTopLines(topLineMap);\n    groupedTopLineMap = opts.reorder ? this.reorderGroupedTopLine(groupedTopLineMap, opts.reorder) : groupedTopLineMap;\n    groupedTopLineMap = opts.add ? this.addGroupedTopLine(groupedTopLineMap, opts.add) : groupedTopLineMap;\n    const propertyTargets = this.getPropertyTargets(groupedTopLineMap, opts);\n    let dayIndex = 0;\n    const addedProgressMap: Record<string, boolean> = {};\n    const addedUpdateMap: Record<string, boolean> = {};\n    const addedWarmupsMap: Record<string, boolean> = {};\n    const addedIdMap: Record<string, boolean> = {};\n\n    for (let weekIndex = 0; weekIndex < this.program.weeks.length; weekIndex += 1) {\n      const week = this.program.weeks[weekIndex];\n      const plannerWeek: IPlannerProgramWeek = { name: week.name, days: [], description: week.description };\n      for (let dayInWeekIndex = 0; dayInWeekIndex < week.days.length; dayInWeekIndex += 1) {\n        const programDay = week.days[dayInWeekIndex];\n        const plannerDay: IPlannerProgramDay = { name: programDay.name, exerciseText: \"\" };\n        let descriptionIndex: number | undefined = undefined;\n        let addedCurrentDescription = false;\n        let finishedToAddDescription = false;\n        const groupedTopLines = groupedTopLineMap[weekIndex][dayInWeekIndex];\n        let groupTextArr: string[] = [];\n        groupLoop: for (let groupIndex = 0; groupIndex < groupedTopLines.length; groupIndex += 1) {\n          const exerciseTextArr: string[] = [];\n          const group = groupedTopLines[groupIndex];\n          for (let lineIndex = 0; lineIndex < group.length; lineIndex += 1) {\n            const line = group[lineIndex];\n            switch (line.type) {\n              case \"comment\": {\n                exerciseTextArr.push(line.value);\n                break;\n              }\n              case \"description\": {\n                let key: string | undefined;\n                for (let i = lineIndex; i < group.length; i += 1) {\n                  if (group[i].type === \"exercise\") {\n                    key = this.getRenamedValue(opts, group[i], weekIndex, dayInWeekIndex);\n                    break;\n                  }\n                }\n                if (descriptionIndex == null) {\n                  descriptionIndex = 0;\n                }\n                if (finishedToAddDescription) {\n                  break;\n                }\n                if (key != null) {\n                  const exercise = this.getCurrentDescriptionExercise(key, weekIndex, dayInWeekIndex);\n                  const result = this.addExerciseDescriptions(\n                    exercise,\n                    weekIndex,\n                    dayInWeekIndex,\n                    addedCurrentDescription\n                  );\n                  if (result) {\n                    exerciseTextArr.push(...result.lines);\n                    addedCurrentDescription = result.addedCurrentDescription;\n                    finishedToAddDescription = true;\n                  } else {\n                    const currentIndex = this.getCurrentDescriptionIndex(key, weekIndex, dayInWeekIndex);\n                    if (currentIndex !== 0 && currentIndex === descriptionIndex && !addedCurrentDescription) {\n                      exerciseTextArr.push(line.value.replace(/^\\/\\/\\s*!?\\s*/, \"// ! \"));\n                      addedCurrentDescription = true;\n                    } else {\n                      exerciseTextArr.push(line.value.replace(/^(\\/\\/\\s*)!\\s*/, \"$1\"));\n                    }\n                  }\n                } else {\n                  exerciseTextArr.push(line.value.replace(/^(\\/\\/\\s*)!\\s*/, \"$1\"));\n                }\n                break;\n              }\n              case \"empty\": {\n                if (!finishedToAddDescription) {\n                  exerciseTextArr.push(\"\");\n                  if (descriptionIndex != null) {\n                    descriptionIndex += 1;\n                  }\n                }\n                break;\n              }\n              case \"exercise\": {\n                descriptionIndex = undefined;\n                const value = this.getRenamedValue(opts, line, weekIndex, dayInWeekIndex);\n                const evalExercise = Program_getProgramExercise(dayIndex + 1, this.program, value)!;\n\n                if (evalExercise == null) {\n                  continue groupLoop;\n                }\n\n                const key = evalExercise.key;\n\n                if (\n                  !finishedToAddDescription &&\n                  (evalExercise.descriptions.reuse || evalExercise.descriptions.values.length > 0) &&\n                  !this.isInheritedDescription(evalExercise, weekIndex, dayInWeekIndex)\n                ) {\n                  const result = this.addExerciseDescriptions(\n                    evalExercise,\n                    weekIndex,\n                    dayInWeekIndex,\n                    addedCurrentDescription\n                  );\n                  if (result) {\n                    exerciseTextArr.push(...result.lines);\n                  }\n                }\n\n                finishedToAddDescription = false;\n                addedCurrentDescription = false;\n\n                let plannerExercise = \"\";\n                plannerExercise += this.getExerciseName(evalExercise);\n                plannerExercise += \" / \";\n                if (evalExercise.notused) {\n                  plannerExercise += \"used: none / \";\n                }\n                const variations = evalExercise.evaluatedSetVariations;\n                const globals = this.getGlobals(evalExercise);\n\n                const shouldReuseSets = this.shouldReuseSets(evalExercise);\n                const dereuseDecisions = shouldReuseSets ? this.getDereuseDecisions(evalExercise) : [];\n                if (shouldReuseSets) {\n                  plannerExercise += this.reuseToStr(evalExercise);\n\n                  if (dereuseDecisions.includes(\"sets\")) {\n                    plannerExercise +=\n                      ` / ` +\n                      variations\n                        .map((v, i) => {\n                          return this.variationToString(v, globals, i, evalExercise);\n                        })\n                        .join(\" / \");\n                  }\n\n                  const overriddenGlobals: string[] = [];\n                  if (dereuseDecisions.includes(\"weight\") && globals.weight != null) {\n                    overriddenGlobals.push(`${this.weightExprToStr(globals.weight)}${globals.askWeight ? \"+\" : \"\"}`);\n                  } else if (dereuseDecisions.includes(\"weight\") && globals.askWeight) {\n                    overriddenGlobals.push(\"?+\");\n                  }\n                  if (dereuseDecisions.includes(\"rpe\") && globals.rpe != null) {\n                    overriddenGlobals.push(`@${n(globals.rpe)}${globals.logRpe ? \"+\" : \"\"}`);\n                  }\n                  if (\n                    globals.setTimer != null &&\n                    (dereuseDecisions.includes(\"setTimer\") ||\n                      dereuseDecisions.includes(\"timer\") ||\n                      dereuseDecisions.includes(\"sets\"))\n                  ) {\n                    // The rest timer is embedded in the setTimer|rest token, so any timer-ish change\n                    // (and materialized sets, which skip per-set timer tokens) restates the whole token.\n                    overriddenGlobals.push(this.setTimerGlobalToStr(globals));\n                  } else if (dereuseDecisions.includes(\"timer\") && globals.timer != null) {\n                    overriddenGlobals.push(`${n(globals.timer)}s`);\n                  }\n                  if (overriddenGlobals.length > 0) {\n                    plannerExercise += ` / ${overriddenGlobals.join(\" \")}`;\n                  }\n                } else {\n                  if (evalExercise.setVariations.length > 0) {\n                    plannerExercise += variations\n                      .map((v, i) => this.variationToString(v, globals, i, evalExercise))\n                      .join(\" / \");\n                  }\n\n                  const globalsStr: string[] = [];\n                  if (globals.weight != null) {\n                    globalsStr.push(`${this.weightExprToStr(globals.weight)}${globals.askWeight ? \"+\" : \"\"}`);\n                  } else if (globals.askWeight) {\n                    globalsStr.push(\"?+\");\n                  }\n                  if (globals.rpe != null) {\n                    globalsStr.push(`@${globals.rpe}${globals.logRpe ? \"+\" : \"\"}`);\n                  }\n                  if (globals.setTimer != null) {\n                    globalsStr.push(this.setTimerGlobalToStr(globals));\n                  } else if (globals.timer != null) {\n                    globalsStr.push(`${globals.timer}s`);\n                  }\n                  if (globalsStr.length > 0) {\n                    plannerExercise += ` / ${globalsStr.join(\" \")}`;\n                  }\n                }\n\n                const warmupSource =\n                  !addedWarmupsMap[key] && evalExercise?.warmupSets\n                    ? this.getPropertySource(propertyTargets, \"warmup\", key, weekIndex, dayInWeekIndex, evalExercise)\n                    : undefined;\n                if (warmupSource != null) {\n                  const warmupSets = this.getWarmupSets(warmupSource);\n                  if (warmupSets != null) {\n                    plannerExercise += ` / warmup: ${warmupSets}`;\n                    addedWarmupsMap[key] = true;\n                  }\n                }\n\n                // Printed at the instance the author wrote it on, like the other shared properties.\n                // Every instance of a key carries identical tags (PlannerEvaluator_fillInMetadata\n                // rejects anything else), so which one prints them doesn't change the value - but\n                // printing them on the first instance put them on a line compaction may delete.\n                const idSource =\n                  !addedIdMap[key] && (evalExercise.tags || []).length > 0\n                    ? this.getPropertySource(propertyTargets, \"id\", key, weekIndex, dayInWeekIndex, evalExercise)\n                    : undefined;\n                if (idSource != null) {\n                  plannerExercise += ` / ${this.idToStr(idSource)}`;\n                  addedIdMap[key] = true;\n                }\n\n                const superset = evalExercise.superset?.name;\n                if (superset) {\n                  plannerExercise += ` / superset: ${superset}`;\n                }\n\n                const update = evalExercise.update;\n                if (!addedUpdateMap[key] && update && (update.reuse || update.script)) {\n                  if (!evalExercise.reuse || dereuseDecisions.includes(\"update\")) {\n                    const source = this.getPropertySource(\n                      propertyTargets,\n                      \"update\",\n                      key,\n                      weekIndex,\n                      dayInWeekIndex,\n                      evalExercise\n                    );\n                    if (source != null) {\n                      const updateStr = ProgramToPlanner.getUpdate(source, this.settings);\n                      if (updateStr) {\n                        plannerExercise += ` / ${updateStr}`;\n                      }\n                      addedUpdateMap[key] = true;\n                    }\n                  } else if (update.reuse?.fullName === evalExercise.reuse.fullName) {\n                    addedUpdateMap[key] = true;\n                  }\n                }\n\n                const progress = evalExercise.progress;\n                if (progress && progress.type === \"none\") {\n                  plannerExercise += ` / progress: none`;\n                } else if (!addedProgressMap[key] && progress && (progress.reuse || progress.script)) {\n                  if (!evalExercise.reuse || dereuseDecisions.includes(\"progress\")) {\n                    const source = this.getPropertySource(\n                      propertyTargets,\n                      \"progress\",\n                      key,\n                      weekIndex,\n                      dayInWeekIndex,\n                      evalExercise\n                    );\n                    if (source != null) {\n                      const progressStr = ProgramToPlanner.getProgress(source, this.settings, false);\n                      if (progressStr) {\n                        plannerExercise += ` / ${progressStr}`;\n                      }\n                      addedProgressMap[key] = true;\n                    }\n                  } else if (progress.reuse?.fullName === evalExercise.reuse.fullName) {\n                    addedProgressMap[key] = true;\n                  }\n                }\n                exerciseTextArr.push(plannerExercise);\n                break;\n              }\n            }\n          }\n          if (exerciseTextArr.length > 0) {\n            groupTextArr = groupTextArr.concat(exerciseTextArr);\n          }\n        }\n        plannerDay.exerciseText = groupTextArr.join(\"\\n\");\n        plannerDay.description = programDay.description;\n        plannerWeek.days.push(plannerDay);\n        dayIndex += 1;\n      }\n      plannerWeeks.push(plannerWeek);\n    }\n    const result: IPlannerProgram = { vtype: \"planner\", name: this.program.name, weeks: plannerWeeks };\n    const repeatingExercises = new Set<string>();\n    PP_iterate2(this.program.weeks, (exercise) => {\n      if (exercise.repeat != null && exercise.repeat.length > 0) {\n        const key = PlannerKey_fromPlannerExercise(exercise, this.settings);\n        repeatingExercises.add(key);\n      }\n    });\n    const newPlanner = PlannerProgram_compact(\n      this.program.planner,\n      result,\n      this.settings,\n      repeatingExercises,\n      opts.renameMapping\n    );\n    // console.log(PlannerProgram.generateFullText(newPlanner.weeks));\n    return newPlanner;\n  }\n\n  // The exercise as the evaluator sees it, printed back as Liftoscript: every `...reuse`\n  // resolved into the values it stands for, and every property that governs the exercise on the\n  // line even when it's declared on another week. Read-only — it is what the sheet shows when\n  // asked what a line means, never what gets saved, which is why it can ignore both the reuse\n  // the author wrote and the once-per-exercise placement rules convertToPlanner keeps to.\n  public materializeExercise(exercise: IPlannerProgramExercise): string {\n    const parts: string[] = [this.getExerciseName(exercise)];\n    if (exercise.notused) {\n      parts.push(\"used: none\");\n    }\n    // From evaluatedSetVariations rather than setVariations: an exercise that only reuses sets\n    // has none of its own, and those resolved sets are the whole point of the view.\n    //\n    // An empty variation is skipped rather than printed: a template that carries only properties\n    // (`tmpl / used: none / progress: ...`) has one, and the set printer's empty-list fallback\n    // would invent a `0x1 0lb` for it.\n    const variations = exercise.evaluatedSetVariations;\n    const globals = this.getGlobals(exercise);\n    for (let i = 0; i < variations.length; i += 1) {\n      if (variations[i].sets.length > 0) {\n        parts.push(this.variationToString(variations[i], globals, i, exercise));\n      }\n    }\n    const globalsStr: string[] = [];\n    if (globals.weight != null) {\n      globalsStr.push(`${this.weightExprToStr(globals.weight)}${globals.askWeight ? \"+\" : \"\"}`);\n    } else if (globals.askWeight) {\n      globalsStr.push(\"?+\");\n    }\n    if (globals.rpe != null) {\n      globalsStr.push(`@${n(globals.rpe)}${globals.logRpe ? \"+\" : \"\"}`);\n    }\n    if (globals.setTimer != null) {\n      globalsStr.push(this.setTimerGlobalToStr(globals));\n    } else if (globals.timer != null) {\n      globalsStr.push(`${n(globals.timer)}s`);\n    }\n    if (globalsStr.length > 0) {\n      parts.push(globalsStr.join(\" \"));\n    }\n    const warmupSets = this.warmupSetsToStr(PlannerProgramExercise_warmups(exercise));\n    if (warmupSets != null) {\n      parts.push(`warmup: ${warmupSets}`);\n    }\n    if ((exercise.tags || []).length > 0) {\n      parts.push(this.idToStr(exercise));\n    }\n    if (exercise.superset?.name) {\n      parts.push(`superset: ${exercise.superset.name}`);\n    }\n    const update = ProgramToPlanner.getUpdate(exercise, this.settings, false, true);\n    if (update) {\n      parts.push(update);\n    }\n    const progress = ProgramToPlanner.getProgress(exercise, this.settings, false, true);\n    if (progress) {\n      parts.push(progress);\n    }\n    return parts.join(\" / \");\n  }\n\n  private getExerciseName(programExercise: IPlannerProgramExercise): string {\n    const variations = programExercise.exerciseVariations;\n    if (variations != null && variations.length > 1) {\n      const currentIndex = variations.findIndex((v) => v.isCurrent);\n      const activeIndex = currentIndex === -1 ? 0 : currentIndex;\n      const parts = variations.map((variation, i) => {\n        const label = i === 0 ? programExercise.label : undefined;\n        const segment = variation.exerciseType\n          ? Exercise_fullName(Exercise_get(variation.exerciseType, this.settings.exercises), this.settings, label)\n          : Exercise_buildName(variation.name, this.settings, label);\n        return `${i === activeIndex && i > 0 ? \"! \" : \"\"}${segment}`;\n      });\n      let name = parts.join(\" | \");\n      if (programExercise.order > 0) {\n        name = `${name}[${programExercise.order}]`;\n      }\n      return name;\n    } else if (programExercise.exerciseType) {\n      const exercise = Exercise_get(programExercise.exerciseType, this.settings.exercises);\n      let name = Exercise_fullName(exercise, this.settings, programExercise.label);\n      if (programExercise.order > 0) {\n        name = `${name}[${programExercise.order}]`;\n      }\n      return name;\n    } else {\n      return programExercise.fullName;\n    }\n  }\n\n  private reuseToStr(programExercise: IPlannerProgramExercise): string {\n    const reuseExercise = programExercise.reuse?.exercise;\n    if (!reuseExercise) {\n      throw new Error(\"reuse.exercise is required\");\n    }\n    const reuse = programExercise.reuse;\n    if (!reuse) {\n      throw new Error(\"reuse is required\");\n    }\n    let str = \"...\";\n    if (reuseExercise.exerciseType) {\n      const exercise = Exercise_get(reuseExercise.exerciseType, this.settings.exercises);\n      const reuseStr = Exercise_fullName(exercise, this.settings, reuseExercise.label);\n      str += reuseStr;\n    } else {\n      str += reuseExercise.fullName;\n    }\n    if (reuse.week || reuse.day) {\n      const weekAndDay = CollectionUtils_compact([reuse.week, reuse.day]).join(\":\");\n      str += `[${weekAndDay}]`;\n    }\n    return str;\n  }\n\n  public static getUpdate(\n    programExercise: IPlannerProgramExercise,\n    settings: ISettings,\n    hideScript?: boolean,\n    resolveReuse?: boolean\n  ): string {\n    const update = programExercise.update ?? (resolveReuse ? programExercise.reuse?.exercise?.update : undefined);\n    if (!update) {\n      return \"\";\n    }\n    // Only as far as the app itself resolves: past a couple of hops the runtime can't find the\n    // script either (progress.ts's update runner reads the same getter and does nothing without\n    // one), so printing the chain out here would promise behaviour that never runs. Falls through\n    // to naming the reuse instead — which is what the exercise really has.\n    if (resolveReuse) {\n      const script = PlannerProgramExercise_getUpdateScript(programExercise);\n      if (script != null) {\n        return `update: custom() ${hideScript ? \"{~ ... ~}\" : script}`;\n      }\n    }\n    if (update.reuse) {\n      if (update.reuse.exercise?.exerciseType) {\n        const exercise = Exercise_get(update.reuse.exercise.exerciseType, settings.exercises);\n        const fullName = Exercise_fullName(exercise, settings, update.reuse.exercise.label);\n        return `update: custom() { ...${fullName} }`;\n      } else {\n        return `update: custom() { ...${update.reuse.exercise?.fullName || update.reuse.fullName} }`;\n      }\n    } else {\n      return `update: custom() ${hideScript ? \"{~ ... ~}\" : update.script}`;\n    }\n  }\n\n  private idToStr(programExercise: IPlannerProgramExercise): string {\n    return `id: tags(${(programExercise.tags || []).join(\", \")})`;\n  }\n\n  public static getProgress(\n    programExercise: IPlannerProgramExercise,\n    settings: ISettings,\n    hideScript?: boolean,\n    resolveReuse?: boolean\n  ): string {\n    const progress = programExercise.progress ?? (resolveReuse ? programExercise.reuse?.exercise?.progress : undefined);\n    if (!progress) {\n      return \"\";\n    }\n    let progressStr = `progress: ${progress.type}`;\n    const state = PlannerProgramExercise_getState(programExercise);\n    const stateMetadata = PlannerProgramExercise_getStateMetadata(programExercise);\n    if (progress.type === \"custom\") {\n      // Resolved, every variable is spelled out: the ones inherited from the reuse target are\n      // exactly the ones the reader can't see from here.\n      // Only a `{ ...Name }` script merges the target's state back in at evaluation. An own script\n      // on a reuse line evaluates with its own state alone, so it has to declare all of it.\n      const argsState =\n        resolveReuse || progress.reuse == null ? state : PlannerProgramExercise_getOnlyChangedState(programExercise);\n      progressStr += `(${ObjectUtils_entries(argsState)\n        .map(([k, v]) => {\n          return `${k}${stateMetadata[k]?.userPrompted ? \"+\" : \"\"}: ${Weight_print(v)}`;\n        })\n        .join(\", \")})`;\n    } else if (progress.type === \"lp\") {\n      const increment = state.increment as IWeight | IPercentage;\n      const successes = state.successes as number;\n      const successCounter = state.successCounter as number;\n      const decrement = state.decrement as IWeight | IPercentage;\n      const failures = state.failures as number;\n      const failureCounter = state.failureCounter as number;\n      const args: string[] = [];\n      args.push(Weight_print(increment));\n      if (successes > 1 || decrement.value > 0) {\n        args.push(`${successes}`);\n      }\n      if (successes > 1 || decrement.value > 0) {\n        args.push(`${successCounter}`);\n      }\n      if (decrement.value > 0) {\n        args.push(Weight_print(decrement));\n      }\n      if (failures > 1) {\n        args.push(`${failures}`);\n      }\n      if (failures > 1) {\n        args.push(`${failureCounter}`);\n      }\n      progressStr += `(${args.join(\", \")})`;\n    } else if (progress.type === \"dp\") {\n      const increment = state.increment as IWeight | IPercentage;\n      const minReps = state.minReps as number;\n      const maxReps = state.maxReps as number;\n      const args = [Weight_print(increment), `${minReps}`, `${maxReps}`];\n      progressStr += `(${args.join(\", \")})`;\n    } else if (progress.type === \"sum\") {\n      const reps = state.reps as number;\n      const increment = state.increment as IWeight | IPercentage;\n      const args = [`${reps}`, Weight_print(increment)];\n      progressStr += `(${args.join(\", \")})`;\n    }\n    if (progress.type === \"custom\") {\n      const resolvedScript = resolveReuse ? PlannerProgramExercise_getProgressScript(programExercise) : undefined;\n      if (resolvedScript != null) {\n        progressStr += hideScript ? ` {~ ... ~}` : ` ${resolvedScript}`;\n      } else if (progress.reuse) {\n        if (progress.reuse.exercise?.exerciseType) {\n          const exercise = Exercise_get(progress.reuse.exercise.exerciseType, settings.exercises);\n          const fullName = Exercise_fullName(exercise, settings, progress.reuse.exercise.label);\n          progressStr += ` { ...${fullName} }`;\n        } else {\n          progressStr += ` { ...${progress.reuse.exercise?.fullName || progress.reuse.fullName} }`;\n        }\n      } else {\n        progressStr += hideScript ? ` {~ ... ~}` : ` ${progress.script}`;\n      }\n    }\n    return progressStr;\n  }\n\n  private getGlobals(exercise: IPlannerProgramExercise): IPlannerToProgram2Globals {\n    const variations = exercise.evaluatedSetVariations;\n    if (variations.length === 0 || variations[0].sets.length === 0) {\n      const globals = exercise.globals;\n      const reusedGlobals = exercise.reuse?.exercise?.globals || {};\n      return {\n        weight: globals?.weight ?? reusedGlobals.weight,\n        rpe: globals?.rpe ?? reusedGlobals.rpe,\n        timer: globals?.timer ?? reusedGlobals.timer,\n        setTimer: globals?.setTimer ?? reusedGlobals.setTimer,\n        isOverflowSetTimer: globals?.isOverflowSetTimer ?? reusedGlobals.isOverflowSetTimer,\n        logRpe: globals?.logRpe ?? reusedGlobals.logRpe,\n        askWeight: globals?.askWeight ?? reusedGlobals.askWeight,\n      };\n    }\n    const firstWeight = variations[0]?.sets[0]?.weight;\n    const firstRpe = variations[0]?.sets[0]?.rpe;\n    const firstLogRpe = !!variations[0]?.sets[0]?.logRpe;\n    const firstAskWeight = !!variations[0]?.sets[0]?.askWeight;\n    const firstTimer = variations[0]?.sets[0]?.timer;\n    // When any set carries a set timer, its rest is embedded in the setTimer|rest token, so the rest\n    // timer must not also be lifted to a global (a global would override the embedded rest on re-parse).\n    const hasAnySetTimer = variations.some((v) => v.sets.some((s) => s.setTimer != null));\n    const firstSetTimer = variations[0]?.sets[0]?.setTimer;\n    const firstIsOverflowSetTimer = !!variations[0]?.sets[0]?.isOverflowSetTimer;\n    // A set timer is only liftable to a global together with its embedded rest, so the whole\n    // setTimer/overflow/rest tuple must be uniform across every set. Even then, keep the source's\n    // style: lift only if it was written as a global, or the sets are reused (where a global\n    // override is the only way to express a timer change without materializing the set list).\n    const setTimerIsGlobal =\n      firstSetTimer != null &&\n      (exercise.globals.setTimer != null || exercise.reuse != null) &&\n      variations.every((v) =>\n        v.sets.every(\n          (s) =>\n            s.setTimer === firstSetTimer && !!s.isOverflowSetTimer === firstIsOverflowSetTimer && s.timer === firstTimer\n        )\n      );\n    return {\n      setTimer: setTimerIsGlobal ? firstSetTimer : undefined,\n      isOverflowSetTimer: setTimerIsGlobal ? firstIsOverflowSetTimer : undefined,\n      weight:\n        firstWeight != null &&\n        variations.every((v) =>\n          v.sets.every((s) => Weight_eqNull(s.weight, firstWeight) && !!s.askWeight === firstAskWeight)\n        )\n          ? firstWeight\n          : undefined,\n      askWeight: variations.every((v) => v.sets.every((s) => Weight_eqNull(s.weight, firstWeight) && !!s.askWeight)),\n      rpe:\n        firstRpe != null &&\n        variations.every((v) => v.sets.every((s) => s.rpe === firstRpe && !!s.logRpe === firstLogRpe))\n          ? firstRpe\n          : undefined,\n      logRpe: variations.every((v) => v.sets.every((s) => s.rpe === firstRpe && !!s.logRpe)),\n      timer:\n        (setTimerIsGlobal || !hasAnySetTimer) &&\n        firstTimer != null &&\n        variations.every((v) => v.sets.every((s) => s.timer === firstTimer))\n          ? firstTimer\n          : undefined,\n    };\n  }\n\n  private groupVariationSets(\n    sets: IPlannerProgramExerciseEvaluatedSet[],\n    exercise: IPlannerProgramExercise,\n    index: number\n  ): [IPlannerProgramExerciseEvaluatedSet, number][] {\n    if (sets.length === 0) {\n      const originalSets = PlannerProgramExercise_sets(exercise, index)[0];\n      return [\n        [\n          {\n            maxrep: originalSets?.repRange?.maxrep || 1,\n            minrep: originalSets?.repRange?.minrep,\n            weight: originalSets?.weight || Weight_zero,\n            logRpe: originalSets?.logRpe || false,\n            isAmrap: originalSets?.repRange?.isAmrap || false,\n            isQuickAddSet: originalSets?.repRange?.isQuickAddSet || false,\n            askWeight: originalSets?.askWeight || false,\n            rpe: originalSets?.rpe,\n            timer: originalSets?.timer,\n            label: originalSets?.label,\n          },\n          0,\n        ],\n      ];\n    }\n    let lastKey: string | undefined;\n    const groups: [IPlannerProgramExerciseEvaluatedSet, number][] = [];\n    for (const set of sets) {\n      const key = this.setToKey(set);\n      if (lastKey == null || lastKey !== key) {\n        groups.push([set, 0]);\n      }\n      groups[groups.length - 1][1] += 1;\n      lastKey = key;\n    }\n    return groups;\n  }\n\n  private groupWarmupsSets(sets: IPlannerProgramExerciseWarmupSet[]): [IPlannerProgramExerciseWarmupSet, number][] {\n    let lastKey: string | undefined;\n    const groups: [IPlannerProgramExerciseWarmupSet, number][] = [];\n    for (const set of sets) {\n      const key = this.warmupSetToKey(set);\n      if (lastKey == null || lastKey !== key) {\n        groups.push([set, 0]);\n      }\n      groups[groups.length - 1][1] += set.numberOfSets;\n      lastKey = key;\n    }\n    return groups;\n  }\n\n  private getWarmupSets(programExercise: IPlannerProgramExercise): string | undefined {\n    return this.warmupSetsToStr(programExercise.warmupSets);\n  }\n\n  private warmupSetsToStr(warmupSets: IPlannerProgramExerciseWarmupSet[] | undefined): string | undefined {\n    if (warmupSets) {\n      const groups = this.groupWarmupsSets(warmupSets);\n      const strs: string[] = [];\n      for (const group of groups) {\n        const first = group[0];\n        const length = group[1];\n        const weight =\n          first.weight ?? (first.percentage != null ? Weight_buildPct(first.percentage) : Weight_build(0, \"lb\"));\n        strs.push(`${length}x${first.reps} ${Weight_print(weight)}`);\n      }\n      return strs.length === 0 ? \"none\" : strs.join(\", \");\n    }\n    return undefined;\n  }\n\n  private weightExprToStr(weightExpr?: IWeight | IPercentage): string {\n    if (weightExpr != null) {\n      return Weight_print(weightExpr);\n    }\n    return \"\";\n  }\n\n  private setTimerGlobalToStr(globals: IPlannerToProgram2Globals): string {\n    const overflow = globals.isOverflowSetTimer ? \"+\" : \"\";\n    const restPart = globals.timer != null ? `${n(Math.max(0, globals.timer))}s` : \"?\";\n    return `${n(Math.max(0, globals.setTimer ?? 0))}s${overflow}|${restPart}`;\n  }\n\n  private variationToString(\n    variation: IPlannerProgramExerciseEvaluatedSetVariation,\n    globals: IPlannerToProgram2Globals,\n    index: number,\n    exercise: IPlannerProgramExercise\n  ): string {\n    const groupedVariationSets = this.groupVariationSets(variation.sets, exercise, index);\n    const result: string[] = [];\n    for (const group of groupedVariationSets) {\n      const set = group[0];\n      let setStr = \"\";\n      setStr += `${group[1]}${set.isQuickAddSet ? \"+\" : \"\"}x`;\n      setStr += set.minrep != null ? `${n(Math.max(0, set.minrep))}-` : \"\";\n      setStr += `${n(Math.max(0, set.maxrep ?? 0))}`;\n      setStr += set.isAmrap ? \"+\" : \"\";\n      if (globals.weight == null && !globals.askWeight) {\n        const weightValue = this.weightExprToStr(set.weight);\n        if (weightValue) {\n          setStr += ` ${weightValue}${set.askWeight ? \"+\" : \"\"}`;\n        } else if (set.askWeight) {\n          setStr += \" ?+\";\n        }\n      }\n      if (globals.rpe == null) {\n        setStr += set.rpe != null ? ` @${n(Math.max(0, set.rpe))}` : \"\";\n        setStr += set.rpe != null && set.logRpe ? \"+\" : \"\";\n      }\n      if (set.setTimer != null && globals.setTimer == null) {\n        const overflow = set.isOverflowSetTimer ? \"+\" : \"\";\n        const restPart = set.timer != null ? `${n(Math.max(0, set.timer))}s` : \"?\";\n        setStr += ` ${n(Math.max(0, set.setTimer))}s${overflow}|${restPart}`;\n      } else if (set.setTimer == null && globals.timer == null) {\n        setStr += set.timer ? ` ${n(Math.max(0, set.timer))}s` : \"\";\n      }\n      if (set.auto) {\n        setStr += \" auto\";\n      }\n      if (set.label) {\n        setStr += ` (${set.label})`;\n      }\n      result.push(setStr);\n    }\n    let resultStr = \"\";\n    if (index > 0 && variation.isCurrent) {\n      resultStr += \"! \";\n    }\n    return resultStr + result.map((r) => r.trim()).join(\", \");\n  }\n\n  private warmupSetToKey(set: IPlannerProgramExerciseWarmupSet): string {\n    return `${set.reps}-${Weight_print(set.weight || set.percentage || 0)}`;\n  }\n\n  private setToKey(set: IPlannerProgramExerciseEvaluatedSet): string {\n    return `${set.maxrep}-${set.minrep}-${Weight_printNull(set.weight)}-${set.isAmrap}-${set.rpe}-${set.logRpe}-${\n      set.timer\n    }-${set.label}-${set.askWeight}-${set.setTimer}-${set.isOverflowSetTimer}-${set.auto}`;\n  }\n}\n","import {\n  Exercise_onerm,\n  Exercise_get,\n  Exercise_getIsUnilateral,\n  Exercise_getWarmupSets,\n  Exercise_toKey,\n  Exercise_eq,\n} from \"./exercise\";\nimport { Reps_findNextEntryAndSet, Reps_isEmptyOrFinished, Reps_isCompleted, Reps_isEmpty } from \"./set\";\nimport {\n  Weight_build,\n  Weight_buildAny,\n  Weight_eq,\n  Weight_lt,\n  Weight_gt,\n  Weight_multiply,\n  Weight_increment,\n  Weight_isPct,\n  Weight_buildPct,\n  Weight_decrement,\n  Weight_is,\n  Weight_round,\n  Weight_roundConvertTo,\n  Weight_getTrainingMax,\n  Weight_getOneRepMax,\n  Weight_rpeMultiplier,\n  Weight_convertToWeight,\n  Weight_display,\n  Weight_calculatePlates,\n  Weight_formatOneSide,\n  Weight_rpePct,\n  Weight_evaluateWeight,\n  Weight_op,\n} from \"./weight\";\nimport { DateUtils_fromYYYYMMDD, DateUtils_fromYYYYMMDDStr } from \"../utils/date\";\nimport { lf, lb, LensBuilder } from \"lens-shmens\";\nimport { ObjectUtils_isEqual, ObjectUtils_entriesNonnull, ObjectUtils_keys, ObjectUtils_clone } from \"../utils/object\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ScriptRunner } from \"../parser\";\n\nimport {\n  emptyProgramId,\n  IEvaluatedProgram,\n  Program_getProgramDay,\n  Program_getProgramDayUsedExercises,\n  Program_getProgramExerciseForKeyAndDay,\n  Program_getAllProgramExercisesWithType,\n  Program_createEmptyProgram,\n  Program_evaluate,\n  Program_runAllFinishDayScripts,\n  Program_getDayExercisesInOrder,\n  Program_getDayData,\n  Program_nextHistoryEntry,\n} from \"./program\";\nimport { IState, updateProgress, updateState } from \"./state\";\nimport {\n  IWeight,\n  IHistoryEntry,\n  ISettings,\n  IHistoryRecord,\n  IProgressMode,\n  IExerciseType,\n  IProgramState,\n  IEquipment,\n  ISubscription,\n  ISet,\n  IDayData,\n  IExerciseDataValue,\n  IUnit,\n  IStats,\n  IProgram,\n  IStorage,\n  IProgramExerciseWarmupSet,\n} from \"../types\";\nimport { INativeEffect } from \"./nativeEffects\";\nimport { Subscriptions_hasSubscription } from \"../utils/subscriptions\";\nimport { IPercentage, IScriptErrorHandler, ITimedSetSide } from \"../types\";\nimport { TimedSet_open, TimedSet_recordedFor } from \"./timedSet\";\nimport {\n  History_workoutTime,\n  History_createCustomEntry,\n  History_resumeWorkout,\n  History_finishProgramDay,\n  History_findLastEntryForExerciseType,\n} from \"./history\";\nimport { WorkoutOutcome_add } from \"./workoutOutcome\";\nimport { CollectionUtils_compact, CollectionUtils_findIndexReverse } from \"../utils/collection\";\nimport { ILiftoscriptEvaluatorUpdate } from \"../liftoscriptEvaluator\";\nimport { Equipment_getUnitForExerciseType } from \"./equipment\";\nimport { IByTag, IByExercise } from \"../pages/planner/plannerEvaluator\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseWithType } from \"../pages/planner/models/types\";\nimport {\n  PlannerProgramExercise_getUpdateScript,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_currentEvaluatedSetVariationIndex,\n  PlannerProgramExercise_currentExerciseVariationIndex,\n  PlannerProgramExercise_currentDescriptionIndex,\n  PlannerProgramExercise_currentSetVariationIndex,\n  PlannerProgramExercise_programWarmups,\n} from \"../pages/planner/models/plannerProgramExercise\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { ProgramSet_getEvaluatedWeight } from \"./programSet\";\nimport { Stats_getCurrentMovingAverageBodyweight, Stats_getEmpty } from \"./stats\";\nimport { IChangeAMRAPAction, ICompleteSetAction } from \"../ducks/reducer\";\nimport {\n  LiveActivityManager_updateProgressLiveActivity,\n  LiveActivityManager_updateLiveActivityForNextEntry,\n} from \"../utils/liveActivityManager\";\nimport { ProgramExercise_hasUserPromptedVars } from \"./programExercise\";\nimport type { IScriptFunctions, IScriptBindings } from \"../liftoscriptFns\";\nimport deepmerge from \"deepmerge\";\nimport { Dialog_alert } from \"../utils/dialog\";\n\nexport type { IScriptBindings } from \"../liftoscriptFns\";\n\nexport interface IScriptFnContext {\n  prints: (number | IWeight | IPercentage)[][];\n  unit: IUnit;\n  exerciseType?: IExerciseType;\n}\n\nexport interface IScriptFinishContext {\n  type: \"finish\";\n  updates: ILiftoscriptEvaluatorUpdate[];\n  exerciseData: IExerciseDataValue;\n  setVariationIndex: number;\n  descriptionIndex: number;\n}\n\nexport interface IScriptUpdateContext {\n  equipment?: IEquipment;\n}\n\ntype IScriptArg = number | IWeight | IPercentage;\n\nfunction applyRounding(num: IScriptArg | undefined, rounder: (n: number) => number): IScriptArg {\n  if (num == null) {\n    return 0;\n  }\n  return typeof num === \"number\" ? rounder(num) : Weight_buildAny(rounder(num.value), num.unit);\n}\n\nfunction isScriptValue(v: unknown): v is IScriptArg {\n  return typeof v === \"number\" || Weight_is(v) || Weight_isPct(v);\n}\n\nfunction flattenScriptArgs(args: unknown[]): IScriptArg[] {\n  const result: IScriptArg[] = [];\n  for (const arg of args) {\n    if (Array.isArray(arg)) {\n      for (const item of arg) {\n        if (isScriptValue(item)) {\n          result.push(item);\n        }\n      }\n    } else if (isScriptValue(arg)) {\n      result.push(arg);\n    }\n  }\n  return result;\n}\n\nfunction sum(args: unknown[]): IWeight | IPercentage | number {\n  const flat = flattenScriptArgs(args);\n  if (flat.length === 0) {\n    return 0;\n  }\n  return flat.reduce<IScriptArg>((acc, a) => Weight_op(undefined, acc, a, (x, y) => x + y), 0);\n}\n\nfunction min(args: unknown[]): IWeight | IPercentage | number {\n  const flat = flattenScriptArgs(args);\n  if (flat.length === 0) {\n    return 0;\n  }\n  return flat.reduce<IScriptArg>((acc, a) => (Weight_lt(a, acc) ? a : acc), flat[0]);\n}\n\nfunction max(args: unknown[]): IWeight | IPercentage | number {\n  const flat = flattenScriptArgs(args);\n  if (flat.length === 0) {\n    return 0;\n  }\n  return flat.reduce<IScriptArg>((acc, a) => (Weight_lt(acc, a) ? a : acc), flat[0]);\n}\n\nfunction zeroOrGte(a: (IWeight | number | undefined | null)[], b: (IWeight | number | undefined | null)[]): boolean {\n  for (let i = 0; i < Math.max(a.length, b.length); i++) {\n    const aVal = a[i];\n    const bVal = b[i];\n    if (aVal != null && bVal != null && !Weight_eq(aVal, 0) && Weight_lt(aVal, bVal)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function Progress_createEmptyScriptBindings(\n  dayData: IDayData,\n  settings: ISettings,\n  exercise?: IExerciseType\n): IScriptBindings {\n  const rm1 = exercise ? Exercise_onerm(exercise, settings) : Weight_build(0, \"lb\");\n  return {\n    day: dayData.day,\n    week: dayData.week ?? 1,\n    dayInWeek: dayData.dayInWeek ?? dayData.day,\n    completedWeights: [],\n    originalWeights: [],\n    weights: [],\n    reps: [],\n    minReps: [],\n    RPE: [],\n    amraps: [],\n    logrpes: [],\n    askweights: [],\n    completedReps: [],\n    completedRepsLeft: [],\n    completedRPE: [],\n    isCompleted: [],\n    timers: [],\n    setTime: [],\n    completedSetTime: [],\n    completedSetTimeLeft: [],\n    w: [],\n    r: [],\n    cr: [],\n    cw: [],\n    mr: [],\n    programNumberOfSets: 0,\n    numberOfSets: 0,\n    completedNumberOfSets: 0,\n    ns: 0,\n    setVariationIndex: 1,\n    exerciseVariationIndex: 1,\n    descriptionIndex: 1,\n    bodyweight: Weight_build(0, settings.units),\n    setIndex: 1,\n    rm1,\n  };\n}\n\nexport function Progress_createScriptBindings(\n  dayData: IDayData,\n  entry: IHistoryEntry,\n  settings: ISettings,\n  programNumberOfSets: number,\n  bodyweight: IWeight | undefined,\n  setIndex?: number,\n  setVariationIndex?: number,\n  descriptionIndex?: number,\n  exerciseVariationIndex?: number\n): IScriptBindings {\n  const bindings = Progress_createEmptyScriptBindings(dayData, settings, entry.exercise);\n  for (const set of entry.sets) {\n    bindings.weights.push(set.weight);\n    bindings.originalWeights.push(set.originalWeight ?? Weight_build(0, settings.units));\n    bindings.reps.push(set.reps);\n    bindings.minReps.push(set.minReps);\n    bindings.completedReps.push(set.completedReps);\n    bindings.completedRepsLeft.push(set.completedRepsLeft);\n    bindings.completedRPE.push(set.completedRpe);\n    bindings.completedWeights.push(set.completedWeight);\n    bindings.RPE.push(set.rpe);\n    bindings.amraps.push(set.isAmrap ? 1 : undefined);\n    bindings.logrpes.push(set.logRpe ? 1 : undefined);\n    bindings.askweights.push(set.askWeight ? 1 : undefined);\n    bindings.timers.push(set.timer);\n    bindings.setTime.push(set.setTimer);\n    bindings.completedSetTime.push(set.completedSetTimer);\n    bindings.completedSetTimeLeft.push(set.completedSetTimerLeft);\n    bindings.isCompleted.push(set.isCompleted ? 1 : 0);\n  }\n  bindings.w = bindings.weights;\n  bindings.r = bindings.reps;\n  bindings.cr = bindings.completedReps;\n  bindings.cw = bindings.completedWeights;\n  bindings.mr = bindings.minReps;\n  bindings.ns = entry.sets.length;\n  bindings.programNumberOfSets = programNumberOfSets;\n  bindings.numberOfSets = entry.sets.length;\n  bindings.completedNumberOfSets = entry.sets.filter((s) => s.isCompleted).length;\n  bindings.setIndex = setIndex ?? 1;\n  bindings.setVariationIndex = setVariationIndex ?? 1;\n  bindings.exerciseVariationIndex = exerciseVariationIndex ?? 1;\n  bindings.descriptionIndex = descriptionIndex ?? 1;\n  bindings.bodyweight = bodyweight ?? Weight_build(0, settings.units);\n  return bindings;\n}\n\nexport function Progress_createScriptFunctions(settings: ISettings): IScriptFunctions {\n  function toWeight(value: IWeight | number): IWeight {\n    return Weight_is(value) ? value : Weight_build(value, settings.units);\n  }\n\n  function increment(vals: IWeight | IPercentage | number, context: IScriptFnContext): IWeight | IPercentage | number {\n    if (typeof vals === \"number\") {\n      const weight = Weight_build(vals, context.unit);\n      return Weight_increment(weight, settings, context.exerciseType);\n    } else if (Weight_isPct(vals)) {\n      return Weight_buildPct(vals.value + 1);\n    } else {\n      return Weight_increment(vals, settings, context.exerciseType);\n    }\n  }\n\n  function decrement(vals: IWeight | IPercentage | number, context: IScriptFnContext): IWeight | IPercentage | number {\n    if (typeof vals === \"number\") {\n      const weight = Weight_build(vals, context.unit);\n      return Weight_decrement(weight, settings, context.exerciseType);\n    } else if (Weight_isPct(vals)) {\n      return Weight_buildPct(vals.value - 1);\n    } else {\n      return Weight_decrement(vals, settings, context.exerciseType);\n    }\n  }\n\n  const fns: IScriptFunctions = {\n    roundWeight: ([num], context) => {\n      const unit = Equipment_getUnitForExerciseType(settings, context?.exerciseType);\n      return Weight_round(toWeight(num), settings, unit ?? settings.units, context?.exerciseType);\n    },\n    roundConvertWeight: ([num], context) => {\n      const unit = Equipment_getUnitForExerciseType(settings, context?.exerciseType);\n      return Weight_roundConvertTo(toWeight(num), settings, unit ?? settings.units, context?.exerciseType);\n    },\n    calculateTrainingMax: ([weight, reps]) => {\n      return Weight_getTrainingMax(toWeight(weight), reps || 0, settings);\n    },\n    calculate1RM: ([weight, reps]) => {\n      return Weight_getOneRepMax(toWeight(weight), reps);\n    },\n    rpeMultiplier: ([repsRaw, rpeRaw]) => {\n      const reps = Weight_is(repsRaw) ? repsRaw.value : repsRaw;\n      const rpe = rpeRaw == null ? 10 : Weight_is(rpeRaw) ? rpeRaw.value : rpeRaw;\n      return Weight_rpeMultiplier(reps, rpe);\n    },\n    floor: ([num]) => applyRounding(num, Math.floor),\n    ceil: ([num]) => applyRounding(num, Math.ceil),\n    round: ([num]) => applyRounding(num, Math.round),\n    sum: (args) => sum(args),\n    min: (args) => min(args),\n    max: (args) => max(args),\n    increment: ([vals], context) => increment(vals, context),\n    decrement: ([vals], context) => decrement(vals, context),\n    zeroOrGte: ([a, b]) => zeroOrGte(a, b),\n    print: (args, context) => {\n      // flat() without filtering: booleans must survive so `if (print(cond))` keeps working.\n      // Liftoscript has no null — undefined values (e.g. completedReps of skipped sets) become 0,\n      // otherwise they'd serialize to null and fail storage validation.\n      const flatArgs = [...args.flat()].map((arg) => arg ?? 0) as (number | IWeight | IPercentage)[];\n      context.prints = context.prints || [];\n      context.prints.push(flatArgs);\n      return flatArgs[0];\n    },\n    sets: ([from, to, minReps, reps, isAmrap, weight, timer, rpe, logRpe], context, bindings) => {\n      for (let i = 0; i < bindings.numberOfSets; i++) {\n        if (i >= from - 1 && i < to) {\n          const weightValue = Weight_convertToWeight(bindings.rm1, weight, context.unit);\n          bindings.minReps[i] = reps !== minReps ? minReps : undefined;\n          bindings.reps[i] = reps;\n          bindings.originalWeights[i] = weightValue;\n          bindings.weights[i] = Weight_round(weightValue, settings, context.unit, context.exerciseType);\n          bindings.RPE[i] = rpe !== 0 ? rpe : undefined;\n          bindings.amraps[i] = isAmrap !== 0 ? 1 : 0;\n          bindings.logrpes[i] = logRpe !== 0 ? 1 : 0;\n          bindings.timers[i] = timer !== 0 ? timer : undefined;\n        }\n      }\n      return to - from;\n    },\n  };\n  return fns;\n}\n\nexport function Progress_isCurrent(progress: Pick<IHistoryRecord, \"id\"> | undefined): boolean {\n  return progress?.id === 0;\n}\n\nexport function Progress_scheduleTimerNotification(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  entryIndex: number,\n  mode: IProgressMode,\n  settings: ISettings,\n  duration: number,\n  timerSinceMs: number,\n  timerSeconds: number\n): void {\n  const title = \"It's time for the next set!\";\n  let subtitle = \"\";\n  let body = \"Time to lift!\";\n  let subtitleHeader = \"\";\n  let bodyHeader = \"The rest is over\";\n  const nextEntryAndSet = Reps_findNextEntryAndSet(progress, entryIndex, mode);\n  if (nextEntryAndSet != null) {\n    const { entry: nextEntry, set: aSet } = nextEntryAndSet;\n    const exercise = Exercise_get(nextEntry.exercise, settings.exercises);\n    if (exercise) {\n      subtitleHeader = \"Next Set\";\n      subtitle = CollectionUtils_compact([\n        exercise.name,\n        aSet.reps != null ? `${aSet.reps}${aSet.isAmrap ? \"+\" : \"\"} reps` : undefined,\n        aSet.weight != null ? Weight_display(aSet.weight) : undefined,\n      ]).join(\", \");\n      if (aSet.weight != null) {\n        const { plates } = Weight_calculatePlates(aSet.weight, settings, aSet.weight.unit, nextEntry.exercise);\n        const formattedPlates = plates.length > 0 ? Weight_formatOneSide(settings, plates, exercise) : \"None\";\n        bodyHeader = \"Plates per side\";\n        body = formattedPlates;\n      }\n    }\n  }\n  effects.push({\n    type: \"startTimer\",\n    params: {\n      duration,\n      title,\n      subtitleHeader,\n      subtitle,\n      bodyHeader,\n      body,\n      ignoreDoNotDisturb: !!settings.ignoreDoNotDisturb,\n      vibration: !!settings.vibration,\n      volume: settings.volume,\n      timerSinceMs,\n      timerSeconds,\n    },\n  });\n}\n\nexport function Progress_startTimer(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  timestamp: number,\n  mode: IProgressMode,\n  entryIndex: number,\n  setIndex: number,\n  settings: ISettings,\n  subscription?: ISubscription,\n  timer?: number,\n  isAdjusting?: boolean\n): IHistoryRecord {\n  const entry = progress.entries[entryIndex];\n  const set = mode === \"warmup\" ? entry?.warmupSets[setIndex] : entry?.sets[setIndex];\n  if (!isAdjusting && (!set || !set.isCompleted)) {\n    return progress;\n  }\n  if (timer == null && Progress_isCurrent(progress) && mode === \"workout\") {\n    timer = entry?.sets[setIndex]?.timer;\n  }\n  if (timer == null) {\n    timer =\n      mode === \"workout\" && entry.superset != null && settings.timers.superset != null\n        ? settings.timers.superset\n        : settings.timers[mode] || undefined;\n  }\n  if (!timer) {\n    if (progress.timerSince != null) {\n      effects.push({ type: \"stopTimer\" });\n    }\n    return {\n      ...progress,\n      timerSince: undefined,\n      timer: undefined,\n      timerMode: undefined,\n      timerEntryIndex: undefined,\n      timerSetIndex: undefined,\n    };\n  }\n  if (subscription && Subscriptions_hasSubscription(subscription)) {\n    // A backdated start (rest resumed after the screen was locked past the target) can already be overrun,\n    // so only schedule the \"rest is over\" notification when there's still time left — UNTimeIntervalNotificationTrigger\n    // aborts on a non-positive interval.\n    const timerForPush = timer - Math.round((Date.now() - timestamp) / 1000);\n    if (timerForPush > 0) {\n      Progress_scheduleTimerNotification(effects, progress, entryIndex, mode, settings, timerForPush, timestamp, timer);\n    } else {\n      // Backdated start that's already overrun: schedule nothing, but clear any earlier pending\n      // notification so a stale one doesn't fire.\n      effects.push({ type: \"stopTimer\" });\n    }\n  }\n  const newProgress: IHistoryRecord = {\n    ...progress,\n    timerSince: timestamp,\n    timer,\n    timerMode: mode,\n    timerEntryIndex: entryIndex,\n    timerSetIndex: setIndex,\n    ui: { ...progress.ui, nativeNotificationScheduled: undefined },\n  };\n  return newProgress;\n}\n\nexport function Progress_getNextSupersetEntry(\n  entries: IHistoryEntry[],\n  entry: IHistoryEntry\n): IHistoryEntry | undefined {\n  const superset: string | undefined = entry.superset;\n  if (superset == null) {\n    return undefined;\n  }\n  const supersetGroups = Progress_getSupersetGroups(entries);\n  const supersetGroup: IHistoryEntry[] = supersetGroups?.[superset] ?? [];\n  if (supersetGroup.length <= 1) {\n    return undefined;\n  }\n  const supersetIndex = supersetGroup?.findIndex((e) => e.id === entry!.id);\n  if (supersetIndex == null || supersetIndex < 0) {\n    return undefined;\n  }\n  return supersetGroup[(supersetIndex + 1) % supersetGroup.length];\n}\n\nexport function Progress_getNextEntry(\n  progress: IHistoryRecord,\n  entry: IHistoryEntry,\n  mode: \"workout\" | \"warmup\",\n  shouldGoToNextEntry: boolean\n): IHistoryEntry | undefined {\n  if (Progress_isFullyEmptyOrFinishedSet(progress)) {\n    return undefined;\n  }\n  const visitedAndFinished = new Set<IHistoryEntry>();\n  let currentEntry: IHistoryEntry | undefined = entry;\n  let isInitial = true;\n  const supersetGroups = Progress_getSupersetGroups(progress.entries);\n  while (currentEntry != null) {\n    let index = progress.entries.findIndex((e) => e.id != null && e.id === currentEntry?.id);\n    if (index === -1) {\n      index = progress.entries.findIndex((e) => e === currentEntry);\n    }\n    const superset: string | undefined = currentEntry.superset;\n    if (mode === \"workout\" && superset != null && !visitedAndFinished.has(currentEntry)) {\n      const supersetGroup: IHistoryEntry[] = supersetGroups?.[superset] ?? [];\n      if (supersetGroup.length > 1) {\n        const supersetIndex = supersetGroup?.findIndex((e) => e.id === currentEntry?.id);\n        currentEntry = supersetGroup[(supersetIndex + 1) % supersetGroup.length];\n      } else {\n        if (shouldGoToNextEntry) {\n          currentEntry = progress.entries[(index + 1) % progress.entries.length];\n        } else {\n          return currentEntry;\n        }\n      }\n    } else if (Reps_isEmptyOrFinished(currentEntry.sets)) {\n      if (shouldGoToNextEntry) {\n        const prevEntry: IHistoryEntry = currentEntry;\n        currentEntry = progress.entries[(index + 1) % progress.entries.length];\n        if (currentEntry === prevEntry) {\n          return undefined;\n        }\n      } else {\n        return undefined;\n      }\n    }\n    if (currentEntry == null) {\n      return undefined;\n    }\n    if (!Reps_isEmptyOrFinished(currentEntry.sets)) {\n      return currentEntry;\n    } else if (!isInitial) {\n      visitedAndFinished.add(currentEntry);\n    }\n    isInitial = false;\n  }\n  return undefined;\n}\n\nexport function Progress_getNextEntryIndex(\n  progress: IHistoryRecord,\n  entry: IHistoryEntry,\n  mode: \"workout\" | \"warmup\"\n): number | undefined {\n  const nextEntry = Progress_getNextEntry(progress, entry, mode, false);\n  if (nextEntry != null) {\n    let index = progress.entries.findIndex((e) => e.id != null && e.id === nextEntry.id);\n    if (index === -1) {\n      index = progress.entries.findIndex((e) => e === nextEntry);\n    }\n    return index === -1 ? undefined : index;\n  }\n  return undefined;\n}\n\nexport function Progress_updateTimer(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  program: IProgram | undefined,\n  newTimer: number,\n  timerSince: number,\n  liveActivityEntryIndex: number | undefined,\n  liveActivitySetIndex: number | undefined,\n  skipLiveActivityUpdate: boolean,\n  settings: ISettings,\n  subscription: ISubscription | undefined\n): IHistoryRecord {\n  const timerForPush = newTimer - Math.round((Date.now() - timerSince) / 1000);\n  if (timerForPush > 0) {\n    const newProgress = Progress_startTimer(\n      effects,\n      progress,\n      progress.timerSince || Date.now(),\n      progress.timerMode || \"workout\",\n      progress.timerEntryIndex || 0,\n      progress.timerSetIndex || 0,\n      settings,\n      subscription,\n      newTimer,\n      true\n    );\n    if (!skipLiveActivityUpdate) {\n      LiveActivityManager_updateProgressLiveActivity(\n        effects,\n        program,\n        progress,\n        settings,\n        subscription,\n        liveActivityEntryIndex,\n        liveActivitySetIndex,\n        newTimer,\n        progress.timerSince || Date.now()\n      );\n    }\n    return newProgress;\n  } else {\n    effects.push({ type: \"stopTimer\" });\n    const newProgress = {\n      ...progress,\n      timer: Math.max(0, newTimer),\n      ui: {\n        ...progress.ui,\n        nativeNotificationScheduled: undefined,\n      },\n    };\n    if (!skipLiveActivityUpdate) {\n      LiveActivityManager_updateProgressLiveActivity(\n        effects,\n        program,\n        progress,\n        settings,\n        subscription,\n        liveActivityEntryIndex,\n        liveActivitySetIndex,\n        Math.max(0, newTimer),\n        progress.timerSince || Date.now()\n      );\n    }\n    return newProgress;\n  }\n}\n\nexport function Progress_maybeApplySuperset(\n  progress: IHistoryRecord,\n  entryIndex: number,\n  mode: \"workout\" | \"warmup\"\n): IHistoryRecord {\n  if (!Progress_isCurrent(progress)) {\n    return progress;\n  }\n  const entry = progress.entries[entryIndex];\n  const nextEntryIndex = Progress_getNextEntryIndex(progress, entry, mode);\n  if (nextEntryIndex != null) {\n    return { ...progress, currentEntryIndex: nextEntryIndex };\n  }\n  return progress;\n}\n\nexport function Progress_stopTimer(effects: INativeEffect[], progress: IHistoryRecord): IHistoryRecord {\n  effects.push({ type: \"stopTimer\" });\n  return Progress_stopTimerPure(progress);\n}\n\nexport function Progress_stopTimerPure(progress: IHistoryRecord): IHistoryRecord {\n  return {\n    ...progress,\n    timerSince: undefined,\n    timerMode: undefined,\n    timer: undefined,\n    timerSetIndex: undefined,\n    timerEntryIndex: undefined,\n  };\n}\n\nexport function Progress_setTimerValue(progress: IHistoryRecord, newTimer: number): IHistoryRecord {\n  if (progress.timerSince == null) {\n    return progress;\n  }\n  return {\n    ...progress,\n    timer: Math.max(0, newTimer),\n  };\n}\n\nexport function Progress_findEntryByExercise(\n  progress: IHistoryRecord,\n  exerciseType: IExerciseType\n): IHistoryEntry | undefined {\n  return progress.entries.find((entry) => entry.exercise === exerciseType);\n}\n\nexport function Progress_isFullyCompletedSet(progress: IHistoryRecord): boolean {\n  return progress.entries.every((entry) => Progress_isCompletedSet(entry));\n}\n\nexport function Progress_isCompletedSet(entry: IHistoryEntry): boolean {\n  return Reps_isCompleted(entry.sets);\n}\n\nexport function Progress_isFullyEmptySet(progress: IHistoryRecord): boolean {\n  return progress.entries.every((entry) => Reps_isEmpty(entry.sets));\n}\n\nexport function Progress_isFullyEmptyOrFinishedSet(progress: IHistoryRecord): boolean {\n  return progress.entries.every((entry) => Progress_isEmptyOrFinishedSet(entry));\n}\n\nexport function Progress_isEmptyOrFinishedSet(entry: IHistoryEntry): boolean {\n  return Reps_isEmptyOrFinished(entry.sets);\n}\n\nexport function Progress_hasLastUnfinishedSet(entry: IHistoryEntry): boolean {\n  return entry.sets.filter((s) => !s.isCompleted).length === 1;\n}\n\nexport function Progress_isChanged(aProgress?: IHistoryRecord, bProgress?: IHistoryRecord): boolean {\n  if (aProgress != null && bProgress == null) {\n    return true;\n  } else if (aProgress == null && bProgress != null) {\n    return true;\n  } else if (aProgress == null && bProgress == null) {\n    return false;\n  } else {\n    const changed = !ObjectUtils_isEqual(aProgress!, bProgress!);\n    return changed;\n  }\n}\n\nexport function Progress_showUpdateDate(progress: IHistoryRecord, date: string, time: number): IHistoryRecord {\n  return {\n    ...progress,\n    ui: {\n      ...progress.ui,\n      dateModal: { date, time },\n    },\n  };\n}\n\n// Shared with the program grid: a superset is the same grouping whether you are reading a program or\n// performing it, so it gets the same color in both.\nexport const Progress_supersetColors = [\"red\", \"blue\", \"green\", \"purple\"];\n\nexport function Progress_getColorToSupersetGroup(\n  progress: Pick<IHistoryRecord, \"entries\">\n): Partial<Record<string, IHistoryEntry[]>> {\n  const groups = Progress_getSupersetGroups(progress.entries);\n  let index = 0;\n  return ObjectUtils_entriesNonnull(groups).reduce<Partial<Record<string, IHistoryEntry[]>>>((memo, [, group]) => {\n    const color = Progress_supersetColors[index % Progress_supersetColors.length];\n    memo[color] = group;\n    index += 1;\n    return memo;\n  }, {});\n}\n\nexport function Progress_getSupersetToColor(entries: IHistoryEntry[]): Partial<Record<string, string>> {\n  const groups = Progress_getSupersetGroups(entries);\n  let index = 0;\n  return ObjectUtils_entriesNonnull(groups).reduce<Partial<Record<string, string>>>((memo, [superset, group]) => {\n    const color = Progress_supersetColors[index % Progress_supersetColors.length];\n    // Keep color assignment in lockstep with Progress_getColorToSupersetGroup (which advances the\n    // index for every group), but a lone leftover entry shouldn't get a pairing line.\n    if (group.length > 1) {\n      memo[superset] = color;\n    }\n    index += 1;\n    return memo;\n  }, {});\n}\n\nexport function Progress_getSupersetGroups(entries: IHistoryEntry[]): Partial<Record<string, IHistoryEntry[]>> {\n  const groups: Partial<Record<string, IHistoryEntry[]>> = {};\n  for (const entry of entries) {\n    if (entry.superset != null) {\n      if (!groups[entry.superset]) {\n        groups[entry.superset] = [];\n      }\n      groups[entry.superset]!.push(entry);\n    }\n  }\n  return groups;\n}\n\nexport function Progress_stop(\n  progresses: Record<number, IHistoryRecord | undefined>,\n  id: number\n): Record<number, IHistoryRecord | undefined> {\n  return ObjectUtils_keys(progresses).reduce<Record<number, IHistoryRecord | undefined>>((memo, k) => {\n    const p = progresses[k];\n    if (p != null && p.id !== id) {\n      memo[k] = p;\n    }\n    return memo;\n  }, {});\n}\n\nexport function Progress_changeDate(progress: IHistoryRecord, dateStr?: string, time?: number): IHistoryRecord {\n  let startTime = progress.startTime;\n  const startTimeDate = new Date(startTime);\n  const date = dateStr != null ? DateUtils_fromYYYYMMDD(dateStr) : undefined;\n  if (date != null) {\n    startTime = new Date(\n      date.getFullYear(),\n      date.getMonth(),\n      date.getDate(),\n      startTimeDate.getHours(),\n      startTimeDate.getMinutes(),\n      startTimeDate.getSeconds()\n    ).getTime();\n  }\n  const endTime = time != null ? startTime + time : startTime + History_workoutTime(progress);\n  return {\n    ...progress,\n    ...(dateStr != null ? { date: DateUtils_fromYYYYMMDDStr(dateStr) } : {}),\n    startTime,\n    intervals: [[startTime, endTime]],\n    endTime,\n    ui: {\n      ...progress.ui,\n      dateModal: undefined,\n    },\n  };\n}\n\nexport function Progress_getProgressId(state: Pick<IState, \"progress\">): number {\n  const editIds = Object.keys((state as IState).progress)\n    .map(Number)\n    .filter(Boolean);\n  return editIds.length > 0 ? editIds[0] : 0;\n}\n\nexport function Progress_lbProgress(progressId?: number): LensBuilder<IState, IHistoryRecord, {}, undefined> {\n  if (progressId == null || progressId === 0) {\n    return lb<IState>().p(\"storage\").pi(\"progress\").i(0);\n  } else {\n    return lb<IState>().pi(\"progress\").pi(progressId);\n  }\n}\n\nexport function Progress_getCurrentProgress(state: Pick<IState, \"storage\">): IHistoryRecord | undefined {\n  return state.storage.progress?.[0];\n}\n\nexport function Progress_getProgress(state: Pick<IState, \"progress\" | \"storage\">): IHistoryRecord | undefined {\n  const progressId = Progress_getProgressId(state);\n  return Progress_getProgressById(state, progressId);\n}\n\nexport function Progress_getProgressById(\n  state: Pick<IState, \"progress\" | \"storage\">,\n  id: number\n): IHistoryRecord | undefined {\n  if (id === 0) {\n    return state.storage.progress?.[0];\n  } else {\n    return (state as IState).progress[id];\n  }\n}\n\nexport function Progress_setProgress(state: IState, progress: IHistoryRecord): IState {\n  if (progress.id === 0) {\n    return lf(state).p(\"storage\").p(\"progress\").set([progress]);\n  } else {\n    return lf(state).pi(\"progress\").p(progress.id).set(progress);\n  }\n}\n\nexport function Progress_runUpdateScriptForEntry(\n  entry: IHistoryEntry,\n  dayData: IDayData,\n  programExercise: IPlannerProgramExercise,\n  otherStates: IByTag<IProgramState>,\n  setIndex: number,\n  settings: ISettings,\n  stats: IStats\n): IHistoryEntry {\n  if (setIndex !== -1 && !entry?.sets[setIndex]?.isCompleted) {\n    return entry;\n  }\n  const script = PlannerProgramExercise_getUpdateScript(programExercise);\n  if (!script) {\n    return entry;\n  }\n  const exercise = programExercise.exerciseType;\n  const state = ObjectUtils_clone(PlannerProgramExercise_getState(programExercise));\n  const setVariationIndex = PlannerProgramExercise_currentEvaluatedSetVariationIndex(programExercise);\n  const descriptionIndex = PlannerProgramExercise_currentDescriptionIndex(programExercise);\n  const exerciseVariationIndex = PlannerProgramExercise_currentExerciseVariationIndex(programExercise);\n  const bindings = Progress_createScriptBindings(\n    dayData,\n    entry,\n    settings,\n    programExercise.evaluatedSetVariations[setVariationIndex]?.sets.length ?? 0,\n    Stats_getCurrentMovingAverageBodyweight(stats, settings),\n    setIndex + 1,\n    setVariationIndex,\n    descriptionIndex,\n    exerciseVariationIndex\n  );\n  const fnContext: IScriptFnContext = { exerciseType: exercise, unit: settings.units, prints: [] };\n  const runner = new ScriptRunner(\n    script,\n    state,\n    ObjectUtils_clone(otherStates),\n    bindings,\n    Progress_createScriptFunctions(settings),\n    settings.units,\n    fnContext,\n    \"update\"\n  );\n  runner.execute();\n  const newEntry = Progress_applyBindings(entry, bindings, settings);\n  newEntry.state = { ...newEntry.state, ...state };\n  if (fnContext.prints.length > 0) {\n    newEntry.updatePrints = fnContext.prints;\n  }\n  return newEntry;\n}\n\nexport function Progress_runInitialUpdateScripts(\n  aProgress: IHistoryRecord,\n  programExerciseIds: string[] | undefined,\n  day: number,\n  program: IEvaluatedProgram,\n  settings: ISettings,\n  stats: IStats\n): IHistoryRecord {\n  const programDay = Program_getProgramDay(program, day);\n  if (!programDay) {\n    return aProgress;\n  }\n  const dayExercises = Program_getProgramDayUsedExercises(programDay);\n  const programExercises = programExerciseIds\n    ? CollectionUtils_compact(programExerciseIds.map((id) => dayExercises.find((e) => e.key === id)))\n    : dayExercises;\n\n  return {\n    ...aProgress,\n    entries: aProgress.entries.map((entry) => {\n      const programExercise =\n        entry.programExerciseId != null ? programExercises.find((e) => e.key === entry.programExerciseId) : undefined;\n      if (!programExercise) {\n        return entry;\n      }\n      try {\n        return Progress_runUpdateScriptForEntry(\n          entry,\n          Progress_getDayData(aProgress),\n          programExercise,\n          program.states,\n          -1,\n          settings,\n          stats\n        );\n      } catch (error) {\n        const e = error as Error;\n        console.error(e);\n        Dialog_alert(`Error during executing 'update: custom()' script for ${programExercise.fullName}: ${e.message}`);\n        return entry;\n      }\n    }),\n  };\n}\n\nexport function Progress_runUpdateScript(\n  aProgress: IHistoryRecord,\n  programExercise: IPlannerProgramExercise,\n  otherStates: IByTag<IProgramState>,\n  entryIndex: number,\n  setIndex: number,\n  mode: IProgressMode,\n  settings: ISettings,\n  stats: IStats,\n  onError?: IScriptErrorHandler\n): IHistoryRecord {\n  if (mode === \"warmup\") {\n    return aProgress;\n  }\n  const entry = aProgress.entries[entryIndex];\n  let newEntry: IHistoryEntry;\n  try {\n    newEntry = Progress_runUpdateScriptForEntry(\n      entry,\n      Progress_getDayData(aProgress),\n      programExercise,\n      otherStates,\n      setIndex,\n      settings,\n      stats\n    );\n  } catch (error) {\n    const e = error as Error;\n    console.error(e);\n    const message = `Error during executing 'update: custom()' script for ${programExercise.fullName}: ${e.message}`;\n    if (onError) {\n      onError(message);\n    } else {\n      Dialog_alert(message);\n    }\n    newEntry = entry;\n  }\n  const progress = lf(aProgress).p(\"entries\").i(entryIndex).set(newEntry);\n  return progress;\n}\n\nexport function Progress_applyBindings(\n  oldEntry: IHistoryEntry,\n  bindings: IScriptBindings,\n  settings: ISettings\n): IHistoryEntry {\n  const keys = [\n    \"RPE\",\n    \"minReps\",\n    \"reps\",\n    \"weights\",\n    \"amraps\",\n    \"logrpes\",\n    \"timers\",\n    \"setTime\",\n    \"originalWeights\",\n    \"askweights\",\n  ] as const;\n  // Deep-clone ONLY `sets` (the part the loop below mutates) and shallow-spread the rest of the entry,\n  // so `exercise`/`warmupSets` keep their reference. The previous whole-entry ObjectUtils_clone gave\n  // entry.exercise a value-identical NEW reference on every set completion, which defeated the\n  // O(per-exercise-history) memos in the graph/history workout cards downstream.\n  const lastCompletedIndex = CollectionUtils_findIndexReverse(bindings.completedReps, (r) => r != null) + 1;\n  const entry: IHistoryEntry = {\n    ...oldEntry,\n    sets: ObjectUtils_clone(oldEntry.sets.slice(0, Math.max(lastCompletedIndex, bindings.numberOfSets, 0))),\n  };\n  for (const key of keys) {\n    for (let i = 0; i < bindings[key].length; i += 1) {\n      if (entry.sets[i] == null) {\n        entry.sets[i] = {\n          vtype: \"set\",\n          id: UidFactory_generateUid(6),\n          index: i,\n          isUnilateral: Exercise_getIsUnilateral(entry.exercise, settings),\n          reps: 0,\n          weight: Weight_build(0, \"lb\"),\n          originalWeight: Weight_build(0, \"lb\"),\n          askWeight: false,\n          isCompleted: false,\n        };\n      }\n      if (!entry.sets[i].isCompleted) {\n        if (key === \"RPE\") {\n          const value = bindings.RPE[i];\n          entry.sets[i].rpe = value !== 0 ? value : undefined;\n        } else if (key === \"reps\") {\n          const value = bindings.reps[i];\n          entry.sets[i].reps = value;\n        } else if (key === \"minReps\") {\n          const value = bindings.minReps[i];\n          entry.sets[i].minReps = value !== 0 ? value : undefined;\n        } else if (key === \"weights\") {\n          const value = bindings.weights[i];\n          entry.sets[i].weight = value;\n        } else if (key === \"originalWeights\") {\n          const value = bindings.originalWeights[i];\n          entry.sets[i].originalWeight = value;\n        } else if (key === \"amraps\") {\n          const value = bindings.amraps[i];\n          entry.sets[i].isAmrap = !!value;\n        } else if (key === \"logrpes\") {\n          const value = bindings.logrpes[i];\n          entry.sets[i].logRpe = !!value;\n        } else if (key === \"askweights\") {\n          const value = bindings.askweights[i];\n          entry.sets[i].askWeight = !!value;\n        } else if (key === \"timers\") {\n          const value = bindings.timers[i];\n          entry.sets[i].timer = value != null && value >= 0 ? value : undefined;\n        } else if (key === \"setTime\") {\n          const value = bindings.setTime[i];\n          entry.sets[i].setTimer = value != null && value >= 0 ? value : undefined;\n        }\n      }\n    }\n  }\n  return entry;\n}\n\nexport function Progress_completeAmrapSet(\n  progress: IHistoryRecord,\n  entryIndex: number,\n  setIndex: number,\n  settings: ISettings\n): IHistoryRecord {\n  const entry = progress.entries[entryIndex];\n  const isUnilateral = Exercise_getIsUnilateral(entry.exercise, settings);\n  return lf(progress)\n    .p(\"entries\")\n    .i(entryIndex)\n    .p(\"sets\")\n    .i(setIndex)\n    .modify((progressSet) => {\n      return {\n        ...progressSet,\n        timestamp: !progressSet.isCompleted ? Date.now() : progressSet.timestamp,\n        completedRepsLeft: isUnilateral ? (progressSet.completedRepsLeft ?? progressSet.reps) : undefined,\n        completedReps: progressSet.completedReps ?? progressSet.reps,\n        completedWeight: progressSet.completedWeight ?? progressSet.weight,\n        isCompleted: !progressSet.isCompleted,\n      };\n    });\n}\n\nexport function Progress_shouldShowAmrapModal(\n  entry: IHistoryEntry,\n  setIndex: number,\n  mode: IProgressMode,\n  hasUserPromptedVars: boolean,\n  settings: ISettings\n): boolean {\n  const set = mode === \"warmup\" ? entry.warmupSets[setIndex] : entry.sets[setIndex];\n  const shouldLogRpe = !!set?.logRpe;\n  const shouldPromptUserVars = hasUserPromptedVars && Progress_hasLastUnfinishedSet(entry);\n  const isUnilateral = Exercise_getIsUnilateral(entry.exercise, settings);\n  const isAmrap =\n    (set?.completedReps == null || (isUnilateral && set?.completedRepsLeft == null)) &&\n    (!!set?.isAmrap || set.reps == null);\n  const shouldAskWeight = set?.completedWeight == null && (!!set?.askWeight || set.weight == null);\n  return !set.isCompleted && (shouldLogRpe || shouldPromptUserVars || isAmrap || shouldAskWeight);\n}\n\nexport function Progress_completeSet(\n  progress: IHistoryRecord,\n  entryIndex: number,\n  setIndex: number,\n  mode: IProgressMode,\n  hasUserPromptedVars: boolean,\n  settings: ISettings,\n  isPlayground?: boolean\n): IHistoryRecord {\n  const entry = progress.entries[entryIndex];\n  const set = mode === \"warmup\" ? entry.warmupSets[setIndex] : entry.sets[setIndex];\n  const setTimerModal = Progress_getActiveSetTimer(progress);\n  const hasOpenSetTimer =\n    setTimerModal != null && setTimerModal.entryIndex === entryIndex && setTimerModal.setIndex === setIndex;\n  // The first \"complete\" on a timed set starts its clock (opens the set-timer modal) instead of\n  // completing it — the actual completion happens on the second signal (Stop & record), mirroring\n  // how the AMRAP modal defers completion. See Progress_completeSetAction for the recording step.\n  if (mode === \"workout\" && set?.setTimer != null && !set.isCompleted && !hasOpenSetTimer) {\n    const now = Date.now();\n    const opened = TimedSet_open(progress, entryIndex, setIndex, settings, {\n      getReadySeconds: isPlayground ? 0 : (settings.timers.getReady ?? 0),\n      startedAt: now,\n      nonce: now,\n    });\n    if (opened != null) {\n      return { ...progress, setTimer: undefined, setTimerGetReady: undefined, ...opened };\n    }\n  }\n  const shouldLogRpe = !!set?.logRpe;\n  const shouldPromptUserVars = hasUserPromptedVars && Progress_hasLastUnfinishedSet(entry);\n  const isUnilateral = Exercise_getIsUnilateral(entry.exercise, settings);\n  const isAmrap =\n    (set?.completedReps == null || (isUnilateral && set?.completedRepsLeft == null)) &&\n    (!!set?.isAmrap || set.reps == null);\n  const shouldAskWeight = set?.completedWeight == null && (!!set?.askWeight || set.weight == null);\n  if (mode === \"warmup\") {\n    return lf(progress)\n      .p(\"entries\")\n      .i(entryIndex)\n      .p(\"warmupSets\")\n      .i(setIndex)\n      .modify((progressSet) => {\n        return {\n          ...progressSet,\n          timestamp: !progressSet.isCompleted ? Date.now() : progressSet.timestamp,\n          completedRepsLeft: isUnilateral ? (progressSet.completedRepsLeft ?? progressSet.reps) : undefined,\n          completedReps: progressSet.completedReps ?? progressSet.reps,\n          completedWeight: progressSet.completedWeight ?? progressSet.weight,\n          isCompleted: !progressSet.isCompleted,\n        };\n      });\n  } else if (Progress_shouldShowAmrapModal(entry, setIndex, mode, hasUserPromptedVars, settings)) {\n    return {\n      ...progress,\n      amrapModal: {\n        entryIndex,\n        setIndex,\n        nonce: Date.now(),\n        logRpe: shouldLogRpe,\n        userVars: shouldPromptUserVars,\n        isAmrap: isAmrap,\n        askWeight: shouldAskWeight,\n      },\n    };\n  } else {\n    return Progress_completeAmrapSet(progress, entryIndex, setIndex, settings);\n  }\n}\n\nexport function Progress_getFirstIncompleteWorkoutSet(\n  progress: IHistoryRecord,\n  after?: { entryIndex: number; setIndex: number }\n): { entryIndex: number; setIndex: number } | undefined {\n  const startEntry = after?.entryIndex ?? 0;\n  for (let entryIndex = startEntry; entryIndex < progress.entries.length; entryIndex += 1) {\n    const sets = progress.entries[entryIndex].sets;\n    const startSet = after != null && entryIndex === after.entryIndex ? after.setIndex + 1 : 0;\n    for (let setIndex = startSet; setIndex < sets.length; setIndex += 1) {\n      if (!sets[setIndex].isCompleted) {\n        return { entryIndex, setIndex };\n      }\n    }\n  }\n  return undefined;\n}\n\nexport type IActiveSetTimer =\n  | {\n      phase: \"getReady\";\n      entryIndex: number;\n      setIndex: number;\n      setId: string;\n      id: string;\n      side: ITimedSetSide;\n      startedAt: number;\n      getReady: number;\n      nonce?: number;\n    }\n  | {\n      phase: \"work\";\n      entryIndex: number;\n      setIndex: number;\n      setId: string;\n      id: string;\n      side: ITimedSetSide;\n      startedAt: number;\n      nonce?: number;\n      keepTiming?: boolean;\n    };\n\n// A watch on a cached bundle writes a phase with no setId, at the same storage version, so the migration\n// never reaches it — such a phase falls back to indices rather than being rejected as unresolvable.\nexport function Progress_resolveTimedSetPhase(\n  progress: IHistoryRecord,\n  phase: { entryIndex: number; setIndex: number; setId?: string } | undefined\n): ISet | undefined {\n  if (phase == null) {\n    return undefined;\n  }\n  const set = progress.entries[phase.entryIndex]?.sets[phase.setIndex];\n  if (set == null) {\n    return undefined;\n  }\n  return phase.setId == null || set.id === phase.setId ? set : undefined;\n}\n\n// `setTimer` wins when both fields are set: version merging is field-by-field, so a merge can legally\n// produce both, and preferring the later phase is the correct recovery.\nexport function Progress_getActiveSetTimer(progress: IHistoryRecord): IActiveSetTimer | undefined {\n  const stm = progress.setTimer;\n  if (stm != null && Progress_resolveTimedSetPhase(progress, stm) != null) {\n    return { phase: \"work\", ...stm, side: stm.side ?? \"bilateral\" };\n  }\n  const getReady = progress.setTimerGetReady;\n  if (getReady != null && Progress_resolveTimedSetPhase(progress, getReady) != null) {\n    return { phase: \"getReady\", ...getReady, side: getReady.side ?? \"bilateral\" };\n  }\n  return undefined;\n}\n\nexport function Progress_startSetTimerWork(progress: IHistoryRecord, startedAt: number): IHistoryRecord {\n  const getReady = progress.setTimerGetReady;\n  // The setTimer != null half is not redundant: a merge can leave both fields set, and a stale \"Start now\"\n  // must not restart a running clock or retarget it at the countdown's set.\n  if (getReady == null || progress.setTimer != null) {\n    return progress;\n  }\n  return {\n    ...progress,\n    setTimerGetReady: undefined,\n    setTimer: {\n      entryIndex: getReady.entryIndex,\n      setIndex: getReady.setIndex,\n      setId: getReady.setId,\n      id: getReady.id,\n      side: getReady.side,\n      startedAt,\n      // Reusing the nonce is what stops the presenter re-navigating on the flip.\n      nonce: getReady.nonce,\n    },\n  };\n}\n\n// Conditions must mirror the auto-advance branch of Progress_isSetTimerCheckDue, or the cue fires for a\n// rest that never rolls into a work window.\nexport function Progress_getNextTimedSet(\n  progress: IHistoryRecord\n): { entryIndex: number; setIndex: number } | undefined {\n  // The \"next\" set for an auto/EMOM advance is the set right after the one the timer belongs to — NOT the\n  // globally-first incomplete set. Users don't work exercises strictly top-to-bottom, so an earlier untimed\n  // exercise left incomplete would otherwise be picked as \"next\", have no setTimer, and silently stop the chain.\n  const current =\n    progress.setTimer != null\n      ? { entryIndex: progress.setTimer.entryIndex, setIndex: progress.setTimer.setIndex }\n      : progress.timerEntryIndex != null && progress.timerSetIndex != null\n        ? { entryIndex: progress.timerEntryIndex, setIndex: progress.timerSetIndex }\n        : undefined;\n  // In a superset the next timed set is the next group member's incomplete set (Crunch → Hollow → Crunch …),\n  // not the current exercise's own next set — otherwise the auto-advance opens a set for the exercise the\n  // clock just left instead of the one now shown. Fall back to raw order once the group is exhausted.\n  const next =\n    (current != null ? Progress_getNextTimedSetInSuperset(progress, current) : undefined) ??\n    Progress_getFirstIncompleteWorkoutSet(progress, current);\n  if (next == null) {\n    return undefined;\n  }\n  const set = progress.entries[next.entryIndex]?.sets[next.setIndex];\n  return set?.setTimer != null ? next : undefined;\n}\n\nfunction Progress_getNextTimedSetInSuperset(\n  progress: IHistoryRecord,\n  current: { entryIndex: number; setIndex: number }\n): { entryIndex: number; setIndex: number } | undefined {\n  const entry = progress.entries[current.entryIndex];\n  if (entry?.superset == null) {\n    return undefined;\n  }\n  // Reuse the same superset resolver the pager uses (Progress_maybeApplySuperset), so the auto-advance\n  // opens a set for the very exercise now shown. It skips finished group members and returns undefined\n  // once the group is exhausted, letting the caller fall back to raw order for any later timed exercise.\n  const nextEntry = Progress_getNextEntry(progress, entry, \"workout\", false);\n  if (nextEntry == null || nextEntry.id === entry.id) {\n    return undefined;\n  }\n  const entryIndex = progress.entries.findIndex((e) => e.id === nextEntry.id);\n  const setIndex = nextEntry.sets.findIndex((s) => !s.isCompleted);\n  if (entryIndex < 0 || setIndex < 0) {\n    return undefined;\n  }\n  return { entryIndex, setIndex };\n}\n\n// Moves the set-timer banner to the next timed set (or closes it if there's none) and clears any rest\n// timer. `freshNonce` controls whether the workout screen re-opens the banner: keep the nonce for an\n// in-place advance (EMOM, banner already open), use a fresh one after rest (banner was closed).\n// An `auto` set's countdown comes OUT of its rest rather than being added in front of it, so the circuit's\n// cadence is unchanged: `45s|15s auto` with a 5s countdown rests 10s, then counts down 5. Clamping to the\n// rest is what makes a zero-rest EMOM produce no countdown at all.\nexport function Progress_getAutoGetReadySeconds(set: ISet | undefined, settings: ISettings): number {\n  if (!set?.auto) {\n    return 0;\n  }\n  return Math.min(settings.timers.getReady ?? 0, set.timer ?? 0);\n}\n\n// `startedAt` is when the previous phase actually ended, not when we noticed. Reading the clock here\n// instead would hand a late reconcile a full fresh countdown and stretch the circuit past its cadence.\nexport function Progress_advanceTimedSet(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  settings: ISettings,\n  freshNonce: boolean,\n  getReadySeconds: number = 0,\n  startedAt?: number\n): IHistoryRecord {\n  const phaseStartedAt = startedAt ?? Date.now();\n  const next = Progress_getNextTimedSet(progress);\n  const prevNonce = progress.setTimer?.nonce;\n  // Advancing ends the current (auto) rest — cancel its pending \"rest is over\" notification so it doesn't\n  // fire during the next set's clock.\n  if (progress.timerSince != null) {\n    effects.push({ type: \"stopTimer\" });\n  }\n  // Follow the clock to the next set's exercise so the shown exercise tracks the active set (EMOM/Tabata can\n  // roll into a different exercise). currentEntryIndex syncs, so every client's view moves with it.\n  const nextEntryIndex = next != null ? next.entryIndex : progress.currentEntryIndex;\n  const entryChanged = nextEntryIndex !== (progress.currentEntryIndex ?? 0);\n  const opened =\n    next != null\n      ? TimedSet_open(progress, next.entryIndex, next.setIndex, settings, {\n          getReadySeconds,\n          startedAt: phaseStartedAt,\n          nonce: freshNonce ? Date.now() : prevNonce,\n        })\n      : undefined;\n  return {\n    ...progress,\n    timerSince: undefined,\n    timer: undefined,\n    timerMode: undefined,\n    timerEntryIndex: undefined,\n    timerSetIndex: undefined,\n    setTimer: undefined,\n    setTimerGetReady: undefined,\n    ...opened,\n    currentEntryIndex: nextEntryIndex,\n    // The pager scrolls on a forceUpdateEntryIndex flip, not on currentEntryIndex alone (so swipes aren't\n    // fought). Flip it when an auto-advance crosses into another exercise so the pager scrolls to follow.\n    ui: entryChanged ? { ...progress.ui, forceUpdateEntryIndex: !progress.ui?.forceUpdateEntryIndex } : progress.ui,\n  };\n}\n\nexport function Progress_handOffToOtherSide(\n  progress: IHistoryRecord,\n  entryIndex: number,\n  setIndex: number,\n  settings: ISettings,\n  endedAt: number,\n  nonce?: number,\n  isPlayground?: boolean\n): IHistoryRecord {\n  const set = progress.entries[entryIndex]?.sets[setIndex];\n  if (set == null) {\n    return progress;\n  }\n  const opened = TimedSet_open(progress, entryIndex, setIndex, settings, {\n    getReadySeconds: isPlayground ? 0 : (settings.timers.getReady ?? 0),\n    startedAt: set.auto ? endedAt : Date.now(),\n    nonce,\n  });\n  if (opened == null) {\n    return progress;\n  }\n  return { ...progress, setTimer: undefined, setTimerGetReady: undefined, ...opened };\n}\n\n// The single place that decides what happens after a timed set is recorded+completed from its clock.\nexport function Progress_proceedAfterTimedSet(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  entryIndex: number,\n  setIndex: number,\n  settings: ISettings,\n  subscription: ISubscription | undefined,\n  isPlayground?: boolean\n): IHistoryRecord {\n  // AMRAP took over (set isn't completed yet). Keep the set-timer modal open so the amrap modal stacks\n  // cleanly on top of it — clearing it here would race the amrap push and pop the wrong screen. The\n  // set-timer modal is closed (and rest started) when amrap resolves; see Progress_changeAmrapAction.\n  if (progress.amrapModal != null) {\n    return progress;\n  }\n  // The playground has no rest timers (like normal-set completion, see below) and doesn't run circuits in real\n  // time — just close the banner. No rest, no EMOM/auto advance; the user taps the next set to continue.\n  if (isPlayground) {\n    return { ...progress, setTimer: undefined };\n  }\n  const set = progress.entries[entryIndex]?.sets[setIndex];\n  // \"Log & keep timing\" records a set early but leaves its clock running to the target, so the recorded\n  // duration and the clock's end are different moments. Rest, the next EMOM window and any countdown all\n  // start from the clock's end, so a late reconcile resumes the cadence instead of restarting it.\n  const clockStartedAt = progress.setTimer?.startedAt;\n  const reachedTarget =\n    clockStartedAt != null &&\n    set?.setTimer != null &&\n    !set.isOverflowSetTimer &&\n    Date.now() - clockStartedAt >= set.setTimer * 1000;\n  const endedOffsetSeconds = reachedTarget ? set?.setTimer : set?.completedSetTimer;\n  const timedSetEndedAt =\n    clockStartedAt != null && endedOffsetSeconds != null ? clockStartedAt + endedOffsetSeconds * 1000 : Date.now();\n  // EMOM-style: auto with no rest rolls straight into the next timed set in the same banner.\n  if (set?.auto && (set.timer ?? 0) === 0) {\n    return Progress_advanceTimedSet(effects, progress, settings, false, 0, timedSetEndedAt);\n  }\n  const autoGetReady = Progress_getAutoGetReadySeconds(set, settings);\n  // The countdown eats the whole rest (rest <= getReady), so there is no rest left to run - go straight into\n  // it, otherwise Progress_startTimer would clear the timer for a 0s rest and nothing would reopen the clock.\n  if (autoGetReady > 0 && (set?.timer ?? 0) - autoGetReady <= 0) {\n    return Progress_advanceTimedSet(effects, progress, settings, true, autoGetReady, timedSetEndedAt);\n  }\n  let newProgress: IHistoryRecord = { ...progress, setTimer: undefined, setTimerGetReady: undefined };\n  if (set?.isCompleted && set.setTimer != null) {\n    // Shortened by the countdown, so the existing \"rest is over\" push lands at the moment the countdown\n    // opens rather than at the moment work starts.\n    const restTimer = autoGetReady > 0 ? (set.timer ?? 0) - autoGetReady : undefined;\n    newProgress = Progress_startTimer(\n      effects,\n      newProgress,\n      timedSetEndedAt,\n      \"workout\",\n      entryIndex,\n      setIndex,\n      settings,\n      subscription,\n      restTimer\n    );\n  }\n  return newProgress;\n}\n\n// Discard the set timer banner without recording. If the set was already logged (via \"Log & keep\"),\n// start its deferred rest.\nexport function Progress_closeTimedSet(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  settings: ISettings,\n  subscription: ISubscription | undefined,\n  isPlayground?: boolean\n): IHistoryRecord {\n  const stm = progress.setTimer;\n  // Without the countdown branch a dismissal during it strands the field, and the banner reopens.\n  if (stm == null) {\n    return progress.setTimerGetReady != null ? { ...progress, setTimerGetReady: undefined } : progress;\n  }\n  let newProgress: IHistoryRecord = { ...progress, setTimer: undefined, setTimerGetReady: undefined };\n  const set = newProgress.entries[stm.entryIndex]?.sets[stm.setIndex];\n  // The playground has no rest timers, so discarding a \"Log & keep timing\" set just closes the banner.\n  if (!isPlayground && set?.isCompleted && set.setTimer != null && newProgress.amrapModal == null) {\n    newProgress = Progress_startTimer(\n      effects,\n      newProgress,\n      Date.now(),\n      \"workout\",\n      stm.entryIndex,\n      stm.setIndex,\n      settings,\n      subscription\n    );\n  }\n  return newProgress;\n}\n\nexport function Progress_reconcileTimedSet(progress: IHistoryRecord, now: number): IHistoryRecord {\n  const getReady = progress.setTimerGetReady;\n  if (progress.setTimer != null || getReady == null || now - getReady.startedAt < getReady.getReady * 1000) {\n    return progress;\n  }\n  return Progress_startSetTimerWork(progress, getReady.startedAt + getReady.getReady * 1000);\n}\n\n// Cheap pure predicate (no program evaluation) telling whether Progress_checkSetTimer would do anything.\n// Lets per-second pollers skip resolving program context + dispatching when nothing is due.\nexport function Progress_isSetTimerCheckDue(progress: IHistoryRecord, now: number): boolean {\n  if (progress.amrapModal != null) {\n    return false;\n  }\n  const getReady = progress.setTimerGetReady;\n  if (progress.setTimer == null && getReady != null) {\n    return now - getReady.startedAt >= getReady.getReady * 1000;\n  }\n  const stm = progress.setTimer;\n  if (stm != null) {\n    const set = progress.entries[stm.entryIndex]?.sets[stm.setIndex];\n    // No !isCompleted guard: a set logged via \"Log & keep timing\" keeps the clock running with the modal\n    // open, and must still auto-close + start rest when the clock reaches the (non-overflow) target.\n    return !!(set?.setTimer != null && !set.isOverflowSetTimer && now - stm.startedAt >= set.setTimer * 1000);\n  }\n  if (\n    progress.timer != null &&\n    progress.timerSince != null &&\n    progress.timerEntryIndex != null &&\n    progress.timerSetIndex != null\n  ) {\n    const restSet = progress.entries[progress.timerEntryIndex]?.sets[progress.timerSetIndex];\n    return !!(\n      restSet?.auto &&\n      now - progress.timerSince >= progress.timer * 1000 &&\n      Progress_getNextTimedSet(progress) != null\n    );\n  }\n  return false;\n}\n\n// Time-driven set timer transitions, safe to poll. Returns the same `progress` reference when nothing\n// is due, so callers can skip dispatching. Two cases: (A) a non-overflow timed set's work timer reached\n// its target → record+complete+proceed (overflow `+` sets count up past target and are stopped manually);\n// (B) an `auto` set's rest expired → advance to the next timed set.\nexport function Progress_checkSetTimer(\n  effects: INativeEffect[],\n  settings: ISettings,\n  stats: IStats,\n  progress: IHistoryRecord,\n  subscription: ISubscription | undefined,\n  programExercise: IPlannerProgramExercise | undefined,\n  otherStates: IByExercise<IProgramState> | undefined,\n  nowArg?: number,\n  isPlayground?: boolean\n): IHistoryRecord {\n  const now = nowArg ?? Date.now();\n  if (progress.amrapModal != null) {\n    return progress;\n  }\n  const current = Progress_reconcileTimedSet(progress, now);\n  const stm = current.setTimer;\n  if (stm != null) {\n    const set = current.entries[stm.entryIndex]?.sets[stm.setIndex];\n    // No !isCompleted guard: a \"Log & keep timing\" set is already completed but keeps the clock running, and\n    // must still auto-close + rest at the target. completeSetAction's already-logged branch handles it.\n    if (set?.setTimer != null && !set.isOverflowSetTimer && now - stm.startedAt >= set.setTimer * 1000) {\n      const recordedSeconds = TimedSet_recordedFor(set, stm.side) ?? set.setTimer;\n      return Progress_completeSetAction(\n        effects,\n        settings,\n        stats,\n        current,\n        {\n          type: \"CompleteSetAction\",\n          entryIndex: stm.entryIndex,\n          setIndex: stm.setIndex,\n          mode: \"workout\",\n          programExercise,\n          otherStates,\n          forceUpdateEntryIndex: false,\n          isExternal: true,\n          isPlayground: isPlayground ?? false,\n          recordedSeconds,\n        },\n        subscription\n      );\n    }\n    // `current`, not `progress`, or a promotion made above is silently discarded.\n    return current;\n  }\n  if (\n    current.timer != null &&\n    current.timerSince != null &&\n    current.timerEntryIndex != null &&\n    current.timerSetIndex != null\n  ) {\n    const restSet = current.entries[current.timerEntryIndex]?.sets[current.timerSetIndex];\n    if (\n      restSet?.auto &&\n      now - current.timerSince >= current.timer * 1000 &&\n      Progress_getNextTimedSet(current) != null\n    ) {\n      // The rest that just ended was already shortened by the countdown, so what follows it is the countdown\n      // itself, not the work clock. It starts at the rest's deadline, not now: a tick that lands late (a\n      // throttled timer, a wake) must not hand out a full fresh countdown and stretch the round.\n      return Progress_advanceTimedSet(\n        effects,\n        current,\n        settings,\n        true,\n        Progress_getAutoGetReadySeconds(restSet, settings),\n        current.timerSince + current.timer * 1000\n      );\n    }\n  }\n  return current;\n}\n\nexport function Progress_getIsRpeEnabled(sets: ISet[]): boolean {\n  return sets.some((set) => set.rpe != null);\n}\n\nexport function Progress_getIsMinRepsEnabled(sets: ISet[]): boolean {\n  return sets.some((set) => set.minReps != null);\n}\n\nexport function Progress_updateAmrapRepsInExercise(progress: IHistoryRecord, value?: number): IHistoryRecord {\n  if (progress.amrapModal != null) {\n    const { entryIndex, setIndex } = progress.amrapModal;\n    return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedReps\").set(value);\n  } else {\n    return progress;\n  }\n}\n\nexport function Progress_updateAmrapRepsLeftInExercise(progress: IHistoryRecord, value?: number): IHistoryRecord {\n  if (progress.amrapModal != null) {\n    const { entryIndex, setIndex } = progress.amrapModal;\n    return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedRepsLeft\").set(value);\n  } else {\n    return progress;\n  }\n}\n\nexport function Progress_updateRpeInExercise(progress: IHistoryRecord, value?: number): IHistoryRecord {\n  if (progress.amrapModal != null) {\n    const { entryIndex, setIndex } = progress.amrapModal;\n    const newValue = value != null ? Math.round(Math.min(10, Math.max(0, value)) / 0.5) * 0.5 : undefined;\n    return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedRpe\").set(newValue);\n  } else {\n    return progress;\n  }\n}\n\nexport function Progress_updateWeightInExercise(progress: IHistoryRecord, value?: IWeight): IHistoryRecord {\n  if (progress.amrapModal != null) {\n    const { entryIndex, setIndex } = progress.amrapModal;\n    return lf(progress).p(\"entries\").i(entryIndex).p(\"sets\").i(setIndex).p(\"completedWeight\").set(value);\n  } else {\n    return progress;\n  }\n}\n\nexport function Progress_updateUserPromptedStateVars(\n  progress: IHistoryRecord,\n  programExerciseId: string,\n  userPromptedStateVars: IProgramState\n): IHistoryRecord {\n  return {\n    ...progress,\n    userPromptedStateVars: {\n      ...(progress.userPromptedStateVars || {}),\n      [programExerciseId]: userPromptedStateVars,\n    },\n  };\n}\n\nexport function Progress_editExerciseNotes(dispatch: IDispatch, entryIndex: number, notes: string): void {\n  updateProgress(dispatch, [lb<IHistoryRecord>().p(\"entries\").i(entryIndex).p(\"notes\").record(notes)], \"edit-notes\");\n}\n\nexport function Progress_addExercise(dispatch: IDispatch, exerciseType: IExerciseType, numberOfEntries: number): void {\n  updateProgress(\n    dispatch,\n    [\n      lb<IHistoryRecord>()\n        .p(\"entries\")\n        .recordModify((entries) => {\n          return [...entries, History_createCustomEntry(exerciseType, numberOfEntries)].map((e, i) => ({\n            ...e,\n            index: i,\n          }));\n        }),\n      lb<IHistoryRecord>().p(\"currentEntryIndex\").record(numberOfEntries),\n    ],\n    \"add-exercise\"\n  );\n}\n\nexport function Progress_isEligibleForInferredWeight(set: ISet): boolean {\n  return set.originalWeight == null && set.reps != null && set.rpe != null;\n}\n\n// Which past set to read the new exercise off. Closest reps rather than the heaviest set: the e1RM\n// round trip below only cancels its own error near the rep range it was estimated from, and an e1RM\n// extrapolated from a 15-rep accessory is meaningless far away from 15. Warmups are not considered —\n// they would drag the estimate down.\nfunction findSwapSourceSet(prevEntry: IHistoryEntry | undefined, targetReps: number): ISet | undefined {\n  let best: ISet | undefined;\n  let bestDistance = Infinity;\n  let bestOnerm: IWeight | undefined;\n  for (const set of prevEntry?.sets ?? []) {\n    const reps = set.completedReps ?? set.reps;\n    const weight = set.completedWeight ?? set.weight;\n    if (!set.isCompleted || reps == null || reps <= 0 || weight == null || weight.value <= 0) {\n      continue;\n    }\n    const distance = Math.abs(reps - targetReps);\n    const onerm = Weight_getOneRepMax(weight, reps, set.completedRpe ?? set.rpe);\n    if (distance < bestDistance || (distance === bestDistance && (bestOnerm == null || Weight_gt(onerm, bestOnerm)))) {\n      best = set;\n      bestDistance = distance;\n      bestOnerm = onerm;\n    }\n  }\n  return best;\n}\n\n// What the new exercise should weigh for this set's target, when the program's own number is an\n// absolute weight and so means nothing on a different lift — 500lb of leg press is not 500lb of\n// lateral raise. Answered through an e1RM, which is unreliable as an absolute number for high-rep\n// accessories but fine as an intermediate, because the error cancels on the way back out: a source\n// set at the same reps and RPE returns exactly its own weight, with no special case for it.\nfunction swapDerivedWeight(\n  set: ISet,\n  exerciseType: IExerciseType,\n  settings: ISettings,\n  prevEntry: IHistoryEntry | undefined\n): IWeight {\n  const targetReps = set.reps ?? 1;\n  const targetRpe = set.rpe ?? 10;\n  const source = findSwapSourceSet(prevEntry, targetReps);\n  const sourceWeight = source?.completedWeight ?? source?.weight;\n  const sourceReps = source?.completedReps ?? source?.reps;\n  if (sourceWeight == null || sourceReps == null) {\n    // No history for this exercise, so fall back to its 1RM — explicit if the user set one, the\n    // exercise DB's starting weight otherwise. That is already what a percentage-based set does on\n    // a swap, so the no-history case behaves the same for both kinds of program.\n    return Weight_evaluateWeight(Weight_rpePct(targetReps, targetRpe), exerciseType, settings);\n  }\n  // Defaulting the source RPE to the *target's* rather than to 10 is what makes the two multipliers\n  // cancel for the many programs that carry no RPE at all, so equal reps hand back the same weight.\n  const sourceRpe = source?.completedRpe ?? source?.rpe ?? targetRpe;\n  const ratio = Weight_rpeMultiplier(targetReps, targetRpe) / Weight_rpeMultiplier(sourceReps, sourceRpe);\n  return Weight_multiply(sourceWeight, ratio);\n}\n\n// A swapped-in exercise the program already knows about brings its own authored ramp with it, even\n// when the definition lives on a day the user isn't doing today. The first authored definition wins:\n// the same exercise carrying different warmups on different days is rare, and `warmup: none` is\n// authored too, so it is honored as an answer rather than skipped over as a missing one.\nexport function Progress_programWarmupsForExerciseType(\n  evaluatedProgram: IEvaluatedProgram | undefined,\n  exerciseType: IExerciseType,\n  settings: ISettings\n): IProgramExerciseWarmupSet[] | undefined {\n  for (const programExercise of evaluatedProgram ? Program_getAllProgramExercisesWithType(evaluatedProgram) : []) {\n    if (Exercise_eq(programExercise.exerciseType, exerciseType)) {\n      const warmups = PlannerProgramExercise_programWarmups(programExercise, settings);\n      if (warmups != null) {\n        return warmups;\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function Progress_updateSetWeights(\n  entry: IHistoryEntry,\n  exerciseType: IExerciseType,\n  settings: ISettings,\n  prevEntry?: IHistoryEntry,\n  programWarmups?: IProgramExerciseWarmupSet[]\n): IHistoryEntry {\n  const unit = Equipment_getUnitForExerciseType(settings, exerciseType) ?? settings.units;\n  const newSets = entry.sets.map((set) => {\n    if (set.isCompleted) {\n      return set;\n    }\n    if (Progress_isEligibleForInferredWeight(set) || Weight_isPct(set.originalWeight)) {\n      const originalWeight = set.originalWeight ?? Weight_rpePct(set.reps ?? 1, set.rpe ?? 10);\n      const evaluatedWeight = Weight_evaluateWeight(originalWeight, exerciseType, settings);\n      const weight = Weight_roundConvertTo(evaluatedWeight, settings, unit, exerciseType);\n      return { ...set, weight };\n    }\n    if (set.originalWeight != null) {\n      const weight = Weight_roundConvertTo(\n        swapDerivedWeight(set, exerciseType, settings, prevEntry),\n        settings,\n        unit,\n        exerciseType\n      );\n      // Both fields take the loadable number. The target here is one the app invented, not a program\n      // value being approximated, so leaving them different would light up the rounding strikethrough\n      // — and its \"adjusted to match what you can load\" explanation — for a weight nothing rounded.\n      return { ...set, weight, originalWeight: weight };\n    }\n    return set;\n  });\n  // The old exercise's ramp is meaningless on the new one, so it is rebuilt: from whatever the\n  // program authors for the new exercise if it defines it anywhere, and from that exercise's own\n  // default scheme otherwise — which correctly leaves an accessory with no warmups at all.\n  const hasCompletedWarmup = entry.warmupSets.some((set) => set.isCompleted);\n  const warmupSets = hasCompletedWarmup\n    ? entry.warmupSets\n    : Exercise_getWarmupSets(exerciseType, newSets[0]?.weight, settings, programWarmups);\n  return { ...entry, sets: newSets, warmupSets };\n}\n\nexport function Progress_doesUse1RM(entry: IHistoryEntry): boolean {\n  return entry.sets.some((set) => (set.originalWeight == null ? set.rpe != null : Weight_isPct(set.originalWeight)));\n}\n\nexport function Progress_changeExercise(\n  dispatch: IDispatch,\n  settings: ISettings,\n  history: IHistoryRecord[],\n  evaluatedProgram: IEvaluatedProgram | undefined,\n  progressId: number,\n  exerciseType: IExerciseType,\n  entryIndex: number,\n  shouldKeepProgramExerciseId: boolean\n): void {\n  // `progressId` is the record's own id — 0 for the ongoing workout (Program_nextHistoryRecord),\n  // the real id when a past workout is being edited — which is exactly what has to be excluded from\n  // the history lookup, so no caller has to remember to pass it.\n  const prevEntry = History_findLastEntryForExerciseType(history, exerciseType, progressId);\n  const programWarmups = Progress_programWarmupsForExerciseType(evaluatedProgram, exerciseType, settings);\n  updateState(\n    dispatch,\n    [\n      Progress_lbProgress(progressId)\n        .p(\"entries\")\n        .i(entryIndex)\n        .recordModify((entry) => {\n          entry = Progress_updateSetWeights(entry, exerciseType, settings, prevEntry, programWarmups);\n          return {\n            ...entry,\n            exercise: exerciseType,\n            ...(shouldKeepProgramExerciseId ? {} : { programExerciseId: undefined }),\n            changed: true,\n          };\n        }),\n    ],\n    \"Change exercise\"\n  );\n}\n\n// Swapping a program exercise re-keys it, and entries point at the program by key — without\n// this the ongoing workout silently stops following the exercise it came from. Entries the\n// user already swapped by hand (`changed`) keep their own exercise either way, so they're\n// left alone. Once the ids line up the usual ApplyProgramChangesToProgress pass swaps the\n// exercise and regenerates its sets.\nexport function Progress_remapProgramExerciseId(\n  progress: IHistoryRecord,\n  oldKey: string,\n  newKey: string\n): IHistoryRecord {\n  const entries = progress.entries.map((entry) =>\n    entry.programExerciseId === oldKey && !entry.changed ? { ...entry, programExerciseId: newKey } : entry\n  );\n  return { ...progress, entries };\n}\n\n// Every entry index stored on the record is a position in `entries`, so inserting, dropping or re-sorting\n// invalidates all of them at once — a rest timer or an open AMRAP prompt would silently retarget a different\n// exercise. Anything whose entry is gone is cleared rather than left pointing at whoever moved into that slot.\n//\n// Matched by object identity, not by `entry.id`: ids are derived from the exercise\n// (`Progress_getEntryId`), so a program Squat and an ad-hoc Squat carry the same one, and a lookup would\n// hand a timer to the wrong entry. Callers therefore have to pass through the *same* entry objects for\n// everything that survived — which is what reconciling by filter/splice/sort already does.\nexport function Progress_reindexEntries(progress: IHistoryRecord, newEntries: IHistoryEntry[]): IHistoryRecord {\n  const newIndexOf = new Map<IHistoryEntry, number>(newEntries.map((e, i) => [e, i]));\n  const remap = (index: number | undefined): number | undefined => {\n    const entry = index != null ? progress.entries[index] : undefined;\n    return entry != null ? newIndexOf.get(entry) : undefined;\n  };\n  // Only ever a position to render at, never a subject that can go missing, so it lands on a neighbor instead of\n  // being cleared — a workout with entries always has one selected.\n  const clamp = (index: number | undefined): number | undefined => {\n    if (index == null || newEntries.length === 0) {\n      return undefined;\n    }\n    return remap(index) ?? Math.max(0, Math.min(index, newEntries.length - 1));\n  };\n  const keepAt = <T extends { entryIndex: number }>(value: T | undefined): T | undefined => {\n    const entryIndex = value != null ? remap(value.entryIndex) : undefined;\n    return value != null && entryIndex != null ? { ...value, entryIndex } : undefined;\n  };\n  const ui = progress.ui;\n  const currentEntryIndex = clamp(progress.currentEntryIndex);\n  const pickerState = ui?.exercisePicker?.state;\n  return {\n    ...progress,\n    entries: newEntries.map((e, i) => (e.index === i ? e : { ...e, index: i })),\n    currentEntryIndex,\n    timerEntryIndex: remap(progress.timerEntryIndex),\n    setTimer: keepAt(progress.setTimer),\n    setTimerGetReady: keepAt(progress.setTimerGetReady),\n    amrapModal: keepAt(progress.amrapModal),\n    ui:\n      ui == null\n        ? ui\n        : {\n            ...ui,\n            editModal: keepAt(ui.editModal),\n            editSetModal: keepAt(ui.editSetModal),\n            setTimerEditModal: keepAt(ui.setTimerEditModal),\n            roundingModal: keepAt(ui.roundingModal),\n            exerciseBottomSheet: keepAt(ui.exerciseBottomSheet),\n            entryIndexEditMode: remap(ui.entryIndexEditMode),\n            // The open swap picker writes straight into `entries[entryIndex]`, so a stale one retargets whoever\n            // moved into that slot. Nested a level deeper than the rest, hence not a `keepAt`.\n            exercisePicker:\n              pickerState?.entryIndex == null\n                ? ui.exercisePicker\n                : { ...ui.exercisePicker, state: { ...pickerState, entryIndex: remap(pickerState.entryIndex) } },\n            // The pager only scrolls when this flips — `currentEntryIndex` alone moves the highlight and leaves\n            // the shown exercise behind. Flipped only when the selected entry actually moved, so the user keeps\n            // looking at the exercise they were on.\n            forceUpdateEntryIndex:\n              currentEntryIndex !== progress.currentEntryIndex ? !ui.forceUpdateEntryIndex : ui.forceUpdateEntryIndex,\n          },\n  };\n}\n\n// Warmups count: they're work the user did and would have to redo. One definition, so the swap confirmation and\n// the reconciliation below can't disagree about whether an entry is worth protecting.\nexport function Progress_hasCompletedWork(entry: IHistoryEntry): boolean {\n  return entry.sets.some((set) => set.isCompleted) || entry.warmupSets.some((set) => set.isCompleted);\n}\n\nexport function Progress_hasCompletedSetsForProgramExerciseId(progress: IHistoryRecord, key: string): boolean {\n  return progress.entries.some(\n    (entry) => entry.programExerciseId === key && !entry.changed && Progress_hasCompletedWork(entry)\n  );\n}\n\nexport function Progress_changeEquipment(\n  dispatch: IDispatch,\n  progressId: number,\n  entryIndex: number,\n  equipment: IEquipment\n): void {\n  updateState(\n    dispatch,\n    [Progress_lbProgress(progressId).p(\"entries\").i(entryIndex).p(\"exercise\").p(\"equipment\").record(equipment)],\n    \"Change equipment\"\n  );\n}\n\nexport function Progress_editNotes(dispatch: IDispatch, progressId: number, notes: string): void {\n  updateState(dispatch, [Progress_lbProgress(progressId).p(\"notes\").record(notes)], \"Edit workout notes\");\n}\n\nexport function Progress_getDayData(progress: IHistoryRecord): IDayData {\n  return {\n    day: progress.day,\n    week: progress.week,\n    dayInWeek: progress.dayInWeek,\n  };\n}\n\nexport function Progress_applyProgramExercise(\n  progressEntry: IHistoryEntry | undefined,\n  index: number,\n  programExercise: IPlannerProgramExerciseWithType,\n  settings: ISettings,\n  forceWarmupSets?: boolean\n): IHistoryEntry {\n  const variationIndex = PlannerProgramExercise_currentSetVariationIndex(programExercise);\n  const sets = programExercise.evaluatedSetVariations[variationIndex].sets;\n  const programExerciseWarmupSets = PlannerProgramExercise_programWarmups(programExercise, settings);\n\n  if (progressEntry != null) {\n    const newSetsNum = Math.max(progressEntry.sets.length, sets.length);\n    const newSets: ISet[] = [];\n    for (let i = 0; i < newSetsNum; i++) {\n      const progressSet: ISet | undefined = progressEntry.sets[i] as ISet | undefined;\n      const programSet = sets[i];\n      if (!!progressSet?.isCompleted) {\n        newSets.push(progressSet);\n      } else if (programSet != null) {\n        const originalWeight = programSet.weight;\n        const weight = ProgramSet_getEvaluatedWeight(programSet, programExercise.exerciseType, settings);\n        newSets.push({\n          ...progressSet,\n          id: progressSet?.id ?? UidFactory_generateUid(6),\n          vtype: \"set\",\n          index: newSets.length,\n          reps: programSet.maxrep,\n          minReps: programSet.minrep,\n          rpe: programSet.rpe,\n          isUnilateral: Exercise_getIsUnilateral(programExercise.exerciseType, settings),\n          originalWeight,\n          weight,\n          isAmrap: programSet.isAmrap,\n          logRpe: programSet.logRpe,\n          label: programSet.label,\n          timer: programSet.timer,\n          setTimer: programSet.setTimer,\n          isOverflowSetTimer: programSet.isOverflowSetTimer,\n          auto: programSet.auto,\n          askWeight: programSet.askWeight,\n        });\n      }\n    }\n    let newWarmupSets = progressEntry.warmupSets;\n    if (progressEntry.warmupSets.every((w) => !w.isCompleted)) {\n      const firstWeight = newSets[0]?.weight;\n      forceWarmupSets = forceWarmupSets || Reps_isEmpty(newSets);\n      if (forceWarmupSets) {\n        const generated =\n          firstWeight != null\n            ? Exercise_getWarmupSets(programExercise.exerciseType, firstWeight, settings, programExerciseWarmupSets)\n            : [];\n        newWarmupSets = generated.map((ws, i) => ({\n          ...ws,\n          id: progressEntry.warmupSets[i]?.id ?? ws.id,\n        }));\n      } else {\n        newWarmupSets = progressEntry.warmupSets;\n      }\n    }\n\n    return {\n      ...progressEntry,\n      exercise: progressEntry.changed ? progressEntry.exercise : programExercise.exerciseType,\n      warmupSets: newWarmupSets,\n      sets: newSets,\n    };\n  } else {\n    const newSets = sets.map((set, i) => {\n      const weight = ProgramSet_getEvaluatedWeight(set, programExercise.exerciseType, settings);\n      return {\n        vtype: \"set\" as const,\n        id: UidFactory_generateUid(6),\n        index: i,\n        reps: set.maxrep,\n        minReps: set.minrep,\n        originalWeight: set.weight,\n        isUnilateral: Exercise_getIsUnilateral(programExercise.exerciseType, settings),\n        weight,\n        rpe: set.rpe,\n        logRpe: set.logRpe,\n        isAmrap: set.isAmrap,\n        label: set.label,\n        timer: set.timer,\n        setTimer: set.setTimer,\n        isOverflowSetTimer: set.isOverflowSetTimer,\n        auto: set.auto,\n        askWeight: set.askWeight,\n      };\n    });\n    const firstWeight = newSets[0]?.weight;\n\n    return {\n      vtype: \"history_entry\",\n      index,\n      id: Progress_getEntryId(programExercise.exerciseType, programExercise.label),\n      exercise: programExercise.exerciseType,\n      programExerciseId: programExercise.key,\n      sets: newSets,\n      warmupSets:\n        firstWeight != null\n          ? Exercise_getWarmupSets(programExercise.exerciseType, firstWeight, settings, programExerciseWarmupSets)\n          : [],\n    };\n  }\n}\n\nexport function Progress_getEntryId(exerciseType: IExerciseType, label?: string): string {\n  return CollectionUtils_compact([label, Exercise_toKey(exerciseType)]).join(\"_\");\n}\n\nexport interface IApplyProgramDayOptions {\n  // Restricts the pass to these exercises. Callers that pass it mean \"just re-apply these\" (equipment, exercise\n  // data), so they never get structural work.\n  programExerciseIds?: string[];\n  // The day's keys in canonical order *before* the program changed, from `Program_getDayExerciseKeys`. Structure\n  // is reconciled against this rather than against the entries alone: whether an exercise the day contains but\n  // the workout lacks was never added or was removed by the user is only answerable by diffing the two programs.\n  // Absent (fresh boot, restore, non-program change) means no structural work.\n  oldDayKeys?: string[];\n  // Only read when inserting — a newly added exercise runs its update script the same way a freshly started\n  // workout would, and that reads bodyweight.\n  stats?: IStats;\n}\n\n// The entry list is the program day minus the user's overrides, recomputed from scratch each time. Every step is\n// a function of (entries, oldDayKeys, newDayKeys), so applying the same program change twice is a no-op — the\n// listener can fire more than once for one logical edit, and a second pass must not insert a second copy.\nfunction reconcileStructure(\n  progress: IHistoryRecord,\n  program: IEvaluatedProgram,\n  day: number,\n  settings: ISettings,\n  oldDayKeys: string[],\n  stats: IStats\n): IHistoryEntry[] {\n  const dayExercises = Program_getDayExercisesInOrder(program, day);\n  const newDayKeys = dayExercises.map((e) => e.key);\n\n  // An exercise the day has but the workout doesn't is either one the user removed or one that was just added,\n  // and only the diff can tell them apart. Removals therefore need nothing recorded on the record.\n  const kept = progress.entries.filter(\n    (entry) =>\n      entry.programExerciseId == null ||\n      entry.changed ||\n      newDayKeys.indexOf(entry.programExerciseId) !== -1 ||\n      Progress_hasCompletedWork(entry)\n  );\n\n  const entries = [...kept];\n  const dayData = Program_getDayData(program, day);\n  for (const exercise of dayExercises) {\n    if (oldDayKeys.indexOf(exercise.key) !== -1) {\n      continue;\n    }\n    if (entries.some((e) => e.programExerciseId === exercise.key)) {\n      continue;\n    }\n    // Placed after whatever its program predecessor turned into, walking back past exercises the workout doesn't\n    // have: an added line asserts a position relative to its neighbors, not a re-sort of the whole day.\n    let at = 0;\n    for (let i = newDayKeys.indexOf(exercise.key) - 1; i >= 0; i -= 1) {\n      const predecessor = entries.findIndex((e) => e.programExerciseId === newDayKeys[i]);\n      if (predecessor !== -1) {\n        at = predecessor + 1;\n        break;\n      }\n    }\n    entries.splice(at, 0, Program_nextHistoryEntry(program, dayData, at, exercise, stats, settings));\n  }\n\n  const commonBefore = oldDayKeys.filter((key) => newDayKeys.indexOf(key) !== -1);\n  const commonAfter = newDayKeys.filter((key) => oldDayKeys.indexOf(key) !== -1);\n  const isReordered =\n    commonBefore.length !== commonAfter.length || commonBefore.some((key, i) => key !== commonAfter[i]);\n  if (!isReordered) {\n    return entries;\n  }\n  // Adhoc entries and orphans kept for their logged sets have no position of their own, so they take their\n  // predecessor's and ride along with it — someone who added an accessory right after Squat meant it to be there.\n  // Entries ahead of the first program exercise stay at the front.\n  let inherited = -1;\n  const sortKeys = entries.map((entry) => {\n    const own = entry.programExerciseId != null ? newDayKeys.indexOf(entry.programExerciseId) : -1;\n    if (own !== -1) {\n      inherited = own;\n    }\n    return own !== -1 ? own : inherited;\n  });\n  return entries\n    .map((entry, index) => ({ entry, index, sortKey: sortKeys[index] }))\n    .sort((a, b) => (a.sortKey !== b.sortKey ? a.sortKey - b.sortKey : a.index - b.index))\n    .map((e) => e.entry);\n}\n\nexport function Progress_applyProgramDay(\n  progress: IHistoryRecord,\n  program: IEvaluatedProgram,\n  day: number,\n  settings: ISettings,\n  options?: IApplyProgramDayOptions\n): IHistoryRecord {\n  const programExerciseIds = options?.programExerciseIds;\n  const programDay = Program_getProgramDay(program, day);\n  if (!programDay) {\n    return progress;\n  }\n  // A caller that named exercises means \"just re-apply these\" and never gets structural work.\n  const structural =\n    programExerciseIds == null && options?.oldDayKeys != null\n      ? reconcileStructure(progress, program, day, settings, options.oldDayKeys, options.stats ?? Stats_getEmpty())\n      : undefined;\n  const reindexed = structural != null ? Progress_reindexEntries(progress, structural) : progress;\n  const newEntries = reindexed.entries.map((entry, index) => {\n    if (entry.programExerciseId == null) {\n      return entry;\n    }\n    if (programExerciseIds != null && !programExerciseIds.includes(entry.programExerciseId)) {\n      return entry;\n    }\n    const programExercise = Program_getProgramExerciseForKeyAndDay(program, day, entry.programExerciseId);\n    if (!programExercise) {\n      return entry;\n    }\n    return Progress_applyProgramExercise(entry, index, programExercise, settings, false);\n  });\n\n  return { ...reindexed, entries: newEntries };\n}\n\nexport function Progress_changeAmrapAction(\n  effects: INativeEffect[],\n  settings: ISettings,\n  stats: IStats,\n  progress: IHistoryRecord,\n  action: IChangeAMRAPAction,\n  subscription: ISubscription | undefined,\n  onError?: IScriptErrorHandler\n): IHistoryRecord {\n  let newProgress = { ...progress };\n  if (\n    action.amrapValue == null &&\n    action.amrapLeftValue == null &&\n    action.rpeValue == null &&\n    action.weightValue == null &&\n    ObjectUtils_keys(action.userVars || {}).length === 0\n  ) {\n    return { ...newProgress, amrapModal: undefined };\n  }\n  if (action.amrapValue != null) {\n    newProgress = Progress_updateAmrapRepsInExercise(newProgress, action.amrapValue);\n  }\n  if (action.amrapLeftValue != null) {\n    newProgress = Progress_updateAmrapRepsLeftInExercise(newProgress, action.amrapLeftValue);\n  }\n  if (action.logRpe) {\n    newProgress = Progress_updateRpeInExercise(newProgress, action.rpeValue);\n  }\n  if (action.weightValue != null) {\n    newProgress = Progress_updateWeightInExercise(newProgress, action.weightValue);\n  }\n  const programExerciseId = action.programExercise?.key;\n  if (ObjectUtils_keys(action.userVars || {}).length > 0 && programExerciseId != null) {\n    newProgress = Progress_updateUserPromptedStateVars(newProgress, programExerciseId, action.userVars || {});\n  }\n  newProgress = Progress_completeAmrapSet(newProgress, action.entryIndex, action.setIndex, settings);\n  if (action.programExercise) {\n    newProgress = Progress_runUpdateScript(\n      newProgress,\n      action.programExercise,\n      action.otherStates || {},\n      action.entryIndex,\n      action.setIndex,\n      \"workout\",\n      settings,\n      stats,\n      onError\n    );\n  }\n  if (Progress_isFullyEmptyOrFinishedSet(newProgress)) {\n    newProgress = Progress_stopTimer(effects, newProgress);\n  }\n  newProgress = Progress_maybeApplySuperset(newProgress, action.entryIndex, \"workout\");\n  // A timed set keeps its set-timer modal open behind the amrap modal (see Progress_proceedAfterTimedSet).\n  // If it was recorded via \"Log & keep timing\" (keepTiming), leave the clock running and don't start rest;\n  // otherwise close the banner and start the deferred rest. For non-timed sets setTimerModal is already\n  // undefined, so this is just the normal rest start.\n  const amrapSetTimerModal = newProgress.setTimer;\n  // Clearing the countdown too is not redundant. A field-by-field merge can legally leave both phase fields\n  // set, and Progress_getActiveSetTimer only *prefers* the work clock — it never repairs the record. Drop\n  // the work clock alone and the stale countdown becomes active again, reopening for a set just resolved.\n  if (amrapSetTimerModal?.keepTiming) {\n    newProgress = {\n      ...newProgress,\n      setTimer: { ...amrapSetTimerModal, keepTiming: undefined },\n      setTimerGetReady: undefined,\n    };\n  } else {\n    newProgress = { ...newProgress, setTimer: undefined, setTimerGetReady: undefined };\n    // Intentionally \"now\", NOT backdated to the clock end like Progress_proceedAfterTimedSet does (see\n    // time-based-exercises.md §5.2). The time spent in the AMRAP modal is data entry, not rest — backdating\n    // would count it as elapsed rest and a short rest could be over the instant the user submits.\n    // The playground has no rest timers (matches Progress_proceedAfterTimedSet + normal-set completion).\n    if (!action.isPlayground) {\n      newProgress = Progress_startTimer(\n        effects,\n        newProgress,\n        new Date().getTime(),\n        \"workout\",\n        action.entryIndex,\n        action.setIndex,\n        settings,\n        subscription\n      );\n    }\n  }\n  newProgress.intervals = History_resumeWorkout(\n    effects,\n    newProgress,\n    action.isPlayground,\n    settings.timers.reminder,\n    subscription != null && Subscriptions_hasSubscription(subscription)\n  );\n  LiveActivityManager_updateLiveActivityForNextEntry(\n    effects,\n    newProgress,\n    action.entryIndex,\n    \"workout\",\n    action.programExercise,\n    settings,\n    subscription\n  );\n  return { ...newProgress, amrapModal: undefined };\n}\n\nexport interface ITimedSetDurations {\n  left?: number;\n  right?: number;\n}\n\n// Takes explicit durations rather than deriving them from the clock: a completed `auto` set backdates the\n// next set's clock into the future, so Date.now() against it went negative and recorded [25, -25, 0].\nexport function Progress_settleTimedSet(\n  effects: INativeEffect[],\n  settings: ISettings,\n  stats: IStats,\n  progress: IHistoryRecord,\n  entryIndex: number,\n  setIndex: number,\n  mode: IProgressMode,\n  durations: ITimedSetDurations,\n  ctx: {\n    programExercise?: IPlannerProgramExercise;\n    otherStates?: IByExercise<IProgramState>;\n    subscription?: ISubscription;\n    isPlayground?: boolean;\n  },\n  onError?: IScriptErrorHandler\n): IHistoryRecord {\n  let current = progress;\n  for (let pass = 0; pass < 4; pass += 1) {\n    const phase = Progress_getActiveSetTimer(current);\n    if (phase == null || phase.entryIndex !== entryIndex || phase.setIndex !== setIndex) {\n      return current;\n    }\n    if (phase.phase === \"getReady\") {\n      current = Progress_startSetTimerWork(current, phase.startedAt);\n      continue;\n    }\n    const setsKey = mode === \"warmup\" ? \"warmupSets\" : \"sets\";\n    const set = current.entries[entryIndex]?.[setsKey][setIndex];\n    if (set == null) {\n      return current;\n    }\n    const reported = phase.side === \"left\" ? durations.left : durations.right;\n    current = Progress_completeSetAction(\n      effects,\n      settings,\n      stats,\n      current,\n      {\n        type: \"CompleteSetAction\",\n        entryIndex,\n        setIndex,\n        mode,\n        programExercise: ctx.programExercise,\n        otherStates: ctx.otherStates,\n        forceUpdateEntryIndex: false,\n        isExternal: true,\n        isPlayground: ctx.isPlayground ?? false,\n        recordedSeconds: reported ?? TimedSet_recordedFor(set, phase.side) ?? set.setTimer,\n      },\n      ctx.subscription,\n      onError\n    );\n    const after = current.entries[entryIndex]?.[setsKey][setIndex];\n    if (after == null || TimedSet_recordedFor(after, phase.side) == null) {\n      return current;\n    }\n  }\n  return current;\n}\n\nexport function Progress_completeSetAction(\n  effects: INativeEffect[],\n  settings: ISettings,\n  stats: IStats,\n  progress: IHistoryRecord,\n  action: ICompleteSetAction,\n  subscription: ISubscription | undefined,\n  onError?: IScriptErrorHandler\n): IHistoryRecord {\n  const setTimerModal = progress.setTimer;\n  const wasSetTimerOpen =\n    action.mode === \"workout\" &&\n    setTimerModal != null &&\n    setTimerModal.entryIndex === action.entryIndex &&\n    setTimerModal.setIndex === action.setIndex;\n  const countdown = progress.setTimerGetReady;\n  if (\n    action.mode === \"workout\" &&\n    !wasSetTimerOpen &&\n    countdown != null &&\n    countdown.entryIndex === action.entryIndex &&\n    countdown.setIndex === action.setIndex\n  ) {\n    return progress;\n  }\n  // A Stop/Log tap from the set-timer banner (keepSetTimerRunning is set only by those) is a deferred user\n  // action — if the clock already auto-completed, advanced, or closed just before the event landed, the banner\n  // is stale and completing here would fall through to normal toggling and flip an already-completed set back\n  // off. Thunk_recordSetTimer guards this before dispatching; the playground dispatches directly, so guard here\n  // too (safe for every path: the thunk/watch already pre-check, and auto-fires don't set keepSetTimerRunning).\n  if (action.keepSetTimerRunning != null && !wasSetTimerOpen) {\n    return progress;\n  }\n  const oldSet = progress.entries[action.entryIndex][action.mode === \"warmup\" ? \"warmupSets\" : \"sets\"][action.setIndex];\n  const timedSide = setTimerModal?.side ?? \"bilateral\";\n  const recordedThisSide = TimedSet_recordedFor(oldSet, timedSide);\n\n  if (wasSetTimerOpen && setTimerModal != null && timedSide === \"left\") {\n    const recorded =\n      recordedThisSide ?? action.recordedSeconds ?? Math.round((Date.now() - setTimerModal.startedAt) / 1000);\n    let banked = lf(progress)\n      .p(\"entries\")\n      .i(action.entryIndex)\n      .p(\"sets\")\n      .i(action.setIndex)\n      .p(\"completedSetTimerLeft\")\n      .set(recorded);\n    if (!action.keepSetTimerRunning) {\n      const target = oldSet.setTimer;\n      const reachedTarget =\n        target != null && !oldSet.isOverflowSetTimer && Date.now() - setTimerModal.startedAt >= target * 1000;\n      const endedAt = reachedTarget ? setTimerModal.startedAt + target * 1000 : Date.now();\n      const handedOff = Progress_handOffToOtherSide(\n        banked,\n        action.entryIndex,\n        action.setIndex,\n        settings,\n        endedAt,\n        setTimerModal.nonce,\n        action.isPlayground\n      );\n      if (handedOff === banked) {\n        return Progress_completeSetAction(\n          effects,\n          settings,\n          stats,\n          { ...banked, setTimer: undefined, setTimerGetReady: undefined },\n          { ...action, keepSetTimerRunning: undefined, recordedSeconds: undefined },\n          subscription,\n          onError\n        );\n      }\n      banked = handedOff;\n    }\n    LiveActivityManager_updateLiveActivityForNextEntry(\n      effects,\n      banked,\n      action.entryIndex,\n      action.mode,\n      action.programExercise,\n      settings,\n      subscription\n    );\n    return banked;\n  }\n\n  // Stopping the clock on a set that's already logged (e.g. after \"Log & keep timing\"): just update the\n  // recorded time and close/keep the banner — don't run completion, which would toggle the set off.\n  if (wasSetTimerOpen && setTimerModal != null && oldSet.isCompleted) {\n    const recorded =\n      recordedThisSide ?? action.recordedSeconds ?? Math.round((Date.now() - setTimerModal.startedAt) / 1000);\n    let stopped = lf(progress)\n      .p(\"entries\")\n      .i(action.entryIndex)\n      .p(\"sets\")\n      .i(action.setIndex)\n      .p(\"completedSetTimer\")\n      .set(recorded);\n    if (!action.keepSetTimerRunning) {\n      stopped = Progress_proceedAfterTimedSet(\n        effects,\n        stopped,\n        action.entryIndex,\n        action.setIndex,\n        settings,\n        subscription,\n        action.isPlayground\n      );\n    }\n    stopped.intervals = History_resumeWorkout(\n      effects,\n      stopped,\n      action.isPlayground,\n      settings.timers.reminder,\n      subscription != null && Subscriptions_hasSubscription(subscription)\n    );\n    LiveActivityManager_updateLiveActivityForNextEntry(\n      effects,\n      stopped,\n      action.entryIndex,\n      action.mode,\n      action.programExercise,\n      settings,\n      subscription\n    );\n    return stopped;\n  }\n\n  // Completing a timed set from its running clock: record the elapsed time first (derived from when the\n  // clock started, unless the surface passed an explicit recordedSeconds).\n  if (wasSetTimerOpen && setTimerModal != null && !oldSet.isCompleted && recordedThisSide == null) {\n    const recorded = action.recordedSeconds ?? Math.round((Date.now() - setTimerModal.startedAt) / 1000);\n    progress = lf(progress)\n      .p(\"entries\")\n      .i(action.entryIndex)\n      .p(\"sets\")\n      .i(action.setIndex)\n      .p(\"completedSetTimer\")\n      .set(recorded);\n  }\n\n  const hasUserPromptedVars = action.programExercise && ProgramExercise_hasUserPromptedVars(action.programExercise);\n  let newProgress = Progress_completeSet(\n    progress,\n    action.entryIndex,\n    action.setIndex,\n    action.mode,\n    !!hasUserPromptedVars,\n    settings,\n    action.isPlayground\n  );\n  const newSet =\n    newProgress.entries[action.entryIndex][action.mode === \"warmup\" ? \"warmupSets\" : \"sets\"][action.setIndex];\n  const didFinish = !oldSet.isCompleted && newSet.isCompleted;\n  // First tap on a timed set just opened its clock (see Progress_completeSet) — nothing is completed\n  // yet, so skip the completion side-effects and only refresh the live activity to show the timer.\n  const startedTimer = Progress_getActiveSetTimer(newProgress);\n  const justStartedSetTimer =\n    !wasSetTimerOpen &&\n    !newSet.isCompleted &&\n    startedTimer?.entryIndex === action.entryIndex &&\n    startedTimer?.setIndex === action.setIndex;\n  if (justStartedSetTimer) {\n    // Starting this set's clock means the previous set's rest is over — stop it (and cancel its pending\n    // \"rest is over\" notification) so it doesn't fire in the middle of this set's clock.\n    if (newProgress.timerSince != null) {\n      newProgress = Progress_stopTimer(effects, newProgress);\n    }\n    LiveActivityManager_updateLiveActivityForNextEntry(\n      effects,\n      newProgress,\n      action.entryIndex,\n      action.mode,\n      action.programExercise,\n      settings,\n      subscription\n    );\n    return newProgress;\n  }\n  if (action.programExercise && !newProgress.amrapModal) {\n    newProgress = Progress_runUpdateScript(\n      newProgress,\n      action.programExercise,\n      action.otherStates || {},\n      action.entryIndex,\n      action.setIndex,\n      action.mode,\n      settings,\n      stats,\n      onError\n    );\n  }\n\n  if (Progress_isFullyEmptyOrFinishedSet(newProgress)) {\n    newProgress = Progress_stopTimer(effects, newProgress);\n  }\n  if (didFinish) {\n    newProgress = Progress_maybeApplySuperset(newProgress, action.entryIndex, action.mode);\n  }\n  // Non-timed sets start their rest timer here. Timed sets defer it to Progress_proceedAfterTimedSet\n  // (below) so a set logged via \"Log & keep timing\" doesn't start resting while its clock still runs.\n  if (!action.isPlayground && newSet.setTimer == null) {\n    newProgress = Progress_startTimer(\n      effects,\n      newProgress,\n      new Date().getTime(),\n      action.mode,\n      action.entryIndex,\n      action.setIndex,\n      settings,\n      subscription\n    );\n  }\n  // After a timed set is recorded+completed from its clock, advance to the next timed set or close the\n  // banner and start rest — the one place that decision lives. \"Log & keep timing\" skips it.\n  if (wasSetTimerOpen && !action.keepSetTimerRunning) {\n    newProgress = Progress_proceedAfterTimedSet(\n      effects,\n      newProgress,\n      action.entryIndex,\n      action.setIndex,\n      settings,\n      subscription,\n      action.isPlayground\n    );\n  } else if (\n    wasSetTimerOpen &&\n    action.keepSetTimerRunning &&\n    newProgress.amrapModal != null &&\n    newProgress.setTimer != null\n  ) {\n    // Recorded via \"Log & keep timing\" and the AMRAP modal opened on top: mark the clock so it survives\n    // the AMRAP resolution (Progress_changeAmrapAction would otherwise close it).\n    newProgress = {\n      ...newProgress,\n      setTimer: { ...newProgress.setTimer, keepTiming: true },\n    };\n  }\n  newProgress.intervals = History_resumeWorkout(\n    effects,\n    newProgress,\n    action.isPlayground,\n    settings.timers.reminder,\n    subscription != null && Subscriptions_hasSubscription(subscription)\n  );\n  LiveActivityManager_updateLiveActivityForNextEntry(\n    effects,\n    newProgress,\n    action.entryIndex,\n    action.mode,\n    action.programExercise,\n    settings,\n    subscription\n  );\n  // The pager scrolls only on a flip of this flag; the superset advance above moves currentEntryIndex\n  // without one, and timed-set completions dispatch with the flag off, so the thumbnail moved while the\n  // card stayed. An EMOM advance already flipped it — flip exactly once.\n  const entryChanged = (newProgress.currentEntryIndex ?? 0) !== (progress.currentEntryIndex ?? 0);\n  const alreadyFlipped = !!newProgress.ui?.forceUpdateEntryIndex !== !!progress.ui?.forceUpdateEntryIndex;\n  if ((action.forceUpdateEntryIndex || entryChanged) && !alreadyFlipped) {\n    newProgress = {\n      ...newProgress,\n      ui: { ...newProgress.ui, forceUpdateEntryIndex: !newProgress.ui?.forceUpdateEntryIndex },\n    };\n  }\n  if (action.isExternal) {\n    newProgress = {\n      ...newProgress,\n      ui: { ...newProgress.ui, isExternal: true },\n    };\n  }\n  return newProgress;\n}\n\nexport function Progress_forceUpdateEntryIndex(dispatch: IDispatch): void {\n  updateProgress(\n    dispatch,\n    [\n      lb<IHistoryRecord>()\n        .pi(\"ui\", {})\n        .p(\"forceUpdateEntryIndex\")\n        .recordModify((v) => !v),\n    ],\n    \"Force update entry index\"\n  );\n}\n\nexport function Progress_finishWorkout(\n  effects: INativeEffect[],\n  storage: IStorage,\n  progress: IHistoryRecord,\n  healthSync: boolean\n): IStorage {\n  const settings = storage.settings;\n  const programIndex = storage.programs.findIndex((p) => p.id === progress.programId)!;\n  const program = progress.programId === emptyProgramId ? Program_createEmptyProgram() : storage.programs[programIndex];\n  const evaluatedProgram = program ? Program_evaluate(program, settings) : undefined;\n  Progress_stopTimer(effects, progress);\n  const historyRecord = History_finishProgramDay(\n    progress,\n    storage.settings,\n    progress.day,\n    evaluatedProgram,\n    storage.stats\n  );\n  let newHistory;\n  if (!Progress_isCurrent(progress)) {\n    newHistory = storage.history.map((h) => (h.id === progress.id ? historyRecord : h));\n  } else {\n    newHistory = [historyRecord, ...storage.history];\n  }\n  const exerciseData = storage.settings.exerciseData;\n  const { program: newProgram, exerciseData: newExerciseData } =\n    Progress_isCurrent(progress) && program != null\n      ? Program_runAllFinishDayScripts(program, progress, storage.stats, settings)\n      : { program, exerciseData };\n  const newPrograms = newProgram != null ? lf(storage.programs).i(programIndex).set(newProgram) : storage.programs;\n  const newSettingsExerciseData = deepmerge(storage.settings.exerciseData, newExerciseData);\n  return {\n    ...storage,\n    progress: Progress_isCurrent(progress) ? [] : storage.progress,\n    history: newHistory,\n    workoutOutcomes: Progress_isCurrent(progress)\n      ? WorkoutOutcome_add(storage.workoutOutcomes, {\n          id: historyRecord.id,\n          outcome: \"finish\",\n          healthSync,\n          endTime: historyRecord.endTime ?? Date.now(),\n        })\n      : storage.workoutOutcomes,\n    programs: newPrograms,\n    settings: {\n      ...storage.settings,\n      exerciseData: newSettingsExerciseData,\n    },\n  };\n}\n","import type { INativeTimerStartParams } from \"../utils/timerBridge\";\n\nexport interface IWebPushSubscription {\n  endpoint: string;\n  keys: { p256dh: string; auth: string };\n}\n\nexport interface IRestTimerAlert {\n  endsAtMs: number;\n  subscription: IWebPushSubscription;\n  title: string;\n  body: string;\n}\n\nexport interface IRestTimerPushRequest {\n  issuedAtMs: number;\n  alert: IRestTimerAlert | null;\n}\n\nexport type IRestTimerAlertStatus = \"install\" | \"unsupported\" | \"blocked\" | \"on\" | \"off\";\n\nexport interface IRestTimerAlertBrowserState {\n  hasPushManager: boolean;\n  isStandalone: boolean;\n  permission: \"default\" | \"granted\" | \"denied\";\n  hasSubscription: boolean;\n}\n\nexport function RestTimerAlert_text(params: INativeTimerStartParams): { title: string; body: string } {\n  const lines = [params.subtitle, `${params.bodyHeader}: ${params.body}`].filter((line) => line !== \"\");\n  return { title: params.title, body: lines.join(\"\\n\") };\n}\n\nexport function RestTimerAlert_request(\n  params: INativeTimerStartParams | undefined,\n  subscription: IWebPushSubscription | undefined,\n  issuedAtMs: number\n): IRestTimerPushRequest {\n  if (params == null || subscription == null) {\n    return { issuedAtMs, alert: null };\n  }\n  return {\n    issuedAtMs,\n    alert: {\n      endsAtMs: params.timerSinceMs + params.timerSeconds * 1000,\n      subscription,\n      ...RestTimerAlert_text(params),\n    },\n  };\n}\n\nexport function RestTimerAlert_status(state: IRestTimerAlertBrowserState): IRestTimerAlertStatus {\n  if (!state.hasPushManager) {\n    return state.isStandalone ? \"unsupported\" : \"install\";\n  }\n  if (state.permission === \"denied\") {\n    return \"blocked\";\n  }\n  return state.hasSubscription ? \"on\" : \"off\";\n}\n\nexport function RestTimerAlert_label(status: IRestTimerAlertStatus): string {\n  switch (status) {\n    case \"install\":\n      return \"Add to Home Screen first\";\n    case \"unsupported\":\n      return \"Not supported\";\n    case \"blocked\":\n      return \"Blocked in Settings\";\n    case \"on\":\n      return \"On\";\n    case \"off\":\n      return \"Off\";\n  }\n}\n\nexport function RestTimerAlert_tapAction(status: IRestTimerAlertStatus): \"subscribe\" | \"unsubscribe\" | \"none\" {\n  if (status === \"off\") {\n    return \"subscribe\";\n  }\n  return status === \"on\" ? \"unsubscribe\" : \"none\";\n}\n","export interface IRestTimerProgress {\n  elapsedMs: number;\n  remainingMs: number;\n  fraction: number;\n  isTimeOut: boolean;\n}\n\nexport function RestTimerProgress_at(timerSince: number, timerSeconds: number, now: number): IRestTimerProgress {\n  const totalMs = timerSeconds * 1000;\n  const elapsedMs = Math.max(0, now - timerSince);\n  const remainingMs = Math.max(0, totalMs - elapsedMs);\n  const fraction = totalMs <= 0 ? 1 : Math.min(1, elapsedMs / totalMs);\n  return { elapsedMs, remainingMs, fraction, isTimeOut: elapsedMs > totalMs };\n}\n","// Advance widths from Poppins-Bold.ttf hmtx, in em: \"4\" is the widest digit, \":\" is fixed.\n// Poppins has no tabular-nums (tnum) feature, so fontVariant cannot do this.\nconst DIGIT_EM = 0.677;\nconst COLON_EM = 0.284;\n\nexport function RestTimerWidth_em(text: string): number {\n  let em = 0;\n  for (const char of text) {\n    em += char === \":\" ? COLON_EM : DIGIT_EM;\n  }\n  return em;\n}\n","import { IState } from \"./state\";\nimport { dequal } from \"dequal\";\nimport { Progress_isCurrent } from \"./progress\";\nimport { IFoodMeal, IStatsKey } from \"../types\";\nimport { Program_getProgram, Program_cleanPlannerProgram } from \"./program\";\nimport { ObjectUtils_isEqual } from \"../utils/object\";\nimport type { IFoodSearchResult } from \"./foodSearch\";\n\nexport type ITab = \"home\" | \"program\" | \"workout\" | \"graphs\" | \"me\" | \"food\";\n\nexport type IScreenData =\n  | { name: \"first\"; params?: Record<string, never> }\n  | { name: \"main\"; params?: { historyRecordId?: number } }\n  | { name: \"settings\"; params?: Record<string, never> }\n  | { name: \"account\"; params?: Record<string, never> }\n  | { name: \"timers\"; params?: Record<string, never> }\n  | { name: \"plates\"; params?: Record<string, never> }\n  | { name: \"gyms\"; params?: Record<string, never> }\n  | { name: \"programs\"; params?: Record<string, never> }\n  | { name: \"progress\"; params?: { id?: number } }\n  | { name: \"graphsList\"; params?: Record<string, never> }\n  | { name: \"finishDay\"; params?: { id?: number } }\n  | { name: \"muscles\"; params?: Record<string, never> }\n  | { name: \"muscleGroups\"; params?: Record<string, never> }\n  | { name: \"stats\"; params?: Record<string, never> }\n  | { name: \"units\"; params?: Record<string, never> }\n  | { name: \"appleHealth\"; params?: Record<string, never> }\n  | { name: \"googleHealth\"; params?: Record<string, never> }\n  | { name: \"editProgram\"; params: { programId: string } }\n  | { name: \"measurements\"; params?: { key: IStatsKey } }\n  | { name: \"sleepNutrition\"; params?: Record<string, never> }\n  | { name: \"subscription\"; params?: Record<string, never> }\n  | { name: \"exerciseStats\"; params?: Record<string, never> }\n  | { name: \"exercises\"; params?: Record<string, never> }\n  | { name: \"onerms\"; params?: Record<string, never> }\n  | { name: \"setupequipment\"; params?: Record<string, never> }\n  | { name: \"setupplates\"; params?: Record<string, never> }\n  | { name: \"hearaboutus\"; params?: Record<string, never> }\n  | { name: \"programselect\"; params?: Record<string, never> }\n  | { name: \"programPreview\"; params?: Record<string, never> }\n  | { name: \"apiKeys\"; params?: Record<string, never> }\n  | { name: \"recentImports\"; params?: Record<string, never> }\n  | { name: \"importPreview\"; params?: Record<string, never> }\n  | { name: \"food\"; params?: { date?: string } }\n  | { name: \"foodAdd\"; params: { date: string; meal: IFoodMeal; editTimestamp?: number } }\n  | { name: \"foodLibrary\"; params?: Record<string, never> }\n  | { name: \"foodItem\"; params: { id?: string; kind: \"food\" | \"recipe\"; prefill?: IFoodSearchResult } }\n  | { name: \"foodGoals\"; params?: Record<string, never> }\n  | { name: \"foodTemplates\"; params: { date: string; meal: IFoodMeal } };\n\nexport type IScreen = IScreenData[\"name\"];\nexport type IScreenParams<T extends IScreen> = Extract<IScreenData, { name: T }>[\"params\"];\n\nexport function Screen_shouldConfirmNavigation(state: IState, currentScreen: IScreenData): string | undefined {\n  const progressId = currentScreen.name === \"progress\" ? (currentScreen.params?.id ?? 0) : 0;\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  if (progress && !Progress_isCurrent(progress)) {\n    const oldHistoryRecord = state.storage.history.find((hr) => hr.id === progress.id);\n    const { ui: _ui, ...progressWithoutUi } = progress;\n    if (oldHistoryRecord != null && !dequal(oldHistoryRecord, progressWithoutUi)) {\n      return \"Are you sure? Changes won't be saved.\";\n    }\n  }\n\n  if (currentScreen.name === \"editProgram\") {\n    const programId = currentScreen.params?.programId;\n    const editProgramState = programId ? state.editProgramStates[programId] : undefined;\n    if (editProgramState) {\n      const currentProgram = Program_getProgram(state, editProgramState.current.program.id);\n      if (currentProgram != null && currentProgram.planner && editProgramState.current.program.planner) {\n        const oldCleanedProgram = Program_cleanPlannerProgram(currentProgram);\n        const newCleanedProgram = Program_cleanPlannerProgram(editProgramState.current.program);\n        if (!ObjectUtils_isEqual(oldCleanedProgram.planner!, newCleanedProgram.planner!)) {\n          return \"Are you sure? Your program changes won't be saved.\";\n        }\n      }\n    }\n  }\n\n  return undefined;\n}\n\nexport function Screen_isSameTab(prev: IScreen, next: IScreen): boolean {\n  return Screen_tab(prev) === Screen_tab(next);\n}\n\nexport function Screen_tab(screen: IScreen): ITab {\n  switch (screen) {\n    case \"main\": {\n      return \"home\";\n    }\n    case \"settings\": {\n      return \"me\";\n    }\n    case \"account\": {\n      return \"me\";\n    }\n    case \"timers\": {\n      return \"me\";\n    }\n    case \"plates\": {\n      return \"me\";\n    }\n    case \"appleHealth\": {\n      return \"me\";\n    }\n    case \"googleHealth\": {\n      return \"me\";\n    }\n    case \"gyms\": {\n      return \"me\";\n    }\n    case \"exercises\": {\n      return \"me\";\n    }\n    case \"programs\": {\n      return \"program\";\n    }\n    case \"progress\": {\n      return \"workout\";\n    }\n    case \"graphsList\": {\n      return \"graphs\";\n    }\n    case \"finishDay\": {\n      return \"workout\";\n    }\n    case \"muscles\": {\n      return \"workout\";\n    }\n    case \"muscleGroups\": {\n      return \"me\";\n    }\n    case \"stats\": {\n      return \"me\";\n    }\n    case \"editProgram\": {\n      return \"program\";\n    }\n    case \"measurements\": {\n      return \"me\";\n    }\n    case \"sleepNutrition\": {\n      return \"me\";\n    }\n    case \"subscription\": {\n      return \"workout\";\n    }\n    case \"exerciseStats\": {\n      return \"me\";\n    }\n    case \"programPreview\": {\n      return \"program\";\n    }\n    case \"first\": {\n      return \"program\";\n    }\n    case \"onerms\": {\n      return \"program\";\n    }\n    case \"setupequipment\": {\n      return \"program\";\n    }\n    case \"setupplates\": {\n      return \"program\";\n    }\n    case \"hearaboutus\": {\n      return \"program\";\n    }\n    case \"programselect\": {\n      return \"program\";\n    }\n    case \"units\": {\n      return \"program\";\n    }\n    case \"apiKeys\": {\n      return \"me\";\n    }\n    case \"recentImports\": {\n      return \"me\";\n    }\n    case \"importPreview\": {\n      return \"me\";\n    }\n    case \"food\":\n    case \"foodAdd\":\n    case \"foodLibrary\":\n    case \"foodItem\":\n    case \"foodGoals\":\n    case \"foodTemplates\": {\n      return \"food\";\n    }\n  }\n}\n","import { CollectionUtils_groupBy, CollectionUtils_inGroupsOf } from \"../utils/collection\";\nimport {\n  Weight_display,\n  Weight_eqNull,\n  Weight_gte,\n  Weight_print,\n  Weight_printNull,\n  Weight_multiply,\n  Weight_build,\n  Weight_convertTo,\n  Weight_add,\n  Weight_is,\n} from \"./weight\";\nimport { ISet, IHistoryRecord, IHistoryEntry, IWeight, IUnit } from \"../types\";\nimport { ObjectUtils_clone } from \"../utils/object\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { Progress_getNextEntry } from \"./progress\";\n\nexport type IProgramReps = number;\n\nexport type ISetsStatus = \"success\" | \"in-range\" | \"failed\" | \"not-finished\";\n\nexport interface IDisplaySet {\n  dimReps?: boolean;\n  dimRpe?: boolean;\n  dimWeight?: boolean;\n  dimTimer?: boolean;\n  reps: string;\n  weight?: string;\n  rpe?: string;\n  askWeight?: boolean;\n  unit?: string;\n  isCompleted?: boolean;\n  isRpeFailed?: boolean;\n  isInRange?: boolean;\n  timer?: number;\n  setTimer?: number;\n  setTimerLeft?: number;\n  isOverflowSetTimer?: boolean;\n  auto?: boolean;\n}\n\nexport function Reps_display(sets: ISet[], isNext: boolean = false): string {\n  if (Reps_areSameReps(sets, isNext)) {\n    return `${sets.length}x${sets[0].completedReps || sets[0].reps}`;\n  } else {\n    const arr = sets.map((s) => (isNext ? Reps_displayReps(s) : Reps_displayCompletedReps(s)));\n    const groups = CollectionUtils_inGroupsOf(5, arr);\n    return groups.map((g) => g.join(\"/\")).join(\"/ \");\n  }\n}\n\nfunction isSameDisplaySet(a: IDisplaySet, b: IDisplaySet): boolean {\n  return (\n    a.reps === b.reps &&\n    a.weight === b.weight &&\n    a.rpe === b.rpe &&\n    a.askWeight === b.askWeight &&\n    a.timer === b.timer &&\n    a.setTimer === b.setTimer &&\n    a.setTimerLeft === b.setTimerLeft &&\n    a.isOverflowSetTimer === b.isOverflowSetTimer &&\n    a.auto === b.auto\n  );\n}\n\nexport function Reps_groupDisplaySets(displaySets: IDisplaySet[]): IDisplaySet[][] {\n  return CollectionUtils_groupBy(displaySets, (last, set) => {\n    return !isSameDisplaySet(last, set);\n  });\n}\n\nexport function Reps_setToDisplaySet(set: ISet, isNext: boolean, units: IUnit): IDisplaySet {\n  const completedOrRequiredWeight = set.completedWeight ?? set.weight;\n  return {\n    reps: isNext ? Reps_displayReps(set) : Reps_displayCompletedReps(set),\n    rpe: set.completedRpe?.toString() ?? set.rpe?.toString(),\n    weight: isNext\n      ? set.weight && set.originalWeight\n        ? Weight_display(set.weight, false)\n        : undefined\n      : completedOrRequiredWeight\n        ? Weight_display(completedOrRequiredWeight, false)\n        : undefined,\n    unit: completedOrRequiredWeight?.unit ?? units,\n    askWeight: set.askWeight,\n    isCompleted: Reps_isCompletedSet(set),\n    isRpeFailed: set.completedRpe != null && set.completedRpe > (set.rpe ?? 0),\n    isInRange: set.minReps != null ? set.completedReps != null && set.completedReps >= set.minReps : undefined,\n    setTimer: isNext ? set.setTimer : set.completedSetTimer,\n    setTimerLeft: isNext ? undefined : set.completedSetTimerLeft,\n    isOverflowSetTimer: isNext ? set.isOverflowSetTimer : undefined,\n    timer: isNext ? set.timer : undefined,\n    auto: set.auto,\n  };\n}\n\nfunction convertSetWeightsTo(set: ISet, unit: IUnit): ISet {\n  return {\n    ...set,\n    weight: set.weight ? Weight_convertTo(set.weight, unit) : undefined,\n    originalWeight: Weight_is(set.originalWeight) ? Weight_convertTo(set.originalWeight, unit) : set.originalWeight,\n    completedWeight: set.completedWeight ? Weight_convertTo(set.completedWeight, unit) : undefined,\n  };\n}\n\nexport function Reps_addSet(\n  sets: ISet[],\n  isUnilateral: boolean,\n  previousWorkoutSet?: ISet,\n  isWarmup?: boolean,\n  unit?: IUnit\n): ISet[] {\n  let lastSet =\n    sets[sets.length - 1] ??\n    (previousWorkoutSet && unit ? convertSetWeightsTo(previousWorkoutSet, unit) : previousWorkoutSet);\n  if (lastSet == null) {\n    lastSet = Reps_newSet(isUnilateral, 0);\n  } else {\n    if (isWarmup) {\n      lastSet = {\n        ...ObjectUtils_clone(lastSet),\n        reps: lastSet.completedReps ?? lastSet.reps,\n        weight: lastSet.completedWeight ?? lastSet.weight,\n      };\n    } else {\n      lastSet = {\n        ...ObjectUtils_clone(lastSet),\n        reps: lastSet.reps ?? lastSet.completedReps,\n        weight: lastSet.weight ?? lastSet.completedWeight,\n        originalWeight: lastSet.originalWeight ?? lastSet.weight ?? lastSet.completedWeight,\n        completedReps: undefined,\n        completedRepsLeft: undefined,\n        completedWeight: undefined,\n        completedRpe: undefined,\n        completedSetTimer: undefined,\n        completedSetTimerLeft: undefined,\n      };\n    }\n  }\n  const maxIndex = Math.max(-1, ...sets.map((s) => s.index || 0));\n\n  return [\n    ...sets,\n    { ...ObjectUtils_clone(lastSet), id: UidFactory_generateUid(6), isCompleted: false, index: maxIndex + 1 },\n  ];\n}\n\nexport function Reps_isSameSet(set1: ISet, set2: ISet): boolean {\n  return Weight_eqNull(set1.weight, set2.weight) && set1.completedReps === set2.completedReps && set1.rpe === set2.rpe;\n}\n\nexport function Reps_displayReps(set: ISet): string {\n  const reps = set.minReps != null ? `${set.minReps}-${set.reps ?? 0}` : `${set.reps ?? 0}`;\n  return set.isAmrap ? `${reps}+` : `${reps}`;\n}\n\nexport function Reps_displayCompletedReps(set: ISet): string {\n  return set.completedReps != null\n    ? `${set.completedRepsLeft != null ? `${set.completedRepsLeft}/` : \"\"}${set.completedReps}`\n    : \"-\";\n}\n\nexport function Reps_areSameReps(sets: ISet[], isNext: boolean): boolean {\n  const firstRep = sets[0]?.reps;\n  if (sets.length > 0) {\n    return sets.every(\n      (s) => (isNext ? s.reps : s.completedReps) != null && (isNext ? s.reps : s.completedReps) === firstRep\n    );\n  } else {\n    return false;\n  }\n}\n\nexport function Reps_isEmpty(sets: ISet[]): boolean {\n  return sets.every((s) => !s.isCompleted);\n}\n\nexport function Reps_newSet(isUnilateral: boolean, index: number): ISet {\n  return {\n    vtype: \"set\",\n    index,\n    id: UidFactory_generateUid(6),\n    originalWeight: undefined,\n    weight: undefined,\n    isUnilateral,\n    reps: undefined,\n    isAmrap: false,\n    askWeight: false,\n    isCompleted: false,\n  };\n}\n\nexport function Reps_isCompleted(sets: ISet[]): boolean {\n  return sets.length > 0 && sets.every((set) => Reps_isCompletedSet(set));\n}\n\nexport function Reps_setWarmupStatus(sets: ISet[]): ISetsStatus {\n  if (sets.length === 0) {\n    return \"not-finished\";\n  }\n  if (Reps_isFinished(sets)) {\n    return \"success\";\n  } else {\n    return \"not-finished\";\n  }\n}\n\nexport function Reps_setsStatus(sets: ISet[]): ISetsStatus {\n  if (Reps_isCompleted(sets)) {\n    return \"success\";\n  } else if (Reps_isInRangeCompleted(sets)) {\n    return \"in-range\";\n  } else if (!Reps_isFinished(sets)) {\n    return \"not-finished\";\n  } else {\n    return \"failed\";\n  }\n}\n\nexport function Reps_isCompletedSet(set: ISet): boolean {\n  if (set.completedReps != null && set.completedWeight != null) {\n    return (\n      !!set.isCompleted &&\n      (set.reps == null || set.completedReps >= set.reps) &&\n      (set.weight == null || Weight_gte(set.completedWeight, set.weight))\n    );\n  } else {\n    return false;\n  }\n}\n\nexport function Reps_isInRangeCompletedSet(set: ISet): boolean {\n  if (set.completedReps != null && set.completedWeight != null) {\n    return (\n      (set.weight == null || Weight_gte(set.completedWeight, set.weight)) &&\n      (set.minReps != null ? set.completedReps >= set.minReps : set.reps == null || set.completedReps >= set.reps)\n    );\n  } else {\n    return false;\n  }\n}\n\nexport function Reps_isStarted(sets: ISet[]): boolean {\n  return sets.length > 0 && sets.some((s) => Reps_isFinishedSet(s));\n}\n\nexport function Reps_isFinished(sets: ISet[]): boolean {\n  return sets.length > 0 && sets.every((s) => Reps_isFinishedSet(s));\n}\n\nexport function Reps_isEmptyOrFinished(sets: ISet[]): boolean {\n  return sets.length === 0 || Reps_isFinished(sets);\n}\n\nexport function Reps_isFinishedSet(s: ISet): boolean {\n  return !!s.isCompleted;\n}\n\nexport function Reps_toKey(set: ISet): string {\n  return `${Weight_printNull(set.weight)}-${Weight_printNull(set.completedWeight)}-${set.reps}-${set.minReps}-${set.isAmrap}-${set.rpe}-${set.askWeight}-${set.completedReps}-${set.completedRepsLeft}-${set.completedRpe}-${set.isCompleted}-${set.completedSetTimer}-${set.completedSetTimerLeft}`;\n}\n\nexport function Reps_isInRangeCompleted(sets: ISet[]): boolean {\n  return sets.some((s) => s.minReps != null) && sets.every((s) => Reps_isInRangeCompletedSet(s));\n}\n\nexport function Reps_enforceCompletedSet(set: ISet): ISet {\n  return {\n    ...set,\n    isCompleted: set.completedReps == null || set.completedWeight == null ? false : !!set.isCompleted,\n  };\n}\n\nexport function Reps_maxUnilateralCompletedReps(set: ISet): number | undefined {\n  if (set.isUnilateral) {\n    return Math.max(set.completedReps ?? 0, set.completedRepsLeft ?? 0);\n  } else {\n    return set.completedReps;\n  }\n}\n\nexport function Reps_avgUnilateralCompletedReps(set: ISet): number | undefined {\n  if (set.isUnilateral) {\n    return Math.round(((set.completedReps ?? 0) + (set.completedRepsLeft ?? 0)) / 2);\n  } else {\n    return set.completedReps;\n  }\n}\n\nexport function Reps_setVolume(set: ISet, unit: IUnit): IWeight {\n  const totalReps =\n    set.isUnilateral || set.completedRepsLeft != null\n      ? (set.completedReps ?? 0) + (set.completedRepsLeft ?? 0)\n      : (set.completedReps ?? 0);\n  return Weight_multiply(set.completedWeight ?? set.weight ?? Weight_build(0, unit), totalReps);\n}\n\nexport function Reps_group(sets: ISet[], isNext?: boolean): ISet[][] {\n  return sets.reduce<ISet[][]>(\n    (memo, set) => {\n      let lastGroup = memo[memo.length - 1];\n      const last = lastGroup[lastGroup.length - 1];\n      if (\n        last != null &&\n        (!Weight_eqNull(last.weight, set.weight) ||\n          last.reps !== set.reps ||\n          last.minReps !== set.minReps ||\n          last.completedReps !== set.completedReps ||\n          last.completedRepsLeft !== set.completedRepsLeft ||\n          !Weight_eqNull(last.completedWeight, set.completedWeight) ||\n          last.askWeight !== set.askWeight ||\n          (isNext && last.isAmrap !== set.isAmrap) ||\n          last.rpe !== set.rpe ||\n          last.completedRpe !== set.completedRpe ||\n          last.setTimer !== set.setTimer ||\n          (isNext && last.timer !== set.timer) ||\n          (isNext && last.isOverflowSetTimer !== set.isOverflowSetTimer) ||\n          last.auto !== set.auto ||\n          (!isNext && last.completedSetTimer !== set.completedSetTimer) ||\n          (!isNext && last.completedSetTimerLeft !== set.completedSetTimerLeft))\n      ) {\n        memo.push([]);\n        lastGroup = memo[memo.length - 1];\n      }\n      lastGroup.push(set);\n      return memo;\n    },\n    [[]]\n  );\n}\n\nexport function Reps_findNextSet(entry: IHistoryEntry): ISet | undefined {\n  return [...entry.warmupSets, ...entry.sets].filter((s) => !s.isCompleted)[0];\n}\n\nexport function Reps_findNextSetIndex(entry: IHistoryEntry): number {\n  return [...entry.warmupSets, ...entry.sets].findIndex((s) => !s.isCompleted);\n}\n\nexport function Reps_findNextEntryAndSet(\n  historyRecord: IHistoryRecord,\n  entryIndex: number,\n  mode: \"workout\" | \"warmup\"\n):\n  | {\n      entry: IHistoryEntry;\n      set: ISet;\n    }\n  | undefined {\n  const entry = historyRecord.entries[entryIndex];\n  if (entry == null) {\n    return undefined;\n  }\n  const nextEntry = Progress_getNextEntry(historyRecord, entry, mode, true);\n  if (nextEntry == null) {\n    return undefined;\n  }\n\n  const nextSet = Reps_findNextSet(nextEntry);\n  if (nextSet != null) {\n    return { entry: nextEntry, set: nextSet };\n  }\n\n  return undefined;\n}\n\nexport function Reps_findNextEntryAndSetIndex(\n  historyRecord: IHistoryRecord,\n  entryIndex: number,\n  mode: \"workout\" | \"warmup\"\n):\n  | {\n      entryIndex: number;\n      setIndex: number;\n    }\n  | undefined {\n  const entry = historyRecord.entries[entryIndex];\n  if (entry == null) {\n    return undefined;\n  }\n  const nextEntry = Progress_getNextEntry(historyRecord, entry, mode, true);\n  if (nextEntry == null) {\n    return undefined;\n  }\n\n  const nextSet = Reps_findNextSetIndex(nextEntry);\n\n  return { entryIndex: historyRecord.entries.indexOf(nextEntry), setIndex: nextSet };\n}\n\nexport function Reps_groupConsecutive<T>(items: T[], keyFn: (item: T) => string): [T, number][] {\n  const groups: [T, number][] = [];\n  let lastKey: string | undefined;\n  for (const item of items) {\n    const key = keyFn(item);\n    if (lastKey == null || lastKey !== key) {\n      groups.push([item, 0]);\n    }\n    groups[groups.length - 1][1] += 1;\n    lastKey = key;\n  }\n  return groups;\n}\n\nexport function Reps_completedSetKey(set: ISet): string {\n  const reps = set.completedReps ?? 0;\n  const repsLeft = set.isUnilateral ? (set.completedRepsLeft ?? 0) : -1;\n  const w = set.completedWeight ? Weight_print(set.completedWeight) : \"none\";\n  const rpe = set.completedRpe ?? -1;\n  const setTimer = set.completedSetTimer != null ? Math.round(set.completedSetTimer) : -1;\n  const setTimerLeft =\n    set.isUnilateral && set.completedSetTimerLeft != null ? Math.round(set.completedSetTimerLeft) : -1;\n  const label = set.label ?? \"\";\n  return `${reps}-${repsLeft}-${w}-${rpe}-${setTimer}-${setTimerLeft}-${label}`;\n}\n\nexport function Reps_targetSetKey(set: ISet): string {\n  const reps = set.reps ?? 0;\n  const minReps = set.minReps ?? -1;\n  const w = set.weight ? Weight_print(set.weight) : \"none\";\n  const rpe = set.rpe ?? -1;\n  const logRpe = set.logRpe ? 1 : 0;\n  const timer = set.timer ?? -1;\n  const setTimer = set.setTimer ?? -1;\n  const overflow = set.isOverflowSetTimer ? 1 : 0;\n  const amrap = set.isAmrap ? 1 : 0;\n  const label = set.label ?? \"\";\n  const askWeight = set.askWeight ? 1 : 0;\n  return `${reps}-${minReps}-${w}-${askWeight}-${rpe}-${logRpe}-${timer}-${setTimer}-${overflow}-${amrap}-${label}`;\n}\n\nexport function Reps_volume(sets: ISet[], unit: IUnit): IWeight {\n  return Weight_convertTo(\n    sets.reduce((memo, set) => Weight_add(memo, Reps_setVolume(set, unit)), Weight_build(0, unit)),\n    unit\n  );\n}\n","import {\n  ISettings,\n  IPlannerSettings,\n  IAllEquipment,\n  IAllCustomExercises,\n  ITargetType,\n  targetTypes,\n  IProgram,\n  IExerciseType,\n  IWeight,\n  IWebEditorSettings,\n} from \"../types\";\nimport { Weight_build, Weight_print } from \"./weight\";\nimport { IExportedProgram, Program_evaluate, Program_getAllUsedProgramExercises } from \"./program\";\nimport { ObjectUtils_filter, ObjectUtils_pick } from \"../utils/object\";\nimport { lb } from \"lens-shmens\";\nimport { updateSettings } from \"./state\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IExercise, Exercise_toKey, Exercise_get, Exercise_nameWithEquipment } from \"./exercise\";\nimport { CollectionUtils_uniqByExpr, CollectionUtils_sort } from \"../utils/collection\";\nimport { ProgramExercise_doesUse1RM } from \"./programExercise\";\nimport { IExercisePickerSettings } from \"../components/exercisePicker/exercisePickerSettings\";\n\nexport function Settings_programContentBuild(): Pick<ISettings, \"timers\" | \"units\" | \"planner\"> {\n  return {\n    timers: {\n      warmup: 90,\n      workout: 180,\n      reminder: 900,\n      getReady: 5,\n    },\n    units: \"lb\",\n    planner: Settings_buildPlannerSettings(),\n  };\n}\n\nexport function Settings_defaultEquipment(): IAllEquipment {\n  return {\n    barbell: {\n      vtype: \"equipment_data\",\n      multiplier: 2,\n      bar: {\n        lb: Weight_build(45, \"lb\"),\n        kg: Weight_build(20, \"kg\"),\n      },\n      plates: [\n        { weight: Weight_build(45, \"lb\"), num: 8 },\n        { weight: Weight_build(25, \"lb\"), num: 4 },\n        { weight: Weight_build(10, \"lb\"), num: 4 },\n        { weight: Weight_build(5, \"lb\"), num: 4 },\n        { weight: Weight_build(2.5, \"lb\"), num: 4 },\n        { weight: Weight_build(1.25, \"lb\"), num: 2 },\n        { weight: Weight_build(20, \"kg\"), num: 8 },\n        { weight: Weight_build(10, \"kg\"), num: 4 },\n        { weight: Weight_build(5, \"kg\"), num: 4 },\n        { weight: Weight_build(2.5, \"kg\"), num: 4 },\n        { weight: Weight_build(1.25, \"kg\"), num: 4 },\n        { weight: Weight_build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [],\n      isFixed: false,\n    },\n    trapbar: {\n      vtype: \"equipment_data\",\n      multiplier: 2,\n      bar: {\n        lb: Weight_build(45, \"lb\"),\n        kg: Weight_build(20, \"kg\"),\n      },\n      plates: [\n        { weight: Weight_build(45, \"lb\"), num: 8 },\n        { weight: Weight_build(25, \"lb\"), num: 4 },\n        { weight: Weight_build(10, \"lb\"), num: 4 },\n        { weight: Weight_build(5, \"lb\"), num: 4 },\n        { weight: Weight_build(2.5, \"lb\"), num: 4 },\n        { weight: Weight_build(1.25, \"lb\"), num: 2 },\n        { weight: Weight_build(20, \"kg\"), num: 8 },\n        { weight: Weight_build(10, \"kg\"), num: 4 },\n        { weight: Weight_build(5, \"kg\"), num: 4 },\n        { weight: Weight_build(2.5, \"kg\"), num: 4 },\n        { weight: Weight_build(1.25, \"kg\"), num: 4 },\n        { weight: Weight_build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [],\n      isFixed: false,\n    },\n    leverageMachine: {\n      vtype: \"equipment_data\",\n      multiplier: 1,\n      bar: {\n        lb: Weight_build(0, \"lb\"),\n        kg: Weight_build(0, \"kg\"),\n      },\n      plates: [\n        { weight: Weight_build(45, \"lb\"), num: 8 },\n        { weight: Weight_build(25, \"lb\"), num: 4 },\n        { weight: Weight_build(10, \"lb\"), num: 4 },\n        { weight: Weight_build(5, \"lb\"), num: 4 },\n        { weight: Weight_build(2.5, \"lb\"), num: 4 },\n        { weight: Weight_build(1.25, \"lb\"), num: 2 },\n        { weight: Weight_build(20, \"kg\"), num: 8 },\n        { weight: Weight_build(10, \"kg\"), num: 4 },\n        { weight: Weight_build(5, \"kg\"), num: 4 },\n        { weight: Weight_build(2.5, \"kg\"), num: 4 },\n        { weight: Weight_build(1.25, \"kg\"), num: 4 },\n        { weight: Weight_build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [],\n      isFixed: false,\n    },\n    smith: {\n      vtype: \"equipment_data\",\n      multiplier: 2,\n      bar: {\n        lb: Weight_build(45, \"lb\"),\n        kg: Weight_build(20, \"kg\"),\n      },\n      plates: [\n        { weight: Weight_build(45, \"lb\"), num: 8 },\n        { weight: Weight_build(25, \"lb\"), num: 4 },\n        { weight: Weight_build(10, \"lb\"), num: 4 },\n        { weight: Weight_build(5, \"lb\"), num: 4 },\n        { weight: Weight_build(2.5, \"lb\"), num: 4 },\n        { weight: Weight_build(1.25, \"lb\"), num: 2 },\n        { weight: Weight_build(20, \"kg\"), num: 8 },\n        { weight: Weight_build(10, \"kg\"), num: 4 },\n        { weight: Weight_build(5, \"kg\"), num: 4 },\n        { weight: Weight_build(2.5, \"kg\"), num: 4 },\n        { weight: Weight_build(1.25, \"kg\"), num: 4 },\n        { weight: Weight_build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [],\n      isFixed: false,\n    },\n    dumbbell: {\n      vtype: \"equipment_data\",\n      multiplier: 2,\n      bar: {\n        lb: Weight_build(10, \"lb\"),\n        kg: Weight_build(5, \"kg\"),\n      },\n      plates: [\n        { weight: Weight_build(10, \"lb\"), num: 8 },\n        { weight: Weight_build(5, \"lb\"), num: 4 },\n        { weight: Weight_build(2.5, \"lb\"), num: 4 },\n        { weight: Weight_build(1.25, \"lb\"), num: 2 },\n        { weight: Weight_build(5, \"kg\"), num: 8 },\n        { weight: Weight_build(2.5, \"kg\"), num: 4 },\n        { weight: Weight_build(1.25, \"kg\"), num: 4 },\n        { weight: Weight_build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [\n        Weight_build(10, \"lb\"),\n        Weight_build(15, \"lb\"),\n        Weight_build(20, \"lb\"),\n        Weight_build(25, \"lb\"),\n        Weight_build(30, \"lb\"),\n        Weight_build(35, \"lb\"),\n        Weight_build(40, \"lb\"),\n        Weight_build(4, \"kg\"),\n        Weight_build(6, \"kg\"),\n        Weight_build(8, \"kg\"),\n        Weight_build(10, \"kg\"),\n        Weight_build(12, \"kg\"),\n        Weight_build(14, \"kg\"),\n        Weight_build(20, \"kg\"),\n      ],\n      isFixed: false,\n    },\n    ezbar: {\n      vtype: \"equipment_data\",\n      multiplier: 2,\n      bar: {\n        lb: Weight_build(20, \"lb\"),\n        kg: Weight_build(10, \"kg\"),\n      },\n      plates: [\n        { weight: Weight_build(45, \"lb\"), num: 8 },\n        { weight: Weight_build(25, \"lb\"), num: 4 },\n        { weight: Weight_build(10, \"lb\"), num: 4 },\n        { weight: Weight_build(5, \"lb\"), num: 4 },\n        { weight: Weight_build(2.5, \"lb\"), num: 4 },\n        { weight: Weight_build(1.25, \"lb\"), num: 2 },\n        { weight: Weight_build(20, \"kg\"), num: 8 },\n        { weight: Weight_build(10, \"kg\"), num: 4 },\n        { weight: Weight_build(5, \"kg\"), num: 4 },\n        { weight: Weight_build(2.5, \"kg\"), num: 4 },\n        { weight: Weight_build(1.25, \"kg\"), num: 4 },\n        { weight: Weight_build(0.5, \"kg\"), num: 2 },\n      ],\n      fixed: [],\n      isFixed: false,\n    },\n    cable: {\n      vtype: \"equipment_data\",\n      multiplier: 1,\n      bar: {\n        lb: Weight_build(0, \"lb\"),\n        kg: Weight_build(0, \"kg\"),\n      },\n      plates: [\n        {\n          weight: Weight_build(10, \"lb\"),\n          num: 20,\n        },\n        {\n          weight: Weight_build(5, \"lb\"),\n          num: 10,\n        },\n        {\n          weight: Weight_build(5, \"kg\"),\n          num: 20,\n        },\n        {\n          weight: Weight_build(2.5, \"kg\"),\n          num: 10,\n        },\n      ],\n      fixed: [],\n      isFixed: false,\n    },\n    kettlebell: {\n      vtype: \"equipment_data\",\n      multiplier: 1,\n      bar: {\n        lb: Weight_build(0, \"lb\"),\n        kg: Weight_build(0, \"kg\"),\n      },\n      plates: [],\n      fixed: [\n        Weight_build(10, \"lb\"),\n        Weight_build(15, \"lb\"),\n        Weight_build(20, \"lb\"),\n        Weight_build(25, \"lb\"),\n        Weight_build(30, \"lb\"),\n        Weight_build(35, \"lb\"),\n        Weight_build(40, \"lb\"),\n        Weight_build(4, \"kg\"),\n        Weight_build(8, \"kg\"),\n        Weight_build(12, \"kg\"),\n        Weight_build(16, \"kg\"),\n        Weight_build(24, \"kg\"),\n      ],\n      isFixed: true,\n    },\n  };\n}\n\nexport function Settings_build(): ISettings {\n  return {\n    ...Settings_programContentBuild(),\n    graphsSettings: {\n      isSameXAxis: false,\n      isWithBodyweight: false,\n      isWithOneRm: true,\n    },\n    exerciseData: {},\n    graphOptions: {},\n    exerciseStatsSettings: {\n      ascendingSort: false,\n    },\n    gyms: [\n      {\n        vtype: \"gym\",\n        id: \"default\",\n        name: \"Main\",\n        equipment: Settings_defaultEquipment(),\n      },\n    ],\n    // Builds before 2026-09-26 require deletedGyms in VSettings. Drop with its removal migration.\n    deletedGyms: [],\n    volume: 1.0,\n    vibration: false,\n    startWeekFromMonday: false,\n    lengthUnits: \"in\",\n    workoutSettings: {\n      targetType: \"target\",\n    },\n    statsEnabled: { weight: { weight: true }, length: {}, percentage: {} },\n    exercises: {},\n    graphs: { graphs: [], vtype: \"graphs\" },\n    planner: Settings_buildPlannerSettings(),\n    muscleGroups: {\n      vtype: \"muscle_groups_settings\",\n      data: {},\n    },\n  };\n}\n\nexport function Settings_buildPlannerSettings(): IPlannerSettings {\n  return {\n    strengthSetsPct: 30,\n    hypertrophySetsPct: 70,\n    weeklyRangeSets: {\n      shoulders: [10, 12],\n      triceps: [10, 12],\n      back: [10, 12],\n      abs: [10, 12],\n      glutes: [10, 12],\n      hamstrings: [10, 12],\n      quadriceps: [10, 12],\n      chest: [10, 12],\n      biceps: [10, 12],\n      calves: [10, 12],\n      forearms: [10, 12],\n    },\n    weeklyFrequency: {\n      shoulders: 2,\n      triceps: 2,\n      back: 2,\n      abs: 2,\n      glutes: 2,\n      hamstrings: 2,\n      quadriceps: 2,\n      chest: 2,\n      biceps: 2,\n      calves: 2,\n      forearms: 2,\n    },\n    synergistMultiplier: 0.5,\n  };\n}\n\nexport function Settings_withWeeklyRangeSetsBound(\n  range: [number, number] | undefined,\n  bound: \"min\" | \"max\",\n  value: number\n): [number, number] {\n  return bound === \"min\" ? [value, range?.[1] ?? 0] : [range?.[0] ?? 0, value];\n}\n\nexport function Settings_applyExportedProgram(settings: ISettings, exportedProgram: IExportedProgram): ISettings {\n  const result = {\n    ...settings,\n    exercises: {\n      ...settings.exercises,\n      ...exportedProgram.customExercises,\n    },\n    timers: {\n      ...settings.timers,\n      workout: settings.timers.workout ?? exportedProgram.settings.timers?.workout,\n      warmup: settings.timers.warmup ?? exportedProgram.settings.timers?.warmup,\n    },\n    exerciseData: { ...settings.exerciseData, ...exportedProgram.settings.exerciseData },\n    workoutSettings: { ...settings.workoutSettings, ...exportedProgram.settings.workoutSettings },\n  };\n  return result;\n}\n\nfunction mergeWithDeletions<T>(\n  stored: Record<string, T>,\n  update: Record<string, T> | undefined,\n  deletedKeys: string[] | undefined\n): Record<string, T> {\n  const result = { ...stored, ...update };\n  for (const key of deletedKeys || []) {\n    delete result[key];\n  }\n  return result;\n}\n\nexport function Settings_applyWebEditorSettings(\n  settings: ISettings,\n  update: IWebEditorSettings,\n  deleted?: { exerciseDataKeys?: string[]; starredExerciseKeys?: string[] }\n): ISettings {\n  // A dictionary merge cannot express a removal, so clearing an exercise override or unstarring\n  // needs its keys named explicitly - otherwise the stored entry is merged straight back in\n  const exerciseData = mergeWithDeletions(settings.exerciseData, update.exerciseData, deleted?.exerciseDataKeys);\n  const starredExercises =\n    update.starredExercises != null || deleted?.starredExerciseKeys?.length\n      ? mergeWithDeletions(settings.starredExercises || {}, update.starredExercises, deleted?.starredExerciseKeys)\n      : settings.starredExercises;\n\n  return {\n    ...settings,\n    units: update.units ?? settings.units,\n    // `workout: null` means the user turned the rest timer off, so presence of the key decides, not truthiness\n    timers: update.timers != null ? { ...settings.timers, ...update.timers } : settings.timers,\n    planner: update.planner ?? settings.planner,\n    muscleGroups: update.muscleGroups ?? settings.muscleGroups,\n    exerciseData,\n    workoutSettings:\n      update.workoutSettings != null\n        ? { ...settings.workoutSettings, ...update.workoutSettings }\n        : settings.workoutSettings,\n    exercises: update.exercises != null ? { ...settings.exercises, ...update.exercises } : settings.exercises,\n    starredExercises,\n  };\n}\n\nexport function Settings_webEditorInitial(\n  stored: ISettings | undefined,\n  programCustomExercises: IAllCustomExercises | undefined\n): ISettings {\n  const settings = Settings_build();\n  return {\n    ...settings,\n    exercises: { ...settings.exercises, ...stored?.exercises, ...programCustomExercises },\n    timers: { ...settings.timers, workout: stored?.timers.workout ?? settings.timers.workout },\n    planner: stored?.planner || settings.planner,\n    muscleGroups: stored?.muscleGroups || settings.muscleGroups,\n    units: stored?.units ?? settings.units,\n    exerciseData: { ...settings.exerciseData, ...stored?.exerciseData },\n    workoutSettings: { ...settings.workoutSettings, ...stored?.workoutSettings },\n    starredExercises: stored?.starredExercises,\n  };\n}\n\nexport interface IWebEditorSettingsRequest {\n  settings: IWebEditorSettings;\n  deletedExerciseDataKeys: string[];\n  deletedStarredExerciseKeys: string[];\n}\n\nconst pickerSettingsKeys: (keyof IExercisePickerSettings)[] = [\n  \"shouldKeepProgramExerciseId\",\n  \"pickerSort\",\n  \"shouldShowInvisibleEquipment\",\n];\n\nfunction changedEntries<T>(\n  initial: Partial<Record<string, T>>,\n  current: Partial<Record<string, T>>\n): { changed: Record<string, T>; deletedKeys: string[] } {\n  const changed: Record<string, T> = {};\n  for (const key of Object.keys(current)) {\n    const value = current[key];\n    if (value != null && value !== initial[key]) {\n      changed[key] = value;\n    }\n  }\n  const deletedKeys = Object.keys(initial).filter((key) => initial[key] != null && current[key] == null);\n  return { changed, deletedKeys };\n}\n\n// Stars, picker settings and custom exercises are sent as a diff against page load, so a stale tab\n// cannot overwrite what the app changed since. A shared program's custom exercises are only sent once edited.\nexport function Settings_webEditorSettingsRequest(initial: ISettings, current: ISettings): IWebEditorSettingsRequest {\n  const exercises = changedEntries(initial.exercises, current.exercises).changed;\n  const starred = changedEntries(initial.starredExercises || {}, current.starredExercises || {});\n  const pickerSettings = ObjectUtils_pick(\n    current.workoutSettings,\n    pickerSettingsKeys.filter((key) => current.workoutSettings[key] !== initial.workoutSettings[key])\n  );\n  return {\n    settings: {\n      units: current.units,\n      timers: { workout: current.timers.workout },\n      planner: current.planner,\n      muscleGroups: current.muscleGroups,\n      exerciseData: current.exerciseData,\n      ...(Object.keys(exercises).length > 0 ? { exercises } : {}),\n      ...(Object.keys(starred.changed).length > 0 ? { starredExercises: starred.changed } : {}),\n      ...(Object.keys(pickerSettings).length > 0 ? { workoutSettings: pickerSettings } : {}),\n    },\n    deletedExerciseDataKeys: changedEntries(initial.exerciseData, current.exerciseData).deletedKeys,\n    deletedStarredExerciseKeys: starred.deletedKeys,\n  };\n}\n\nexport function Settings_activeCustomExercises(settings: ISettings): IAllCustomExercises {\n  return ObjectUtils_filter(settings.exercises, (k, v) => !v?.isDeleted);\n}\n\nexport function Settings_getNextTargetType(type: ITargetType, skipPlatesCalculator: boolean): ITargetType {\n  const index = targetTypes.indexOf(type);\n  let nextTargetType: ITargetType;\n  if (index === -1) {\n    nextTargetType = targetTypes[0];\n  } else if (index === targetTypes.length - 1) {\n    nextTargetType = targetTypes[0];\n  } else {\n    nextTargetType = targetTypes[index + 1];\n  }\n  if (nextTargetType === \"platescalculator\" && skipPlatesCalculator) {\n    nextTargetType = Settings_getNextTargetType(\"platescalculator\", skipPlatesCalculator);\n  }\n  return nextTargetType;\n}\n\nexport function Settings_toggleStarred(starred: ISettings[\"starredExercises\"], key: string): ISettings[\"starredExercises\"] {\n  if (starred?.[key]) {\n    const next = { ...starred };\n    delete next[key];\n    return next;\n  }\n  return { ...starred, [key]: true };\n}\n\nexport function Settings_toggleStarredExercise(dispatch: IDispatch, key: string): void {\n  updateSettings(\n    dispatch,\n    lb<ISettings>()\n      .p(\"starredExercises\")\n      .recordModify((starred) => Settings_toggleStarred(starred, key)),\n    `Toggle starred exercise ${key}`\n  );\n}\n\nexport const settingsRecentExercisesLimit = 5;\n\n// Keys are never deleted from this map, only overwritten. VersionTracker's nested-object path bumps\n// versions per key present in the new object (versionTrackerUpdateVersions.ts:427), so a removed key\n// never gets its version bumped and the next merge resurrects it. Writing `[]` would sync; deleting\n// would not.\nexport function Settings_withRecentSwap(\n  recentExercises: ISettings[\"recentExercises\"],\n  from: IExerciseType,\n  to: IExerciseType\n): Partial<Record<string, string[]>> {\n  const fromKey = Exercise_toKey(from);\n  const toKey = Exercise_toKey(to);\n  const previous = recentExercises?.[fromKey] ?? [];\n  return {\n    ...recentExercises,\n    [fromKey]: [toKey, ...previous.filter((key) => key !== toKey)].slice(0, settingsRecentExercisesLimit),\n  };\n}\n\nexport function Settings_addRecentSwap(dispatch: IDispatch, from: IExerciseType, to: IExerciseType): void {\n  updateSettings(\n    dispatch,\n    lb<ISettings>()\n      .p(\"recentExercises\")\n      .recordModify((recentExercises) => Settings_withRecentSwap(recentExercises, from, to)),\n    `Record recent swap from ${Exercise_toKey(from)} to ${Exercise_toKey(to)}`\n  );\n}\n\nexport function Settings_changePickerSettings(dispatch: IDispatch, settings: IExercisePickerSettings): void {\n  updateSettings(\n    dispatch,\n    lb<ISettings>()\n      .p(\"workoutSettings\")\n      .recordModify((workoutSettings) => {\n        return { ...workoutSettings, ...settings };\n      }),\n    `Change picker settings`\n  );\n}\n\nexport function Settings_doesProgramHaveUnset1RMs(program: IProgram, settings: ISettings): boolean {\n  return Settings_getExercisesWithUnset1RMs(program, settings).length > 0;\n}\n\nexport function Settings_getExercisesWithUnset1RMs(program: IProgram, settings: ISettings): IExercise[] {\n  const evalutedProgram = Program_evaluate(program, settings);\n  const plannerExercises = Program_getAllUsedProgramExercises(evalutedProgram).filter((exercise) => {\n    return ProgramExercise_doesUse1RM(exercise);\n  });\n  const exerciseTypes = CollectionUtils_uniqByExpr(\n    plannerExercises\n      .filter((exercise) => {\n        return settings.exerciseData[Exercise_toKey(exercise.exerciseType)]?.rm1 == null;\n      })\n      .map((exercise) => exercise.exerciseType),\n    (e) => Exercise_toKey(e)\n  );\n  const exercises = exerciseTypes.map((e) => Exercise_get(e, settings.exercises));\n  return CollectionUtils_sort(exercises, (a, b) => {\n    return Exercise_nameWithEquipment(a, settings).localeCompare(Exercise_nameWithEquipment(b, settings));\n  });\n}\n\nexport function Settings_setOneRM(\n  dispatch: IDispatch,\n  exerciseType: IExerciseType,\n  value: IWeight,\n  settings: ISettings\n): void {\n  updateSettings(\n    dispatch,\n    lb<ISettings>()\n      .p(\"exerciseData\")\n      .recordModify((data) => {\n        const key = Exercise_toKey(exerciseType);\n        return { ...data, [key]: { ...data[key], rm1: value } };\n      }),\n    `Set 1RM for ${Exercise_nameWithEquipment(Exercise_get(exerciseType, settings.exercises), settings)} to ${Weight_print(value)}`\n  );\n}\n\nexport const TEXT_SIZE_MIN = 12;\nexport const TEXT_SIZE_MAX = 24;\nexport const TEXT_SIZE_STEP = 2;\nconst TEXT_SIZE_BASE = 16;\n\n// An unset textSize follows the OS font scale, the same way an unset theme follows dark mode.\n// The OS scale is deliberately not applied on top of an explicit value - it is folded into the\n// rem here so that spacing and icons move with the type instead of the text alone growing.\nexport function Settings_getTextSize(settings: ISettings, osFontScale: number): number {\n  if (settings.textSize != null) {\n    return clampTextSize(settings.textSize);\n  }\n  const scaled = TEXT_SIZE_BASE * osFontScale;\n  return clampTextSize(Math.round(scaled / TEXT_SIZE_STEP) * TEXT_SIZE_STEP);\n}\n\nfunction clampTextSize(size: number): number {\n  return Math.max(TEXT_SIZE_MIN, Math.min(TEXT_SIZE_MAX, size));\n}\n","declare let __HOST__: string;\n\nexport function Share_generateLink(userId: string, id: number): string {\n  return `${__HOST__}/record?id=${id}&user=${userId}`;\n}\n\nexport function Share_generateProfileLink(userId: string): string {\n  return `${__HOST__}/profile/${userId}`;\n}\n","import { Service } from \"../api/service\";\nimport { IAudioInterface } from \"../lib/audioInterface\";\nimport { IPlannerState } from \"../pages/planner/models/types\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Storage_getDefault } from \"../models/storage\";\nimport { ILensRecordingPayload } from \"lens-shmens\";\nimport { IUser } from \"./user\";\nimport { IProgramIndexEntry } from \"./program\";\nimport {\n  IStorage,\n  IProgram,\n  IHistoryRecord,\n  IProgramDay,\n  ISettings,\n  IExerciseType,\n  IEquipment,\n  IStats,\n  IImportSession,\n} from \"../types\";\nimport { IImportResult } from \"../utils/importTypes\";\nimport { AsyncQueue } from \"../utils/asyncQueue\";\nimport { basicBeginnerProgram } from \"../programs/basicBeginnerProgram\";\nimport type { NavigationContainerRef } from \"@react-navigation/native\";\nimport type { IRootStackParamList } from \"../navigation/types\";\nimport type { IScreenData } from \"./screen\";\nimport type { IProgramPreviewPlaygroundState } from \"../components/preview/programPreviewPlaygroundSetup\";\nimport type { IIapActiveSubscription, IIapAdapter } from \"../utils/iapAdapter\";\nimport type { IHealthAdapter } from \"../utils/healthAdapter\";\nimport type { IPushSync } from \"../utils/pushSyncAdapter\";\nimport type { Persistence } from \"../utils/persistence\";\nimport type { ITimerBridge } from \"../utils/timerBridge\";\nimport type { IWorkoutBridge } from \"../utils/workoutBridge\";\nimport type { IWatchBridge } from \"../utils/watchBridge\";\nimport type { IKeychain } from \"../utils/keychain\";\nimport type { IWorkoutMirroring } from \"../utils/workoutMirroring\";\nimport type { IHeartRateStore } from \"../utils/heartRateStore\";\n\nexport type IEnv = {\n  service: Service;\n  audio: IAudioInterface;\n  queue: AsyncQueue;\n  persistence: Persistence;\n  navigationRef?: NavigationContainerRef<IRootStackParamList>;\n  getCurrentScreenData?: () => IScreenData | undefined;\n  iap?: IIapAdapter;\n  health?: IHealthAdapter;\n  push?: IPushSync;\n  timer: ITimerBridge;\n  workout: IWorkoutBridge;\n  watch: IWatchBridge;\n  keychain: IKeychain;\n  mirroring: IWorkoutMirroring;\n  heartRate: IHeartRateStore;\n};\n\nexport interface INotification {\n  type: \"error\" | \"success\";\n  content: string;\n}\n\nexport interface INavCommon {\n  loading: ILoading;\n  userId?: string;\n  currentProgram?: IProgram;\n  isOngoingProgress: boolean;\n  stats: IStats;\n  settings: ISettings;\n}\n\nexport interface ILoadingItem {\n  startTime: number;\n  type: string;\n  attempt?: number;\n  endTime?: number;\n  error?: string;\n}\n\nexport type ILoading = {\n  items: Partial<Record<string, ILoadingItem>>;\n};\n\nexport interface ISubscriptionLoading {\n  monthly?: boolean;\n  yearly?: boolean;\n  lifetime?: boolean;\n}\n\nexport interface IStateErrors {\n  corruptedstorage?: {\n    userid: string;\n    backup: boolean;\n    confirmed: boolean;\n    local: boolean;\n  };\n}\n\nexport interface IAppleOffer {\n  yearly: IApplePromotionalOffer;\n  monthly: IApplePromotionalOffer;\n}\n\nexport interface IApplePromotionalOffer {\n  offerId: string;\n  signature: string;\n  nonce: string;\n  timestamp: number;\n}\n\nexport interface IGoogleOffer {\n  yearly: IGooglePromotionalOffer;\n  monthly: IGooglePromotionalOffer;\n}\n\nexport interface IGooglePromotionalOffer {\n  offerId: string;\n  productId: string;\n}\n\nexport interface IOfferData {\n  offerId: string;\n  formattedPrice: string;\n}\n\nexport interface IAttributionData {\n  isOrganic: boolean;\n  mediaSource: string;\n  campaign: string;\n  adSet: string;\n  ad: string;\n}\n\nexport type ITourId = \"workout\" | \"program\";\n\nexport interface IStateTour {\n  id: ITourId;\n  enforced: boolean;\n  // Screen the tour was started on. Step `condition`s resolve the active screen\n  // via getCurrentScreenData(), which returns the tour modal once it's open — so\n  // they're evaluated against this snapshot instead, keeping the steps shown in\n  // the modal consistent with the ones that triggered the tour.\n  screenData?: IScreenData;\n}\n\nexport interface ILastSynced {\n  versions: IStorage[\"_versions\"];\n  tempUserId: string;\n  serverVersionsFetchedAt: number;\n}\n\nexport interface IState {\n  user?: IUser;\n  storage: IStorage;\n  lastSynced?: ILastSynced;\n  programs: IProgram[];\n  programsIndex: IProgramIndexEntry[];\n  notification?: INotification;\n  revisions: Partial<Record<string, string[]>>;\n  prices?: Partial<Record<string, string>>;\n  offers?: Partial<Record<string, IOfferData[]>>;\n  loading: ILoading;\n  defaultEquipmentExpanded?: IEquipment;\n  subscriptionLoading?: ISubscriptionLoading;\n  subscriptionStatus?: IIapActiveSubscription[];\n  subscriptionStatusLoading?: boolean;\n  // Ephemeral, NON-synced optimistic hint for a just-queued Android plan switch, bridging the gap until\n  // Google's deferred RTDN lands and the server reports `pendingProduct` authoritatively. Session-only\n  // (not persisted/synced) and time-boxed via `until` so it can't drift like the old synced flag did.\n  subscriptionPendingHint?: { productId: string; until: number };\n  ownedLifetime?: boolean;\n  progress: Partial<Record<number, IHistoryRecord>>;\n  previewProgram?: {\n    id: string;\n    showCustomPrograms?: boolean;\n  };\n  muscleView?: {\n    type: \"program\" | \"day\";\n    programId?: string;\n    day?: number;\n  };\n  viewExerciseType?: IExerciseType;\n  adminKey?: string;\n  showWhatsNew?: boolean;\n  showSignupRequest?: boolean;\n  showHearAboutUs?: boolean;\n  toast?: string;\n  tour?: IStateTour;\n  scrollToHistoryRecordId?: number;\n  freshMigrations: boolean;\n  errors: IStateErrors;\n  reportedCorruptedStorage?: boolean;\n  nosync: boolean;\n  selectedGymId?: string;\n  appleOffer?: IAppleOffer;\n  googleOffer?: IGoogleOffer;\n  deviceId: string;\n  editProgramStates: Record<string, IPlannerState>;\n  playgroundState?: IProgramPreviewPlaygroundState;\n  importPreview?: IImportPreview;\n}\n\nexport interface IImportPreview {\n  source: IImportSession[\"source\"];\n  result: IImportResult;\n}\n\nexport interface ILocalStorage {\n  storage?: IStorage;\n  lastSynced?: ILastSynced;\n  editDay?: IProgramDay;\n}\n\nexport function buildState(args: {\n  storage?: IStorage;\n  notification?: INotification;\n  userId?: string;\n  nosync?: boolean;\n  deviceId: string;\n}): IState {\n  return {\n    progress: {},\n    programs: [basicBeginnerProgram],\n    programsIndex: [],\n    loading: { items: {} },\n    notification: args.notification,\n    storage: args.storage || Storage_getDefault(),\n    user: args.userId ? { email: args.userId, id: args.userId } : undefined,\n    errors: {},\n    revisions: {},\n    freshMigrations: false,\n    nosync: !!args.nosync,\n    deviceId: args.deviceId,\n    editProgramStates: {},\n  };\n}\n\nexport function updateState(dispatch: IDispatch, lensRecording: ILensRecordingPayload<IState>[], desc: string): void {\n  dispatch({ type: \"UpdateState\", lensRecording, desc });\n}\n\nexport function updateSettings(\n  dispatch: IDispatch,\n  lensRecording: ILensRecordingPayload<ISettings>,\n  desc: string\n): void {\n  dispatch({ type: \"UpdateSettings\", lensRecording, desc });\n}\n\nexport function updateProgress(\n  dispatch: IDispatch,\n  lensRecordings: ILensRecordingPayload<IHistoryRecord>[] | ILensRecordingPayload<IHistoryRecord>,\n  desc: string\n): void {\n  const recordings = Array.isArray(lensRecordings) ? lensRecordings : [lensRecordings];\n  dispatch({ type: \"UpdateProgress\", lensRecordings: recordings, desc });\n}\n","import { IPercentage, ISettings, IStats, IStatsHealthKey, IStatsKey, IWeight } from \"../types\";\nimport { CollectionUtils_sort, CollectionUtils_sortBy } from \"../utils/collection\";\nimport { ObjectUtils_keys } from \"../utils/object\";\nimport { Weight_add, Weight_build, Weight_divide } from \"./weight\";\n\nexport function Stats_name(key: IStatsKey | IStatsHealthKey): string {\n  switch (key) {\n    case \"bicepLeft\":\n      return \"Left Bicep\";\n    case \"bicepRight\":\n      return \"Right Bicep\";\n    case \"calfLeft\":\n      return \"Left Calf\";\n    case \"calfRight\":\n      return \"Right Calf\";\n    case \"chest\":\n      return \"Chest\";\n    case \"forearmLeft\":\n      return \"Left Forearm\";\n    case \"forearmRight\":\n      return \"Right Forearm\";\n    case \"hips\":\n      return \"Hips\";\n    case \"neck\":\n      return \"Neck\";\n    case \"shoulders\":\n      return \"Shoulders\";\n    case \"thighLeft\":\n      return \"Left Thigh\";\n    case \"thighRight\":\n      return \"Right Thigh\";\n    case \"waist\":\n      return \"Waist\";\n    case \"weight\":\n      return \"Bodyweight\";\n    case \"bodyfat\":\n      return \"Bodyfat\";\n    case \"sleep\":\n      return \"Sleep\";\n    case \"calories\":\n      return \"Calories\";\n    case \"protein\":\n      return \"Protein\";\n  }\n}\n\nexport function Stats_getCurrentBodyweight(stats: IStats): IWeight | undefined {\n  const weights = CollectionUtils_sortBy(stats.weight.weight || [], \"timestamp\", true);\n  return weights[0]?.value;\n}\n\nexport function Stats_getCurrentMovingAverageBodyweight(stats: IStats, settings: ISettings): IWeight | undefined {\n  const movingAverageWindowSize = settings.graphOptions.weight?.movingAverageWindowSize;\n  if (!movingAverageWindowSize) {\n    return Stats_getCurrentBodyweight(stats);\n  }\n  const weights = CollectionUtils_sortBy(stats.weight.weight || [], \"timestamp\", true);\n  if (weights.length < movingAverageWindowSize) {\n    return Stats_getCurrentBodyweight(stats);\n  }\n  const recentWeights = weights.slice(0, movingAverageWindowSize);\n  const totalWeight = recentWeights.reduce((sum, item) => Weight_add(sum, item.value), Weight_build(0, settings.units));\n  return Weight_divide(totalWeight, recentWeights.length);\n}\n\nexport function Stats_getCurrentBodyfat(stats: IStats): IPercentage | undefined {\n  const weights = CollectionUtils_sortBy(stats.percentage.bodyfat || [], \"timestamp\", true);\n  return weights[0]?.value;\n}\n\nexport function Stats_insertByTimestamp<T extends { timestamp: number }>(values: T[] | undefined, value: T): T[] {\n  return CollectionUtils_sort([value, ...(values || [])], (a, b) => b.timestamp - a.timestamp);\n}\n\nexport function Stats_getEmpty(): IStats {\n  return {\n    weight: {},\n    percentage: {},\n    length: {},\n  };\n}\n\nexport function Stats_isEmpty(stats: IStats): boolean {\n  const statsKeys: IStatsKey[] = [\n    ...ObjectUtils_keys(stats.weight).filter((k) => (stats.weight[k] || []).length > 0),\n    ...ObjectUtils_keys(stats.percentage).filter((k) => (stats.percentage[k] || []).length > 0),\n    ...ObjectUtils_keys(stats.length).filter((k) => (stats.length[k] || []).length > 0),\n  ];\n  return statsKeys.length === 0;\n}\n","import { runMigrations } from \"../migrations/runner\";\nimport * as v from \"valibot\";\nimport { getLatestMigrationVersion } from \"../migrations/migrations\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { Settings_build } from \"../models/settings\";\nimport { IEither } from \"../utils/types\";\nimport RB from \"rollbar\";\nimport { IState, updateState } from \"./state\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ObjectUtils_isEqual } from \"../utils/object\";\nimport { DateUtils_formatYYYYMMDD } from \"../utils/date\";\nimport { IHistoryRecord, IStorage, IPartialStorage, STORAGE_VERSION_TYPES, VStorage, VHistoryRecord } from \"../types\";\nimport { CollectionUtils_immutableSort } from \"../utils/collection\";\nimport { IVersions, VersionTracker } from \"./versionTracker\";\nimport { lg } from \"../utils/posthog\";\nimport { Diagnostics_getLastActions, Diagnostics_setLastValidationErrors } from \"../utils/diagnostics\";\n\ndeclare let Rollbar: RB;\n\nfunction formatIssuePath(issue: v.GenericIssue): string {\n  if (!issue.path || issue.path.length === 0) {\n    return \"\";\n  }\n  return issue.path\n    .map((segment) => {\n      const key = (segment as { key: unknown }).key;\n      if (typeof key === \"number\") {\n        return `[${key}]`;\n      }\n      return String(key);\n    })\n    .reduce((acc, part) => {\n      if (part.startsWith(\"[\")) {\n        return `${acc}${part}`;\n      }\n      return acc ? `${acc}.${part}` : part;\n    }, \"\");\n}\n\nexport function Storage_validate<T>(data: unknown, schema: v.GenericSchema<T>, name: string): IEither<T, string[]> {\n  const result = v.safeParse(schema, data, { abortEarly: false });\n  if (result.success) {\n    // Return the input as T (not result.output) so unknown fields are preserved at every\n    // nesting level — valibot's v.object strips unknown keys; io-ts did not, and storage may\n    // carry forward-compatible fields we do not want to silently drop. Trade-off: any\n    // v.transform / coercion added to schemas in the future will run but be discarded here.\n    return { success: true, data: data as T };\n  }\n  const errors = result.issues.map((issue) => {\n    const path = formatIssuePath(issue);\n    const head = path ? `${name}.${path}` : name;\n    return `${head}: ${issue.message}`;\n  });\n  return { success: false, error: errors };\n}\n\nexport function Storage_validateStorage(data: Record<string, unknown>): IEither<IStorage, string[]> {\n  const result = Storage_validate(data, VStorage, \"storage\");\n  if (result.success) {\n    return { success: true, data: result.data as unknown as IStorage };\n  }\n  return result;\n}\n\nexport function Storage_validateAndReportStorage(data: Record<string, unknown>): IEither<IStorage, string[]> {\n  const result = Storage_validateAndReport(data, VStorage, \"storage\");\n  if (result.success) {\n    return { success: true, data: result.data as unknown as IStorage };\n  }\n  return result;\n}\n\nexport function Storage_fillVersions<T extends IPartialStorage | IStorage>(storage: T, deviceId: string): T {\n  const versionTracker = new VersionTracker(STORAGE_VERSION_TYPES, { deviceId });\n  const timestamp = Date.now();\n  const filledVersions = versionTracker.fillVersions(storage, storage._versions || {}, timestamp);\n  return {\n    ...storage,\n    _versions: filledVersions,\n  };\n}\n\nexport function Storage_validateAndReport<T>(\n  data: unknown,\n  schema: v.GenericSchema<T>,\n  name: string\n): IEither<T, string[]> {\n  const result = Storage_validate(data, schema, name);\n  if (!result.success) {\n    const error = result.error;\n    lg(\"ls-corrupted-storage\", { lastActions: JSON.stringify(Diagnostics_getLastActions()) });\n    Diagnostics_setLastValidationErrors(error);\n    if (typeof Rollbar !== \"undefined\" && Rollbar != null) {\n      Rollbar.error(error.join(\"\\n\"), { state: JSON.stringify(data), type: name });\n    }\n    console.error(`Error decoding ${name}`);\n    console.log(data);\n    error.forEach((e) => console.error(e));\n  }\n  return result;\n}\n\nexport function Storage_get(\n  maybeStorage?: Record<string, unknown>,\n  shouldReportError?: boolean\n): IEither<IStorage, string[]> {\n  if (maybeStorage) {\n    let finalStorage = runMigrations(maybeStorage as IStorage);\n    const firstValidateResult = Storage_validate(finalStorage, VStorage, \"storage\");\n    if (!firstValidateResult.success) {\n      maybeStorage.version = \"20250322014249\";\n      finalStorage = runMigrations(maybeStorage as IStorage);\n    }\n    const result = shouldReportError\n      ? Storage_validateAndReport(finalStorage, VStorage, \"storage\")\n      : Storage_validate(finalStorage, VStorage, \"storage\");\n    if (result.success) {\n      return { success: true, data: result.data as unknown as IStorage };\n    }\n    return result;\n  } else {\n    return { success: false, error: [\"Provided data is empty\"] };\n  }\n}\n\nexport function Storage_getHistoryRecord(\n  record: Record<string, unknown>,\n  shouldReportError?: boolean\n): IEither<IHistoryRecord, string[]> {\n  const storage = Storage_getDefault();\n  storage.version = \"20251230101232\";\n  storage.history = [record as unknown as IHistoryRecord];\n  const migrated = runMigrations(storage);\n  const migratedRecord = migrated.history[0];\n  if (!migratedRecord) {\n    return { success: false, error: [\"Failed to migrate history record\"] };\n  }\n  const result = shouldReportError\n    ? Storage_validateAndReport(migratedRecord as unknown as Record<string, unknown>, VHistoryRecord, \"progress\")\n    : Storage_validate(migratedRecord as unknown as Record<string, unknown>, VHistoryRecord, \"progress\");\n  if (result.success) {\n    return { success: true, data: migratedRecord };\n  }\n  return { success: false, error: result.error };\n}\n\nexport function Storage_getDefault(): IStorage {\n  const dateNow = Date.now();\n  return {\n    id: dateNow,\n    originalId: dateNow,\n    currentProgramId: undefined,\n    reviewRequests: [],\n    signupRequests: [],\n    // Builds before 2026-09-26 require the deleted* arrays in VStorage. Drop with their removal migration.\n    deletedHistory: [],\n    deletedPrograms: [],\n    deletedStats: [],\n    tempUserId: UidFactory_generateUid(10),\n    affiliates: {},\n    progress: [],\n    stats: {\n      weight: { weight: [] },\n      length: {\n        neck: [],\n        shoulders: [],\n        bicepLeft: [],\n        bicepRight: [],\n        forearmLeft: [],\n        forearmRight: [],\n        chest: [],\n        waist: [],\n        hips: [],\n        thighLeft: [],\n        thighRight: [],\n        calfLeft: [],\n        calfRight: [],\n      },\n      percentage: { bodyfat: [] },\n    },\n    settings: Settings_build(),\n    history: [],\n    version: getLatestMigrationVersion(),\n    subscription: { apple: [], google: [] },\n    programs: [],\n    helps: [],\n    email: undefined,\n    whatsNew: DateUtils_formatYYYYMMDD(Date.now(), \"\"),\n  };\n}\n\nexport function Storage_setAffiliate(dispatch: IDispatch, source: string, type: \"coupon\" | \"program\"): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"affiliates\")\n        .recordModify((affiliates) => {\n          if (affiliates[source] != null) {\n            return affiliates;\n          }\n          return { ...affiliates, [source]: { id: source, timestamp: Date.now(), type, vtype: \"affiliate\" } };\n        }),\n    ],\n    \"Set affiliate\"\n  );\n}\n\nexport function Storage_isChanged(aStorage?: IStorage, bStorage?: IStorage): boolean {\n  if ((!aStorage && bStorage) || (!bStorage && aStorage)) {\n    return true;\n  }\n  if (!aStorage && !bStorage) {\n    return false;\n  }\n  const { originalId: _aOriginalId, id: _aId, _versions: _aVersions, ...cleanedAStorage } = aStorage!;\n  const { originalId: _bOriginalId, id: _bId, _versions: _bVersions, ...cleanedBStorage } = bStorage!;\n  const changed = !ObjectUtils_isEqual(cleanedAStorage, cleanedBStorage, [\"version\"]);\n  return changed;\n}\n\nexport function Storage_isFullStorage(storage: IStorage | IPartialStorage): storage is IStorage {\n  return storage.programs != null && storage.history != null && storage.stats != null;\n}\n\nexport function Storage_partialStorageToStorage(partialStorage: IPartialStorage): IStorage {\n  if (partialStorage.history != null && partialStorage.programs != null && partialStorage.stats != null) {\n    return partialStorage as IStorage;\n  } else {\n    return {\n      ...partialStorage,\n      history: partialStorage.history || [],\n      programs: partialStorage.programs || [],\n      stats: partialStorage.stats || {\n        length: {},\n        percentage: {},\n        weight: {},\n      },\n    };\n  }\n}\n\nexport function Storage_updateVersions(\n  oldStorage: IPartialStorage,\n  newStorage: IPartialStorage,\n  deviceId: string\n): IVersions<IStorage> {\n  const { id: oldId, originalId: oldOriginalId, _versions: oldVersions, ...oldCleanedStorage } = oldStorage;\n  const { id: newId, originalId: newOriginalId, _versions: newVersions, ...newCleanedStorage } = newStorage;\n  const versionTracker = new VersionTracker(STORAGE_VERSION_TYPES, { deviceId });\n  const timestamp = Date.now();\n  if (\n    oldCleanedStorage.tempUserId === newCleanedStorage.tempUserId &&\n    oldCleanedStorage.version === newCleanedStorage.version\n  ) {\n    return versionTracker.updateVersions(\n      oldCleanedStorage,\n      newCleanedStorage,\n      oldStorage._versions || {},\n      newStorage._versions || {},\n      timestamp\n    );\n  } else {\n    return newVersions || {};\n  }\n}\n\nexport function Storage_mergeStorage(oldStorage: IStorage, newStorage: IStorage, deviceId: string): IStorage {\n  const migratedOldStorage = runMigrations(oldStorage);\n  const migratedNewStorage = runMigrations(newStorage);\n  const { id: oldId, originalId: oldOriginalId, _versions: oldVersions, ...oldCleanedStorage } = migratedOldStorage;\n  const { id: newId, originalId: newOriginalId, _versions: newVersions, ...newCleanedStorage } = migratedNewStorage;\n  const versionTracker = new VersionTracker(STORAGE_VERSION_TYPES, { deviceId });\n  const updatedVersions = versionTracker.mergeVersions(oldVersions || {}, newVersions || {});\n  const updatedCleanedStorage = versionTracker.mergeByVersions(\n    oldCleanedStorage,\n    oldVersions || {},\n    newVersions || {},\n    newCleanedStorage\n  );\n  const updatedStorage: IStorage = {\n    ...updatedCleanedStorage,\n    id: Math.max(newId || Date.now(), oldId || Date.now()),\n    originalId: Math.max(newOriginalId ?? 0, oldOriginalId ?? 0),\n    _versions: updatedVersions,\n  };\n  const sortedProgress = sortProgressByIndex(updatedStorage.progress);\n  return sortedProgress === updatedStorage.progress ? updatedStorage : { ...updatedStorage, progress: sortedProgress };\n}\n\nfunction sortProgressByIndex(progress: undefined): undefined;\nfunction sortProgressByIndex(progress: IHistoryRecord[]): IHistoryRecord[];\nfunction sortProgressByIndex(progress: IHistoryRecord[] | undefined): IHistoryRecord[] | undefined;\nfunction sortProgressByIndex(progress: IHistoryRecord[] | undefined): IHistoryRecord[] | undefined {\n  if (!progress || progress.length === 0) {\n    return progress;\n  }\n  const head = progress[0];\n  if (!head.entries || head.entries.length === 0) {\n    return progress;\n  }\n\n  const byIndex = (a: { index: number }, b: { index: number }): number => a.index - b.index;\n\n  let entriesWithSortedSets = head.entries;\n  for (let i = 0; i < head.entries.length; i++) {\n    const entry = head.entries[i];\n    const sortedSets = CollectionUtils_immutableSort(entry.sets, byIndex);\n    if (sortedSets !== entry.sets) {\n      if (entriesWithSortedSets === head.entries) {\n        entriesWithSortedSets = head.entries.slice();\n      }\n      entriesWithSortedSets[i] = { ...entry, sets: sortedSets };\n    }\n  }\n\n  const sortedEntries = CollectionUtils_immutableSort(entriesWithSortedSets, byIndex);\n  if (sortedEntries === head.entries) {\n    return progress;\n  }\n  return [{ ...head, entries: sortedEntries }, ...progress.slice(1)];\n}\n","import { Exercise_get, Exercise_fullName, Exercise_getIsUnilateral } from \"./exercise\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport { ExerciseImageUtils_url } from \"./exerciseImage\";\nimport type { IActiveSetTimer } from \"./progress\";\nimport { IHistoryRecord, ISet, ISettings, ITimedSetSide } from \"../types\";\n\nexport interface ITimedSetView {\n  phaseId: string;\n  entryIndex: number;\n  setIndex: number;\n  setId: string;\n  stage: \"getReady\" | \"work\";\n  side: ITimedSetSide;\n  startedAt: number;\n  getReadySeconds: number;\n  targetSeconds: number;\n  restSeconds: number;\n  isOverflow: boolean;\n  isCompleted: boolean;\n  recordedThisSide: boolean;\n  exerciseName: string;\n  exerciseShortName: string;\n  imageUrl?: string;\n  currentSet: number;\n  totalSets: number;\n}\n\nexport function TimedSet_recordedFor(set: ISet, side: ITimedSetSide): number | undefined {\n  return side === \"left\" ? set.completedSetTimerLeft : set.completedSetTimer;\n}\n\nexport function TimedSet_withRecorded(set: ISet, side: ITimedSetSide, seconds: number): ISet {\n  return side === \"left\" ? { ...set, completedSetTimerLeft: seconds } : { ...set, completedSetTimer: seconds };\n}\n\nexport function TimedSet_sideToTime(set: ISet, isUnilateral: boolean): ITimedSetSide | undefined {\n  if (!isUnilateral) {\n    return set.completedSetTimer == null ? \"bilateral\" : undefined;\n  }\n  if (set.completedSetTimerLeft == null) {\n    return \"left\";\n  }\n  return set.completedSetTimer == null ? \"right\" : undefined;\n}\n\nexport interface ITimedSetPhaseFields {\n  setTimer?: NonNullable<IHistoryRecord[\"setTimer\"]>;\n  setTimerGetReady?: NonNullable<IHistoryRecord[\"setTimerGetReady\"]>;\n}\n\nexport function TimedSet_open(\n  progress: IHistoryRecord,\n  entryIndex: number,\n  setIndex: number,\n  settings: ISettings,\n  opts: { getReadySeconds: number; startedAt: number; nonce?: number }\n): ITimedSetPhaseFields | undefined {\n  const entry = progress.entries[entryIndex];\n  const set = entry?.sets[setIndex];\n  if (entry == null || set == null) {\n    return undefined;\n  }\n  const side = TimedSet_sideToTime(set, Exercise_getIsUnilateral(entry.exercise, settings));\n  if (side == null) {\n    return undefined;\n  }\n  const identity = { entryIndex, setIndex, setId: set.id, id: UidFactory_generateUid(8), side };\n  return opts.getReadySeconds > 0\n    ? {\n        setTimerGetReady: {\n          ...identity,\n          startedAt: opts.startedAt,\n          getReady: opts.getReadySeconds,\n          nonce: opts.nonce,\n        },\n      }\n    : { setTimer: { ...identity, startedAt: opts.startedAt, nonce: opts.nonce } };\n}\n\nexport function TimedSet_toView(\n  progress: IHistoryRecord,\n  phase: IActiveSetTimer | undefined,\n  settings: ISettings\n): ITimedSetView | undefined {\n  if (phase == null || progress.amrapModal != null) {\n    return undefined;\n  }\n  const entry = progress.entries[phase.entryIndex];\n  const set = entry?.sets[phase.setIndex];\n  if (entry == null || set == null) {\n    return undefined;\n  }\n  const exercise = Exercise_get(entry.exercise, settings.exercises);\n  return {\n    phaseId: phase.id,\n    entryIndex: phase.entryIndex,\n    setIndex: phase.setIndex,\n    setId: phase.setId,\n    stage: phase.phase,\n    side: phase.side,\n    startedAt: phase.startedAt,\n    getReadySeconds: phase.phase === \"getReady\" ? phase.getReady : 0,\n    targetSeconds: set.setTimer ?? 0,\n    restSeconds: set.timer ?? 0,\n    isOverflow: !!set.isOverflowSetTimer,\n    isCompleted: !!set.isCompleted,\n    recordedThisSide: TimedSet_recordedFor(set, phase.side) != null,\n    exerciseName: Exercise_fullName(exercise, settings),\n    exerciseShortName: exercise.name,\n    imageUrl: ExerciseImageUtils_url(exercise, \"small\", settings),\n    currentSet: entry.warmupSets.length + phase.setIndex + 1,\n    totalSets: entry.warmupSets.length + entry.sets.length,\n  };\n}\n","/**\n * VersionTracker - A field-level version tracking system for JavaScript objects\n *\n * This module provides a generic, configurable version tracking system that records\n * timestamps for individual field changes within complex object hierarchies. It's\n * designed to support conflict resolution in distributed systems where multiple\n * clients may modify the same data offline.\n *\n * ## Core Concepts:\n *\n * ### 1. Atomic Objects\n * Objects that are versioned as a single unit. When any property of an atomic\n * object changes, the entire object gets a single version timestamp. This is\n * useful for objects that should be treated as indivisible units.\n *\n * Example: A \"history_record\" might be atomic because all its fields (date,\n * exercises, sets) should be synced together as one cohesive workout session.\n *\n * ### 2. Controlled Objects\n * Objects where only specific fields are versioned. This allows fine-grained\n * control over which properties trigger version updates. Useful for objects\n * where some fields are critical for sync while others are local-only or\n * computed.\n *\n * Example: A \"program\" might have controlled fields like \"name\" and \"nextDay\"\n * that need versioning, while fields like \"description\" might not need tracking.\n *\n * ### 3. Regular Objects\n * Objects that aren't atomic or controlled have each field versioned\n * independently. This provides maximum granularity for conflict resolution.\n *\n * ### 4. Collections (Arrays and Dictionaries)\n * Arrays and dictionary objects containing items with IDs are treated specially.\n * The tracker maintains an \"items\" map (ID -> version) and a \"deleted\" map\n * (ID -> deletion timestamp) to handle additions, updates, and deletions.\n *\n * ## How It Works:\n *\n * 1. **Initialization**: Create a VersionTracker with configuration specifying\n *    atomic types, controlled types, their ID fields, and dictionary paths.\n *\n * 2. **Version Tracking**: Call updateVersions() with old and new objects to\n *    generate a version tree that mirrors the object structure but contains\n *    timestamps instead of values.\n *\n * 3. **Conflict Resolution**: Use the version tree to merge changes from\n *    multiple sources by comparing timestamps - newer timestamps win.\n *\n * ## Usage Example:\n *\n * ```typescript\n * // Define your configuration\n * const config: IVersionTypes<MyAtomicType, MyControlledType> = {\n *   atomicTypes: [\"history_record\", \"user_preference\"],\n *   controlledTypes: [\"program\", \"exercise\"],\n *   typeIdMapping: {\n *     \"history_record\": \"id\",\n *     \"program\": \"id\",\n *     \"exercise\": \"name\"\n *   },\n *   controlledFields: {\n *     \"program\": [\"name\", \"nextDay\"],\n *     \"exercise\": [\"sets\", \"reps\"]\n *   },\n *   dictionaryFields: [\"settings.exercises\", \"users.preferences\"]\n * };\n *\n * // Create tracker instance\n * const tracker = new VersionTracker(config);\n *\n * // Track changes\n * const oldState = { name: \"John\", age: 30, settings: { theme: \"dark\" } };\n * const newState = { name: \"John\", age: 31, settings: { theme: \"light\" } };\n * const versions = tracker.updateVersions(oldState, newState, {}, Date.now());\n * // Result: { age: 1234567890, settings: { theme: 1234567890 } }\n * ```\n */\nimport { IVersionTypes, IVersions } from \"./versionTracker/types\";\nimport { VersionTrackerDiffVersions } from \"./versionTracker/versionTrackerDiffVersions\";\nimport { VersionTrackerExtractByVersions } from \"./versionTracker/versionTrackerExtractByVersions\";\nimport { VersionTrackerFillVersions } from \"./versionTracker/versionTrackerFillVersions\";\nimport { VersionTrackerMergeByVersions } from \"./versionTracker/versionTrackerMergeByVersions\";\nimport { VersionTrackerMergeVersions } from \"./versionTracker/versionTrackerMergeVersions\";\nimport { VersionTrackerUpdateVersions } from \"./versionTracker/versionTrackerUpdateVersions\";\n\nexport * from \"./versionTracker/types\";\n\nexport class VersionTracker<TAtomicType extends string, TControlledType extends string> {\n  private readonly versionTypes: IVersionTypes<TAtomicType, TControlledType>;\n  private readonly deviceId: string;\n\n  // A tracker acts on behalf of exactly one writer, and it has to be told which. When this was\n  // optional, any construction that left it out minted bare timestamps instead of vector clocks -\n  // which zeroed every device's counter and silently rolled a user's program back seven weeks.\n  constructor(versionTypes: IVersionTypes<TAtomicType, TControlledType>, options: { deviceId: string }) {\n    this.versionTypes = versionTypes;\n    this.deviceId = options.deviceId;\n  }\n\n  public updateVersions<T extends Record<string, unknown>>(\n    oldObj: T,\n    newObj: T,\n    currentVersions: IVersions<T>,\n    newVersions: IVersions<T>,\n    timestamp: number\n  ): IVersions<T> {\n    return new VersionTrackerUpdateVersions(this.versionTypes, this.deviceId).run(\n      oldObj,\n      newObj,\n      currentVersions,\n      newVersions,\n      timestamp\n    );\n  }\n\n  public fillVersions<T extends Record<string, unknown>>(\n    fullObj: T,\n    versions: IVersions<T>,\n    timestamp: number\n  ): IVersions<T> {\n    return new VersionTrackerFillVersions(this.versionTypes, this.deviceId).run(fullObj, versions, timestamp);\n  }\n\n  public diffVersions<T>(oldVersions: IVersions<T> | undefined, newVersions: IVersions<T>): IVersions<T> | undefined {\n    return new VersionTrackerDiffVersions().run(oldVersions, newVersions);\n  }\n\n  public extractByVersions<T extends Record<string, unknown>>(obj: T, versionsDiff: IVersions<T>): Partial<T> {\n    return new VersionTrackerExtractByVersions(this.versionTypes).run(obj, versionsDiff);\n  }\n\n  public mergeByVersions<T extends Record<string, unknown>>(\n    fullObj: T,\n    fullVersions: IVersions<T>,\n    versionDiff: IVersions<T>,\n    extractedObj: Partial<T>\n  ): T {\n    return new VersionTrackerMergeByVersions(this.versionTypes).run(fullObj, fullVersions, versionDiff, extractedObj);\n  }\n\n  public mergeVersions<T>(fullVersions: IVersions<T>, versionDiff: IVersions<T>): IVersions<T> {\n    return new VersionTrackerMergeVersions(this.versionTypes).run(fullVersions, versionDiff);\n  }\n}\n","export interface IVectorClock {\n  vc: { [deviceId: string]: number };\n  t: number;\n}\n\nexport interface IIdVersion extends IVectorClock {\n  value: string;\n}\n\nexport type IFieldVersion = number | IVectorClock | IIdVersion;\n\nexport interface IVersionsObject {\n  [key: string]: IVersionValue | undefined;\n}\n\nexport type IVersionValue = IFieldVersion | IVersionsObject | ICollectionVersions;\n\nexport type IVersions<T> = {\n  [K in keyof T & string]?: IVersionValue;\n};\n\nexport interface ICollectionVersions {\n  items?: Record<string, IVersionsObject | IFieldVersion>;\n  deleted?: Record<string, number>;\n  nukedeleted?: number;\n}\n\nexport type ITypedObject<T extends string = string> = { vtype: T } & Record<string, unknown>;\n\nexport interface IVersionTypes<TAtomicType extends string, TControlledType extends string> {\n  atomicTypes: readonly TAtomicType[];\n  controlledTypes: readonly TControlledType[];\n  typeIdMapping: Record<TAtomicType | TControlledType, string>;\n  controlledFields: Record<TControlledType, readonly string[]>;\n  excludedFields?: Partial<Record<TControlledType, readonly string[]>>;\n  dictionaryFields: readonly string[];\n  compactionThresholds?: Record<string, number>;\n  typeValidators?: Partial<Record<TControlledType, { is: (u: unknown) => boolean }>>;\n}\n\nexport function isVectorClock(v: unknown): v is IVectorClock {\n  return typeof v === \"object\" && v !== null && \"vc\" in v && \"t\" in v;\n}\n\nexport function isIdVersion(v: unknown): v is IIdVersion {\n  return isVectorClock(v) && \"value\" in v && typeof (v as IIdVersion).value === \"string\";\n}\n\nexport function isFieldVersion(v: unknown): v is IFieldVersion {\n  return typeof v === \"number\" || isVectorClock(v);\n}\n\nexport function isCollectionVersions(v: unknown): v is ICollectionVersions {\n  return v !== null && typeof v === \"object\" && (\"items\" in v || \"deleted\" in v);\n}\n\nexport function isVersionsObject(v: unknown): v is IVersionsObject {\n  return v !== null && typeof v === \"object\" && !isCollectionVersions(v) && !isFieldVersion(v);\n}\n","import { ObjectUtils_isEqual } from \"../../utils/object\";\nimport {\n  IVersionTypes,\n  ITypedObject,\n  IFieldVersion,\n  IVectorClock,\n  IIdVersion,\n  IVersionsObject,\n  IVersionValue,\n  IVersions,\n  ICollectionVersions,\n  isVectorClock,\n  isIdVersion,\n  isCollectionVersions,\n  isVersionsObject,\n} from \"./types\";\n\nexport function VersionTrackerUtils_isAtomicType<TAtomicType extends string, TControlledType extends string>(\n  value: unknown,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): value is ITypedObject<TAtomicType> {\n  return VersionTrackerUtils_isTypedObject(value) && versionTypes.atomicTypes.includes(value.vtype as TAtomicType);\n}\n\nexport function VersionTrackerUtils_isControlledType<TAtomicType extends string, TControlledType extends string>(\n  value: unknown,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): value is ITypedObject<TControlledType> {\n  return (\n    VersionTrackerUtils_isTypedObject(value) && versionTypes.controlledTypes.includes(value.vtype as TControlledType)\n  );\n}\n\nexport function VersionTrackerUtils_isTypedObject(value: unknown): value is ITypedObject {\n  return typeof value === \"object\" && value !== null && \"vtype\" in value && typeof value.vtype === \"string\";\n}\n\nexport function VersionTrackerUtils_isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null;\n}\n\nexport function VersionTrackerUtils_areEqual(a: unknown, b: unknown): boolean {\n  return ObjectUtils_isEqual(a as Record<string, unknown>, b as Record<string, unknown>);\n}\n\nexport function VersionTrackerUtils_getId<TAtomicType extends string, TControlledType extends string>(\n  obj: unknown,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): string | undefined {\n  if (!VersionTrackerUtils_isTypedObject(obj)) {\n    return undefined;\n  }\n  const idField = versionTypes.typeIdMapping[obj.vtype as TAtomicType | TControlledType];\n  if (!idField || !(idField in obj)) {\n    return undefined;\n  }\n  const id = obj[idField];\n  return id != null ? String(id) : undefined;\n}\n\nexport function VersionTrackerUtils_asVersionsObject<T>(versions: IVersions<T>): IVersionsObject {\n  return versions as IVersionsObject;\n}\n\nexport function VersionTrackerUtils_ensureVersionsObject(version: IVersionValue | undefined): IVersionsObject {\n  if (isVersionsObject(version)) {\n    return version;\n  }\n  return {};\n}\n\nexport function VersionTrackerUtils_ensureCollectionVersions(version: IVersionValue | undefined): ICollectionVersions {\n  if (isCollectionVersions(version)) {\n    return version;\n  }\n  return { items: {}, deleted: {} };\n}\n\nexport function VersionTrackerUtils_createVersion(\n  timestamp: number,\n  currentVersion: IFieldVersion | undefined,\n  deviceId: string\n): IFieldVersion {\n  // This helper can no longer emit a bare timestamp, and that is the point: minting one zeroed every\n  // device's counter, so the next write restarted that device at 1 while a replica dormant since\n  // before the reset still held a higher count for the same node - and then won every later merge\n  // outright. Only an empty string reaches the fallback, and a node named \"\" would collide across\n  // writers.\n  const node = deviceId || VersionTrackerUtils_SERVER_DEVICE_ID;\n  const current = VersionTrackerUtils_normalizeVersion(currentVersion);\n  const newClock = { ...current.vc };\n  newClock[node] = (newClock[node] || 0) + 1;\n\n  return {\n    vc: newClock,\n    t: timestamp,\n  };\n}\n\nexport function VersionTrackerUtils_normalizeVersion(version?: IFieldVersion): IVectorClock {\n  if (!version) {\n    return { vc: {}, t: 0 };\n  }\n  if (isVectorClock(version)) {\n    return version;\n  }\n  return { vc: {}, t: version };\n}\n\nexport function VersionTrackerUtils_compareVersions(\n  a: IFieldVersion,\n  b: IFieldVersion\n): \"a_newer\" | \"b_newer\" | \"concurrent\" | \"equal\" {\n  const aNorm = VersionTrackerUtils_normalizeVersion(a);\n  const bNorm = VersionTrackerUtils_normalizeVersion(b);\n\n  const aDevices = Object.keys(aNorm.vc);\n  const bDevices = Object.keys(bNorm.vc);\n  const aHasVc = aDevices.length > 0;\n  const bHasVc = bDevices.length > 0;\n\n  if (aHasVc !== bHasVc) {\n    if (aNorm.t === bNorm.t) {\n      return \"equal\";\n    }\n    return aNorm.t > bNorm.t ? \"a_newer\" : \"b_newer\";\n  }\n\n  if (!aHasVc && !bHasVc) {\n    if (aNorm.t === bNorm.t) {\n      return \"equal\";\n    }\n    return aNorm.t > bNorm.t ? \"a_newer\" : \"b_newer\";\n  }\n\n  const allDevices = new Set([...aDevices, ...bDevices]);\n  let aHasHigher = false;\n  let bHasHigher = false;\n\n  for (const deviceId of allDevices) {\n    const aCount = aNorm.vc[deviceId] || 0;\n    const bCount = bNorm.vc[deviceId] || 0;\n\n    if (aCount > bCount) {\n      aHasHigher = true;\n    }\n    if (bCount > aCount) {\n      bHasHigher = true;\n    }\n  }\n\n  if (!aHasHigher && !bHasHigher) {\n    return \"equal\";\n  }\n  if (aHasHigher && !bHasHigher) {\n    return \"a_newer\";\n  }\n  if (bHasHigher && !aHasHigher) {\n    return \"b_newer\";\n  }\n  return \"concurrent\";\n}\n\nexport function VersionTrackerUtils_mergeFieldVersions(a: IFieldVersion, b: IFieldVersion): IFieldVersion {\n  const comparison = VersionTrackerUtils_compareVersions(a, b);\n  if (comparison === \"a_newer\") {\n    return a;\n  }\n  if (comparison === \"b_newer\") {\n    return b;\n  }\n  if (comparison === \"equal\") {\n    return a;\n  }\n\n  const aNorm = VersionTrackerUtils_normalizeVersion(a);\n  const bNorm = VersionTrackerUtils_normalizeVersion(b);\n\n  const allDevices = new Set([...Object.keys(aNorm.vc), ...Object.keys(bNorm.vc)]);\n  const mergedVc: { [deviceId: string]: number } = {};\n\n  for (const deviceId of allDevices) {\n    mergedVc[deviceId] = Math.max(aNorm.vc[deviceId] || 0, bNorm.vc[deviceId] || 0);\n  }\n\n  return {\n    vc: mergedVc,\n    t: Math.max(aNorm.t, bNorm.t),\n  };\n}\n\nexport function VersionTrackerUtils_incrementNukedeleted(collection: ICollectionVersions): ICollectionVersions {\n  if (collection.nukedeleted == null) {\n    return collection;\n  }\n  const next = collection.nukedeleted + 1;\n  if (next > VersionTrackerUtils_NUKEDELETED_THRESHOLD) {\n    const { nukedeleted, ...rest } = collection;\n    return rest;\n  }\n  return { ...collection, nukedeleted: next };\n}\n\nexport function VersionTrackerUtils_applyCompaction<TAtomicType extends string, TControlledType extends string>(\n  collection: ICollectionVersions,\n  path: string,\n  currentTimestamp: number,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): ICollectionVersions {\n  const threshold = path && versionTypes.compactionThresholds ? versionTypes.compactionThresholds[path] : undefined;\n\n  if (!threshold || !collection.deleted || Object.keys(collection.deleted).length === 0) {\n    return collection;\n  }\n\n  const result: ICollectionVersions = {\n    items: collection.items,\n    deleted: {},\n  };\n\n  for (const [key, deletionTimestamp] of Object.entries(collection.deleted)) {\n    if (currentTimestamp - deletionTimestamp < threshold) {\n      result.deleted![key] = deletionTimestamp;\n    }\n  }\n\n  return result;\n}\n\nexport function VersionTrackerUtils_getIdFieldName<TAtomicType extends string, TControlledType extends string>(\n  vtype: TControlledType,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): string | undefined {\n  return versionTypes.typeIdMapping[vtype];\n}\n\nexport function VersionTrackerUtils_createIdVersion(\n  timestamp: number,\n  value: string,\n  currentVersion: IIdVersion | undefined,\n  deviceId: string\n): IIdVersion {\n  // Reusing the current clock unchanged made this write compare \"equal\" to the one it replaces, so a\n  // merge kept the other side and the change was silently dropped. Always claim a node instead.\n  const node = deviceId || VersionTrackerUtils_SERVER_DEVICE_ID;\n  const current = currentVersion ? { vc: currentVersion.vc, t: currentVersion.t } : { vc: {}, t: 0 };\n  const newClock = { ...current.vc };\n  newClock[node] = (newClock[node] || 0) + 1;\n\n  return {\n    vc: newClock,\n    t: timestamp,\n    value,\n  };\n}\n\nexport function VersionTrackerUtils_pickWinningIdVersion(a: IIdVersion, b: IIdVersion): IIdVersion {\n  const comparison = VersionTrackerUtils_compareVersions(a, b);\n  if (comparison === \"a_newer\") {\n    return a;\n  }\n  if (comparison === \"b_newer\") {\n    return b;\n  }\n  // For concurrent or equal, use timestamp as tiebreaker\n  return a.t >= b.t ? a : b;\n}\n\nexport function VersionTrackerUtils_getIdValue<TAtomicType extends string, TControlledType extends string>(\n  obj: unknown,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): string | undefined {\n  if (!VersionTrackerUtils_isControlledType(obj, versionTypes)) {\n    return undefined;\n  }\n  const idField = versionTypes.typeIdMapping[obj.vtype];\n  if (!idField || !(idField in obj)) {\n    return undefined;\n  }\n  const id = obj[idField];\n  return id != null ? String(id) : undefined;\n}\n\nexport function VersionTrackerUtils_getIdVersionFromVersions<\n  TAtomicType extends string,\n  TControlledType extends string,\n>(\n  vtype: TControlledType,\n  versions: IVersionsObject | undefined,\n  versionTypes: IVersionTypes<TAtomicType, TControlledType>\n): IIdVersion | undefined {\n  if (!versions) {\n    return undefined;\n  }\n  const idField = versionTypes.typeIdMapping[vtype];\n  if (!idField) {\n    return undefined;\n  }\n  const idVersion = versions[idField];\n  return isIdVersion(idVersion) ? idVersion : undefined;\n}\n\nexport const VersionTrackerUtils_NUKEDELETED_THRESHOLD = 3;\n\n// Server-side writes have no client device to attribute to, but they still have to claim a node in the\n// vector clock rather than erase it. One shared id is correct here: every server write serializes through\n// a read-modify-write of the user's stored storage, so the server behaves as a single replica.\nexport const VersionTrackerUtils_SERVER_DEVICE_ID = \"srv_api\";\n\n// A sync from a client that sent no device id. Rejecting it would break installs that predate the\n// client-side fix, so they share one node - no worse than the bare timestamps they write today, and it\n// at least preserves the clock. The server logs every use, so this can become a hard 400 once it drains.\nexport const VersionTrackerUtils_UNIDENTIFIED_DEVICE_ID = \"unk_client\";\n","import { ObjectUtils_keys } from \"../../utils/object\";\nimport { SetUtils_areEqual } from \"../../utils/setUtils\";\nimport {\n  IVersions,\n  IVersionsObject,\n  IVersionValue,\n  ICollectionVersions,\n  isFieldVersion,\n  isCollectionVersions,\n  isVersionsObject,\n} from \"./types\";\nimport { VersionTrackerUtils_compareVersions } from \"./utils\";\n\nexport class VersionTrackerDiffVersions {\n  public run<T>(oldVersions: IVersions<T> | undefined, newVersions: IVersions<T>): IVersions<T> | undefined {\n    const diff: IVersions<T> = {};\n    let hasChanges = false;\n\n    for (const key of ObjectUtils_keys(newVersions)) {\n      const oldVersion = oldVersions?.[key];\n      const newVersion = newVersions[key];\n\n      const fieldDiff = this.diffFieldVersion(oldVersion, newVersion);\n      if (fieldDiff != null) {\n        diff[key] = fieldDiff;\n        hasChanges = true;\n      }\n    }\n\n    return hasChanges ? diff : undefined;\n  }\n\n  private diffFieldVersion(\n    oldVersion: IVersionValue | undefined,\n    newVersion: IVersionValue | undefined\n  ): IVersionValue | undefined {\n    if (isFieldVersion(oldVersion) && isFieldVersion(newVersion)) {\n      const comparison = VersionTrackerUtils_compareVersions(oldVersion, newVersion);\n      return comparison === \"equal\" ? undefined : newVersion;\n    }\n\n    if (isFieldVersion(newVersion) && !isFieldVersion(oldVersion)) {\n      return newVersion;\n    }\n\n    if (isCollectionVersions(newVersion)) {\n      const oldCollection = isCollectionVersions(oldVersion) ? oldVersion : undefined;\n      const diffCollection: ICollectionVersions = { items: {} };\n      let hasChanges = false;\n\n      const oldDeletedKeys = new Set(Object.keys(oldCollection?.deleted || {}));\n      const newDeletedKeys = new Set(Object.keys(newVersion.deleted || {}));\n      if (!SetUtils_areEqual(oldDeletedKeys, newDeletedKeys)) {\n        hasChanges = true;\n      }\n      diffCollection.deleted = { ...(oldCollection?.deleted || {}), ...(newVersion.deleted || {}) };\n      for (const id in newVersion.items) {\n        if (diffCollection.deleted && id in diffCollection.deleted) {\n          continue;\n        }\n        const oldItemVersion = oldCollection?.items?.[id];\n        const newItemVersion = newVersion.items[id];\n\n        const itemDiff = this.diffFieldVersion(oldItemVersion, newItemVersion);\n        if (itemDiff != null && !isCollectionVersions(itemDiff)) {\n          diffCollection.items = diffCollection.items || {};\n          diffCollection.items[id] = itemDiff;\n          hasChanges = true;\n        }\n      }\n\n      return hasChanges ? diffCollection : undefined;\n    }\n\n    if (isVersionsObject(newVersion)) {\n      const oldObj = isVersionsObject(oldVersion) ? oldVersion : undefined;\n      const diffObj: IVersionsObject = {};\n      let hasChanges = false;\n\n      for (const key of Object.keys(newVersion)) {\n        const fieldDiff = this.diffFieldVersion(oldObj?.[key], newVersion[key]);\n        if (fieldDiff != null) {\n          diffObj[key] = fieldDiff;\n          hasChanges = true;\n        }\n      }\n\n      return hasChanges ? diffObj : undefined;\n    }\n\n    return undefined;\n  }\n}\n","import { ObjectUtils_keys } from \"../../utils/object\";\nimport {\n  IVersionTypes,\n  IVersions,\n  IVersionValue,\n  IVersionsObject,\n  ICollectionVersions,\n  isFieldVersion,\n  isCollectionVersions,\n  isVersionsObject,\n} from \"./types\";\nimport { VersionTrackerUtils_isRecord, VersionTrackerUtils_isControlledType, VersionTrackerUtils_getId } from \"./utils\";\n\nexport class VersionTrackerExtractByVersions<TAtomicType extends string, TControlledType extends string> {\n  private readonly versionTypes: IVersionTypes<TAtomicType, TControlledType>;\n\n  constructor(versionTypes: IVersionTypes<TAtomicType, TControlledType>) {\n    this.versionTypes = versionTypes;\n  }\n\n  public run<T extends Record<string, unknown>>(obj: T, versionsDiff: IVersions<T>): Partial<T> {\n    const result: Partial<T> = {};\n\n    for (const key of ObjectUtils_keys(versionsDiff)) {\n      const version = versionsDiff[key];\n      const value = obj[key];\n\n      if (value != null) {\n        const extractedValue = this.extractFieldByVersion(value, version);\n        if (extractedValue != null) {\n          result[key] = extractedValue as T[typeof key];\n        }\n      }\n    }\n\n    return result;\n  }\n\n  private extractFieldByVersion(value: unknown, version: IVersionValue | undefined): unknown {\n    if (isFieldVersion(version)) {\n      return value;\n    }\n\n    if (isCollectionVersions(version)) {\n      return this.extractCollectionByVersion(value, version);\n    }\n\n    if (isVersionsObject(version) && VersionTrackerUtils_isRecord(value)) {\n      if (VersionTrackerUtils_isControlledType(value, this.versionTypes)) {\n        return this.extractControlledTypeByVersion(value, version);\n      }\n\n      return this.run(value, version);\n    }\n\n    return value;\n  }\n\n  private extractControlledTypeByVersion(value: Record<string, unknown>, version: IVersionsObject): unknown {\n    const vtype = value.vtype as TControlledType;\n    const controlledFields = this.versionTypes.controlledFields[vtype] || [];\n    const excludedFields = this.versionTypes.excludedFields?.[vtype] || [];\n    const excludedFieldsSet = new Set(excludedFields);\n\n    const hasControlledFieldChange = controlledFields.some((field) => version[field] != null);\n\n    if (!hasControlledFieldChange) {\n      return undefined;\n    }\n\n    const result: Record<string, unknown> = {};\n    for (const key of Object.keys(value)) {\n      if (!excludedFieldsSet.has(key)) {\n        result[key] = value[key];\n      }\n    }\n    return result;\n  }\n\n  private extractCollectionByVersion(value: unknown, collectionVersion: ICollectionVersions): unknown {\n    const hasItemChanges = Object.keys(collectionVersion.items || {}).length > 0;\n    const hasDeletions = Object.keys(collectionVersion.deleted || {}).length > 0;\n    const hasChanges = hasItemChanges || hasDeletions;\n\n    if (!hasChanges) {\n      return undefined;\n    }\n\n    if (Array.isArray(value)) {\n      const result: unknown[] = [];\n\n      for (const item of value) {\n        const itemId = VersionTrackerUtils_getId(item, this.versionTypes);\n        if (itemId && itemId in (collectionVersion.items || {})) {\n          const itemVersion = collectionVersion.items![itemId];\n          if (typeof itemVersion === \"object\" && VersionTrackerUtils_isRecord(item)) {\n            const extracted = this.extractFieldByVersion(item, itemVersion);\n            if (extracted != null) {\n              result.push(extracted);\n            }\n          } else {\n            result.push(item);\n          }\n        }\n      }\n\n      // Return the array even if empty - deletions are still changes\n      return result;\n    } else if (VersionTrackerUtils_isRecord(value)) {\n      const result: Record<string, unknown> = {};\n\n      for (const key in collectionVersion.items) {\n        if (key in value) {\n          const itemVersion = collectionVersion.items[key];\n          const itemValue = value[key];\n\n          if (typeof itemVersion === \"object\" && VersionTrackerUtils_isRecord(itemValue)) {\n            const extracted = this.extractFieldByVersion(itemValue, itemVersion);\n            if (extracted != null) {\n              result[key] = extracted;\n            }\n          } else {\n            result[key] = itemValue;\n          }\n        }\n      }\n\n      // Return the object even if empty - deletions are still changes\n      return result;\n    }\n\n    return undefined;\n  }\n}\n","import { ObjectUtils_keys } from \"../../utils/object\";\nimport {\n  IVersionTypes,\n  ITypedObject,\n  IFieldVersion,\n  IVersionsObject,\n  IVersionValue,\n  IVersions,\n  isFieldVersion,\n  isCollectionVersions,\n  isIdVersion,\n} from \"./types\";\nimport {\n  VersionTrackerUtils_asVersionsObject,\n  VersionTrackerUtils_getId,\n  VersionTrackerUtils_ensureCollectionVersions,\n  VersionTrackerUtils_isControlledType,\n  VersionTrackerUtils_createVersion,\n  VersionTrackerUtils_isRecord,\n  VersionTrackerUtils_isAtomicType,\n  VersionTrackerUtils_ensureVersionsObject,\n  VersionTrackerUtils_getIdFieldName,\n  VersionTrackerUtils_getIdValue,\n  VersionTrackerUtils_createIdVersion,\n} from \"./utils\";\n\nexport class VersionTrackerFillVersions<TAtomicType extends string, TControlledType extends string> {\n  private readonly versionTypes: IVersionTypes<TAtomicType, TControlledType>;\n  private readonly deviceId: string;\n\n  constructor(versionTypes: IVersionTypes<TAtomicType, TControlledType>, deviceId: string) {\n    this.versionTypes = versionTypes;\n    this.deviceId = deviceId;\n  }\n\n  public run<T extends Record<string, unknown>>(fullObj: T, versions: IVersions<T>, timestamp: number): IVersions<T> {\n    const result = { ...versions };\n    const resultObj = VersionTrackerUtils_asVersionsObject(result);\n    const keys = ObjectUtils_keys(fullObj).filter((key) => key !== \"_versions\");\n\n    for (const field of keys) {\n      const value = fullObj[field];\n\n      if (value == null) {\n        continue;\n      }\n\n      const fieldStr = field as string;\n      const currentVersion = resultObj[fieldStr];\n      const filledVersion = this.fillFieldVersion(value, currentVersion, timestamp, fieldStr);\n\n      if (filledVersion !== undefined) {\n        resultObj[fieldStr] = filledVersion;\n      }\n    }\n\n    return result;\n  }\n\n  private fillFieldVersion(\n    value: unknown,\n    currentVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): IVersionValue | undefined {\n    if (isFieldVersion(currentVersion)) {\n      return currentVersion;\n    }\n\n    if (Array.isArray(value)) {\n      const hasTrackableItems = value.some((item) => VersionTrackerUtils_getId(item, this.versionTypes) !== undefined);\n\n      if (hasTrackableItems) {\n        const collectionVersions = VersionTrackerUtils_ensureCollectionVersions(currentVersion);\n        const items = { ...(collectionVersions.items || {}) };\n\n        for (const item of value) {\n          const itemId = VersionTrackerUtils_getId(item, this.versionTypes);\n          if (itemId && !(itemId in items)) {\n            const itemPath = `${path}.items.${itemId}`;\n            const itemVersion = this.getInitialItemVersion(item, timestamp, itemPath);\n            if (itemVersion !== undefined) {\n              items[itemId] = itemVersion;\n            }\n          } else if (itemId && items[itemId] && !isFieldVersion(items[itemId])) {\n            const itemPath = `${path}.items.${itemId}`;\n            if (VersionTrackerUtils_isControlledType(item, this.versionTypes)) {\n              const filledItemVersion = this.fillControlledObjectVersion(item, items[itemId], timestamp, itemPath);\n              if (filledItemVersion !== undefined) {\n                items[itemId] = filledItemVersion;\n              }\n            } else {\n              const filledItemVersion = this.fillFieldVersion(item, items[itemId], timestamp, itemPath);\n              if (filledItemVersion !== undefined && !isCollectionVersions(filledItemVersion)) {\n                items[itemId] = filledItemVersion;\n              }\n            }\n          }\n        }\n\n        return { ...collectionVersions, items };\n      } else {\n        return currentVersion !== undefined\n          ? currentVersion\n          : VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n      }\n    } else if (VersionTrackerUtils_isRecord(value)) {\n      if (this.versionTypes.dictionaryFields.includes(path)) {\n        const collectionVersions = VersionTrackerUtils_ensureCollectionVersions(currentVersion);\n        const items = { ...(collectionVersions.items || {}) };\n        const dictValue = value;\n\n        for (const [key, item] of Object.entries(dictValue)) {\n          if (!(key in items)) {\n            const itemPath = `${path}.items.${key}`;\n            const itemVersion = this.getInitialItemVersion(item, timestamp, itemPath);\n            if (itemVersion !== undefined) {\n              items[key] = itemVersion;\n            }\n          } else if (items[key] && !isFieldVersion(items[key])) {\n            const itemPath = `${path}.items.${key}`;\n            if (VersionTrackerUtils_isControlledType(item, this.versionTypes)) {\n              const filledItemVersion = this.fillControlledObjectVersion(item, items[key], timestamp, itemPath);\n              if (filledItemVersion !== undefined) {\n                items[key] = filledItemVersion;\n              }\n            } else {\n              const filledItemVersion = this.fillFieldVersion(item, items[key], timestamp, itemPath);\n              if (filledItemVersion !== undefined && !isCollectionVersions(filledItemVersion)) {\n                items[key] = filledItemVersion;\n              }\n            }\n          }\n        }\n\n        return { ...collectionVersions, items };\n      } else if (VersionTrackerUtils_isControlledType(value, this.versionTypes)) {\n        return this.fillControlledObjectVersion(value, currentVersion, timestamp, path);\n      } else if (VersionTrackerUtils_isAtomicType(value, this.versionTypes)) {\n        return currentVersion !== undefined\n          ? currentVersion\n          : VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n      } else {\n        const nestedVersions = this.fillNestedVersions(\n          value,\n          VersionTrackerUtils_ensureVersionsObject(currentVersion),\n          timestamp,\n          path\n        );\n        return nestedVersions;\n      }\n    } else {\n      return currentVersion !== undefined\n        ? currentVersion\n        : VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n    }\n  }\n\n  private getInitialItemVersion(\n    item: unknown,\n    timestamp: number,\n    path: string = \"\"\n  ): IVersionsObject | IFieldVersion | undefined {\n    if (VersionTrackerUtils_isAtomicType(item, this.versionTypes)) {\n      return VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n    } else if (VersionTrackerUtils_isControlledType(item, this.versionTypes)) {\n      return this.fillControlledObjectVersion(item, undefined, timestamp, path);\n    } else if (VersionTrackerUtils_isRecord(item)) {\n      return this.fillNestedVersions(item, {}, timestamp, path);\n    } else {\n      return VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n    }\n  }\n\n  private fillControlledObjectVersion(\n    value: ITypedObject<TControlledType>,\n    currentVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): IVersionsObject | undefined {\n    const controlledFields = this.versionTypes.controlledFields[value.vtype] || [];\n    const fieldVersions = VersionTrackerUtils_ensureVersionsObject(currentVersion);\n\n    const result: IVersionsObject = { ...fieldVersions };\n\n    // Fill ID version if not present\n    const idField = VersionTrackerUtils_getIdFieldName(value.vtype, this.versionTypes);\n    if (idField && !isIdVersion(result[idField])) {\n      const idValue = VersionTrackerUtils_getIdValue(value, this.versionTypes);\n      if (idValue != null) {\n        result[idField] = VersionTrackerUtils_createIdVersion(timestamp, idValue, undefined, this.deviceId);\n      }\n    }\n\n    // If we already have controlled field versions (besides ID), return existing\n    const existingFields = Object.keys(result).filter((k) => k !== idField);\n    if (existingFields.length > 0) {\n      return result;\n    }\n\n    for (const controlledField of controlledFields) {\n      const fieldValue = value[controlledField];\n      if (fieldValue != null && !(controlledField in result)) {\n        const fieldPath = path ? `${path}.${controlledField}` : controlledField;\n        const filledVersion = this.fillControlledFieldVersion(fieldValue, timestamp, fieldPath);\n        if (filledVersion != null) {\n          result[controlledField] = filledVersion;\n        }\n      }\n    }\n\n    return Object.keys(result).length > 0 ? result : undefined;\n  }\n\n  private fillControlledFieldVersion(value: unknown, timestamp: number, path: string): IVersionValue | undefined {\n    if (Array.isArray(value)) {\n      const hasTrackableItems = value.some((item) => VersionTrackerUtils_getId(item, this.versionTypes) !== undefined);\n      if (hasTrackableItems) {\n        const items: Record<string, IVersionsObject | IFieldVersion> = {};\n        for (const item of value) {\n          const itemId = VersionTrackerUtils_getId(item, this.versionTypes);\n          if (itemId) {\n            const itemPath = `${path}.items.${itemId}`;\n            const itemVersion = this.getInitialItemVersion(item, timestamp, itemPath);\n            if (itemVersion != null) {\n              items[itemId] = itemVersion;\n            }\n          }\n        }\n        return { items };\n      }\n    }\n\n    if (VersionTrackerUtils_isRecord(value)) {\n      if (this.versionTypes.dictionaryFields.includes(path)) {\n        const items: Record<string, IVersionsObject | IFieldVersion> = {};\n        for (const [key, item] of Object.entries(value)) {\n          const itemPath = `${path}.items.${key}`;\n          const itemVersion = this.getInitialItemVersion(item, timestamp, itemPath);\n          if (itemVersion != null) {\n            items[key] = itemVersion;\n          }\n        }\n        return { items };\n      }\n      if (VersionTrackerUtils_isControlledType(value, this.versionTypes)) {\n        return this.fillControlledObjectVersion(value, undefined, timestamp, path);\n      }\n      if (VersionTrackerUtils_isAtomicType(value, this.versionTypes)) {\n        return VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n      }\n    }\n\n    return VersionTrackerUtils_createVersion(timestamp, undefined, this.deviceId);\n  }\n\n  private fillNestedVersions(\n    obj: Record<string, unknown>,\n    currentVersions: IVersionsObject,\n    timestamp: number,\n    parentPath: string\n  ): IVersionsObject | undefined {\n    const versions: IVersionsObject = { ...currentVersions };\n    const keys = ObjectUtils_keys(obj);\n    let hasAnyVersion = false;\n\n    for (const key of keys) {\n      const value = obj[key];\n      const currentPath = parentPath ? `${parentPath}.${key}` : key;\n\n      if (value != null) {\n        const filledVersion = this.fillFieldVersion(value, versions[key], timestamp, currentPath);\n        if (filledVersion !== undefined) {\n          versions[key] = filledVersion;\n          hasAnyVersion = true;\n        }\n      }\n    }\n\n    return hasAnyVersion ? versions : undefined;\n  }\n}\n","import { CollectionUtils_uniqByExpr } from \"../../utils/collection\";\nimport {\n  IVersionTypes,\n  IFieldVersion,\n  IVersionsObject,\n  IVersionValue,\n  IVersions,\n  ICollectionVersions,\n  isFieldVersion,\n  isCollectionVersions,\n  isVersionsObject,\n} from \"./types\";\nimport {\n  VersionTrackerUtils_compareVersions,\n  VersionTrackerUtils_normalizeVersion,\n  VersionTrackerUtils_isRecord,\n  VersionTrackerUtils_isControlledType,\n  VersionTrackerUtils_getIdVersionFromVersions,\n  VersionTrackerUtils_pickWinningIdVersion,\n  VersionTrackerUtils_ensureVersionsObject,\n  VersionTrackerUtils_getId,\n} from \"./utils\";\n\nexport class VersionTrackerMergeByVersions<TAtomicType extends string, TControlledType extends string> {\n  private readonly versionTypes: IVersionTypes<TAtomicType, TControlledType>;\n\n  constructor(versionTypes: IVersionTypes<TAtomicType, TControlledType>) {\n    this.versionTypes = versionTypes;\n  }\n\n  public run<T extends Record<string, unknown>>(\n    fullObj: T,\n    fullVersions: IVersions<T>,\n    versionDiff: IVersions<T>,\n    extractedObj: Partial<T>\n  ): T {\n    let result: Record<string, unknown> | null = null;\n    const writeKey = (key: string, value: unknown): void => {\n      if (fullObj[key] === value) {\n        return;\n      }\n      if (result == null) {\n        result = { ...fullObj };\n      }\n      result[key] = value;\n    };\n    const deleteKey = (key: string): void => {\n      if (!(key in fullObj)) {\n        return;\n      }\n      if (result == null) {\n        result = { ...fullObj };\n      }\n      delete result[key];\n    };\n\n    for (const key of Object.keys(versionDiff)) {\n      const diffVersion = versionDiff[key];\n      const fullVersion = fullVersions[key];\n      const extractedValue = extractedObj[key as keyof T];\n\n      if (extractedValue !== undefined) {\n        const mergedValue = this.mergeFieldByVersion(fullObj[key], fullVersion, diffVersion, extractedValue, key);\n        if (mergedValue !== undefined) {\n          writeKey(key, mergedValue);\n        }\n      } else if (isFieldVersion(diffVersion)) {\n        if (fullVersion === undefined || !isFieldVersion(fullVersion)) {\n          deleteKey(key);\n        } else {\n          const comparison = VersionTrackerUtils_compareVersions(diffVersion, fullVersion);\n          if (comparison === \"a_newer\") {\n            deleteKey(key);\n          } else if (comparison === \"concurrent\") {\n            const diffNorm = VersionTrackerUtils_normalizeVersion(diffVersion);\n            const fullNorm = VersionTrackerUtils_normalizeVersion(fullVersion);\n            if (diffNorm.t > fullNorm.t) {\n              deleteKey(key);\n            }\n          }\n        }\n      }\n    }\n\n    return (result ?? fullObj) as T;\n  }\n\n  private mergeFieldByVersion(\n    fullValue: unknown,\n    fullVersion: IVersionValue | undefined,\n    diffVersion: IVersionValue | undefined,\n    extractedValue: unknown,\n    path: string\n  ): unknown {\n    if (isFieldVersion(diffVersion) && isFieldVersion(fullVersion)) {\n      const comparison = VersionTrackerUtils_compareVersions(diffVersion, fullVersion);\n      if (comparison === \"a_newer\") {\n        return extractedValue;\n      }\n      if (comparison === \"concurrent\") {\n        const diffNorm = VersionTrackerUtils_normalizeVersion(diffVersion);\n        const fullNorm = VersionTrackerUtils_normalizeVersion(fullVersion);\n        if (diffNorm.t > fullNorm.t) {\n          return extractedValue;\n        }\n      }\n      return fullValue;\n    }\n\n    if (diffVersion !== undefined && fullVersion === undefined) {\n      if (isCollectionVersions(diffVersion)) {\n        return this.mergeCollectionByVersion(fullValue, undefined, diffVersion, extractedValue);\n      }\n\n      if (\n        VersionTrackerUtils_isRecord(fullValue) &&\n        VersionTrackerUtils_isRecord(extractedValue) &&\n        isVersionsObject(diffVersion)\n      ) {\n        return this.run(fullValue, {}, diffVersion, extractedValue);\n      }\n      return extractedValue ?? fullValue;\n    }\n\n    if (isCollectionVersions(diffVersion)) {\n      const fullCollection = isCollectionVersions(fullVersion) ? fullVersion : undefined;\n      return this.mergeCollectionByVersion(fullValue, fullCollection, diffVersion, extractedValue);\n    }\n\n    if (isVersionsObject(diffVersion) && VersionTrackerUtils_isRecord(extractedValue)) {\n      if (VersionTrackerUtils_isControlledType(extractedValue, this.versionTypes)) {\n        const fullVersionObj = isVersionsObject(fullVersion) ? fullVersion : undefined;\n        const diffVersionObj = diffVersion;\n\n        // Get ID versions from both full and diff to determine the winner\n        const fullIdVersion = VersionTrackerUtils_getIdVersionFromVersions(\n          extractedValue.vtype,\n          fullVersionObj,\n          this.versionTypes\n        );\n        const diffIdVersion = VersionTrackerUtils_getIdVersionFromVersions(\n          extractedValue.vtype,\n          diffVersionObj,\n          this.versionTypes\n        );\n\n        // If both have ID versions with different values, determine which one wins\n        if (fullIdVersion && diffIdVersion && fullIdVersion.value !== diffIdVersion.value) {\n          const winner = VersionTrackerUtils_pickWinningIdVersion(fullIdVersion, diffIdVersion);\n          if (winner === fullIdVersion) {\n            // Full wins - keep full value, ignore extracted\n            return fullValue;\n          }\n          // Diff wins - use extracted value entirely (it's a different object)\n          return extractedValue;\n        }\n\n        const controlledFields = this.versionTypes.controlledFields[extractedValue.vtype] || [];\n        const controlledFieldSet = new Set(controlledFields);\n\n        const fullIsRecord = VersionTrackerUtils_isRecord(fullValue);\n        const fullRecord = fullIsRecord ? (fullValue as Record<string, unknown>) : undefined;\n        let mergedItem: Record<string, unknown> | null = fullIsRecord ? null : {};\n        const writeField = (field: string, value: unknown): void => {\n          if (fullRecord && fullRecord[field] === value) {\n            return;\n          }\n          if (mergedItem == null) {\n            mergedItem = { ...fullRecord };\n          }\n          mergedItem[field] = value;\n        };\n\n        for (const field in extractedValue) {\n          if (!controlledFieldSet.has(field) && (!fullRecord || !(field in fullRecord))) {\n            writeField(field, extractedValue[field]);\n          }\n        }\n\n        for (const field of controlledFields) {\n          if (field in diffVersion) {\n            const diffFieldVersion = diffVersion[field];\n            const fullFieldVersion = fullVersionObj?.[field];\n            const fullFieldValue = fullRecord ? fullRecord[field] : undefined;\n            const extractedFieldValue = extractedValue[field];\n\n            if (isFieldVersion(diffFieldVersion)) {\n              if (fullFieldVersion === undefined || !isFieldVersion(fullFieldVersion)) {\n                writeField(field, extractedFieldValue);\n              } else {\n                const comparison = VersionTrackerUtils_compareVersions(diffFieldVersion, fullFieldVersion);\n                if (comparison === \"a_newer\") {\n                  writeField(field, extractedFieldValue);\n                } else if (comparison === \"concurrent\") {\n                  const diffNorm = VersionTrackerUtils_normalizeVersion(diffFieldVersion);\n                  const fullNorm = VersionTrackerUtils_normalizeVersion(fullFieldVersion);\n                  if (diffNorm.t > fullNorm.t) {\n                    writeField(field, extractedFieldValue);\n                  }\n                }\n              }\n            } else if (isCollectionVersions(diffFieldVersion)) {\n              const fullCollection = isCollectionVersions(fullFieldVersion) ? fullFieldVersion : undefined;\n              const merged = this.mergeCollectionByVersion(\n                fullFieldValue,\n                fullCollection,\n                diffFieldVersion,\n                extractedFieldValue\n              );\n              writeField(field, merged);\n            } else if (isVersionsObject(diffFieldVersion) && VersionTrackerUtils_isRecord(extractedFieldValue)) {\n              const merged = this.mergeFieldByVersion(\n                fullFieldValue,\n                fullFieldVersion,\n                diffFieldVersion,\n                extractedFieldValue,\n                `${path}.${field}`\n              );\n              writeField(field, merged);\n            }\n          }\n        }\n\n        if (mergedItem == null) {\n          return fullValue;\n        }\n\n        const validator = this.versionTypes.typeValidators?.[extractedValue.vtype];\n        if (validator && !validator.is(mergedItem)) {\n          console.log(`[MERGE_DEBUG] Validator REJECTED merged ${extractedValue.vtype}, reverting to fullValue`);\n          return fullValue;\n        }\n\n        return mergedItem;\n      }\n\n      if (VersionTrackerUtils_isRecord(fullValue)) {\n        const fullVersionObj = VersionTrackerUtils_ensureVersionsObject(fullVersion);\n        return this.run(fullValue, fullVersionObj, diffVersion, extractedValue);\n      } else {\n        return extractedValue ?? fullValue;\n      }\n    }\n\n    return fullValue;\n  }\n\n  private mergeCollectionByVersion(\n    fullValue: unknown,\n    fullVersion: ICollectionVersions | undefined,\n    diffVersion: ICollectionVersions,\n    extractedValue: unknown\n  ): unknown {\n    const isNukeDeleted = diffVersion.nukedeleted != null || fullVersion?.nukedeleted != null;\n    const deletedKeys = isNukeDeleted\n      ? new Set()\n      : new Set<string>([\n          ...(fullVersion?.deleted ? Object.keys(fullVersion.deleted) : []),\n          ...(diffVersion.deleted ? Object.keys(diffVersion.deleted) : []),\n        ]);\n    if (Array.isArray(fullValue) && Array.isArray(extractedValue)) {\n      const dedupedFull = CollectionUtils_uniqByExpr(fullValue, (item) =>\n        VersionTrackerUtils_getId(item, this.versionTypes)\n      );\n      const dedupedExtracted = CollectionUtils_uniqByExpr(extractedValue, (item) =>\n        VersionTrackerUtils_getId(item, this.versionTypes)\n      );\n      if (dedupedExtracted.length === 0 && deletedKeys.size === 0 && dedupedFull.length === fullValue.length) {\n        return fullValue;\n      }\n      const dedupedFullById = new Map<string, unknown>();\n      for (const item of dedupedFull) {\n        const itemId = VersionTrackerUtils_getId(item, this.versionTypes);\n        if (itemId) {\n          dedupedFullById.set(itemId, item);\n        }\n      }\n      const result: unknown[] = [];\n      const processedIds = new Set<string>();\n      let allSame = true;\n      const pushItem = (item: unknown): void => {\n        const idx = result.length;\n        result.push(item);\n        if (allSame && (idx >= fullValue.length || fullValue[idx] !== item)) {\n          allSame = false;\n        }\n      };\n\n      for (const extractedItem of dedupedExtracted) {\n        const itemId = VersionTrackerUtils_getId(extractedItem, this.versionTypes);\n        if (itemId && !deletedKeys.has(itemId)) {\n          processedIds.add(itemId);\n          const diffItemVersion = diffVersion?.items?.[itemId];\n          const fullItemVersion = fullVersion?.items?.[itemId];\n          const fullItem = dedupedFullById.get(itemId);\n\n          if (\n            isVersionsObject(diffItemVersion) &&\n            isVersionsObject(fullItemVersion) &&\n            fullItem &&\n            typeof fullItem === \"object\" &&\n            typeof extractedItem === \"object\"\n          ) {\n            const mergedItem = this.mergeFieldByVersion(\n              fullItem,\n              fullItemVersion,\n              diffItemVersion,\n              extractedItem,\n              `item:${itemId}`\n            );\n            pushItem(mergedItem);\n          } else if (this.shouldTakeExtractedItem(diffItemVersion, fullItemVersion)) {\n            pushItem(extractedItem);\n          } else {\n            pushItem(fullItem ?? extractedItem);\n          }\n        }\n      }\n\n      for (const fullItem of dedupedFull) {\n        const itemId = VersionTrackerUtils_getId(fullItem, this.versionTypes);\n        if (itemId && !processedIds.has(itemId) && !deletedKeys.has(itemId)) {\n          pushItem(fullItem);\n        }\n      }\n\n      if (allSame && result.length === fullValue.length) {\n        return fullValue;\n      }\n      return result;\n    } else if (VersionTrackerUtils_isRecord(fullValue) && VersionTrackerUtils_isRecord(extractedValue)) {\n      if (Object.keys(extractedValue).length === 0 && deletedKeys.size === 0) {\n        return fullValue;\n      }\n      const fullRecord = fullValue;\n      let result: Record<string, unknown> | null = null;\n      const ensureResult = (): Record<string, unknown> => {\n        if (result == null) {\n          result = { ...fullRecord };\n          for (const dk of deletedKeys) {\n            delete result[dk as string];\n          }\n        }\n        return result;\n      };\n      for (const dk of deletedKeys) {\n        if ((dk as string) in fullRecord) {\n          ensureResult();\n          break;\n        }\n      }\n      const writeKey = (key: string, value: unknown): void => {\n        const current = result ?? fullRecord;\n        if (key in current && current[key] === value) {\n          return;\n        }\n        ensureResult()[key] = value;\n      };\n\n      for (const [key, value] of Object.entries(extractedValue)) {\n        const diffItemVersion = diffVersion?.items?.[key];\n        const fullItemVersion = fullVersion?.items?.[key];\n        const fullItem = fullRecord[key];\n\n        if (\n          isVersionsObject(diffItemVersion) &&\n          isVersionsObject(fullItemVersion) &&\n          VersionTrackerUtils_isRecord(fullItem) &&\n          VersionTrackerUtils_isRecord(value)\n        ) {\n          const mergedItem = this.mergeFieldByVersion(fullItem, fullItemVersion, diffItemVersion, value, `item:${key}`);\n          writeKey(key, mergedItem);\n        } else if (!deletedKeys.has(key) && this.shouldTakeExtractedItem(diffItemVersion, fullItemVersion)) {\n          writeKey(key, value);\n        }\n      }\n\n      return result ?? fullRecord;\n    }\n\n    return extractedValue;\n  }\n\n  private shouldTakeExtractedItem(\n    diffVersion: IVersionsObject | IFieldVersion | undefined,\n    fullVersion: IVersionsObject | IFieldVersion | undefined\n  ): boolean {\n    if (isFieldVersion(diffVersion) && isFieldVersion(fullVersion)) {\n      const comparison = VersionTrackerUtils_compareVersions(diffVersion, fullVersion);\n      if (comparison === \"a_newer\") {\n        return true;\n      }\n      if (comparison === \"concurrent\") {\n        const diffNorm = VersionTrackerUtils_normalizeVersion(diffVersion);\n        const fullNorm = VersionTrackerUtils_normalizeVersion(fullVersion);\n        return diffNorm.t > fullNorm.t;\n      }\n      return false;\n    }\n\n    if (diffVersion !== undefined && fullVersion === undefined) {\n      return true;\n    }\n\n    if (isVersionsObject(diffVersion) && isVersionsObject(fullVersion)) {\n      return true;\n    }\n\n    if (diffVersion === undefined && fullVersion === undefined) {\n      return true;\n    }\n\n    return false;\n  }\n}\n","import { ObjectUtils_keys } from \"../../utils/object\";\nimport {\n  IVersionTypes,\n  IVersionsObject,\n  IVersionValue,\n  IVersions,\n  ICollectionVersions,\n  isFieldVersion,\n  isCollectionVersions,\n  isVersionsObject,\n  isIdVersion,\n  IIdVersion,\n} from \"./types\";\nimport {\n  VersionTrackerUtils_asVersionsObject,\n  VersionTrackerUtils_mergeFieldVersions,\n  VersionTrackerUtils_ensureVersionsObject,\n  VersionTrackerUtils_pickWinningIdVersion,\n  VersionTrackerUtils_NUKEDELETED_THRESHOLD,\n} from \"./utils\";\n\nexport class VersionTrackerMergeVersions<TAtomicType extends string, TControlledType extends string> {\n  private readonly versionTypes: IVersionTypes<TAtomicType, TControlledType>;\n\n  constructor(versionTypes: IVersionTypes<TAtomicType, TControlledType>) {\n    this.versionTypes = versionTypes;\n  }\n\n  public run<T>(fullVersions: IVersions<T>, versionDiff: IVersions<T>): IVersions<T> {\n    const result = { ...fullVersions };\n    const resultObj = VersionTrackerUtils_asVersionsObject(result);\n    const diffObj = VersionTrackerUtils_asVersionsObject(versionDiff);\n\n    for (const key of Object.keys(diffObj)) {\n      const fullVersion = resultObj[key];\n      const diffVersion = diffObj[key];\n\n      const mergedVersion = this.mergeVersionField(fullVersion, diffVersion, key);\n      if (mergedVersion !== undefined) {\n        resultObj[key] = mergedVersion;\n      }\n    }\n\n    return result;\n  }\n\n  public mergeVersionField(\n    fullVersion: IVersionValue | undefined,\n    diffVersion: IVersionValue | undefined,\n    path: string = \"\"\n  ): IVersionValue | undefined {\n    if (diffVersion === undefined) {\n      return fullVersion;\n    }\n\n    if (isFieldVersion(fullVersion) && isFieldVersion(diffVersion)) {\n      const newVersion = VersionTrackerUtils_mergeFieldVersions(fullVersion, diffVersion);\n      return newVersion;\n    }\n\n    if (isFieldVersion(diffVersion)) {\n      // A plain field version for an array only ever describes its itemless era (updateVersions\n      // emits numbers only when neither side has trackable items), so per-item tracking always\n      // supersedes it. Returning the number here would erase the items' versions while\n      // mergeByVersions keeps their data, leaving them permanently invisible to sync diffs.\n      if (isCollectionVersions(fullVersion)) {\n        return fullVersion;\n      }\n      return diffVersion;\n    }\n\n    if (isCollectionVersions(diffVersion)) {\n      const fullCollection = isCollectionVersions(fullVersion) ? fullVersion : undefined;\n      return this.mergeCollectionVersions(fullCollection, diffVersion, path);\n    }\n\n    if (isVersionsObject(diffVersion)) {\n      const fullObj = VersionTrackerUtils_ensureVersionsObject(fullVersion);\n\n      // Check if both have ID versions (controlled types with different identities)\n      const fullIdVersion = this.findIdVersion(fullObj);\n      const diffIdVersion = this.findIdVersion(diffVersion);\n\n      if (fullIdVersion && diffIdVersion && fullIdVersion.value !== diffIdVersion.value) {\n        // Different controlled objects - pick winner by timestamp\n        const winner = VersionTrackerUtils_pickWinningIdVersion(fullIdVersion, diffIdVersion);\n        if (winner === diffIdVersion) {\n          // diff wins - use diff versions entirely\n          return diffVersion;\n        } else {\n          // full wins - keep full versions\n          return fullObj;\n        }\n      }\n\n      const result: IVersionsObject = { ...fullObj };\n\n      for (const key of Object.keys(diffVersion)) {\n        const mergedField = this.mergeVersionField(fullObj[key], diffVersion[key], path ? `${path}.${key}` : key);\n        if (mergedField !== undefined) {\n          result[key] = mergedField;\n        }\n      }\n\n      return result;\n    }\n\n    return diffVersion;\n  }\n\n  private findIdVersion(versions: IVersionsObject): IIdVersion | undefined {\n    for (const key of Object.keys(versions)) {\n      const value = versions[key];\n      if (isIdVersion(value)) {\n        return value;\n      }\n    }\n    return undefined;\n  }\n\n  private mergeCollectionVersions(\n    fullCollection: ICollectionVersions | undefined,\n    diffCollection: ICollectionVersions,\n    path?: string\n  ): ICollectionVersions {\n    const nukedeleted =\n      diffCollection.nukedeleted != null || fullCollection?.nukedeleted != null\n        ? Math.max(diffCollection.nukedeleted || 0, fullCollection?.nukedeleted || 0)\n        : undefined;\n    const result: ICollectionVersions = {\n      items: { ...(fullCollection?.items || {}) },\n      deleted: nukedeleted != null ? {} : { ...(fullCollection?.deleted || {}), ...(diffCollection?.deleted || {}) },\n      ...(nukedeleted != null && nukedeleted < VersionTrackerUtils_NUKEDELETED_THRESHOLD\n        ? { nukedeleted: nukedeleted + 1 }\n        : {}),\n    };\n\n    for (const id of Object.keys(diffCollection.items ?? {})) {\n      const fullItemVersion = result.items?.[id];\n      const diffItemVersion = diffCollection.items?.[id];\n\n      const mergedItemVersion = this.mergeVersionField(fullItemVersion, diffItemVersion);\n      if (mergedItemVersion !== undefined && !isCollectionVersions(mergedItemVersion)) {\n        result.items = result.items || {};\n        result.items[id] = mergedItemVersion;\n      }\n    }\n\n    const threshold =\n      path && this.versionTypes.compactionThresholds ? this.versionTypes.compactionThresholds[path] : undefined;\n    const currentTimestamp = Date.now();\n\n    for (const key of ObjectUtils_keys(result.deleted || {})) {\n      if (result.items) {\n        delete result.items[key];\n      }\n      const fullDeletedTime = fullCollection?.deleted?.[key];\n      const diffDeletedTime = diffCollection?.deleted?.[key];\n      const max = (diffDeletedTime ?? 0) > (fullDeletedTime ?? 0) ? diffDeletedTime : fullDeletedTime;\n\n      if (max != null) {\n        if (!threshold || currentTimestamp - max < threshold) {\n          result.deleted![key] = max;\n        } else {\n          delete result.deleted![key];\n        }\n      }\n    }\n\n    return result;\n  }\n}\n","import { ObjectUtils_clone, ObjectUtils_keys } from \"../../utils/object\";\nimport { lg } from \"../../utils/posthog\";\nimport {\n  IVersionTypes,\n  ITypedObject,\n  IFieldVersion,\n  IVersionsObject,\n  IVersionValue,\n  IVersions,\n  ICollectionVersions,\n  isFieldVersion,\n  isCollectionVersions,\n  isIdVersion,\n} from \"./types\";\nimport {\n  VersionTrackerUtils_asVersionsObject,\n  VersionTrackerUtils_areEqual,\n  VersionTrackerUtils_getId,\n  VersionTrackerUtils_createVersion,\n  VersionTrackerUtils_isControlledType,\n  VersionTrackerUtils_isAtomicType,\n  VersionTrackerUtils_isRecord,\n  VersionTrackerUtils_ensureVersionsObject,\n  VersionTrackerUtils_incrementNukedeleted,\n  VersionTrackerUtils_ensureCollectionVersions,\n  VersionTrackerUtils_applyCompaction,\n  VersionTrackerUtils_getIdFieldName,\n  VersionTrackerUtils_getIdValue,\n  VersionTrackerUtils_createIdVersion,\n} from \"./utils\";\nimport { VersionTrackerMergeVersions } from \"./versionTrackerMergeVersions\";\n\nexport class VersionTrackerUpdateVersions<TAtomicType extends string, TControlledType extends string> {\n  private readonly versionTypes: IVersionTypes<TAtomicType, TControlledType>;\n  private readonly deviceId: string;\n  private readonly mergeVersions: VersionTrackerMergeVersions<TAtomicType, TControlledType>;\n\n  constructor(versionTypes: IVersionTypes<TAtomicType, TControlledType>, deviceId: string) {\n    this.versionTypes = versionTypes;\n    this.deviceId = deviceId;\n    this.mergeVersions = new VersionTrackerMergeVersions(versionTypes);\n  }\n\n  public run<T extends Record<string, unknown>>(\n    oldObj: T,\n    newObj: T,\n    currentVersions: IVersions<T>,\n    newVersions: IVersions<T>,\n    timestamp: number\n  ): IVersions<T> {\n    const versions = ObjectUtils_clone(currentVersions);\n    const versionsObj = VersionTrackerUtils_asVersionsObject(versions);\n    const newVersionsObj = VersionTrackerUtils_asVersionsObject(newVersions);\n\n    const keys = ObjectUtils_keys(newObj).filter((key) => key !== \"_versions\");\n\n    for (const field of keys) {\n      const oldValue = oldObj[field];\n      const newValue = newObj[field];\n\n      if (VersionTrackerUtils_areEqual(oldValue, newValue)) {\n        continue;\n      }\n\n      const fieldStr = field as string;\n      const updatedVersion = this.updateFieldVersion(\n        oldObj,\n        newObj,\n        currentVersions,\n        newVersions,\n        oldValue,\n        newValue,\n        versionsObj[fieldStr],\n        newVersionsObj[fieldStr],\n        timestamp,\n        fieldStr\n      );\n      if (updatedVersion !== undefined) {\n        versionsObj[fieldStr] = updatedVersion;\n      }\n    }\n\n    return versions;\n  }\n\n  private updateFieldVersion(\n    oldFull: unknown,\n    newFull: unknown,\n    oldFullVersion: unknown,\n    newFullVersion: unknown,\n    oldValue: unknown,\n    newValue: unknown,\n    currentVersion: IVersionValue | undefined,\n    newVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): IVersionValue | undefined {\n    if (Array.isArray(newValue)) {\n      const hasTrackableItems = newValue.some(\n        (item) => VersionTrackerUtils_getId(item, this.versionTypes) !== undefined\n      );\n      const oldHasTrackableItems =\n        Array.isArray(oldValue) &&\n        oldValue.some((item: unknown) => VersionTrackerUtils_getId(item, this.versionTypes) !== undefined);\n\n      if (hasTrackableItems || oldHasTrackableItems) {\n        return this.updateArrayCollectionVersion(oldValue, newValue, currentVersion, newVersion, timestamp, path);\n      } else {\n        const mergedVersion = this.mergeVersions.mergeVersionField(currentVersion, newVersion, path);\n        const fieldVersion = isFieldVersion(mergedVersion) ? mergedVersion : undefined;\n        return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n      }\n    } else if (typeof newValue === \"object\" && newValue !== null) {\n      if (this.versionTypes.dictionaryFields.includes(path)) {\n        return this.updateDictionaryCollectionVersion(\n          oldValue,\n          newValue as Record<string, unknown>,\n          currentVersion,\n          newVersion,\n          timestamp,\n          path\n        );\n      } else if (VersionTrackerUtils_isControlledType(newValue, this.versionTypes)) {\n        const mergedVersion = this.mergeVersions.mergeVersionField(currentVersion, newVersion, path);\n        return this.updateControlledObjectVersion(oldValue, newValue, mergedVersion, timestamp, path);\n      } else if (VersionTrackerUtils_isAtomicType(newValue, this.versionTypes)) {\n        const mergedVersion = this.mergeVersions.mergeVersionField(currentVersion, newVersion, path);\n        const fieldVersion = isFieldVersion(mergedVersion) ? mergedVersion : undefined;\n        return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n      } else {\n        const oldObjValue = VersionTrackerUtils_isRecord(oldValue) ? oldValue : undefined;\n        const nestedVersions = this.updateNestedVersions(\n          oldFull,\n          newFull,\n          oldFullVersion,\n          newFullVersion,\n          oldObjValue,\n          newValue as Record<string, unknown>,\n          VersionTrackerUtils_ensureVersionsObject(currentVersion),\n          VersionTrackerUtils_ensureVersionsObject(newVersion),\n          timestamp,\n          path\n        );\n        return nestedVersions;\n      }\n    } else {\n      const mergedVersion = this.mergeVersions.mergeVersionField(currentVersion, newVersion, path);\n      const fieldVersion = isFieldVersion(mergedVersion) ? mergedVersion : undefined;\n      return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n    }\n  }\n\n  private updateArrayCollectionVersion(\n    oldValue: unknown,\n    newValue: unknown[],\n    currentVersion: IVersionValue | undefined,\n    newVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): ICollectionVersions | undefined {\n    const collectionVersions = VersionTrackerUtils_incrementNukedeleted(\n      VersionTrackerUtils_ensureCollectionVersions(currentVersion)\n    );\n    const items = collectionVersions.items || {};\n\n    const newIds = new Set<string>();\n    for (const item of newValue) {\n      const itemId = VersionTrackerUtils_getId(item, this.versionTypes);\n      if (itemId) {\n        newIds.add(itemId);\n      }\n    }\n\n    const deletedInThisUpdate: string[] = [];\n    const oldItemsById = new Map<string, unknown>();\n    if (Array.isArray(oldValue)) {\n      for (const oldItem of oldValue) {\n        const oldItemId = VersionTrackerUtils_getId(oldItem, this.versionTypes);\n        if (!oldItemId) {\n          continue;\n        }\n        if (!oldItemsById.has(oldItemId)) {\n          oldItemsById.set(oldItemId, oldItem);\n        }\n        if (!newIds.has(oldItemId)) {\n          collectionVersions.deleted = collectionVersions.deleted || {};\n          collectionVersions.deleted[oldItemId] = timestamp;\n          delete items[oldItemId];\n          deletedInThisUpdate.push(oldItemId);\n        }\n      }\n    }\n\n    if (deletedInThisUpdate.length > 5) {\n      lg(\"ls-history-deletion-version-tracker\", {\n        path,\n        deletedCount: deletedInThisUpdate.length,\n        oldLen: Array.isArray(oldValue) ? oldValue.length : 0,\n        newLen: newValue.length,\n        timestamp,\n      });\n    }\n\n    for (const item of newValue) {\n      const itemId = VersionTrackerUtils_getId(item, this.versionTypes);\n      if (itemId) {\n        const oldItem = oldItemsById.get(itemId);\n\n        if (!VersionTrackerUtils_areEqual(oldItem, item)) {\n          const newCollectionVersion = isCollectionVersions(newVersion) ? newVersion : undefined;\n          const newItemVersion = newCollectionVersion?.items?.[itemId];\n          const itemPath = `${path}.items.${itemId}`;\n          const mergedItemVersion = this.mergeVersions.mergeVersionField(items[itemId], newItemVersion, itemPath);\n\n          const itemVersion = this.getItemVersion(oldItem, item, mergedItemVersion, timestamp, itemPath);\n          if (itemVersion !== undefined) {\n            items[itemId] = itemVersion;\n          }\n        }\n\n        if (collectionVersions.deleted && itemId in collectionVersions.deleted) {\n          delete collectionVersions.deleted[itemId];\n        }\n      }\n    }\n\n    const hasChanges =\n      Object.keys(items).length > 0 ||\n      (collectionVersions.deleted && Object.keys(collectionVersions.deleted).length > 0);\n\n    const compactedCollection = VersionTrackerUtils_applyCompaction(\n      collectionVersions,\n      path,\n      timestamp,\n      this.versionTypes\n    );\n    return hasChanges || currentVersion ? compactedCollection : undefined;\n  }\n\n  private updateDictionaryCollectionVersion(\n    oldValue: unknown,\n    newValue: Record<string, unknown>,\n    currentVersion: IVersionValue | undefined,\n    newVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): ICollectionVersions | undefined {\n    const collectionVersions = VersionTrackerUtils_incrementNukedeleted(\n      VersionTrackerUtils_ensureCollectionVersions(currentVersion)\n    );\n    const items = collectionVersions.items || {};\n\n    const oldDict = VersionTrackerUtils_isRecord(oldValue) ? oldValue : undefined;\n\n    if (oldDict) {\n      for (const key of ObjectUtils_keys(oldDict)) {\n        if (!(key in newValue)) {\n          collectionVersions.deleted = collectionVersions.deleted || {};\n          collectionVersions.deleted[key] = timestamp;\n          delete items[key];\n        }\n      }\n    }\n\n    for (const [key, item] of Object.entries(newValue)) {\n      const oldItem = oldDict?.[key];\n      if (oldItem !== item) {\n        const newCollectionVersion = isCollectionVersions(newVersion) ? newVersion : undefined;\n        const newItemVersion = newCollectionVersion?.items?.[key];\n        const itemPath = `${path}.items.${key}`;\n        const mergedItemVersion = this.mergeVersions.mergeVersionField(items[key], newItemVersion, itemPath);\n\n        const itemVersion = this.getItemVersion(oldItem, item, mergedItemVersion, timestamp, itemPath);\n        if (itemVersion !== undefined) {\n          items[key] = itemVersion;\n        }\n      }\n\n      if (collectionVersions.deleted && key in collectionVersions.deleted) {\n        delete collectionVersions.deleted[key];\n      }\n    }\n\n    const hasChanges =\n      Object.keys(items).length > 0 ||\n      (collectionVersions.deleted && Object.keys(collectionVersions.deleted).length > 0);\n\n    const compactedCollection = VersionTrackerUtils_applyCompaction(\n      collectionVersions,\n      path,\n      timestamp,\n      this.versionTypes\n    );\n    return hasChanges || currentVersion ? compactedCollection : undefined;\n  }\n\n  private getItemVersion(\n    oldItem: unknown,\n    newItem: unknown,\n    currentItemVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): IVersionsObject | IFieldVersion | undefined {\n    if (VersionTrackerUtils_isAtomicType(newItem, this.versionTypes)) {\n      const fieldVersion = isFieldVersion(currentItemVersion) ? currentItemVersion : undefined;\n      return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n    } else if (VersionTrackerUtils_isControlledType(newItem, this.versionTypes)) {\n      return this.updateControlledObjectVersion(oldItem, newItem, currentItemVersion, timestamp, path);\n    } else {\n      const fieldVersion = isFieldVersion(currentItemVersion) ? currentItemVersion : undefined;\n      return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n    }\n  }\n\n  private updateControlledObjectVersion(\n    oldValue: unknown,\n    newValue: ITypedObject<TControlledType>,\n    currentVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): IVersionsObject | undefined {\n    const controlledFields = this.versionTypes.controlledFields[newValue.vtype] || [];\n    const fieldVersions: IVersionsObject = VersionTrackerUtils_ensureVersionsObject(currentVersion);\n    let hasChanges = false;\n\n    // Always include ID field version for controlled types\n    const idField = VersionTrackerUtils_getIdFieldName(newValue.vtype, this.versionTypes);\n    if (idField) {\n      const idValue = VersionTrackerUtils_getIdValue(newValue, this.versionTypes);\n      if (idValue != null) {\n        const currentIdVersion = isIdVersion(fieldVersions[idField]) ? fieldVersions[idField] : undefined;\n        // Only update if ID changed or no version exists\n        if (!currentIdVersion || currentIdVersion.value !== idValue) {\n          fieldVersions[idField] = VersionTrackerUtils_createIdVersion(\n            timestamp,\n            idValue,\n            currentIdVersion,\n            this.deviceId\n          );\n          hasChanges = true;\n        }\n      }\n    }\n\n    for (const controlledField of controlledFields) {\n      const oldFieldValue =\n        VersionTrackerUtils_isRecord(oldValue) && controlledField in oldValue ? oldValue[controlledField] : undefined;\n      const newFieldValue = newValue[controlledField];\n\n      // A controlled field going present -> absent (e.g. clearing progress.setTimer) must still bump a version so\n      // the deletion propagates to other devices, mirroring how top-level field deletions are tracked. Without this\n      // the field lingers on the receiving device (a stale set-timer modal kept showing after a Stop on the watch).\n      if (!VersionTrackerUtils_areEqual(oldFieldValue, newFieldValue)) {\n        const currentFieldVersion = fieldVersions[controlledField];\n        const fieldPath = path ? `${path}.${controlledField}` : controlledField;\n        const updatedVersion = this.updateControlledFieldVersion(\n          oldFieldValue,\n          newFieldValue,\n          currentFieldVersion,\n          timestamp,\n          fieldPath\n        );\n        if (updatedVersion != null) {\n          fieldVersions[controlledField] = updatedVersion;\n          hasChanges = true;\n        }\n      }\n    }\n\n    return hasChanges || Object.keys(fieldVersions).length > 0 ? fieldVersions : undefined;\n  }\n\n  private updateControlledFieldVersion(\n    oldValue: unknown,\n    newValue: unknown,\n    currentVersion: IVersionValue | undefined,\n    timestamp: number,\n    path: string\n  ): IVersionValue | undefined {\n    if (Array.isArray(newValue)) {\n      const hasTrackableItems = newValue.some(\n        (item) => VersionTrackerUtils_getId(item, this.versionTypes) !== undefined\n      );\n      const oldHasTrackableItems =\n        Array.isArray(oldValue) &&\n        oldValue.some((item: unknown) => VersionTrackerUtils_getId(item, this.versionTypes) !== undefined);\n      if (hasTrackableItems || oldHasTrackableItems) {\n        return this.updateArrayCollectionVersion(oldValue, newValue, currentVersion, undefined, timestamp, path);\n      } else if (newValue.length > 0 || (Array.isArray(oldValue) && oldValue.length > 0)) {\n        const fieldVersion = isFieldVersion(currentVersion) ? currentVersion : undefined;\n        return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n      } else {\n        return this.updateArrayCollectionVersion(oldValue, newValue, currentVersion, undefined, timestamp, path);\n      }\n    }\n\n    if (VersionTrackerUtils_isRecord(newValue)) {\n      if (this.versionTypes.dictionaryFields.includes(path)) {\n        return this.updateDictionaryCollectionVersion(oldValue, newValue, currentVersion, undefined, timestamp, path);\n      }\n      if (VersionTrackerUtils_isControlledType(newValue, this.versionTypes)) {\n        return this.updateControlledObjectVersion(oldValue, newValue, currentVersion, timestamp, path);\n      }\n      if (VersionTrackerUtils_isAtomicType(newValue, this.versionTypes)) {\n        const fieldVersion = isFieldVersion(currentVersion) ? currentVersion : undefined;\n        return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n      }\n    }\n\n    const fieldVersion = isFieldVersion(currentVersion) ? currentVersion : undefined;\n    return VersionTrackerUtils_createVersion(timestamp, fieldVersion, this.deviceId);\n  }\n\n  private updateNestedVersions(\n    oldFull: unknown,\n    newFull: unknown,\n    oldFullVersion: unknown,\n    newFullVersion: unknown,\n    oldObj: Record<string, unknown> | undefined,\n    newObj: Record<string, unknown>,\n    currentVersions: IVersionsObject,\n    newVersions: IVersionsObject,\n    timestamp: number,\n    parentPath: string\n  ): IVersionsObject | undefined {\n    const versions: IVersionsObject = { ...currentVersions };\n    const keys = ObjectUtils_keys(newObj);\n    let hasChanges = false;\n\n    for (const key of keys) {\n      const oldValue = oldObj?.[key];\n      const newValue = newObj[key];\n      const currentPath = parentPath ? `${parentPath}.${key}` : key;\n\n      if (VersionTrackerUtils_areEqual(oldValue, newValue)) {\n        continue;\n      }\n\n      if (oldValue == null && newValue != null) {\n        const updatedVersion = this.updateFieldVersion(\n          oldFull,\n          newFull,\n          oldFullVersion,\n          newFullVersion,\n          undefined,\n          newValue,\n          versions[key],\n          newVersions[key],\n          timestamp,\n          currentPath\n        );\n        if (updatedVersion !== undefined) {\n          versions[key] = updatedVersion;\n          hasChanges = true;\n        }\n      } else if (oldValue != null) {\n        const updatedVersion = this.updateFieldVersion(\n          oldFull,\n          newFull,\n          oldFullVersion,\n          newFullVersion,\n          oldValue,\n          newValue,\n          versions[key],\n          newVersions[key],\n          timestamp,\n          currentPath\n        );\n        if (updatedVersion !== undefined) {\n          versions[key] = updatedVersion;\n          hasChanges = true;\n        }\n      }\n    }\n\n    return hasChanges || Object.keys(currentVersions).length > 0 ? versions : undefined;\n  }\n}\n","export function WatchStorageAccount_isOtherAccount(\n  current: { tempUserId?: string },\n  incoming: { tempUserId?: string }\n): boolean {\n  return current.tempUserId != null && incoming.tempUserId != null && current.tempUserId !== incoming.tempUserId;\n}\n","import { CollectionUtils_sort, CollectionUtils_compressArray } from \"../utils/collection\";\n\nimport { IWeight, IUnit, ISettings, IPlate, IPercentage, IExerciseType } from \"../types\";\nimport { n, MathUtils_roundTo005, MathUtils_round, MathUtils_roundFloat, MathUtils_roundTo000005 } from \"../utils/math\";\nimport {\n  Equipment_getUnitOrDefaultForExerciseType,\n  Equipment_getEquipmentDataForExerciseType,\n  Equipment_smallestPlate,\n} from \"./equipment\";\nimport { Exercise_get, Exercise_onerm, Exercise_defaultRounding } from \"./exercise\";\n\nconst prebuiltWeights: Partial<Record<string, IWeight>> = {};\n\nexport function Weight_display(weight: IWeight | IPercentage | number, withUnit: boolean = true): string {\n  if (typeof weight === \"number\") {\n    return `${weight}`;\n  } else if (Weight_isPct(weight)) {\n    return `${weight.value}${withUnit ? \"%\" : \"\"}`;\n  } else {\n    return `${parseFloat(weight.value.toFixed(2)).toString()}${withUnit ? ` ${weight.unit}` : \"\"}`;\n  }\n}\n\nexport function Weight_rpePct(reps: number, rpe: number): IPercentage {\n  return Weight_buildPct(MathUtils_roundTo005(Weight_rpeMultiplier(reps, rpe) * 100));\n}\n\nexport function Weight_evaluateWeight(\n  weight: IWeight | IPercentage,\n  exerciseType: IExerciseType,\n  settings: ISettings\n): IWeight {\n  if (Weight_is(weight)) {\n    return weight;\n  } else if (Weight_isPct(weight)) {\n    const exercise = Exercise_get(exerciseType, settings.exercises);\n    const onerm = Exercise_onerm(exercise, settings);\n    return Weight_multiply(onerm, weight.value / 100);\n  } else {\n    const unit = Equipment_getUnitOrDefaultForExerciseType(settings, exerciseType);\n    return Weight_build(0, unit);\n  }\n}\n\nexport function Weight_smartConvert(weight: IWeight, toUnit: IUnit): IWeight {\n  if (weight.unit === toUnit) {\n    return weight;\n  }\n  const value = weight.value;\n  if (weight.unit === \"kg\") {\n    if (value < 15) {\n      return Weight_build(value * 2, toUnit);\n    } else {\n      return Weight_build(MathUtils_round(value * 2.25, 5), toUnit);\n    }\n  } else {\n    if (value < 15) {\n      return Weight_build(MathUtils_round(value / 2, 0.25), toUnit);\n    } else {\n      return Weight_build(MathUtils_round(value / 2.25, 2.5), toUnit);\n    }\n  }\n}\n\nexport function Weight_oppositeUnit(unit: IUnit): IUnit {\n  return unit === \"kg\" ? \"lb\" : \"kg\";\n}\n\nexport function Weight_print(weight: IWeight | IPercentage | number): string {\n  if (typeof weight === \"number\") {\n    return `${n(weight)}`;\n  } else {\n    return `${n(weight.value)}${weight.unit}`;\n  }\n}\n\nexport function Weight_printNull(weight: IWeight | IPercentage | number | undefined): string {\n  if (weight == null) {\n    return \"\";\n  } else if (typeof weight === \"number\") {\n    return `${n(weight)}`;\n  } else {\n    return `${n(weight.value)}${weight.unit}`;\n  }\n}\n\nexport function Weight_parsePct(str?: string): IPercentage | IWeight | undefined {\n  if (str == null) {\n    return undefined;\n  }\n  const match = str.match(/^([\\-+]?[0-9.]+)%$/);\n  if (match) {\n    return Weight_buildPct(MathUtils_roundFloat(parseFloat(match[1]), 2));\n  } else {\n    return Weight_parse(str);\n  }\n}\n\nexport function Weight_parse(str: string): IWeight | undefined {\n  const match = str.match(/^([\\-+]?[0-9.]+)\\s*(kg|lb)$/);\n  if (match) {\n    return Weight_build(MathUtils_roundFloat(parseFloat(match[1]), 2), match[2] as IUnit);\n  } else {\n    return undefined;\n  }\n}\n\n// Unlike Weight_parse, the number must be a well-formed decimal — strings like \"...lb\", \"+.kg\",\n// or \"1.2.3lb\" are rejected instead of silently coercing to 0 or a truncated value.\nexport function Weight_strictParse(str: string): IWeight | undefined {\n  const match = str.match(/^([\\-+]?(?:[0-9]+(?:\\.[0-9]+)?|\\.[0-9]+))\\s*(kg|lb)$/);\n  if (!match) {\n    return undefined;\n  }\n  const value = parseFloat(match[1]);\n  if (!isFinite(value)) {\n    return undefined;\n  }\n  return Weight_build(MathUtils_roundFloat(value, 2), match[2] as IUnit);\n}\n\nexport function Weight_printOrNumber(weight: IWeight | IPercentage | number): string {\n  return typeof weight === \"number\" ? `${weight}` : Weight_print(weight);\n}\n\nexport function Weight_buildPct(value: number): IPercentage {\n  return { value, unit: \"%\" };\n}\n\nexport function Weight_buildAny(value: number, unit: IUnit | \"%\"): IWeight | IPercentage {\n  if (unit === \"%\") {\n    return Weight_buildPct(value);\n  } else {\n    return Weight_build(value, unit);\n  }\n}\n\nexport function Weight_build(value: number, unit: IUnit): IWeight {\n  const key = `${value}_${unit}`;\n  const prebuiltWeight = prebuiltWeights[key];\n  if (prebuiltWeight != null) {\n    return prebuiltWeight;\n  } else {\n    const v = { value: typeof value === \"string\" ? parseFloat(value) : value, unit };\n    prebuiltWeights[`${value}_${unit}`] = v;\n    return v;\n  }\n}\n\nexport function Weight_clone(value: IWeight): IWeight {\n  return Weight_build(value.value, value.unit);\n}\n\nexport function Weight_isOrPct(object: unknown): object is IWeight | IPercentage {\n  const objWeight = object as IWeight | IPercentage;\n  return (\n    objWeight &&\n    typeof objWeight === \"object\" &&\n    \"unit\" in objWeight &&\n    \"value\" in objWeight &&\n    (objWeight.unit === \"kg\" || objWeight.unit === \"lb\" || objWeight.unit === \"%\")\n  );\n}\n\nexport function Weight_is(object: unknown): object is IWeight {\n  const objWeight = object as IWeight;\n  return (\n    objWeight &&\n    typeof objWeight === \"object\" &&\n    \"unit\" in objWeight &&\n    \"value\" in objWeight &&\n    (objWeight.unit === \"kg\" || objWeight.unit === \"lb\")\n  );\n}\n\nexport function Weight_isPct(object: unknown): object is IPercentage {\n  const objWeight = object as IPercentage;\n  return (\n    objWeight && typeof objWeight === \"object\" && \"unit\" in objWeight && \"value\" in objWeight && objWeight.unit === \"%\"\n  );\n}\n\nexport function Weight_round(weight: IWeight, settings: ISettings, unit: IUnit, exerciseType?: IExerciseType): IWeight {\n  if (exerciseType == null) {\n    return Weight_roundTo005(weight);\n  }\n  return Weight_calculatePlates(weight, settings, unit, exerciseType).totalWeight;\n}\n\nexport function Weight_increment(weight: IWeight, settings: ISettings, exerciseType?: IExerciseType): IWeight {\n  const equipmentData = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n  if (equipmentData) {\n    const unit = equipmentData.unit ?? weight.unit;\n    const roundWeight = Weight_round(weight, settings, unit, exerciseType);\n    if (equipmentData.isFixed) {\n      const items = CollectionUtils_sort(\n        equipmentData.fixed.filter((e) => e.unit === unit),\n        (a, b) => Weight_compare(a, b)\n      );\n      const item = items.find((i) => Weight_gt(i, roundWeight));\n      return item ?? items[items.length - 1] ?? roundWeight;\n    } else {\n      const smallestPlate = Weight_multiply(Equipment_smallestPlate(equipmentData, unit), equipmentData.multiplier);\n      let newWeight = roundWeight;\n      let attempt = 0;\n      do {\n        newWeight = Weight_add(newWeight, smallestPlate);\n        attempt += 1;\n      } while (attempt < 20 && Weight_eq(Weight_round(newWeight, settings, unit, exerciseType), roundWeight));\n      return newWeight;\n    }\n  } else {\n    const roundWeight = Weight_round(weight, settings, weight.unit, exerciseType);\n    const rounding = exerciseType ? Exercise_defaultRounding(exerciseType, settings) : 1;\n    return Weight_build(roundWeight.value + rounding, roundWeight.unit);\n  }\n}\n\nexport function Weight_decrement(weight: IWeight, settings: ISettings, exerciseType?: IExerciseType): IWeight {\n  const equipmentData = exerciseType ? Equipment_getEquipmentDataForExerciseType(settings, exerciseType) : undefined;\n  if (equipmentData) {\n    const unit = equipmentData.unit ?? weight.unit;\n    const roundWeight = Weight_round(weight, settings, unit, exerciseType);\n    if (equipmentData.isFixed) {\n      const items = CollectionUtils_sort(\n        equipmentData.fixed.filter((e) => e.unit === unit),\n        (a, b) => Weight_compareReverse(a, b)\n      );\n      const item = items.find((i) => Weight_lt(i, roundWeight));\n      return item ?? items[items.length - 1] ?? roundWeight;\n    } else {\n      const smallestPlate = Weight_multiply(Equipment_smallestPlate(equipmentData, unit), equipmentData.multiplier);\n      const subtracted = Weight_subtract(roundWeight, smallestPlate);\n      const newWeight = Weight_round(subtracted, settings, unit, exerciseType);\n      return Weight_build(newWeight.value, newWeight.unit);\n    }\n  } else {\n    const roundWeight = Weight_round(weight, settings, weight.unit, exerciseType);\n    const rounding = exerciseType ? Exercise_defaultRounding(exerciseType, settings) : 1;\n    return Weight_build(roundWeight.value - rounding, roundWeight.unit);\n  }\n}\n\nexport function Weight_getOneRepMax(weight: IWeight, reps: number, rpe?: number): IWeight {\n  if (reps === 0) {\n    return Weight_build(0, weight.unit);\n  } else if (reps === 1) {\n    return weight;\n  } else {\n    return Weight_roundTo005(Weight_divide(weight, Weight_rpeMultiplier(reps, rpe ?? 10)));\n  }\n}\n\nexport function Weight_getNRepMax(oneRepMax: IWeight, reps: number): IWeight {\n  if (reps === 0) {\n    return Weight_build(0, oneRepMax.unit);\n  } else if (reps === 1) {\n    return oneRepMax;\n  } else {\n    return Weight_roundTo005(Weight_multiply(oneRepMax, Weight_rpeMultiplier(reps, 10)));\n  }\n}\n\nexport function Weight_getTrainingMax(weight: IWeight, reps: number, settings: ISettings): IWeight {\n  return Weight_round(Weight_multiply(Weight_getOneRepMax(weight, reps), 0.9), settings, weight.unit);\n}\n\nexport function Weight_platesWeight(plates: IPlate[]): IWeight {\n  const unit = plates[0]?.weight.unit || \"lb\";\n  return plates.reduce(\n    (memo, plate) => Weight_add(memo, Weight_multiply(plate.weight, plate.num)),\n    Weight_build(0, unit)\n  );\n}\n\nexport function Weight_oneSidePlates(settings: ISettings, platesArr: IPlate[], exerciseType: IExerciseType): IWeight[] {\n  const equipmentSettings = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n  const plates: IPlate[] = JSON.parse(JSON.stringify(platesArr));\n  plates.sort((a, b) => Weight_compareReverse(a.weight, b.weight));\n  const arr: IWeight[] = [];\n  const multiplier = equipmentSettings?.multiplier ?? 1;\n  while (true) {\n    const plate = plates.find((p) => p.num >= multiplier);\n    if (plate != null) {\n      arr.push(plate.weight);\n      plate.num -= multiplier;\n    } else {\n      break;\n    }\n  }\n  return arr;\n}\n\nexport function Weight_formatOneSide(settings: ISettings, platesArr: IPlate[], exerciseType: IExerciseType): string {\n  const arr = Weight_oneSidePlates(settings, platesArr, exerciseType).map((w) => w.value);\n  return CollectionUtils_compressArray(arr, 3).join(\"/\");\n}\n\nexport function Weight_roundTo005(weight: IWeight): IWeight {\n  return Weight_build(MathUtils_roundTo005(weight.value), weight.unit);\n}\n\nexport function Weight_roundTo000005(weight: IWeight): IWeight {\n  return Weight_build(MathUtils_roundTo000005(weight.value), weight.unit);\n}\n\nexport function Weight_calculatePlates(\n  allWeight: IWeight,\n  settings: ISettings,\n  units: IUnit,\n  exerciseType: IExerciseType\n): { plates: IPlate[]; platesWeight: IWeight; totalWeight: IWeight } {\n  const equipmentData = Equipment_getEquipmentDataForExerciseType(settings, exerciseType);\n  if (equipmentData == null) {\n    const rounding = Exercise_defaultRounding(exerciseType, settings);\n    allWeight = Weight_build(MathUtils_round(allWeight.value, rounding), allWeight.unit);\n    return { plates: [], platesWeight: allWeight, totalWeight: allWeight };\n  }\n\n  const originalUnit = allWeight.unit;\n  const weightInUnits = Weight_convertTo(allWeight, units);\n  const absAllWeight = Weight_abs(weightInUnits);\n  const inverted = weightInUnits.value < 0;\n  if (equipmentData.isFixed) {\n    const fixed = CollectionUtils_sort(\n      equipmentData.fixed.filter((w) => w.unit === (equipmentData.unit ?? units)),\n      (a, b) => b.value - a.value\n    );\n    const weight = fixed.find((w) => Weight_lte(w, absAllWeight)) || fixed[fixed.length - 1] || absAllWeight;\n    let roundedWeight = Weight_roundTo005(Weight_convertTo(weight, originalUnit));\n    roundedWeight = inverted ? Weight_invert(roundedWeight) : roundedWeight;\n    return { plates: [], platesWeight: roundedWeight, totalWeight: roundedWeight };\n  }\n  const availablePlatesArr = equipmentData.plates.filter((p) => p.weight.unit === units);\n  const barWeight =\n    equipmentData.useBodyweightForBar && settings.currentBodyweight\n      ? settings.currentBodyweight\n      : equipmentData.bar[units];\n  const multiplier = equipmentData.multiplier || 1;\n  const isAssisting = equipmentData.isAssisting || false;\n  const weight = Weight_roundTo000005(Weight_subtract(absAllWeight, barWeight));\n  const availablePlates: IPlate[] = JSON.parse(JSON.stringify(availablePlatesArr));\n  availablePlates.sort((a, b) => Weight_compareReverse(a.weight, b.weight));\n  const plates: IPlate[] = calculatePlatesInternalFast(weight, availablePlates, multiplier, isAssisting);\n  const total = plates.reduce(\n    (memo, plate) => {\n      const weightToAdd = Weight_multiply(plate.weight, plate.num);\n      return isAssisting ? Weight_subtract(memo, weightToAdd) : Weight_add(memo, weightToAdd);\n    },\n    Weight_build(0, units)\n  );\n  const totalInUnits = Weight_add(total, barWeight);\n  const totalWeight = Weight_roundTo000005(\n    Weight_convertTo(inverted ? Weight_invert(totalInUnits) : totalInUnits, originalUnit)\n  );\n  const thePlatesWeight = Weight_convertTo(inverted ? Weight_invert(total) : total, originalUnit);\n  return { plates, platesWeight: thePlatesWeight, totalWeight };\n}\n\nexport function Weight_abs(weight: IWeight): IWeight {\n  return Weight_build(Math.abs(weight.value), weight.unit);\n}\n\nexport function Weight_invert(weight: IWeight): IWeight {\n  return Weight_build(-weight.value, weight.unit);\n}\n\nfunction calculatePlatesInternalFast(\n  weight: IWeight,\n  availablePlates: IPlate[],\n  multiplier: number,\n  isAssisting: boolean\n): IPlate[] {\n  const targetValue = isAssisting ? -weight.value : weight.value;\n  if (targetValue <= 0) {\n    return [];\n  }\n\n  const plateTypes: { weight: IWeight; unitWeight: number; maxUnits: number }[] = [];\n  for (const p of availablePlates) {\n    if (p.num >= multiplier) {\n      plateTypes.push({\n        weight: p.weight,\n        unitWeight: p.weight.value * multiplier,\n        maxUnits: Math.floor(p.num / multiplier),\n      });\n    }\n  }\n  if (plateTypes.length === 0) {\n    return [];\n  }\n\n  // Convert to integers for exact arithmetic\n  const allValues = [targetValue, ...plateTypes.map((p) => p.unitWeight)];\n  let maxDecimals = 0;\n  for (const v of allValues) {\n    const s = v.toString();\n    const dot = s.indexOf(\".\");\n    if (dot >= 0) {\n      maxDecimals = Math.max(maxDecimals, s.length - dot - 1);\n    }\n  }\n  const precision = Math.pow(10, Math.min(maxDecimals, 6));\n  const intTarget = Math.round(targetValue * precision);\n  const intWeights = plateTypes.map((p) => Math.round(p.unitWeight * precision));\n\n  // Max contribution from plates at index i and beyond (for pruning)\n  const maxFrom = new Array(plateTypes.length + 1).fill(0);\n  for (let i = plateTypes.length - 1; i >= 0; i--) {\n    maxFrom[i] = maxFrom[i + 1] + intWeights[i] * plateTypes[i].maxUnits;\n  }\n\n  const best = new Array(plateTypes.length).fill(0);\n  const current = new Array(plateTypes.length).fill(0);\n  let bestRemaining = intTarget + 1;\n  let iterations = 0;\n\n  function search(index: number, remaining: number): void {\n    if (bestRemaining === 0 || iterations >= 10000) {\n      return;\n    }\n    if (remaining === 0 || index >= plateTypes.length) {\n      if (remaining < bestRemaining) {\n        bestRemaining = remaining;\n        for (let i = 0; i < index; i++) {\n          best[i] = current[i];\n        }\n        for (let i = index; i < plateTypes.length; i++) {\n          best[i] = 0;\n        }\n      }\n      return;\n    }\n\n    iterations += 1;\n    const w = intWeights[index];\n    const maxCount = Math.min(plateTypes[index].maxUnits, w > 0 ? Math.floor(remaining / w) : 0);\n\n    for (let count = maxCount; count >= 0; count--) {\n      const newRemaining = remaining - count * w;\n      if (newRemaining - maxFrom[index + 1] >= bestRemaining) {\n        continue;\n      }\n      current[index] = count;\n      search(index + 1, newRemaining);\n      if (bestRemaining === 0) {\n        return;\n      }\n    }\n  }\n\n  search(0, intTarget);\n\n  const plates: IPlate[] = [];\n  for (let i = 0; i < plateTypes.length; i++) {\n    if (best[i] > 0) {\n      plates.push({ weight: plateTypes[i].weight, num: best[i] * multiplier });\n    }\n  }\n  return plates;\n}\n\nexport function Weight_add(weight: IWeight, value: IWeight | number): IWeight {\n  return Weight_operation(weight, value, (a, b) => a + b);\n}\n\nexport function Weight_subtract(weight: IWeight, value: IWeight | number): IWeight {\n  return Weight_operation(weight, value, (a, b) => a - b);\n}\n\nexport function Weight_multiply(weight: IWeight, value: IWeight | number): IWeight {\n  return Weight_operation(weight, value, (a, b) => a * b);\n}\n\nexport function Weight_divide(weight: IWeight, value: IWeight | number): IWeight {\n  return Weight_operation(weight, value, (a, b) => a / b);\n}\n\nexport function Weight_gt(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n  return comparison(weight, value, (a, b) => a > b);\n}\n\nexport function Weight_lt(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n  return comparison(weight, value, (a, b) => a < b);\n}\n\nexport function Weight_gte(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n  return comparison(weight, value, (a, b) => a >= b);\n}\n\nexport function Weight_lte(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n  return comparison(weight, value, (a, b) => a <= b);\n}\n\nexport function Weight_eqNull(\n  weight: IWeight | number | IPercentage | undefined,\n  value: IWeight | number | IPercentage | undefined\n): boolean {\n  if (weight == null && value == null) {\n    return true;\n  } else if (weight == null && value != null) {\n    return false;\n  } else if (weight != null && value == null) {\n    return false;\n  } else {\n    return comparison(weight!, value!, (a, b) => a === b);\n  }\n}\n\nexport function Weight_eq(weight: IWeight | number | IPercentage, value: IWeight | number | IPercentage): boolean {\n  return comparison(weight, value, (a, b) => a === b);\n}\n\nexport function Weight_eqeq(weight: IWeight, value: IWeight): boolean {\n  return weight.value === value.value && weight.unit === value.unit;\n}\n\nexport function Weight_max(weights: IWeight[]): IWeight | undefined {\n  return CollectionUtils_sort(weights, Weight_compareReverse)[0];\n}\n\nexport function Weight_roundConvertTo(\n  weight: IWeight,\n  settings: ISettings,\n  unit: IUnit,\n  exerciseType?: IExerciseType\n): IWeight {\n  return Weight_round(Weight_convertTo(weight, unit), settings, unit, exerciseType);\n}\n\nexport function Weight_type(value: number | IWeight | IPercentage): \"weight\" | \"percentage\" | \"number\" {\n  if (typeof value === \"number\") {\n    return \"number\";\n  } else if (Weight_isPct(value)) {\n    return \"percentage\";\n  } else {\n    return \"weight\";\n  }\n}\n\nexport function Weight_convertTo(weight: IWeight, unit: IUnit): IWeight;\nexport function Weight_convertTo(weight: IPercentage, unit: \"%\" | IUnit): IPercentage;\nexport function Weight_convertTo(weight: number, unit: IUnit): number;\nexport function Weight_convertTo(\n  weight: IWeight | number | IPercentage,\n  unit: IUnit | \"%\"\n): IWeight | number | IPercentage {\n  if (typeof weight === \"number\") {\n    return weight;\n  } else if (weight.unit === \"%\" || unit === \"%\") {\n    return weight;\n  } else {\n    if (weight.unit === unit) {\n      return weight;\n    } else if (weight.unit === \"kg\" && unit === \"lb\") {\n      return Weight_build(Math.round((weight.value * 2.205) / 0.5) * 0.5, unit);\n    } else {\n      return Weight_build(Math.round(weight.value / 2.205 / 0.5) * 0.5, unit);\n    }\n  }\n}\n\nexport function Weight_compare(a: IWeight, b: IWeight): number {\n  return a.value - Weight_convertTo(b, a.unit).value;\n}\n\nexport function Weight_compareReverse(a: IWeight, b: IWeight): number {\n  return Weight_convertTo(b, a.unit).value - a.value;\n}\n\nfunction comparison(\n  weight: IWeight | number | IPercentage,\n  value: IWeight | number | IPercentage,\n  o: (a: number, b: number) => boolean\n): boolean {\n  if (typeof weight === \"number\" && typeof value === \"number\") {\n    return o(weight, value);\n  } else if (typeof weight === \"number\" && typeof value !== \"number\") {\n    return o(weight, value.value);\n  } else if (typeof weight !== \"number\" && typeof value === \"number\") {\n    return o(weight.value, value);\n  } else if (typeof weight !== \"number\" && typeof value !== \"number\") {\n    if (weight.unit === \"%\" && value.unit === \"%\") {\n      return o(weight.value, value.value);\n    } else if (Weight_is(weight) && Weight_is(value)) {\n      return o(weight.value, Weight_convertTo(value, weight.unit).value);\n    } else {\n      return false;\n    }\n  } else {\n    return false;\n  }\n}\n\nexport function Weight_applyOp(\n  onerm: IWeight | undefined,\n  oldValue: IWeight | number | IPercentage,\n  value: IWeight | number | IPercentage,\n  opr: \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"=\"\n): IWeight | number | IPercentage {\n  if (opr === \"=\") {\n    return value;\n  } else if (opr === \"+=\") {\n    return Weight_op(onerm, oldValue, value, (a, b) => a + b);\n  } else if (opr === \"-=\") {\n    return Weight_op(onerm, oldValue, value, (a, b) => a - b);\n  } else if (opr === \"*=\") {\n    return Weight_op(onerm, oldValue, value, (a, b) => MathUtils_roundTo005(a * b));\n  } else {\n    return Weight_op(onerm, oldValue, value, (a, b) => MathUtils_roundTo005(a / b));\n  }\n}\n\nexport function Weight_op(\n  onerm: IWeight | undefined,\n  a: IWeight | number | IPercentage,\n  b: IWeight | number | IPercentage,\n  o: (x: number, y: number) => number\n): IWeight | number | IPercentage {\n  if (typeof a === \"number\" && typeof b === \"number\") {\n    return o(a, b);\n  }\n  if (typeof a === \"number\" && Weight_isPct(b)) {\n    return Weight_buildPct(o(a, b.value));\n  }\n  if (typeof a === \"number\" && Weight_is(b)) {\n    return Weight_operation(a, b, o);\n  }\n\n  if (Weight_isPct(a) && typeof b === \"number\") {\n    return Weight_buildPct(o(a.value, b));\n  }\n  if (Weight_isPct(a) && Weight_isPct(b)) {\n    return Weight_buildPct(o(a.value, b.value));\n  }\n  if (Weight_isPct(a) && Weight_is(b)) {\n    const aWeight = onerm ? Weight_multiply(onerm, a.value / 100) : MathUtils_roundFloat(a.value / 100, 4);\n    return Weight_operation(aWeight, b, o);\n  }\n\n  if (Weight_is(a) && typeof b === \"number\") {\n    return Weight_operation(a, b, o);\n  }\n  if (Weight_is(a) && Weight_isPct(b)) {\n    const bWeight = onerm ? Weight_multiply(onerm, b.value / 100) : MathUtils_roundFloat(b.value / 100, 4);\n    return Weight_operation(a, bWeight, o);\n  }\n  if (Weight_is(a) && Weight_is(b)) {\n    return Weight_operation(a, b, o);\n  }\n\n  throw new Error(`Can't apply operation to ${a} and ${b}`);\n}\n\nexport function Weight_operation(\n  weight: IWeight,\n  value: IWeight | number,\n  o: (a: number, b: number) => number\n): IWeight;\nexport function Weight_operation(\n  weight: IWeight | number,\n  value: IWeight,\n  o: (a: number, b: number) => number\n): IWeight;\nexport function Weight_operation(\n  weight: IWeight | number,\n  value: IWeight | number,\n  o: (a: number, b: number) => number\n): IWeight {\n  if (typeof weight === \"number\" && typeof value !== \"number\") {\n    return Weight_build(o(weight, value.value), value.unit);\n  } else if (typeof weight !== \"number\" && typeof value === \"number\") {\n    return Weight_build(o(weight.value, value), weight.unit);\n  } else if (typeof weight !== \"number\" && typeof value !== \"number\") {\n    return Weight_build(o(weight.value, Weight_convertTo(value, weight.unit).value), weight.unit);\n  } else {\n    throw new Error(\"Weight.operation should never work with numbers only\");\n  }\n}\n\nexport function Weight_convertToWeight(onerm: IWeight, value: IWeight | number | IPercentage, unit: IUnit): IWeight {\n  if (typeof value === \"number\") {\n    return Weight_build(value, unit);\n  } else if (Weight_isPct(value)) {\n    return Weight_convertTo(Weight_multiply(onerm, MathUtils_roundFloat(value.value / 100, 4)), unit);\n  } else {\n    return value;\n  }\n}\n\nexport function Weight_calculateRepMax(\n  knownReps: number,\n  knownRpe: number,\n  knownWeight: number,\n  targetReps: number,\n  targetRpe: number\n): number {\n  const knownRpeMultiplier = Weight_rpeMultiplier(knownReps, knownRpe);\n  const onerm = knownWeight / knownRpeMultiplier;\n  const targetRpeMultiplier = Weight_rpeMultiplier(targetReps, targetRpe);\n  return Math.round(onerm * targetRpeMultiplier);\n}\n\nexport function Weight_rpeMultiplier(reps: number, rpe: number): number {\n  if (reps === 1 && rpe === 10) {\n    return 1;\n  }\n  reps = Math.max(Math.min(reps, 24), 1);\n  rpe = Math.max(Math.min(rpe, 10), 1);\n\n  const x = 10.0 - rpe + (reps - 1);\n  if (x >= 16) {\n    return 0.5;\n  }\n  // The formula is taken from\n  // https://gitlab.com/openpowerlifting/plsource/-/blob/ba5194be6daa08d082bb1b7959d6f47b82e7802c/static/rpe-calc/index.html#L224\n  const intersection = 2.92;\n  if (x <= intersection) {\n    const a = 0.347619;\n    const b = -4.60714;\n    const c = 99.9667;\n    return (a * x * x + b * x + c) / 100;\n  } else {\n    const m = -2.64249;\n    const b = 97.0955;\n    return (m * x + b) / 100;\n  }\n}\n\nexport const Weight_zero: IWeight = { value: 0, unit: \"lb\" } as const;\n","import { ObjectUtils_keys } from \"../utils/object\";\nimport { UrlUtils_build } from \"../utils/url\";\nimport { WhatsNewParser_parseAll } from \"./whatsnewParser\";\n\nexport interface IWhatsNew {\n  title: string;\n  body: string;\n}\n\nlet cached: Record<string, IWhatsNew> | undefined;\n\nexport function WhatsNew_all(): Record<string, IWhatsNew> {\n  if (!cached) {\n    const result: Record<string, IWhatsNew> = {};\n    for (const entry of WhatsNewParser_parseAll()) {\n      result[entry.dateStr] = { title: entry.title, body: entry.body };\n    }\n    cached = result;\n  }\n  return cached;\n}\n\nexport function WhatsNew_doesHaveNewUpdates(lastDateStr?: string): boolean {\n  if (lastDateStr == null) {\n    return false;\n  } else {\n    return Object.keys(WhatsNew_newUpdates(lastDateStr)).length > 0;\n  }\n}\n\nexport function WhatsNew_newUpdates(lastDateStr: string): Record<string, IWhatsNew> {\n  if (typeof window !== \"undefined\" && window.location?.href) {\n    const url = UrlUtils_build(window.location.href);\n    const forcedUserEmail = url.searchParams.get(\"forceuseremail\");\n    if (forcedUserEmail != null) {\n      return {};\n    }\n  }\n  const whatsNew = WhatsNew_all();\n  const lastDate = parseInt(lastDateStr, 10);\n  return ObjectUtils_keys(whatsNew).reduce<Record<string, IWhatsNew>>((memo, dateStr) => {\n    const date = parseInt(dateStr, 10);\n    if (date > lastDate) {\n      memo[dateStr] = whatsNew[dateStr];\n    }\n    return memo;\n  }, {});\n}\n","import { content as changelogMarkdown } from \"../generated/whatsnew\";\n\nexport interface IWhatsNewEntry {\n  dateStr: string;\n  title: string;\n  body: string;\n}\n\nlet cached: IWhatsNewEntry[] | undefined;\n\nexport function WhatsNewParser_parseAll(): IWhatsNewEntry[] {\n  if (cached) {\n    return cached;\n  }\n  cached = parse(changelogMarkdown);\n  return cached;\n}\n\nfunction parse(source: string): IWhatsNewEntry[] {\n  const lines = source.split(/\\r?\\n/);\n  const entries: IWhatsNewEntry[] = [];\n\n  let i = 0;\n  while (i < lines.length) {\n    if (lines[i].trim() !== \"---\") {\n      i += 1;\n      continue;\n    }\n    i += 1;\n\n    const meta: Record<string, string> = {};\n    while (i < lines.length && lines[i].trim() !== \"---\") {\n      const line = lines[i];\n      const match = /^([A-Za-z][A-Za-z0-9_-]*)\\s*:\\s*(.*)$/.exec(line);\n      if (match) {\n        meta[match[1].toLowerCase()] = match[2].trim();\n      }\n      i += 1;\n    }\n    if (i >= lines.length) {\n      break;\n    }\n    i += 1;\n\n    const bodyLines: string[] = [];\n    while (i < lines.length) {\n      if (lines[i].trim() === \"---\" && isFrontmatterStart(lines, i)) {\n        break;\n      }\n      bodyLines.push(lines[i]);\n      i += 1;\n    }\n\n    const dateRaw = meta.date || \"\";\n    const dateStr = dateRaw.replace(/-/g, \"\");\n    const title = meta.title || \"\";\n    if (!/^\\d{8}$/.test(dateStr)) {\n      continue;\n    }\n    entries.push({\n      dateStr,\n      title,\n      body: bodyLines.join(\"\\n\").trim(),\n    });\n  }\n\n  return entries;\n}\n\nfunction isFrontmatterStart(lines: string[], idx: number): boolean {\n  for (let j = idx + 1; j < lines.length; j += 1) {\n    const trimmed = lines[j].trim();\n    if (trimmed === \"---\") {\n      return true;\n    }\n    if (trimmed === \"\") {\n      return false;\n    }\n    if (!/^[A-Za-z][A-Za-z0-9_-]*\\s*:/.test(trimmed)) {\n      return false;\n    }\n  }\n  return false;\n}\n","import { IDispatch } from \"../ducks/types\";\nimport { IState, updateState } from \"./state\";\nimport { lb } from \"lens-shmens\";\nimport { WhatsNew_all } from \"./whatsnew\";\n\nexport function WhatsNew_updateStorage(dispatch: IDispatch): void {\n  const latestDateStr = Object.keys(WhatsNew_all()).sort().reverse()[0];\n  updateState(\n    dispatch,\n    [lb<IState>().p(\"storage\").p(\"whatsNew\").record(latestDateStr), lb<IState>().p(\"showWhatsNew\").record(false)],\n    \"Mark what's new as read\"\n  );\n}\n\nexport function WhatsNew_showWhatsNew(dispatch: IDispatch): void {\n  updateState(dispatch, [lb<IState>().p(\"showWhatsNew\").record(true)], \"Show what's new\");\n}\n","import { IHistoryRecord, IWorkoutOutcome } from \"../types\";\nimport { IHealthWorkoutPayload } from \"../utils/healthAdapter\";\nimport { History_calories } from \"./history\";\n\nconst maxWorkoutOutcomes = 20;\nconst healthSaveMaxAgeMs = 24 * 60 * 60 * 1000;\n\nexport function WorkoutOutcome_add(\n  outcomes: IWorkoutOutcome[] | undefined,\n  outcome: Omit<IWorkoutOutcome, \"vtype\">\n): IWorkoutOutcome[] {\n  const others = (outcomes ?? []).filter((o) => o.id !== outcome.id);\n  return [...others, { vtype: \"workout_outcome\" as const, ...outcome }]\n    .sort((a, b) => a.endTime - b.endTime || a.id - b.id)\n    .slice(-maxWorkoutOutcomes);\n}\n\nexport function WorkoutOutcome_syncId(id: number): string {\n  return `liftosaur-workout-${id}`;\n}\n\nexport function WorkoutOutcome_healthSaves(\n  oldOutcomes: IWorkoutOutcome[] | undefined,\n  newOutcomes: IWorkoutOutcome[] | undefined,\n  history: IHistoryRecord[],\n  nowMs: number\n): IHealthWorkoutPayload[] {\n  const oldIds = new Set((oldOutcomes ?? []).map((o) => o.id));\n  const payloads: IHealthWorkoutPayload[] = [];\n  for (const outcome of newOutcomes ?? []) {\n    if (\n      oldIds.has(outcome.id) ||\n      outcome.outcome !== \"finish\" ||\n      !outcome.healthSync ||\n      nowMs - outcome.endTime > healthSaveMaxAgeMs\n    ) {\n      continue;\n    }\n    const record = history.find((r) => r.id === outcome.id);\n    if (record != null) {\n      payloads.push(WorkoutOutcome_healthPayload(record));\n    }\n  }\n  return payloads;\n}\n\nexport function WorkoutOutcome_healthPayload(record: IHistoryRecord): IHealthWorkoutPayload {\n  const intervals: [number, number | null][] = (record.intervals ?? []).map(([s, e]) => [s, e ?? null]);\n  const closed = intervals.filter((i): i is [number, number] => i[1] != null);\n  const startMs = closed[0]?.[0] ?? record.startTime;\n  return {\n    startMs,\n    endMs: closed[closed.length - 1]?.[1] ?? record.endTime ?? startMs,\n    calories: History_calories(record),\n    intervals,\n    syncId: WorkoutOutcome_syncId(record.id),\n  };\n}\n","export interface IWorkoutTimeEstimateSet {\n  reps?: number;\n  timer?: number;\n  setTimer?: number;\n  auto?: boolean;\n}\n\nexport interface IWorkoutTimeEstimateExercise {\n  superset?: string;\n  isUnilateral?: boolean;\n  sets: IWorkoutTimeEstimateSet[];\n}\n\nexport interface IWorkoutTimeEstimateTimers {\n  rest: number;\n  superset?: number;\n}\n\nconst secondsPerRep = 7;\nconst prepareSeconds = 20;\n\nfunction setWorkMs(set: IWorkoutTimeEstimateSet, isUnilateral: boolean | undefined): number {\n  const prepare = set.auto ? 0 : prepareSeconds;\n  const sideWork = set.setTimer != null ? set.setTimer : (set.reps ?? 0) * secondsPerRep;\n  const sides = isUnilateral ? 2 : 1;\n  return (prepare + sideWork * sides) * 1000;\n}\n\nexport function WorkoutTimeEstimate_dayMs(\n  exercises: IWorkoutTimeEstimateExercise[],\n  timers: IWorkoutTimeEstimateTimers\n): number {\n  let totalMs = 0;\n  const visitedSupersets = new Set<string>();\n  for (const exercise of exercises) {\n    if (exercise.superset == null) {\n      totalMs += straightSetsMs(exercise, timers.rest);\n    } else if (!visitedSupersets.has(exercise.superset)) {\n      visitedSupersets.add(exercise.superset);\n      const group = exercises.filter((e) => e.superset === exercise.superset);\n      totalMs +=\n        group.length > 1 ? supersetMs(group, timers) : straightSetsMs(exercise, timers.superset ?? timers.rest);\n    }\n  }\n  return totalMs;\n}\n\nfunction straightSetsMs(exercise: IWorkoutTimeEstimateExercise, restTimer: number): number {\n  return exercise.sets.reduce(\n    (acc, set) => acc + setWorkMs(set, exercise.isUnilateral) + (set.timer ?? restTimer) * 1000,\n    0\n  );\n}\n\nfunction supersetMs(group: IWorkoutTimeEstimateExercise[], timers: IWorkoutTimeEstimateTimers): number {\n  const rounds = Math.max(...group.map((e) => e.sets.length));\n  let totalMs = 0;\n  for (let round = 0; round < rounds; round += 1) {\n    const roundMembers = group.filter((e) => e.sets[round] != null);\n    roundMembers.forEach((exercise, index) => {\n      const set = exercise.sets[round];\n      const isLastInRound = index === roundMembers.length - 1;\n      const rest = isLastInRound ? (set.timer ?? timers.superset ?? timers.rest) : (timers.superset ?? 0);\n      totalMs += setWorkMs(set, exercise.isUnilateral) + rest * 1000;\n    });\n  }\n  return totalMs;\n}\n","import { JSX, ReactNode, createContext, useCallback, useContext, useEffect, useId, useMemo, useState } from \"react\";\n\ninterface ISheetEntry {\n  id: string;\n  height: number;\n  hidesFloatingUi: boolean;\n}\n\nexport interface IActiveSheet {\n  height: number;\n  hidesFloatingUi: boolean;\n}\n\ninterface IActiveSheetHeightContextValue {\n  entries: ISheetEntry[];\n  register: (id: string, hidesFloatingUi: boolean) => void;\n  update: (id: string, height: number) => void;\n  unregister: (id: string) => void;\n}\n\nconst ActiveSheetHeightContext = createContext<IActiveSheetHeightContextValue>({\n  entries: [],\n  register: () => undefined,\n  update: () => undefined,\n  unregister: () => undefined,\n});\n\nexport function ActiveSheetHeightProvider(props: { children: ReactNode }): JSX.Element {\n  const [entries, setEntries] = useState<ISheetEntry[]>([]);\n  const register = useCallback((id: string, hidesFloatingUi: boolean) => {\n    setEntries((prev) => (prev.some((e) => e.id === id) ? prev : [...prev, { id, height: 0, hidesFloatingUi }]));\n  }, []);\n  const update = useCallback((id: string, height: number) => {\n    setEntries((prev) => {\n      const idx = prev.findIndex((e) => e.id === id);\n      if (idx === -1) {\n        return prev;\n      }\n      if (prev[idx].height === height) {\n        return prev;\n      }\n      const next = prev.slice();\n      next[idx] = { ...prev[idx], height };\n      return next;\n    });\n  }, []);\n  const unregister = useCallback((id: string) => {\n    setEntries((prev) => (prev.some((e) => e.id === id) ? prev.filter((e) => e.id !== id) : prev));\n  }, []);\n  const value = useMemo(() => ({ entries, register, update, unregister }), [entries, register, update, unregister]);\n  return <ActiveSheetHeightContext.Provider value={value}>{props.children}</ActiveSheetHeightContext.Provider>;\n}\n\nexport function useActiveSheet(): IActiveSheet {\n  const { entries } = useContext(ActiveSheetHeightContext);\n  const height = entries.length > 0 ? entries[entries.length - 1].height : 0;\n  // Any sheet in the stack, not just the topmost - a sheet that hides floating UI keeps hiding it\n  // while another one is stacked on top of it.\n  const hidesFloatingUi = entries.some((e) => e.hidesFloatingUi);\n  return useMemo(() => ({ height, hidesFloatingUi }), [height, hidesFloatingUi]);\n}\n\nexport function useReportSheetHeight(hidesFloatingUi: boolean = false): (height: number) => void {\n  const id = useId();\n  const { register, update, unregister } = useContext(ActiveSheetHeightContext);\n  useEffect(() => {\n    register(id, hidesFloatingUi);\n    return () => unregister(id);\n  }, [id, register, unregister, hidesFloatingUi]);\n  return useCallback((height: number) => update(id, height), [id, update]);\n}\n","import { JSX, createContext, useContext } from \"react\";\nimport { createStackNavigator } from \"@react-navigation/stack\";\nimport { createBottomTabNavigator } from \"@react-navigation/bottom-tabs\";\nimport { useTrackedState } from \"./TrackedStateContext\";\nimport type {\n  IOnboardingStackParamList,\n  IHomeStackParamList,\n  IProgramStackParamList,\n  IWorkoutStackParamList,\n  IGraphsStackParamList,\n  IMeStackParamList,\n  IFoodStackParamList,\n  IRootTabParamList,\n  IRootStackParamList,\n} from \"./types\";\nimport type { IScreen } from \"../models/screen\";\nimport { NavHeader } from \"./NavHeader\";\nimport { ScreenErrorBoundary } from \"../components/screenErrorBoundary\";\nimport { Tailwind_semantic } from \"../utils/tailwindConfig\";\nimport { useSystemTheme } from \"../utils/theme\";\nimport { NavScreenMain } from \"./screens/NavScreenHome\";\nimport {\n  NavScreenPrograms,\n  NavScreenEditProgram,\n  NavScreenMuscles,\n  NavScreenOnerms,\n  NavScreenProgramSelect,\n  NavScreenProgramPreview,\n} from \"./screens/NavScreenProgram\";\nimport {\n  NavScreenFirst,\n  NavScreenUnits,\n  NavScreenSetupEquipment,\n  NavScreenSetupPlates,\n  NavScreenHearAboutUs,\n  NavScreenProgramSelectOnboarding,\n  NavScreenProgramsOnboarding,\n  NavScreenProgramPreviewOnboarding,\n} from \"./screens/NavScreenOnboarding\";\nimport { NavScreenProgress, NavScreenFinishDay, NavScreenSubscription } from \"./screens/NavScreenWorkout\";\nimport { NavScreenGraphs } from \"./screens/NavScreenGraphs\";\nimport {\n  NavScreenSettings,\n  NavScreenAccount,\n  NavScreenTimers,\n  NavScreenPlates,\n  NavScreenGyms,\n  NavScreenExercises,\n  NavScreenAppleHealth,\n  NavScreenGoogleHealth,\n  NavScreenMuscleGroups,\n  NavScreenStats,\n  NavScreenMeasurements,\n  NavScreenSleepNutrition,\n  NavScreenExerciseStats,\n  NavScreenApiKeys,\n  NavScreenRecentImports,\n  NavScreenImportPreview,\n} from \"./screens/NavScreenMe\";\nimport {\n  NavScreenFood,\n  NavScreenFoodAdd,\n  NavScreenFoodGoals,\n  NavScreenFoodItem,\n  NavScreenFoodLibrary,\n  NavScreenFoodTemplates,\n} from \"./screens/NavScreenFood\";\nimport { Footer2Wrapper } from \"./screens/NavScreenFooter2\";\nimport { NavModalAmrap } from \"./modals/NavModalAmrap\";\nimport { NavModalExercisePicker } from \"./modals/NavModalExercisePicker\";\nimport { NavModalEditProgramExercisePicker } from \"./modals/NavModalEditProgramExercisePicker\";\nimport { NavModalEditTarget } from \"./modals/NavModalEditTarget\";\nimport { NavModalSetTimer } from \"./modals/NavModalSetTimer\";\nimport { NavModalSetTimerEdit } from \"./modals/NavModalSetTimerEdit\";\nimport { NavModalRoundingInfo } from \"./modals/NavModalRoundingInfo\";\nimport { NavModalDate } from \"./modals/NavModalDate\";\nimport { NavModal1RM } from \"./modals/NavModal1RM\";\nimport { NavModalEquipment } from \"./modals/NavModalEquipment\";\nimport { NavModalWorkoutSuperset } from \"./modals/NavModalWorkoutSuperset\";\nimport { NavModalPlaygroundEditExercise } from \"./modals/NavModalPlaygroundEditExercise\";\nimport { NavModalCoupon } from \"./modals/NavModalCoupon\";\nimport { NavModalNewGym } from \"./modals/NavModalNewGym\";\nimport { NavModalNewEquipment } from \"./modals/NavModalNewEquipment\";\nimport { NavModalPlates } from \"./modals/NavModalPlates\";\nimport { NavModalNewFixedWeight } from \"./modals/NavModalNewFixedWeight\";\nimport { NavModalCreateProgram } from \"./modals/NavModalCreateProgram\";\nimport { NavModalImportFromLink } from \"./modals/NavModalImportFromLink\";\nimport { NavModalAffiliate } from \"./modals/NavModalAffiliate\";\nimport { NavModalImportFromOtherApps } from \"./modals/NavModalImportFromOtherApps\";\nimport { NavModalDayFromAdhoc } from \"./modals/NavModalDayFromAdhoc\";\nimport { NavModalNextWorkout } from \"./modals/NavModalNextWorkout\";\nimport { NavModalWhatsnew } from \"./modals/NavModalWhatsnew\";\nimport { NavModalSignupRequest } from \"./modals/NavModalSignupRequest\";\nimport { NavModalHearAboutUs } from \"./modals/NavModalHearAboutUs\";\nimport { NavModalCorruptedState } from \"./modals/NavModalCorruptedState\";\nimport { NavModalDebug } from \"./modals/NavModalDebug\";\nimport { NavModalWorkoutShare } from \"./modals/NavModalWorkoutShare\";\nimport { NavModalSocialShare } from \"./modals/NavModalSocialShare\";\nimport { NavModalCustomExercise } from \"./modals/NavModalCustomExercise\";\nimport { NavModalMusclesOverride } from \"./modals/NavModalMusclesOverride\";\nimport { NavModalTour } from \"./modals/NavModalTour\";\nimport { NavModalEditProgramMenu } from \"./modals/NavModalEditProgramMenu\";\nimport { NavModalProgramNextDay } from \"./modals/NavModalProgramNextDay\";\nimport { NavModalProgramImageExport } from \"./modals/NavModalProgramImageExport\";\nimport { NavModalProgramRevisions } from \"./modals/NavModalProgramRevisions\";\nimport { NavModalMonthCalendar } from \"./modals/NavModalMonthCalendar\";\nimport { NavModalAccount } from \"./modals/NavModalAccount\";\nimport { NavModalEmailAuth } from \"./modals/NavModalEmailAuth\";\nimport { NavModalChangePassword } from \"./modals/NavModalChangePassword\";\nimport { NavModalSubscriptionInfo } from \"./modals/NavModalSubscriptionInfo\";\nimport { NavModalWeekInsightsDetails } from \"./modals/NavModalWeekInsightsDetails\";\nimport { NavModalSetSplit } from \"./modals/NavModalSetSplit\";\nimport { NavModalPlannerSettings } from \"./modals/NavModalPlannerSettings\";\nimport { NavModalEditMuscleGroups } from \"./modals/NavModalEditMuscleGroups\";\nimport { NavModalWeekStats } from \"./modals/NavModalWeekStats\";\nimport { NavModalDayStats } from \"./modals/NavModalDayStats\";\nimport { NavModalExerciseStats } from \"./modals/NavModalExerciseStats\";\nimport { NavModalEditExerciseChange } from \"./modals/NavModalEditExerciseChange\";\nimport { NavModalGraphs } from \"./modals/NavModalGraphs\";\nimport { NavModalStatsSettings } from \"./modals/NavModalStatsSettings\";\nimport { NavModalProgramInfo } from \"./modals/NavModalProgramInfo\";\nimport { NavModalChangeNextDay } from \"./modals/NavModalChangeNextDay\";\nimport { NavModalInputSelect } from \"./modals/NavModalInputSelect\";\nimport { NavModalStateVars } from \"./modals/NavModalStateVars\";\nimport { NavModalAcrossProgram } from \"./modals/NavModalAcrossProgram\";\nimport { NavModalCreateStateVar } from \"./modals/NavModalCreateStateVar\";\nimport { NavModalTextInput } from \"./modals/NavModalTextInput\";\nimport { NavModalEditDetails } from \"./modals/NavModalEditDetails\";\nimport { NavModalRepMaxCalculator } from \"./modals/NavModalRepMaxCalculator\";\nimport { NavModalMuscleGroupMusclePicker } from \"./modals/NavModalMuscleGroupMusclePicker\";\nimport { NavModalPhotoPicker } from \"./modals/NavModalPhotoPicker\";\nimport { NavModalExerciseImageSource } from \"./modals/NavModalExerciseImageSource\";\nimport { NavModalExerciseImageLibrary } from \"./modals/NavModalExerciseImageLibrary\";\nimport { NavModalExerciseCloneLibrary } from \"./modals/NavModalExerciseCloneLibrary\";\nimport { NavModalExerciseTypesPicker } from \"./modals/NavModalExerciseTypesPicker\";\nimport { NavModalExerciseMusclesPicker } from \"./modals/NavModalExerciseMusclesPicker\";\nimport { NavModalHelp } from \"./modals/NavModalHelp\";\nimport { NavModalExerciseLiftoEditor } from \"./modals/NavModalExerciseLiftoEditor\";\nimport { NavModalDayLiftoEditor } from \"./modals/NavModalDayLiftoEditor\";\n\nfunction renderScreenWithErrorBoundary(args: {\n  route: { name: string };\n  navigation: { canGoBack?: () => boolean; goBack?: () => void };\n  children: JSX.Element;\n}): JSX.Element {\n  return (\n    <ScreenErrorBoundary screenName={args.route.name} navigation={args.navigation}>\n      {args.children}\n    </ScreenErrorBoundary>\n  );\n}\n\nconst OnboardingStack = createStackNavigator<IOnboardingStackParamList>();\nconst HomeStack = createStackNavigator<IHomeStackParamList>();\nconst ProgramStack = createStackNavigator<IProgramStackParamList>();\nconst WorkoutStack = createStackNavigator<IWorkoutStackParamList>();\nconst GraphsStack = createStackNavigator<IGraphsStackParamList>();\nconst MeStack = createStackNavigator<IMeStackParamList>();\nconst FoodStack = createStackNavigator<IFoodStackParamList>();\nconst Tab = createBottomTabNavigator<IRootTabParamList>();\nconst RootStack = createStackNavigator<IRootStackParamList>();\n\n// Tailwind_semantic reads theme from the DOM (set by side effect on settings.theme and the OS theme).\n// Narrow subscription to theme so options re-evaluate only on theme change, not every dispatch.\nfunction useThemeRerender(): void {\n  const trackedState = useTrackedState();\n  useSystemTheme();\n  // eslint-disable-next-line no-void\n  void trackedState.storage.settings.theme;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction useStackScreenOptions() {\n  useThemeRerender();\n  return {\n    header: NavHeader,\n    animationEnabled: false,\n    freezeOnBlur: true,\n    cardStyle: { flex: 1, overflow: \"hidden\" as const, backgroundColor: Tailwind_semantic().background.default },\n  };\n}\n\nfunction OnboardingStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  const initialScreen = useContext(InitialScreenContext) as keyof IOnboardingStackParamList | undefined;\n  return (\n    <OnboardingStack.Navigator\n      screenOptions={screenOptions}\n      screenLayout={renderScreenWithErrorBoundary}\n      initialRouteName={initialScreen || \"first\"}\n    >\n      <OnboardingStack.Screen name=\"first\" component={NavScreenFirst} />\n      <OnboardingStack.Screen name=\"units\" component={NavScreenUnits} />\n      <OnboardingStack.Screen name=\"setupequipment\" component={NavScreenSetupEquipment} />\n      <OnboardingStack.Screen name=\"setupplates\" component={NavScreenSetupPlates} />\n      <OnboardingStack.Screen\n        name=\"hearaboutus\"\n        component={NavScreenHearAboutUs}\n        options={{ headerShown: true, header: NavHeader }}\n      />\n      <OnboardingStack.Screen name=\"programselect\" component={NavScreenProgramSelectOnboarding} />\n      <OnboardingStack.Screen name=\"programs\" component={NavScreenProgramsOnboarding} />\n      <OnboardingStack.Screen name=\"programPreview\" component={NavScreenProgramPreviewOnboarding} />\n      <OnboardingStack.Screen name=\"onerms\" component={NavScreenOnerms} />\n    </OnboardingStack.Navigator>\n  );\n}\n\nfunction HomeStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  return (\n    <HomeStack.Navigator screenOptions={screenOptions} screenLayout={renderScreenWithErrorBoundary}>\n      <HomeStack.Screen name=\"main\" component={NavScreenMain} />\n      <HomeStack.Screen name=\"progress\" component={NavScreenProgress} getId={({ params }) => String(params?.id ?? 0)} />\n      <HomeStack.Screen name=\"exerciseStats\" component={NavScreenExerciseStats} />\n    </HomeStack.Navigator>\n  );\n}\n\nfunction ProgramStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  return (\n    <ProgramStack.Navigator screenOptions={screenOptions} screenLayout={renderScreenWithErrorBoundary}>\n      <ProgramStack.Screen name=\"programs\" component={NavScreenPrograms} />\n      <ProgramStack.Screen name=\"editProgram\" component={NavScreenEditProgram} />\n      <ProgramStack.Screen name=\"onerms\" component={NavScreenOnerms} />\n      <ProgramStack.Screen name=\"programselect\" component={NavScreenProgramSelect} />\n      <ProgramStack.Screen name=\"programPreview\" component={NavScreenProgramPreview} />\n      <ProgramStack.Screen name=\"exerciseStats\" component={NavScreenExerciseStats} />\n    </ProgramStack.Navigator>\n  );\n}\n\nfunction WorkoutStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  return (\n    <WorkoutStack.Navigator screenOptions={screenOptions} screenLayout={renderScreenWithErrorBoundary}>\n      <WorkoutStack.Screen\n        name=\"progress\"\n        component={NavScreenProgress}\n        getId={({ params }) => String(params?.id ?? 0)}\n      />\n      <WorkoutStack.Screen name=\"finishDay\" component={NavScreenFinishDay} />\n      <WorkoutStack.Screen name=\"muscles\" component={NavScreenMuscles} />\n      <WorkoutStack.Screen name=\"exerciseStats\" component={NavScreenExerciseStats} />\n    </WorkoutStack.Navigator>\n  );\n}\n\nfunction GraphsStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  return (\n    <GraphsStack.Navigator screenOptions={screenOptions} screenLayout={renderScreenWithErrorBoundary}>\n      <GraphsStack.Screen name=\"graphsList\" component={NavScreenGraphs} />\n      <GraphsStack.Screen\n        name=\"progress\"\n        component={NavScreenProgress}\n        getId={({ params }) => String(params?.id ?? 0)}\n      />\n    </GraphsStack.Navigator>\n  );\n}\n\nfunction MeStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  return (\n    <MeStack.Navigator screenOptions={screenOptions} screenLayout={renderScreenWithErrorBoundary}>\n      <MeStack.Screen name=\"settings\" component={NavScreenSettings} />\n      <MeStack.Screen name=\"account\" component={NavScreenAccount} />\n      <MeStack.Screen name=\"timers\" component={NavScreenTimers} />\n      <MeStack.Screen name=\"plates\" component={NavScreenPlates} />\n      <MeStack.Screen name=\"gyms\" component={NavScreenGyms} />\n      <MeStack.Screen name=\"exercises\" component={NavScreenExercises} />\n      <MeStack.Screen name=\"appleHealth\" component={NavScreenAppleHealth} />\n      <MeStack.Screen name=\"googleHealth\" component={NavScreenGoogleHealth} />\n      <MeStack.Screen name=\"muscleGroups\" component={NavScreenMuscleGroups} />\n      <MeStack.Screen name=\"stats\" component={NavScreenStats} />\n      <MeStack.Screen name=\"measurements\" component={NavScreenMeasurements} />\n      <MeStack.Screen name=\"sleepNutrition\" component={NavScreenSleepNutrition} />\n      <MeStack.Screen name=\"exerciseStats\" component={NavScreenExerciseStats} />\n      <MeStack.Screen name=\"apiKeys\" component={NavScreenApiKeys} />\n      <MeStack.Screen name=\"recentImports\" component={NavScreenRecentImports} />\n      <MeStack.Screen name=\"importPreview\" component={NavScreenImportPreview} />\n      <MeStack.Screen name=\"programs\" component={NavScreenPrograms} />\n      <MeStack.Screen name=\"programPreview\" component={NavScreenProgramPreview} />\n      <MeStack.Screen name=\"progress\" component={NavScreenProgress} getId={({ params }) => String(params?.id ?? 0)} />\n      <MeStack.Screen name=\"onerms\" component={NavScreenOnerms} />\n      <MeStack.Screen name=\"editProgram\" component={NavScreenEditProgram} />\n    </MeStack.Navigator>\n  );\n}\n\nfunction FoodStackScreen(): JSX.Element {\n  const screenOptions = useStackScreenOptions();\n  return (\n    <FoodStack.Navigator screenOptions={screenOptions} screenLayout={renderScreenWithErrorBoundary}>\n      <FoodStack.Screen name=\"food\" component={NavScreenFood} />\n      <FoodStack.Screen name=\"foodAdd\" component={NavScreenFoodAdd} />\n      <FoodStack.Screen name=\"foodLibrary\" component={NavScreenFoodLibrary} />\n      <FoodStack.Screen name=\"foodItem\" component={NavScreenFoodItem} />\n      <FoodStack.Screen name=\"foodGoals\" component={NavScreenFoodGoals} />\n      <FoodStack.Screen name=\"foodTemplates\" component={NavScreenFoodTemplates} />\n    </FoodStack.Navigator>\n  );\n}\n\nconst tabScreenOptions = {\n  headerShown: false,\n  freezeOnBlur: true,\n  sceneStyle: { flex: 1, overflow: \"hidden\" as const },\n};\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction useRootScreenOptions() {\n  useThemeRerender();\n  return {\n    headerShown: false,\n    animationEnabled: false,\n    freezeOnBlur: true,\n    cardStyle: { flex: 1, backgroundColor: Tailwind_semantic().background.default },\n  };\n}\n\nfunction MainTabsScreen(): JSX.Element {\n  return (\n    <Tab.Navigator screenOptions={tabScreenOptions} tabBar={(tabProps) => <Footer2Wrapper {...tabProps} />}>\n      <Tab.Screen name=\"home\" component={HomeStackScreen} />\n      <Tab.Screen name=\"program\" component={ProgramStackScreen} />\n      <Tab.Screen name=\"workout\" component={WorkoutStackScreen} />\n      <Tab.Screen name=\"graphs\" component={GraphsStackScreen} />\n      <Tab.Screen name=\"food\" component={FoodStackScreen} />\n      <Tab.Screen name=\"me\" component={MeStackScreen} />\n    </Tab.Navigator>\n  );\n}\n\nconst onboardingScreens: IScreen[] = [\n  \"first\",\n  \"units\",\n  \"setupequipment\",\n  \"setupplates\",\n  \"hearaboutus\",\n  \"programselect\",\n];\n\nconst InitialScreenContext = createContext<IScreen | undefined>(undefined);\n\nexport function AppNavigator(props: { initialScreen?: IScreen }): JSX.Element {\n  const { initialScreen } = props;\n  const rootScreenOptions = useRootScreenOptions();\n  const stackScreenOptions = useStackScreenOptions();\n  const isOnboarding = initialScreen ? onboardingScreens.includes(initialScreen) : false;\n  return (\n    <InitialScreenContext.Provider value={initialScreen}>\n      <RootStack.Navigator\n        screenOptions={rootScreenOptions}\n        screenLayout={renderScreenWithErrorBoundary}\n        initialRouteName={isOnboarding ? \"onboarding\" : \"mainTabs\"}\n      >\n        <RootStack.Screen name=\"onboarding\" component={OnboardingStackScreen} />\n        <RootStack.Screen name=\"mainTabs\" component={MainTabsScreen} />\n        <RootStack.Screen\n          name=\"subscription\"\n          component={NavScreenSubscription}\n          options={{ ...stackScreenOptions, headerShown: true }}\n        />\n        <RootStack.Group\n          screenOptions={{\n            presentation: \"transparentModal\",\n            headerShown: false,\n            cardOverlayEnabled: false,\n            cardStyle: { backgroundColor: \"transparent\" },\n          }}\n        >\n          <RootStack.Screen name=\"amrapModal\" component={NavModalAmrap} />\n          <RootStack.Screen name=\"exercisePickerModal\" component={NavModalExercisePicker} />\n          <RootStack.Screen name=\"editProgramExercisePickerModal\" component={NavModalEditProgramExercisePicker} />\n          <RootStack.Screen name=\"editSetTargetModal\" component={NavModalEditTarget} />\n          <RootStack.Screen name=\"setTimerModal\" component={NavModalSetTimer} />\n          <RootStack.Screen name=\"setTimerEditModal\" component={NavModalSetTimerEdit} />\n          <RootStack.Screen name=\"roundingInfoModal\" component={NavModalRoundingInfo} />\n          <RootStack.Screen name=\"dateModal\" component={NavModalDate} />\n          <RootStack.Screen name=\"rm1Modal\" component={NavModal1RM} />\n          <RootStack.Screen name=\"equipmentModal\" component={NavModalEquipment} />\n          <RootStack.Screen name=\"supersetPickerModal\" component={NavModalWorkoutSuperset} />\n          <RootStack.Screen name=\"playgroundEditModal\" component={NavModalPlaygroundEditExercise} />\n          <RootStack.Screen name=\"couponModal\" component={NavModalCoupon} />\n          <RootStack.Screen name=\"newGymModal\" component={NavModalNewGym} />\n          <RootStack.Screen name=\"newEquipmentModal\" component={NavModalNewEquipment} />\n          <RootStack.Screen name=\"newPlateModal\" component={NavModalPlates} />\n          <RootStack.Screen name=\"newFixedWeightModal\" component={NavModalNewFixedWeight} />\n          <RootStack.Screen name=\"createProgramModal\" component={NavModalCreateProgram} />\n          <RootStack.Screen name=\"importFromLinkModal\" component={NavModalImportFromLink} />\n          <RootStack.Screen name=\"affiliateModal\" component={NavModalAffiliate} />\n          <RootStack.Screen name=\"importFromOtherAppsModal\" component={NavModalImportFromOtherApps} />\n          <RootStack.Screen name=\"dayFromAdhocModal\" component={NavModalDayFromAdhoc} />\n          <RootStack.Screen name=\"nextWorkoutModal\" component={NavModalNextWorkout} />\n          <RootStack.Screen name=\"whatsnewModal\" component={NavModalWhatsnew} />\n          <RootStack.Screen name=\"signupRequestModal\" component={NavModalSignupRequest} />\n          <RootStack.Screen name=\"hearAboutUsModal\" component={NavModalHearAboutUs} />\n          <RootStack.Screen name=\"corruptedStateModal\" component={NavModalCorruptedState} />\n          <RootStack.Screen name=\"debugModal\" component={NavModalDebug} />\n          <RootStack.Screen name=\"workoutShareModal\" component={NavModalWorkoutShare} />\n          <RootStack.Screen name=\"socialShareModal\" component={NavModalSocialShare} />\n          <RootStack.Screen name=\"customExerciseModal\" component={NavModalCustomExercise} />\n          <RootStack.Screen name=\"musclesOverrideModal\" component={NavModalMusclesOverride} />\n          <RootStack.Screen name=\"tourModal\" component={NavModalTour} />\n          <RootStack.Screen name=\"editProgramMenuModal\" component={NavModalEditProgramMenu} />\n          <RootStack.Screen name=\"programNextDayModal\" component={NavModalProgramNextDay} />\n          <RootStack.Screen name=\"programImageExportModal\" component={NavModalProgramImageExport} />\n          <RootStack.Screen name=\"programRevisionsModal\" component={NavModalProgramRevisions} />\n          <RootStack.Screen name=\"monthCalendarModal\" component={NavModalMonthCalendar} />\n          <RootStack.Screen name=\"accountModal\" component={NavModalAccount} />\n          <RootStack.Screen name=\"emailAuthModal\" component={NavModalEmailAuth} />\n          <RootStack.Screen name=\"changePasswordModal\" component={NavModalChangePassword} />\n          <RootStack.Screen name=\"subscriptionInfoModal\" component={NavModalSubscriptionInfo} />\n          <RootStack.Screen name=\"weekInsightsDetailsModal\" component={NavModalWeekInsightsDetails} />\n          <RootStack.Screen name=\"setSplitModal\" component={NavModalSetSplit} />\n          <RootStack.Screen name=\"plannerSettingsModal\" component={NavModalPlannerSettings} />\n          <RootStack.Screen name=\"editMuscleGroupsModal\" component={NavModalEditMuscleGroups} />\n          <RootStack.Screen name=\"weekStatsModal\" component={NavModalWeekStats} />\n          <RootStack.Screen name=\"dayStatsModal\" component={NavModalDayStats} />\n          <RootStack.Screen name=\"exerciseStatsModal\" component={NavModalExerciseStats} />\n          <RootStack.Screen name=\"editExerciseChangeModal\" component={NavModalEditExerciseChange} />\n          <RootStack.Screen name=\"graphsModal\" component={NavModalGraphs} />\n          <RootStack.Screen name=\"statsSettingsModal\" component={NavModalStatsSettings} />\n          <RootStack.Screen name=\"programInfoModal\" component={NavModalProgramInfo} />\n          <RootStack.Screen name=\"changeNextDayModal\" component={NavModalChangeNextDay} />\n          <RootStack.Screen name=\"inputSelectModal\" component={NavModalInputSelect} />\n          <RootStack.Screen name=\"stateVarsModal\" component={NavModalStateVars} />\n          <RootStack.Screen name=\"acrossProgramModal\" component={NavModalAcrossProgram} />\n          <RootStack.Screen name=\"createStateVarModal\" component={NavModalCreateStateVar} />\n          <RootStack.Screen name=\"textInputModal\" component={NavModalTextInput} />\n          <RootStack.Screen name=\"editDetailsModal\" component={NavModalEditDetails} />\n          <RootStack.Screen name=\"repMaxCalculatorModal\" component={NavModalRepMaxCalculator} />\n          <RootStack.Screen name=\"muscleGroupMusclePickerModal\" component={NavModalMuscleGroupMusclePicker} />\n          <RootStack.Screen name=\"photoPickerModal\" component={NavModalPhotoPicker} />\n          <RootStack.Screen name=\"exerciseImageSourceModal\" component={NavModalExerciseImageSource} />\n          <RootStack.Screen name=\"exerciseImageLibraryModal\" component={NavModalExerciseImageLibrary} />\n          <RootStack.Screen name=\"exerciseCloneLibraryModal\" component={NavModalExerciseCloneLibrary} />\n          <RootStack.Screen name=\"exerciseTypesPickerModal\" component={NavModalExerciseTypesPicker} />\n          <RootStack.Screen name=\"exerciseMusclesPickerModal\" component={NavModalExerciseMusclesPicker} />\n          <RootStack.Screen name=\"helpModal\" component={NavModalHelp} />\n          <RootStack.Screen name=\"exerciseLiftoEditorModal\" component={NavModalExerciseLiftoEditor} />\n          <RootStack.Screen name=\"dayLiftoEditorModal\" component={NavModalDayLiftoEditor} />\n        </RootStack.Group>\n      </RootStack.Navigator>\n    </InitialScreenContext.Provider>\n  );\n}\n","import {\n  createContext,\n  JSX,\n  ReactNode,\n  RefObject,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { View, Animated, StyleSheet, Platform, BackHandler } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { NativeCustomKeyboard } from \"../components/nativeCustomKeyboard.native\";\nimport { IPercentageUnit, IUnit } from \"../types\";\nimport {\n  KeyboardActiveId_get,\n  KeyboardActiveId_set,\n  KeyboardActiveId_setHeight,\n  KeyboardActiveId_subscribe,\n} from \"./keyboardActiveId\";\n\nexport interface IKeyboardConfig {\n  id: string;\n  onInput: (key: string) => void;\n  onBlur: () => void;\n  onPlus: () => void;\n  onMinus: () => void;\n  onShowCalculator?: () => void;\n  onChangeUnits?: (unit: IUnit | IPercentageUnit) => void;\n  allowDot?: boolean;\n  allowNegative?: boolean;\n  isNegative: boolean;\n  withDot: boolean;\n  keyboardAddon?: ReactNode;\n  enableCalculator?: boolean;\n  enableUnits?: (IUnit | IPercentageUnit)[];\n  selectedUnit?: IUnit | IPercentageUnit;\n}\n\ninterface ICustomKeyboardContextValue {\n  height: number;\n  animatedHeight: Animated.Value;\n  measuredHeightRef: RefObject<number>;\n  activeId: string | null;\n  setHeight: (h: number) => void;\n  openKeyboard: (config: IKeyboardConfig) => void;\n  closeKeyboard: () => void;\n}\n\nconst defaultAnimatedHeight = new Animated.Value(0);\nconst defaultMeasuredHeightRef: RefObject<number> = { current: 0 };\n\nconst CustomKeyboardContext = createContext<ICustomKeyboardContextValue>({\n  height: 0,\n  animatedHeight: defaultAnimatedHeight,\n  measuredHeightRef: defaultMeasuredHeightRef,\n  activeId: null,\n  setHeight: () => undefined,\n  openKeyboard: () => undefined,\n  closeKeyboard: () => undefined,\n});\n\nexport function CustomKeyboardProvider(props: {\n  children: ReactNode;\n  applySafeAreaBottom?: boolean;\n  inline?: boolean;\n  // Auto-height host (fit-content sheets): children keep their natural height and the\n  // keyboard adds inline space below them instead of overlaying (the flex:1 wrapper of the\n  // default layout collapses inside auto-height parents).\n  fitContent?: boolean;\n  noShadow?: boolean;\n}): JSX.Element {\n  const [height, setHeight] = useState(0);\n  const animatedHeight = useRef(new Animated.Value(0)).current;\n  const measuredHeightRef = useRef(0);\n  const [activeConfig, setActiveConfig] = useState<IKeyboardConfig | null>(null);\n  const [renderedConfig, setRenderedConfig] = useState<IKeyboardConfig | null>(null);\n  const [shouldMount, setShouldMount] = useState(false);\n  const slideY = useRef(new Animated.Value(400)).current;\n  const prevActiveRef = useRef<IKeyboardConfig | null>(null);\n  const touchStartRef = useRef<{ x: number; y: number; openGen: number; activeId: string | null } | null>(null);\n  const openGenRef = useRef(0);\n  const insets = useSafeAreaInsets();\n  const bottomOverflow = props.applySafeAreaBottom === false ? insets.bottom : 0;\n\n  useEffect(() => {\n    const animation = Animated.timing(animatedHeight, {\n      toValue: height,\n      duration: height > 0 ? 250 : 200,\n      useNativeDriver: false,\n    });\n    animation.start();\n    return () => animation.stop();\n  }, [height, animatedHeight]);\n\n  useEffect(() => {\n    const prev = prevActiveRef.current;\n    if (activeConfig) {\n      setRenderedConfig(activeConfig);\n      if (!prev) {\n        setShouldMount(true);\n        const startVal = measuredHeightRef.current > 0 ? measuredHeightRef.current : 400;\n        slideY.setValue(startVal);\n        Animated.timing(slideY, { toValue: 0, duration: 250, useNativeDriver: Platform.OS !== \"web\" }).start();\n      }\n    } else if (prev) {\n      const endVal = measuredHeightRef.current > 0 ? measuredHeightRef.current : 400;\n      Animated.timing(slideY, { toValue: endVal, duration: 200, useNativeDriver: Platform.OS !== \"web\" }).start(\n        ({ finished }) => {\n          if (finished) {\n            setShouldMount(false);\n            setRenderedConfig(null);\n          }\n        }\n      );\n    }\n    prevActiveRef.current = activeConfig;\n  }, [activeConfig, slideY]);\n\n  const openKeyboard = useCallback((config: IKeyboardConfig) => {\n    openGenRef.current += 1;\n    setActiveConfig(config);\n    KeyboardActiveId_set(config.id);\n    if (measuredHeightRef.current > 0) {\n      setHeight(measuredHeightRef.current);\n    }\n  }, []);\n\n  const closeKeyboard = useCallback(() => {\n    setActiveConfig(null);\n    KeyboardActiveId_set(null);\n    setHeight(0);\n  }, []);\n\n  const isKeyboardOpen = activeConfig != null;\n  useEffect(() => {\n    if (Platform.OS !== \"android\" || !isKeyboardOpen) {\n      return;\n    }\n    const subscription = BackHandler.addEventListener(\"hardwareBackPress\", () => {\n      closeKeyboard();\n      return true;\n    });\n    return () => subscription.remove();\n  }, [isKeyboardOpen, closeKeyboard]);\n\n  useEffect(() => {\n    KeyboardActiveId_setHeight(height);\n  }, [height]);\n\n  // A focused field that unmounts clears the store. Following it here keeps the keypad from outliving it.\n  useEffect(() => {\n    return KeyboardActiveId_subscribe(() => {\n      if (KeyboardActiveId_get() == null) {\n        setActiveConfig(null);\n        setHeight(0);\n      }\n    });\n  }, []);\n\n  const activeId = activeConfig?.id ?? null;\n  const value = useMemo(\n    () => ({\n      height,\n      animatedHeight,\n      measuredHeightRef,\n      activeId,\n      setHeight,\n      openKeyboard,\n      closeKeyboard,\n    }),\n    [height, animatedHeight, activeId, openKeyboard, closeKeyboard]\n  );\n\n  const inlineLayout = (props.inline && Platform.OS === \"android\") || props.fitContent;\n\n  const keyboardNode = renderedConfig && (\n    <NativeCustomKeyboard\n      onInput={renderedConfig.onInput}\n      onBlur={renderedConfig.onBlur}\n      onPlus={renderedConfig.onPlus}\n      onMinus={renderedConfig.onMinus}\n      onShowCalculator={renderedConfig.onShowCalculator}\n      onChangeUnits={renderedConfig.onChangeUnits}\n      allowDot={renderedConfig.allowDot}\n      allowNegative={renderedConfig.allowNegative}\n      isNegative={renderedConfig.isNegative}\n      withDot={renderedConfig.withDot}\n      keyboardAddon={renderedConfig.keyboardAddon}\n      enableCalculator={renderedConfig.enableCalculator}\n      enableUnits={renderedConfig.enableUnits}\n      selectedUnit={renderedConfig.selectedUnit}\n      applySafeAreaBottom={props.applySafeAreaBottom}\n      noShadow={props.noShadow}\n    />\n  );\n\n  return (\n    <CustomKeyboardContext.Provider value={value}>\n      <View\n        // flexShrink so a host that caps its own height can shrink what is above the keyboard:\n        // this wrapper sits between the two, and a child that cannot shrink pins the whole chain.\n        // Inert unless the host constrains the height, since nothing else here shrinks.\n        style={inlineLayout ? { flexShrink: 1 } : { flex: 1 }}\n        onTouchStart={(e) => {\n          if (activeConfig == null) {\n            return;\n          }\n          const t = e.nativeEvent.touches[0];\n          if (!t) {\n            return;\n          }\n          touchStartRef.current = {\n            x: t.pageX,\n            y: t.pageY,\n            openGen: openGenRef.current,\n            activeId: KeyboardActiveId_get(),\n          };\n        }}\n        onTouchEnd={(e) => {\n          const start = touchStartRef.current;\n          touchStartRef.current = null;\n          if (!start || activeConfig == null) {\n            return;\n          }\n          if (openGenRef.current !== start.openGen || KeyboardActiveId_get() !== start.activeId) {\n            return;\n          }\n          const t = e.nativeEvent.changedTouches[0];\n          if (!t) {\n            return;\n          }\n          const dx = t.pageX - start.x;\n          const dy = t.pageY - start.y;\n          if (Math.abs(dx) < 10 && Math.abs(dy) < 10) {\n            closeKeyboard();\n          }\n        }}\n        onTouchCancel={() => {\n          touchStartRef.current = null;\n        }}\n      >\n        {props.children}\n      </View>\n      {shouldMount &&\n        (inlineLayout ? (\n          <View>\n            <Animated.View style={{ height: animatedHeight }} />\n            <View style={{ position: \"absolute\", left: 0, right: 0, bottom: 0 }}>\n              <Animated.View style={{ transform: [{ translateY: slideY }] }}>{keyboardNode}</Animated.View>\n            </View>\n          </View>\n        ) : (\n          <View pointerEvents=\"box-none\" style={[StyleSheet.absoluteFill, { bottom: -bottomOverflow }]}>\n            <View pointerEvents=\"box-none\" className=\"flex-1 justify-end\">\n              <Animated.View style={{ transform: [{ translateY: slideY }] }}>{keyboardNode}</Animated.View>\n            </View>\n          </View>\n        ))}\n    </CustomKeyboardContext.Provider>\n  );\n}\n\nexport function useCustomKeyboardHeight(): number {\n  return useContext(CustomKeyboardContext).height;\n}\n\nexport function useCustomKeyboardAnimatedHeight(): Animated.Value {\n  return useContext(CustomKeyboardContext).animatedHeight;\n}\n\nexport function useSetCustomKeyboardHeight(): (height: number) => void {\n  return useContext(CustomKeyboardContext).setHeight;\n}\n\nexport function useMeasuredKeyboardHeightRef(): RefObject<number> {\n  return useContext(CustomKeyboardContext).measuredHeightRef;\n}\n\nexport function useCustomKeyboardActiveId(): string | null {\n  return useContext(CustomKeyboardContext).activeId;\n}\n\nexport function useOpenCustomKeyboard(): (config: IKeyboardConfig) => void {\n  return useContext(CustomKeyboardContext).openKeyboard;\n}\n\nexport function useCloseCustomKeyboard(): () => void {\n  return useContext(CustomKeyboardContext).closeKeyboard;\n}\n","import { JSX, ReactNode, UIEvent } from \"react\";\n\ninterface IScrollEventLike {\n  nativeEvent: {\n    contentOffset: { y: number };\n    contentSize: { height: number };\n    layoutMeasurement: { height: number };\n  };\n}\n\ninterface IProps {\n  children: ReactNode;\n  header?: ReactNode | string;\n  noPadding?: boolean;\n  scrollEnabled?: boolean;\n  onScroll?: (e: IScrollEventLike) => void;\n}\n\nexport function FormSheet(props: IProps): JSX.Element {\n  const hasHeader = props.header != null;\n  const scrollPadding = props.noPadding ? \"\" : [\"px-4\", hasHeader ? \"\" : \"pt-6\", \"pb-6\"].filter(Boolean).join(\" \");\n  const headerNode =\n    typeof props.header === \"string\" ? (\n      <div className=\"flex items-center justify-center py-4\">\n        <span className=\"text-base font-semibold\">{props.header}</span>\n      </div>\n    ) : (\n      props.header\n    );\n  const onScroll = props.onScroll;\n  const handleScroll = onScroll\n    ? (e: UIEvent<HTMLDivElement>) => {\n        const el = e.currentTarget;\n        onScroll({\n          nativeEvent: {\n            contentOffset: { y: el.scrollTop },\n            contentSize: { height: el.scrollHeight },\n            layoutMeasurement: { height: el.clientHeight },\n          },\n        });\n      }\n    : undefined;\n  return (\n    <div className=\"flex flex-col\" style={{ maxHeight: \"85vh\" }}>\n      {hasHeader && <div className=\"shrink-0\">{headerNode}</div>}\n      <div className={`overflow-y-auto min-h-0 ${scrollPadding}`} style={{ flex: \"0 1 auto\" }} onScroll={handleScroll}>\n        {props.children}\n      </div>\n    </div>\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { Animated, useWindowDimensions, View } from \"react-native\";\nimport { SheetScreenContainer } from \"./SheetScreenContainer\";\nimport { TransparentModal } from \"./TransparentModal\";\nimport { CustomKeyboardProvider } from \"./CustomKeyboardContext\";\nimport { NavScreenScrollContext } from \"./NavScreenScrollContext\";\nimport { useNavScreenScroll } from \"./useNavScreenScroll\";\nimport { Text } from \"../components/primitives/text\";\n\ninterface IProps {\n  children: ReactNode;\n  header?: string;\n  onClose: () => void;\n}\n\n// A sheet whose number fields open the custom keypad.\n//\n// Deliberately not a FormSheet: that rides on a native fit-to-contents sheet, which takes its\n// height when it is first laid out and never grows afterwards. The keypad needs the sheet some\n// 350dp taller, so on Android it ended up below the bottom of the screen — and no amount of\n// reshuffling the content changes a height the sheet has stopped reading. This sheet is drawn by\n// us, so its height is ordinary layout and follows the keypad like anything else.\nexport function KeyboardSheet(props: IProps): JSX.Element {\n  const { height: windowHeight } = useWindowDimensions();\n  // The ceiling belongs on the sheet, not on the scroll area: the grabber, the header and the\n  // safe-area band are all part of what has to fit under it.\n  const maxHeight = windowHeight * 0.85;\n  // Publishing the scroll area is what lets a field focused near the bottom be scrolled clear of\n  // the keypad. Left null — which is what a scroller that isn't a screen gets by default — that\n  // reveal silently does nothing. Nothing overlaps the scroll area from below: the keypad is a\n  // sibling that shortens it rather than covering it, so there is no footer to account for.\n  const { contextValue, scrollRef, viewportRef, onScroll, onLayout, onContentSizeChange } = useNavScreenScroll({\n    footerHeight: 0,\n    stickyHeaderHeight: 0,\n  });\n  return (\n    <SheetScreenContainer onClose={props.onClose} shouldShowClose={true}>\n      <TransparentModal onClose={props.onClose} fitContent maxHeight={maxHeight}>\n        <CustomKeyboardProvider applySafeAreaBottom={false} fitContent noShadow>\n          <NavScreenScrollContext.Provider value={contextValue}>\n            {props.header != null && (\n              <View className=\"items-center py-4\">\n                <Text className=\"text-base font-semibold\">{props.header}</Text>\n              </View>\n            )}\n            {/* Alone among the sheet's children in being allowed to shrink, so this is what gives\n                way once the keypad opens under a list already at the ceiling. Both the wrapper and\n                the scroller shrink — either one that couldn't would pin the chain. The wrapper is\n                also the box a field reveal measures itself against, which is why it spans exactly\n                the scroll area and nothing else. maxHeight is for web, where the sheet above is a\n                plain fragment and cannot impose one. */}\n            <View ref={viewportRef} style={{ flexShrink: 1 }}>\n              <Animated.ScrollView\n                ref={scrollRef}\n                style={{ maxHeight, flexShrink: 1 }}\n                onScroll={onScroll}\n                scrollEventThrottle={16}\n                onLayout={onLayout}\n                onContentSizeChange={onContentSizeChange}\n                keyboardShouldPersistTaps=\"handled\"\n              >\n                {props.children}\n              </Animated.ScrollView>\n            </View>\n          </NavScreenScrollContext.Provider>\n        </CustomKeyboardProvider>\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, ReactNode, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconCloseCircleOutline } from \"../components/icons/iconCloseCircleOutline\";\n\ninterface IProps {\n  children: ReactNode;\n  onClose: () => void;\n  maxWidth?: string;\n  isFullWidth?: boolean;\n  isFullHeight?: boolean;\n  overflowHidden?: boolean;\n  innerClassName?: string;\n  shouldShowClose?: boolean;\n  zIndex?: number;\n}\n\nexport function ModalScreenContainer(props: IProps): JSX.Element {\n  const [containerRef, setContainerRef] = useState<HTMLElement | null>(null);\n\n  useEffect(() => {\n    setContainerRef(document.getElementById(\"modal\"));\n    document.body.classList.add(\"stop-scrolling-modal\");\n    return () => {\n      document.body.classList.remove(\"stop-scrolling-modal\");\n    };\n  }, []);\n\n  const element = (\n    <section\n      className=\"fixed inset-0 flex items-center justify-center bottom-sticked\"\n      style={{ zIndex: props.zIndex ?? 50 }}\n    >\n      <div\n        data-name=\"overlay\"\n        onClick={props.onClose}\n        className=\"absolute inset-0 z-10 overflow-scroll scrolling-touch opacity-50 bg-background-darkgray\"\n      ></div>\n      <div\n        data-name=\"modal\"\n        data-testid=\"modal\"\n        className={`relative z-20 flex flex-col bg-background-default rounded-lg shadow-lg text-text-primary`}\n        style={{\n          maxWidth: props.maxWidth ?? \"92%\",\n          maxHeight: \"90%\",\n          width: props.isFullWidth ? \"92%\" : \"auto\",\n          height: props.isFullHeight ? \"90%\" : \"auto\",\n        }}\n      >\n        <div className={`relative h-full flex flex-col min-h-0 ${props.innerClassName ?? \"\"}`}>{props.children}</div>\n        {props.shouldShowClose !== false && (\n          <button\n            data-testid=\"modal-close\"\n            onClick={props.onClose}\n            className=\"absolute p-2 nm-modal-close\"\n            style={{ top: \"-3px\", right: \"-3px\" }}\n          >\n            <IconCloseCircleOutline />\n          </button>\n        )}\n      </div>\n    </section>\n  );\n\n  if (!containerRef) {\n    return <></>;\n  }\n  return createPortal(element, containerRef);\n}\n","import { JSX, ReactNode, createContext, useContext, useReducer, useEffect, useRef, useCallback } from \"react\";\nimport type {\n  IMuscle,\n  IExerciseKind,\n  IExerciseType,\n  IExercisePickerSelectedExercise,\n  IDayData,\n  IPlannerProgram,\n  IProgramState,\n  IProgramStateMetadata,\n} from \"../types\";\nimport type { IEvaluatedProgram } from \"../models/program\";\nimport { getNavigationRef } from \"./navUtils\";\nimport { UidFactory_generateUid } from \"../utils/generator\";\nimport type { IStateVariableType } from \"../components/editProgramExercise/progressions/modalCreateStateVariable\";\nimport type { ILiftoEditorAcrossField, ILiftoEditorStateVarEntry } from \"../components/primitives/liftoEditorActions\";\n\nexport interface IInputSelectModalData {\n  name?: string;\n  values: [string, string][];\n  hint?: string;\n  selectedValue?: string;\n  placeholder?: string;\n  emptyLabel?: string;\n}\n\nexport interface ITextInputModalData {\n  title: string;\n  inputLabel: string;\n  placeholder: string;\n  submitLabel: string;\n  dataCyPrefix: string;\n  maxLength?: number;\n  pattern?: string;\n  patternMessage?: string;\n}\n\n// Editing what something is called and what it says about itself — a week today, a day next. The\n// modal owns neither: it takes the current pair and hands back the edited one.\nexport interface IEditDetailsModalData {\n  title: string;\n  nameLabel: string;\n  namePlaceholder: string;\n  descriptionPlaceholder: string;\n  submitLabel: string;\n  dataCyPrefix: string;\n  name: string;\n  description?: string;\n}\n\nexport interface IEditDetailsModalResult {\n  name: string;\n  description?: string;\n}\n\nexport interface IRepMaxCalculatorModalData {\n  unit: \"kg\" | \"lb\";\n}\n\nexport interface IExerciseTypesPickerModalData {\n  selectedTypes: IExerciseKind[];\n}\n\nexport interface IExerciseMusclesPickerModalData {\n  title: string;\n  name: string;\n  selectedMuscles: IMuscle[];\n}\n\nexport interface IExerciseImageLibraryResult {\n  smallImageUrl?: string;\n  largeImageUrl?: string;\n}\n\nexport interface IExerciseCloneLibraryResult {\n  smallImageUrl?: string;\n  largeImageUrl?: string;\n  targetMuscles: IMuscle[];\n  synergistMuscles: IMuscle[];\n  types: IExerciseKind[];\n}\n\nexport interface ILiftoEditorExercisePickerModalData {\n  exerciseType?: IExerciseType;\n  label?: string;\n  templateName?: string;\n  // Handed over rather than looked up by id: while the program editor is open the program\n  // that matters is the unsaved draft, and only the opener knows which one that is.\n  evaluatedProgram?: IEvaluatedProgram;\n  dayData?: Required<IDayData>;\n  // Exercises on that day that must not count as \"already used\", because they *are* the slot\n  // being edited — the one the program still has there and the one the unsaved text now names.\n  // Without this the picker disables the exercise you are replacing, so a swap can't be undone.\n  excludeUsedExerciseTypes?: IExerciseType[];\n}\n\nexport interface IStateVarsModalData {\n  // What custom()'s parens hold, as the syntax tree read it; the result is the same list,\n  // rewritten.\n  entries: ILiftoEditorStateVarEntry[];\n  hasUnparsed: boolean;\n  defaults?: IProgramState;\n  defaultsMetadata?: IProgramStateMetadata;\n  sourceName?: string;\n  progressScript?: string;\n  updateScript?: string;\n  exerciseType?: IExerciseType;\n}\n\nexport interface ICreateStateVarModalResult {\n  name: string;\n  type: IStateVariableType;\n  isUserPrompted: boolean;\n}\n\n// Retuning one exercise's sets across every week that shares a value. Planner in, planner out —\n// nothing about the program around it is read. Handed over rather than looked up by id because\n// the opener may be holding edits that aren't in app state yet, and the grouping has to be of\n// what the user can actually see.\nexport interface IAcrossProgramModalData {\n  planner: IPlannerProgram;\n  exerciseKey: string;\n  exerciseFullName: string;\n  field: ILiftoEditorAcrossField;\n}\n\nexport interface IModalDataMap {\n  inputSelectModal: IInputSelectModalData;\n  acrossProgramModal: IAcrossProgramModalData;\n  stateVarsModal: IStateVarsModalData;\n  createStateVarModal: { existingNames?: string[] };\n  liftoEditorExercisePickerModal: ILiftoEditorExercisePickerModalData;\n  textInputModal: ITextInputModalData;\n  editDetailsModal: IEditDetailsModalData;\n  repMaxCalculatorModal: IRepMaxCalculatorModalData;\n  exerciseTypesPickerModal: IExerciseTypesPickerModalData;\n  exerciseMusclesPickerModal: IExerciseMusclesPickerModalData;\n  exerciseImageSourceModal: { exerciseId: string };\n  exerciseImageLibraryModal: {};\n  exerciseCloneLibraryModal: {};\n  photoPickerModal: {};\n}\n\nexport interface IModalResultMap {\n  inputSelectModal: string;\n  // The rewritten program. The opener decides where it goes — pending in a sheet, or straight\n  // into a lens — so this modal never writes to app state itself.\n  acrossProgramModal: IPlannerProgram;\n  stateVarsModal: string;\n  createStateVarModal: ICreateStateVarModalResult;\n  liftoEditorExercisePickerModal: IExercisePickerSelectedExercise;\n  textInputModal: string;\n  editDetailsModal: IEditDetailsModalResult;\n  repMaxCalculatorModal: number;\n  exerciseTypesPickerModal: IExerciseKind[];\n  exerciseMusclesPickerModal: IMuscle[];\n  exerciseImageSourceModal: IExerciseImageLibraryResult;\n  exerciseImageLibraryModal: IExerciseImageLibraryResult;\n  exerciseCloneLibraryModal: IExerciseCloneLibraryResult;\n  photoPickerModal: string;\n}\n\nexport interface IModalState {\n  modals: Partial<IModalDataMap>;\n  results: Partial<IModalResultMap>;\n  // Who opened each modal last. Several components can hold a useModal hook for the same\n  // key (one per mounted day editor), and a result is delivered to the one that asked for\n  // it — a canceled opener would otherwise stay armed and take the next opener's result.\n  owners: Partial<Record<keyof IModalDataMap, string>>;\n}\n\ntype IModalAction =\n  | { type: \"open\"; key: string; data: unknown; owner?: string }\n  | { type: \"clear\"; key: string }\n  | { type: \"setResult\"; key: string; value: unknown }\n  | { type: \"clearResult\"; key: string };\n\nfunction modalReducer(state: IModalState, action: IModalAction): IModalState {\n  switch (action.type) {\n    case \"open\":\n      return {\n        ...state,\n        modals: { ...state.modals, [action.key]: action.data },\n        owners: { ...state.owners, [action.key]: action.owner },\n      };\n    case \"clear\": {\n      const { [action.key]: _, ...rest } = state.modals as Record<string, unknown>;\n      return { ...state, modals: rest as Partial<IModalDataMap> };\n    }\n    case \"setResult\":\n      return { ...state, results: { ...state.results, [action.key]: action.value } };\n    case \"clearResult\": {\n      const { [action.key]: _, ...rest } = state.results as Record<string, unknown>;\n      return { ...state, results: rest as Partial<IModalResultMap> };\n    }\n    default:\n      return state;\n  }\n}\n\nconst initialModalState: IModalState = { modals: {}, results: {}, owners: {} };\n\nexport type IModalDispatch = (action: IModalAction) => void;\n\nconst noopModalDispatch: IModalDispatch = () => {};\n\nconst ModalStateContext = createContext<IModalState>(initialModalState);\nconst ModalDispatchContext = createContext<IModalDispatch>(noopModalDispatch);\n\nexport function ModalStateProvider(props: { children: ReactNode }): JSX.Element {\n  const [state, dispatch] = useReducer(modalReducer, initialModalState);\n  return (\n    <ModalDispatchContext.Provider value={dispatch}>\n      <ModalStateContext.Provider value={state}>{props.children}</ModalStateContext.Provider>\n    </ModalDispatchContext.Provider>\n  );\n}\n\nexport function useIsModalAvailable(): boolean {\n  return useContext(ModalDispatchContext) !== noopModalDispatch;\n}\n\nexport function useModalState(): IModalState {\n  return useContext(ModalStateContext);\n}\n\nexport function useModalDispatch(): IModalDispatch {\n  return useContext(ModalDispatchContext);\n}\n\nexport function useModalData<K extends keyof IModalDataMap>(key: K): IModalDataMap[K] | undefined {\n  const state = useModalState();\n  return state.modals[key];\n}\n\nexport function Modal_open<K extends keyof IModalDataMap>(\n  dispatch: IModalDispatch,\n  key: K,\n  data: IModalDataMap[K],\n  owner?: string\n): void {\n  dispatch({ type: \"open\", key, data, owner });\n}\n\nexport function Modal_setResult<K extends keyof IModalResultMap>(\n  dispatch: IModalDispatch,\n  key: K,\n  value: IModalResultMap[K]\n): void {\n  dispatch({ type: \"setResult\", key, value });\n}\n\nexport function Modal_clear(dispatch: IModalDispatch, key: keyof IModalDataMap): void {\n  dispatch({ type: \"clear\", key });\n}\n\nexport function useModalResult<K extends keyof IModalResultMap>(\n  key: K,\n  callback: (value: IModalResultMap[K]) => void\n): void {\n  const state = useModalState();\n  const dispatch = useModalDispatch();\n  const result = state.results[key];\n  const callbackRef = useRef(callback);\n  callbackRef.current = callback;\n  useEffect(() => {\n    if (result !== undefined) {\n      dispatch({ type: \"clearResult\", key });\n      callbackRef.current(result as IModalResultMap[K]);\n    }\n  }, [result]);\n}\n\nexport function useModal<K extends keyof IModalDataMap & keyof IModalResultMap>(\n  key: K,\n  callback: (value: IModalResultMap[K]) => void\n): (data: IModalDataMap[K]) => void {\n  const state = useModalState();\n  const dispatch = useModalDispatch();\n  const result = state.results[key];\n  const callbackRef = useRef(callback);\n  callbackRef.current = callback;\n  const isOpenRef = useRef(false);\n  const idRef = useRef<string | undefined>(undefined);\n  if (idRef.current == null) {\n    idRef.current = UidFactory_generateUid(8);\n  }\n  // Closing without a result leaves this hook armed — nothing tells it the modal went away.\n  // Ownership is what retires it: the next opener takes the key, and only the owner is\n  // allowed to consume a result.\n  const isOwner = state.owners[key] === idRef.current;\n\n  useEffect(() => {\n    if (result != null && isOpenRef.current && isOwner) {\n      isOpenRef.current = false;\n      dispatch({ type: \"clearResult\", key });\n      callbackRef.current(result as IModalResultMap[K]);\n    }\n  }, [result, dispatch, key, isOwner]);\n\n  return useCallback(\n    (data: IModalDataMap[K]) => {\n      isOpenRef.current = true;\n      Modal_open(dispatch, key, data, idRef.current);\n      getNavigationRef().then(({ navigationRef: ref }) => ref.navigate(key as never));\n    },\n    [dispatch, key]\n  );\n}\n","import { JSX, ReactNode } from \"react\";\nimport { View, Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { NavbarView } from \"../components/navbar\";\nimport { useTrackedState, useTrackedDispatch, untrack } from \"./TrackedStateContext\";\nimport { buildNavCommon } from \"./utils\";\nimport type { ITourId } from \"../models/state\";\nimport type { IHelpKey } from \"../components/help/helpRegistry\";\n\nexport interface INavHeaderOptions {\n  navTitle?: ReactNode;\n  navSubtitle?: ReactNode;\n  navRightButtons?: JSX.Element[];\n  navOnBack?: () => boolean;\n  navOnTitleClick?: () => void;\n  navHelpTourId?: ITourId;\n  navHelpKey?: IHelpKey;\n  navHidden?: boolean;\n  navIsScrolled?: boolean;\n}\n\ninterface IHeaderProps {\n  options: object;\n  back?: { title: string | undefined } | undefined;\n}\n\nexport function NavHeader(props: IHeaderProps): JSX.Element | null {\n  const options = props.options as INavHeaderOptions;\n  const state = useTrackedState();\n  const dispatch = useTrackedDispatch();\n  // buildNavCommon reads many state slices via the proxy → header re-renders only when\n  // those specific slices change. untrack at the boundary so downstream NavbarView\n  // doesn't receive a proxy object.\n  const navCommon = untrack(buildNavCommon(state));\n  const insets = useSafeAreaInsets();\n  if (options.navHidden) {\n    return null;\n  }\n  const shadowStyle = options.navIsScrolled\n    ? Platform.select({\n        ios: { shadowColor: \"#000\", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.08, shadowRadius: 4 },\n        android: { elevation: 4 },\n        default: { boxShadow: \"0 4px 4px -2px rgba(0,0,0,0.08)\" },\n      })\n    : undefined;\n  return (\n    <View className=\"bg-background-default\" style={[{ paddingTop: insets.top }, shadowStyle]}>\n      <NavbarView\n        isStatic\n        showBack={!!props.back}\n        dispatch={dispatch}\n        navCommon={navCommon}\n        title={options.navTitle ?? \"\"}\n        subtitle={options.navSubtitle}\n        rightButtons={options.navRightButtons}\n        onBack={options.navOnBack}\n        onTitleClick={options.navOnTitleClick}\n        helpTourId={options.navHelpTourId}\n        helpKey={options.navHelpKey}\n      />\n    </View>\n  );\n}\n","import { Children, JSX, ReactNode, useCallback, useContext, useEffect, useState } from \"react\";\nimport { Animated, View, LayoutChangeEvent, Platform } from \"react-native\";\nimport { useIsFocused, useNavigation } from \"@react-navigation/native\";\nimport { BottomTabBarHeightContext } from \"@react-navigation/bottom-tabs\";\nimport { useReportSheetHeight } from \"./ActiveSheetHeightContext\";\nimport { useCustomKeyboardAnimatedHeight } from \"./CustomKeyboardContext\";\nimport { NavScreenScrollContext } from \"./NavScreenScrollContext\";\nimport { useNavScreenScroll } from \"./useNavScreenScroll\";\nimport { usePerfScrollMarkers } from \"../utils/usePerfScrollMarkers\";\nimport { SystemKeyboardSpacer } from \"../components/systemKeyboardSpacer\";\n\nexport { NavScreenScrollContext } from \"./NavScreenScrollContext\";\nexport type { INavScreenScrollListener, INavScreenScrollContextValue } from \"./NavScreenScrollContext\";\n\nexport function NavScreenContent(props: {\n  children: ReactNode;\n  stickyHeaderIndices?: number[];\n  footer?: ReactNode;\n  // Opt-in per screen rather than global: on-drag dismisses on any scroll, which is wrong\n  // for form-ish screens but right where the keyboard covers what you're reading.\n  keyboardDismissMode?: \"none\" | \"on-drag\" | \"interactive\";\n  // Android only (iOS gets it from automaticallyAdjustKeyboardInsets). Opt-in because it\n  // lengthens the scroll content on every screen that turns it on, keyboard up or not.\n  // \"reveal\" also scrolls the focused TextInput above the keyboard. The program editor keeps\n  // `true` because it reveals its native editor's caret itself.\n  avoidSystemKeyboard?: boolean | \"reveal\";\n}): JSX.Element {\n  const navigation = useNavigation();\n  const isFocused = useIsFocused();\n  const tabBarHeight = useContext(BottomTabBarHeightContext) ?? 0;\n  const animatedKeyboardHeight = useCustomKeyboardAnimatedHeight();\n  const [footerHeight, setFooterHeight] = useState(0);\n  const [stickyHeaderHeight, setStickyHeaderHeight] = useState(0);\n  const onScrolledChange = useCallback(\n    (isScrolled: boolean) => navigation.setOptions({ navIsScrolled: isScrolled }),\n    [navigation]\n  );\n  const {\n    contextValue,\n    scrollRef,\n    viewportRef,\n    onScroll: onAnimatedScroll,\n    onLayout: onScrollViewLayout,\n    onContentSizeChange,\n  } = useNavScreenScroll({ footerHeight, stickyHeaderHeight, onScrolledChange });\n\n  const onFooterLayout = useCallback((e: LayoutChangeEvent) => {\n    setFooterHeight(e.nativeEvent.layout.height);\n  }, []);\n\n  const onStickyHeaderLayout = useCallback((e: LayoutChangeEvent) => {\n    setStickyHeaderHeight(e.nativeEvent.layout.height);\n  }, []);\n\n  // Only the last sticky header is measured: RN pushes each pinned one out with the next, so\n  // by the time the content below is on screen that one alone covers the top of the scroll\n  // area. The wrapper is what gives it a host view to measure — the child may be a Profiler.\n  const stickyIndices = props.stickyHeaderIndices;\n  const lastStickyIndex =\n    stickyIndices != null && stickyIndices.length > 0 ? stickyIndices[stickyIndices.length - 1] : undefined;\n  const children =\n    lastStickyIndex == null\n      ? props.children\n      : Children.map(props.children, (child, index) =>\n          index === lastStickyIndex ? <View onLayout={onStickyHeaderLayout}>{child}</View> : child\n        );\n\n  const scrollMarkers = usePerfScrollMarkers(\"NavScreenContent\");\n\n  const scrollView = (\n    <Animated.ScrollView\n      ref={scrollRef}\n      data-testid=\"screen\"\n      testID=\"screen\"\n      className=\"flex-1 bg-background-default\"\n      contentContainerStyle={{ flexGrow: 1, paddingBottom: props.footer != null ? footerHeight : 0 }}\n      automaticallyAdjustKeyboardInsets={true}\n      keyboardDismissMode={props.keyboardDismissMode}\n      onScroll={onAnimatedScroll}\n      onLayout={onScrollViewLayout}\n      onContentSizeChange={onContentSizeChange}\n      scrollEventThrottle={16}\n      onScrollBeginDrag={scrollMarkers.onScrollBeginDrag}\n      onScrollEndDrag={scrollMarkers.onScrollEndDrag}\n      onMomentumScrollEnd={scrollMarkers.onMomentumScrollEnd}\n      stickyHeaderIndices={props.stickyHeaderIndices}\n      removeClippedSubviews={false}\n      style={\n        Platform.OS === \"web\"\n          ? ({ WebkitOverflowScrolling: \"touch\", overscrollBehavior: \"contain\" } as object)\n          : undefined\n      }\n    >\n      {children}\n      <Animated.View style={{ height: animatedKeyboardHeight }} />\n      {props.avoidSystemKeyboard && Platform.OS === \"android\" ? (\n        <SystemKeyboardSpacer scrollRef={props.avoidSystemKeyboard === \"reveal\" ? scrollRef : undefined} />\n      ) : null}\n    </Animated.ScrollView>\n  );\n\n  return (\n    <NavScreenScrollContext.Provider value={contextValue}>\n      {/* Spans exactly the scroll area, and stays even without a footer: measuring whether a child\n          is on screen needs this box, because on Android edge-to-edge the window and\n          measureInWindow don't share an origin. */}\n      <View ref={viewportRef} className=\"flex-1\">\n        {scrollView}\n        {props.footer != null ? (\n          <View onLayout={onFooterLayout} className=\"absolute bottom-0 left-0 right-0\" pointerEvents=\"box-none\">\n            {props.footer}\n          </View>\n        ) : null}\n        {isFocused && props.footer != null && footerHeight > 0 ? (\n          <FooterHeightReport height={footerHeight + tabBarHeight} />\n        ) : null}\n      </View>\n    </NavScreenScrollContext.Provider>\n  );\n}\n\nfunction FooterHeightReport(props: { height: number }): null {\n  const reportHeight = useReportSheetHeight();\n  useEffect(() => {\n    reportHeight(props.height);\n  }, [props.height, reportHeight]);\n  return null;\n}\n","import { createContext, RefObject } from \"react\";\nimport type { Animated, NativeScrollEvent, ScrollView, View } from \"react-native\";\n\nexport type INavScreenScrollListener = (e: { nativeEvent: NativeScrollEvent }) => void;\n\nexport type INavScrollTarget = Pick<ScrollView, \"scrollTo\">;\n\nexport type INavViewport = Pick<View, \"measureInWindow\">;\n\nexport interface INavScreenScrollContextValue {\n  scrollRef: RefObject<INavScrollTarget | null>;\n  scrollYRef: RefObject<number>;\n  contentSizeRef: RefObject<{ width: number; height: number }>;\n  // The same offset, fed by the native animation driver rather than by JS. Anything whose\n  // position is derived from the scroll has to interpolate this one — the ref and the\n  // listeners lag by a frame or two, which shows up as the content drifting on fast scrolls.\n  scrollAnimatedY: Animated.Value;\n  // The scroll area itself, for measuring where it ends on screen. Set only on screens with\n  // a footer, which are the only ones where anything overlaps the scroll content. Measure it\n  // rather than deriving a bottom from window height: on Android edge-to-edge the window and\n  // measureInWindow don't share an origin, so the two can't be mixed in one calculation.\n  viewportRef: RefObject<INavViewport | null>;\n  // Height of the screen's footer slot (0 when there is none) — what docked chrome occludes.\n  // State, not a ref, so anything positioning against it re-runs when the footer resizes.\n  footerHeight: number;\n  // How much of the scroll area's top edge the pinned sticky header covers, for content that\n  // wants to position itself against the actually-visible top rather than the viewport's.\n  stickyHeaderHeight: number;\n  addScrollListener: (listener: INavScreenScrollListener) => () => void;\n}\n\nexport const NavScreenScrollContext = createContext<INavScreenScrollContextValue | null>(null);\n","import { JSX, ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconCloseCircleOutline } from \"../components/icons/iconCloseCircleOutline\";\n\ninterface IProps {\n  children: ReactNode;\n  shouldShowClose?: boolean;\n  fitContent?: boolean;\n  // Pre-animation veto: the sheet slides out before onClose fires, so any \"discard\n  // changes?\" confirmation must happen here, while the sheet is still visible.\n  shouldClose?: () => boolean | Promise<boolean>;\n  onClose: () => void;\n}\n\nexport function SheetScreenContainer(props: IProps): JSX.Element {\n  const [containerRef, setContainerRef] = useState<HTMLElement | null>(null);\n  const [isVisible, setIsVisible] = useState(false);\n  const sheetRef = useRef<HTMLDivElement>(null);\n  const onCloseRef = useRef(props.onClose);\n  onCloseRef.current = props.onClose;\n  const shouldCloseRef = useRef(props.shouldClose);\n  shouldCloseRef.current = props.shouldClose;\n\n  useEffect(() => {\n    setContainerRef(document.getElementById(\"bottomsheet\"));\n    document.body.classList.add(\"stop-scrolling-bottom-sheet\");\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        setIsVisible(true);\n      });\n    });\n    return () => {\n      document.body.classList.remove(\"stop-scrolling-bottom-sheet\");\n    };\n  }, []);\n\n  const handleClose = useCallback(async () => {\n    if (shouldCloseRef.current != null && !(await shouldCloseRef.current())) {\n      return;\n    }\n    setIsVisible(false);\n    setTimeout(() => {\n      onCloseRef.current();\n    }, 200);\n  }, []);\n\n  const bottomShift = isVisible ? 0 : (sheetRef.current?.clientHeight ?? 800);\n\n  const element = (\n    <div className=\"fixed inset-0\" style={{ zIndex: 60 }}>\n      <div\n        data-name=\"overlay\"\n        className={`absolute inset-0 bg-text-secondary will-change-transform ${\n          isVisible ? \"visible opacity-50\" : \"invisible opacity-0\"\n        }`}\n        style={{ transition: \"visibility 0.2s ease-out, opacity 0.2s ease-out\" }}\n        onClick={handleClose}\n      ></div>\n      <div\n        ref={sheetRef}\n        data-testid=\"bottom-sheet\"\n        className={`bottom-sticked absolute bottom-0 left-0 flex w-full overflow-y-auto bg-background-default will-change-transform ${\n          isVisible ? \"visible\" : \"invisible\"\n        }`}\n        style={{\n          transition: \"transform 0.2s ease-out, visibility 0.2s\",\n          transform: `translateY(${bottomShift}px)`,\n          borderRadius: \"16px 16px 0 0\",\n          boxShadow: \"0 -5px 15px rgb(0 0 0 / 30%)\",\n          maxHeight: \"90vh\",\n        }}\n      >\n        {props.shouldShowClose && (\n          <button\n            data-testid=\"bottom-sheet-close\"\n            onClick={handleClose}\n            className=\"absolute top-0 right-0 z-20 p-2 nm-bottom-sheet-close\"\n          >\n            <IconCloseCircleOutline size={28} />\n          </button>\n        )}\n        <div className=\"flex flex-col w-full safe-area-inset-bottom\" style={{ maxHeight: \"90vh\" }}>\n          <div className=\"z-10 flex items-center justify-center pt-2 bg-background-default\">\n            <div className=\"w-8 rounded-sm bg-text-disabled\" style={{ height: \"3px\" }} />\n          </div>\n          {props.children}\n        </div>\n      </div>\n    </div>\n  );\n\n  if (!containerRef) {\n    return <></>;\n  }\n  return createPortal(element, containerRef);\n}\n","import { createContext, useContext } from \"react\";\nimport type { IState } from \"../models/state\";\nimport type { IDispatch } from \"../ducks/types\";\n\nexport interface IStateContext {\n  state: IState;\n  dispatch: IDispatch;\n}\n\nexport const StateContext = createContext<IStateContext | null>(null);\n\nexport function useAppState(): IStateContext {\n  const ctx = useContext(StateContext);\n  if (!ctx) {\n    throw new Error(\"StateContext not provided\");\n  }\n  return ctx;\n}\n","import { createContainer, getUntrackedObject } from \"react-tracked\";\nimport type { IState } from \"../models/state\";\nimport type { IDispatch } from \"../ducks/types\";\n\ninterface ITrackedStateProviderProps {\n  state: IState;\n  dispatch: IDispatch;\n}\n\nfunction useTrackedStateValue(props: ITrackedStateProviderProps): readonly [IState, IDispatch] {\n  return [props.state, props.dispatch] as const;\n}\n\nconst container = createContainer(useTrackedStateValue);\n\nexport const TrackedStateProvider = container.Provider;\nexport const useTrackedState = container.useTrackedState;\nexport const useTrackedDispatch = container.useUpdate;\n\nexport function untrack<T>(value: T): T {\n  const untracked = getUntrackedObject(value);\n  return (untracked ?? value) as T;\n}\n","import { JSX, ReactNode, CSSProperties } from \"react\";\n\ninterface IProps {\n  children: ReactNode;\n  onClose: () => void;\n  shouldClose?: () => boolean | Promise<boolean>;\n  fitContent?: boolean;\n  // Native-only: the web sheet is the DOM one SheetScreenContainer draws, and it caps itself.\n  maxHeight?: number;\n  // Native-only: sits in the sheet's bottom safe-area band; the web sheet has neither.\n  safeAreaContent?: ReactNode;\n}\n\nexport function TransparentModal(props: IProps): JSX.Element {\n  return <>{props.children}</>;\n}\n\nexport function SheetDragHandle(props: {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}): JSX.Element {\n  return (\n    <div className={props.className} style={props.style}>\n      {props.children}\n    </div>\n  );\n}\n","import { useSyncExternalStore } from \"react\";\n\nconst listeners = new Set<() => void>();\nlet activeId: string | null = null;\nlet height = 0;\n\nexport function KeyboardActiveId_set(id: string | null): void {\n  if (activeId === id) {\n    return;\n  }\n  activeId = id;\n  for (const listener of listeners) {\n    listener();\n  }\n}\n\nexport function KeyboardActiveId_get(): string | null {\n  return activeId;\n}\n\nexport function KeyboardActiveId_setHeight(value: number): void {\n  if (height === value) {\n    return;\n  }\n  height = value;\n  for (const listener of listeners) {\n    listener();\n  }\n}\n\nfunction subscribe(listener: () => void): () => void {\n  listeners.add(listener);\n  return () => {\n    listeners.delete(listener);\n  };\n}\n\nexport const KeyboardActiveId_subscribe = subscribe;\n\nexport function useIsKeyboardActive(id: string): boolean {\n  return useSyncExternalStore(\n    subscribe,\n    () => activeId === id,\n    () => false\n  );\n}\n\nexport function useKeyboardHeightIfActive(id: string): number {\n  return useSyncExternalStore(\n    subscribe,\n    () => (activeId === id ? height : 0),\n    () => 0\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { PlannerEditorView } from \"../../pages/planner/components/plannerEditorView\";\nimport { Button } from \"../../components/button\";\nimport { Text } from \"../../components/primitives/text\";\nimport type { IDayLiftoEditorSheetProps } from \"./dayLiftoEditorSheetTypes\";\n\n// Web body: a plain CodeMirror editor — no pills, hints, breadcrumbs or drag-to-reorder. With\n// a physical keyboard the structured touch UI adds nothing, and CodeMirror brings autocomplete\n// and inline syntax diagnostics of its own. Reordering is a text edit here.\nexport function DayLiftoEditorSheet(props: IDayLiftoEditorSheetProps): JSX.Element {\n  const [text, setText] = useState(props.initialText);\n\n  return (\n    <View testID=\"day-liftoeditor\" className=\"px-gutter pb-4\">\n      {/* pr-10 clears the sheet container's absolutely-positioned close button. */}\n      <View className=\"flex-row items-center gap-2 pb-2 pr-10\">\n        <View className=\"flex-1\">\n          <Text className=\"text-xs font-bold text-text-secondary\">{props.headerLabel}</Text>\n        </View>\n        <Button\n          name=\"day-liftoeditor-save\"\n          testID=\"day-liftoeditor-save\"\n          kind=\"purple\"\n          buttonSize=\"sm\"\n          className=\"text-xs\"\n          onPress={() => props.onDone(text)}\n        >\n          Save\n        </Button>\n      </View>\n      <PlannerEditorView\n        name=\"day-liftoeditor\"\n        redError={true}\n        customExercises={props.settings.exercises}\n        exerciseFullNames={props.exerciseFullNames}\n        error={props.error}\n        value={props.initialText}\n        onChange={(value) => {\n          setText(value);\n          props.onTextChange(value);\n        }}\n      />\n    </View>\n  );\n}\n","import { JSX, useEffect, useMemo, useRef, useState } from \"react\";\nimport { LayoutChangeEvent, Pressable, ScrollView, View } from \"react-native\";\nimport { useAppState } from \"../StateContext\";\nimport { PlannerEditorView } from \"../../pages/planner/components/plannerEditorView\";\nimport { PlannerSyntaxError } from \"../../pages/planner/plannerExerciseEvaluator\";\nimport { Button } from \"../../components/button\";\nimport { Text } from \"../../components/primitives/text\";\nimport { FadeScrollView } from \"../../components/fadeScrollView\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport {\n  IExerciseLiftoEditorSheetProps,\n  IExerciseLiftoEditorSheetInstanceOption,\n} from \"./exerciseLiftoEditorSheetTypes\";\n\n// Web body: a plain CodeMirror editor — no pills, hints or breadcrumbs. With a physical\n// keyboard the structured touch UI adds nothing, and CodeMirror brings autocomplete and\n// inline syntax diagnostics of its own.\nexport function ExerciseLiftoEditorSheet(props: IExerciseLiftoEditorSheetProps): JSX.Element {\n  const { state } = useAppState();\n  const [text, setText] = useState(props.initialText);\n  const [liveError, setLiveError] = useState<{ message: string; from?: number; to?: number } | undefined>(undefined);\n  const analyzeTextRef = useRef(props.analyzeText);\n  analyzeTextRef.current = props.analyzeText;\n  // Debounced: validation evaluates the whole program, too heavy per keystroke. No preview asked\n  // for — this body has no panel to put one in. Re-runs on the host's revision too: a stacked\n  // sheet can save an exercise this one reads through, which the banner has no other way to hear\n  // about.\n  useEffect(() => {\n    const timer = setTimeout(() => setLiveError(analyzeTextRef.current?.(text, { withPreview: false })?.error), 300);\n    return () => clearTimeout(timer);\n  }, [text, props.analysisRevision]);\n  // Memoized so PlannerEditorView's [error] effect doesn't relint on every render.\n  const error = useMemo(\n    () =>\n      liveError != null\n        ? new PlannerSyntaxError(liveError.message, 0, 0, liveError.from ?? 0, liveError.to ?? 0, {\n            type: \"fromWebview\",\n          })\n        : undefined,\n    [liveError]\n  );\n  const accent = Tailwind_semantic().text.purple;\n  const railRef = useRef<ScrollView>(null);\n  // Only on the initial layout: the body remounts on instance switch, and reacting to later\n  // re-layouts would yank the rail away from wherever the user scrolled it.\n  const hasAutoScrolledRail = useRef(false);\n  const scrollSelectedIntoView = (event: LayoutChangeEvent): void => {\n    if (hasAutoScrolledRail.current) {\n      return;\n    }\n    hasAutoScrolledRail.current = true;\n    const x = event.nativeEvent.layout.x;\n    requestAnimationFrame(() => railRef.current?.scrollTo({ x: Math.max(0, x - 24), animated: false }));\n  };\n\n  // Whether switching would discard anything is the sheet's call, same as on native — this body\n  // only knows the text it currently has.\n  const selectInstance = (instance: IExerciseLiftoEditorSheetInstanceOption): void => {\n    if (!instance.isSelected) {\n      props.onSelectInstance(instance);\n    }\n  };\n\n  return (\n    <View testID=\"exercise-liftoeditor\" className=\"px-gutter pb-4\">\n      {/* pr-10 clears the sheet container's absolutely-positioned close button. */}\n      <View className=\"flex-row items-center gap-2 pb-2 pr-10\">\n        <View className=\"flex-1\">\n          {props.instances.length > 1 ? (\n            <FadeScrollView contentClassName=\"gap-1\" scrollRef={railRef}>\n              {props.instances.map((instance) => (\n                <Pressable\n                  key={`${instance.dayData.week}-${instance.dayData.dayInWeek}`}\n                  testID={`exercise-liftoeditor-instance-${instance.dayData.week}-${instance.dayData.dayInWeek}`}\n                  onLayout={instance.isSelected ? scrollSelectedIntoView : undefined}\n                  className={`px-2 py-0.5 rounded border ${\n                    instance.isSelected\n                      ? \"bg-background-default border-button-primarybackground\"\n                      : \"bg-background-subtle border-background-subtle\"\n                  }`}\n                  onPress={() => selectInstance(instance)}\n                >\n                  <Text\n                    className=\"text-xs font-bold text-text-secondary\"\n                    style={instance.isSelected ? { color: accent } : undefined}\n                  >\n                    {instance.label}\n                  </Text>\n                </Pressable>\n              ))}\n            </FadeScrollView>\n          ) : (\n            <Text className=\"text-xs font-bold text-text-secondary\">{props.headerLabel}</Text>\n          )}\n        </View>\n        <Button\n          name=\"exercise-liftoeditor-save\"\n          kind=\"purple\"\n          buttonSize=\"sm\"\n          className=\"text-xs\"\n          onPress={() => props.onDone(text)}\n        >\n          Save\n        </Button>\n      </View>\n      <PlannerEditorView\n        name=\"exercise-liftoeditor\"\n        redError={true}\n        customExercises={state.storage.settings.exercises}\n        exerciseFullNames={props.exerciseFullNames}\n        error={error}\n        value={props.initialText}\n        onChange={(value) => {\n          setText(value);\n          props.onTextChange?.(value);\n        }}\n      />\n    </View>\n  );\n}\n","import { JSX, useCallback, useEffect, useRef } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ExerciseRM } from \"../../components/exerciseRm\";\nimport { Exercise_get, Exercise_toKey, IExercise } from \"../../models/exercise\";\nimport { Weight_build } from \"../../models/weight\";\nimport { IState, updateState } from \"../../models/state\";\nimport { Progress_lbProgress } from \"../../models/progress\";\nimport { lb } from \"lens-shmens\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport type { IRootStackParamList } from \"../types\";\nimport { Button } from \"../../components/button\";\n\nfunction useCommitRm1(exercise: IExercise | undefined): (rawOrValue: string | number | undefined) => void {\n  const { state, dispatch } = useAppState();\n  return (rawOrValue) => {\n    if (!exercise) {\n      return;\n    }\n    const value = typeof rawOrValue === \"number\" ? rawOrValue : rawOrValue ? parseFloat(rawOrValue) : undefined;\n    if (!value || isNaN(value)) {\n      return;\n    }\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"settings\")\n          .p(\"exerciseData\")\n          .recordModify((data) => {\n            const k = Exercise_toKey(exercise);\n            return { ...data, [k]: { ...data[k], rm1: Weight_build(value, state.storage.settings.units) } };\n          }),\n      ],\n      \"Update 1RM from modal\"\n    );\n  };\n}\n\nfunction NavModal1RMWorkout(props: { progressId: number }): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const { progressId } = props;\n\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const exerciseType = progress?.ui?.rm1Modal?.exerciseType;\n  const exercise = exerciseType ? Exercise_get(exerciseType, state.storage.settings.exercises) : undefined;\n  const pendingInputRef = useRef<string | undefined>(undefined);\n  const commitRm1 = useCommitRm1(exercise);\n\n  const onClose = (): void => {\n    updateState(\n      dispatch,\n      [Progress_lbProgress(progressId).pi(\"ui\", {}).p(\"rm1Modal\").record(undefined)],\n      \"Close 1RM modal\"\n    );\n    navigation.goBack();\n  };\n\n  const onSave = (): void => {\n    const raw = pendingInputRef.current;\n    if (raw !== undefined) {\n      commitRm1(raw);\n    }\n    onClose();\n  };\n\n  const shouldGoBack = !progress || !exerciseType;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !exercise) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ExerciseRM\n          name=\"1 Rep Max\"\n          rmKey=\"rm1\"\n          exercise={exercise}\n          settings={state.storage.settings}\n          onInput={(v) => {\n            pendingInputRef.current = v;\n          }}\n          onEditVariable={(value) => {\n            pendingInputRef.current = undefined;\n            commitRm1(value);\n          }}\n        />\n        <View className=\"flex-row items-center justify-between gap-4 mt-4\">\n          <Button name=\"rm1-modal-cancel\" type=\"button\" kind=\"grayv2\" onClick={onClose}>\n            Cancel\n          </Button>\n          <Button name=\"rm1-modal-save\" type=\"button\" kind=\"purple\" onClick={onSave}>\n            Save\n          </Button>\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n\nfunction NavModal1RMPreview(props: { programId: string }): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const { programId } = props;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const previewOneRepMaxModal = plannerState?.ui?.previewOneRepMaxModal;\n  const exerciseType = previewOneRepMaxModal?.plannerExercise?.exerciseType;\n  const exercise = exerciseType ? Exercise_get(exerciseType, state.storage.settings.exercises) : undefined;\n  const pendingInputRef = useRef<string | undefined>(undefined);\n  const commitRm1 = useCommitRm1(exercise);\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(\n        lb<IPlannerState>().pi(\"ui\").p(\"previewOneRepMaxModal\").record(undefined),\n        \"Close preview 1RM modal\"\n      );\n    }\n    navigation.goBack();\n  };\n\n  const onSave = (): void => {\n    const raw = pendingInputRef.current;\n    if (raw !== undefined) {\n      commitRm1(raw);\n    }\n    onClose();\n  };\n\n  const shouldGoBack = !plannerState || !exerciseType;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !exercise) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ExerciseRM\n          name=\"1 Rep Max\"\n          rmKey=\"rm1\"\n          exercise={exercise}\n          settings={state.storage.settings}\n          onInput={(v) => {\n            pendingInputRef.current = v;\n          }}\n          onEditVariable={(value) => {\n            pendingInputRef.current = undefined;\n            commitRm1(value);\n          }}\n        />\n        <View className=\"flex-row items-center justify-between gap-4 mt-4\">\n          <Button name=\"rm1-modal-cancel\" type=\"button\" kind=\"grayv2\" onClick={onClose}>\n            Cancel\n          </Button>\n          <Button name=\"rm1-modal-save\" type=\"button\" kind=\"purple\" onClick={onSave}>\n            Save\n          </Button>\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n\nexport function NavModal1RM(): JSX.Element {\n  const route = useRoute<{ key: string; name: \"rm1Modal\"; params: IRootStackParamList[\"rm1Modal\"] }>();\n  const params = route.params;\n\n  if (params.context === \"preview\") {\n    return <NavModal1RMPreview programId={params.programId} />;\n  }\n  return <NavModal1RMWorkout progressId={params.progressId} />;\n}\n","import { JSX, useCallback } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { useAppContext } from \"../../components/appContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Account } from \"../../components/account\";\nimport { navigateToModal } from \"../navigationService\";\nimport { Account_getFromStorage } from \"../../models/account\";\nimport { IState } from \"../../models/state\";\nimport { Thunk_pushScreen } from \"../../ducks/thunks\";\n\nexport function NavModalAccount(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const { service } = useAppContext();\n  const navigation = useNavigation();\n\n  const userId = state.user?.id;\n  const userEmail = state.user?.email;\n  const account = userId && userEmail ? Account_getFromStorage(userId, userEmail, state.storage) : undefined;\n\n  const onSignIn = useCallback((newState: IState) => {\n    if (newState.storage.currentProgramId) {\n      dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n    }\n  }, []);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <Account\n          account={account}\n          client={service.client}\n          dispatch={dispatch}\n          onSignIn={onSignIn}\n          onOpenEmailAuth={() => navigateToModal(\"emailAuthModal\", { navigateHomeOnSignIn: true })}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useMemo, useRef, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { KeyboardSheet } from \"../KeyboardSheet\";\nimport { Modal_clear, Modal_setResult, useModalData, useModalDispatch } from \"../ModalStateContext\";\nimport { Program_evaluatePlannerWeeks } from \"../../models/program\";\nimport { FocusedInputFlush_flush } from \"../../utils/focusedInputFlush\";\nimport { EditProgramExerciseAcrossAllWeeks } from \"../../components/editProgramExercise/editProgramExerciseAcrossAllWeeks\";\nimport { Text } from \"../../components/primitives/text\";\nimport { Button } from \"../../components/button\";\nimport type { ILiftoEditorAcrossField } from \"../../components/primitives/liftoEditorActions\";\nimport type { IPlannerProgram } from \"../../types\";\n\n// The tab a field lands on, in the order the tabs are built.\nconst tabForField: Record<ILiftoEditorAcrossField, number> = { reps: 0, weight: 1, rpe: 2, timer: 3 };\n\nexport function NavModalAcrossProgram(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const { state } = useAppState();\n  const settings = state.storage.settings;\n  const data = useModalData(\"acrossProgramModal\");\n\n  // The working copy. Every edit rewrites the whole program, so it stays local and is handed back\n  // once — the opener decides where it goes, and this sheet never writes to app state itself.\n  //\n  // Mirrored into a ref because Save has to read it in the same tick it flushes the focused input\n  // into it, and a setState hasn't run its updater by then. The ref is what has been applied; the\n  // state is only what has been rendered.\n  const [planner, setPlanner] = useState<IPlannerProgram | undefined>(data?.planner);\n  const plannerRef = useRef<IPlannerProgram | undefined>(data?.planner);\n  const applyChange = (apply: (current: IPlannerProgram) => IPlannerProgram): void => {\n    if (plannerRef.current == null) {\n      return;\n    }\n    plannerRef.current = apply(plannerRef.current);\n    setPlanner(plannerRef.current);\n  };\n  const [tabIndex, setTabIndex] = useState(data != null ? tabForField[data.field] : 0);\n\n  // Re-evaluated only when an edit lands, not per render: the grouping has to reflect what the\n  // user has just changed, and each change rewrites the whole planner.\n  const weeks = useMemo(\n    () => (planner != null ? Program_evaluatePlannerWeeks(planner, settings) : undefined),\n    [planner, settings]\n  );\n  const plannerExercise = useMemo(() => {\n    for (const week of weeks ?? []) {\n      for (const day of week.days) {\n        const exercise = day.exercises.find((e) => e.key === data?.exerciseKey);\n        if (exercise != null) {\n          return exercise;\n        }\n      }\n    }\n    return undefined;\n  }, [weeks, data]);\n\n  // Editing here rewrites lines the opener isn't showing, so the two exits have to mean different\n  // things: Save hands the rewritten program back, closing throws it away. Without the button,\n  // dismissing would silently apply — the affordance says \"cancel\" and the behaviour wouldn't.\n  const onSave = (): void => {\n    // The number fields commit on blur, and tapping Save doesn't blur them — the keypad is still\n    // up and the press lands on a button, not on another input. Without this, the value being\n    // typed at the moment of saving is the one value that doesn't make it.\n    FocusedInputFlush_flush();\n    const edited = plannerRef.current;\n    if (data != null && edited != null && edited !== data.planner) {\n      Modal_setResult(modalDispatch, \"acrossProgramModal\", edited);\n    }\n    Modal_clear(modalDispatch, \"acrossProgramModal\");\n    navigation.goBack();\n  };\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"acrossProgramModal\");\n    navigation.goBack();\n  };\n\n  if (data == null) {\n    return <></>;\n  }\n\n  return (\n    <KeyboardSheet header={data.exerciseFullName} onClose={onClose}>\n      {weeks == null || plannerExercise == null ? (\n        <View className=\"px-gutter py-6\">\n          <Text className=\"text-sm text-center text-text-secondary\">Couldn't find this exercise in the program.</Text>\n        </View>\n      ) : (\n        <EditProgramExerciseAcrossAllWeeks\n          weeks={weeks}\n          plannerExercise={plannerExercise}\n          settings={settings}\n          tabIndex={tabIndex}\n          onChangeTabIndex={setTabIndex}\n          onChange={applyChange}\n        />\n      )}\n      <View className=\"items-center pt-4 pb-2\">\n        <Button kind=\"purple\" name=\"across-program-save\" onClick={onSave}>\n          Save\n        </Button>\n      </View>\n    </KeyboardSheet>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalAffiliateContent } from \"../../components/modalAffiliate\";\n\nexport function NavModalAffiliate(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ModalAffiliateContent\n          onClose={onClose}\n          isAffiliateEnabled={!!state.storage.settings.affiliateEnabled}\n          dispatch={dispatch}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect, useRef } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalAmrapContent } from \"../../components/modalAmrap\";\nimport { Progress_isCurrent, Progress_forceUpdateEntryIndex } from \"../../models/progress\";\nimport {\n  Program_getFullProgram,\n  Program_evaluate,\n  Program_getProgramExercise,\n  Program_getFirstProgramExercise,\n  Program_fullProgram,\n} from \"../../models/program\";\nimport { buildPlaygroundDispatch, getPlaygroundProgress } from \"./navModalPlaygroundUtils\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalAmrap(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{ key: string; name: \"amrapModal\"; params: IRootStackParamList[\"amrapModal\"] }>();\n  const { context, ...rest } = route.params;\n  const amrapModal = rest;\n  const isPlayground = context === \"playground\";\n\n  let progress: ReturnType<typeof getPlaygroundProgress>;\n  let modalDispatch = dispatch;\n\n  if (context === \"workout\") {\n    const { progressId } = route.params as IRootStackParamList[\"amrapModal\"] & { context: \"workout\" };\n    progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  } else {\n    const { weekIndex, dayIndex } = route.params as IRootStackParamList[\"amrapModal\"] & { context: \"playground\" };\n    progress = getPlaygroundProgress(state, weekIndex, dayIndex);\n    modalDispatch = buildPlaygroundDispatch(\n      dispatch,\n      weekIndex,\n      dayIndex,\n      () => getPlaygroundProgress(state, weekIndex, dayIndex),\n      state.storage.settings,\n      { weight: {}, length: {}, percentage: {} }\n    );\n  }\n\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getFullProgram(state, state.storage.currentProgramId) : undefined;\n\n  let program: ReturnType<typeof Program_fullProgram> | undefined;\n  let evaluatedProgram: ReturnType<typeof Program_evaluate> | undefined;\n\n  if (isPlayground) {\n    const playgroundProgram = state.playgroundState?.program;\n    if (playgroundProgram) {\n      program = Program_fullProgram(playgroundProgram, state.storage.settings);\n      evaluatedProgram = Program_evaluate(program, state.storage.settings);\n    }\n  } else {\n    program =\n      progress && Progress_isCurrent(progress)\n        ? Program_getFullProgram(state, progress.programId) ||\n          (currentProgram ? Program_fullProgram(currentProgram, state.storage.settings) : undefined)\n        : undefined;\n    evaluatedProgram = program ? Program_evaluate(program, state.storage.settings) : undefined;\n  }\n\n  const entry = progress?.entries[amrapModal.entryIndex];\n  const programExercise = evaluatedProgram\n    ? Program_getProgramExercise(progress!.day, evaluatedProgram, entry?.programExerciseId) ||\n      Program_getFirstProgramExercise(evaluatedProgram, entry?.programExerciseId)\n    : undefined;\n\n  const didGoBackRef = useRef(false);\n  const goBackOnce = (): void => {\n    if (didGoBackRef.current) {\n      return;\n    }\n    didGoBackRef.current = true;\n    navigation.goBack();\n  };\n\n  const cancelAmrap = (): void => {\n    modalDispatch({\n      type: \"ChangeAMRAPAction\",\n      amrapValue: undefined,\n      amrapLeftValue: undefined,\n      rpeValue: undefined,\n      weightValue: undefined,\n      setIndex: amrapModal.setIndex,\n      entryIndex: amrapModal.entryIndex,\n      programExercise,\n      isPlayground,\n      otherStates: evaluatedProgram?.states,\n      isAmrap: !!amrapModal.isAmrap,\n      logRpe: !!amrapModal.logRpe,\n      askWeight: !!amrapModal.askWeight,\n      userVars: {},\n    });\n    if (!isPlayground) {\n      Progress_forceUpdateEntryIndex(dispatch);\n    }\n  };\n\n  const onClose = (): void => {\n    cancelAmrap();\n    goBackOnce();\n  };\n\n  // A native back/gesture dismissal skips onClose/onDone (which set didGoBackRef via goBackOnce), so cancel here to\n  // clear amrapModal — otherwise the playground bridge's edge guard can never re-open it. Guard against clobbering a\n  // committed \"Done\" value, whose goBackOnce already ran.\n  useClearOnModalRemove(() => {\n    if (didGoBackRef.current) {\n      return;\n    }\n    didGoBackRef.current = true;\n    cancelAmrap();\n  });\n\n  // Also dismiss when the synced amrapModal clears — e.g. the same prompt was answered on the watch. Playground\n  // progress has no amrapModal field, so only gate on it for the workout context.\n  const shouldGoBack = !progress || (context === \"workout\" && progress.amrapModal == null);\n  useEffect(() => {\n    if (shouldGoBack) {\n      goBackOnce();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !progress) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} maxWidth=\"480px\" isFullWidth>\n      <FormSheet>\n        <ModalAmrapContent\n          progress={progress}\n          dispatch={modalDispatch}\n          isPlayground={isPlayground}\n          settings={state.storage.settings}\n          amrapModal={amrapModal}\n          programExercise={programExercise}\n          otherStates={evaluatedProgram?.states}\n          onDone={() => {\n            if (!isPlayground) {\n              Progress_forceUpdateEntryIndex(dispatch);\n            }\n            goBackOnce();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useCallback } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalChangeNextDayContent } from \"../../components/modalChangeNextDay\";\nimport { Program_getProgram, Program_selectProgram } from \"../../models/program\";\nimport { EditProgram_setNextDay } from \"../../models/editProgram\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\n\nexport function NavModalChangeNextDay(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n\n  const onClose = useCallback((): void => {\n    navigation.goBack();\n  }, [navigation]);\n\n  const onSelect = useCallback(\n    (programId: string, day: number): void => {\n      Program_selectProgram(dispatch, programId);\n      EditProgram_setNextDay(dispatch, programId, day);\n    },\n    [dispatch]\n  );\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} zIndex={70} isFullWidth={true}>\n      <FormSheet>\n        <ModalChangeNextDayContent\n          initialCurrentProgramId={currentProgram?.id}\n          allPrograms={state.storage.programs}\n          settings={state.storage.settings}\n          stats={state.storage.stats}\n          onSelect={onSelect}\n          onClose={onClose}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useAppContext } from \"../../components/appContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ChangePasswordForm } from \"../../components/account\";\n\nexport function NavModalChangePassword(): JSX.Element {\n  const { service } = useAppContext();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <View className=\"px-gutter pb-4\">\n          <Text className=\"mb-2 text-lg font-bold text-center\">Change Password</Text>\n          <ChangePasswordForm service={service} onDone={() => onClose()} />\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect, useRef } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Button } from \"../../components/button\";\nimport { Text } from \"../../components/primitives/text\";\nimport { Link } from \"../../components/link\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\n\nexport function NavModalCorruptedState(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const corruptedstorage = state.errors.corruptedstorage;\n  const isResettingRef = useRef(false);\n\n  useEffect(() => {\n    const unsubscribe = navigation.addListener(\"beforeRemove\", (e) => {\n      if (!isResettingRef.current) {\n        e.preventDefault();\n      }\n    });\n    return unsubscribe;\n  }, [navigation]);\n\n  const onReset = (): void => {\n    isResettingRef.current = true;\n    updateState(\n      dispatch,\n      [lb<IState>().p(\"errors\").p(\"corruptedstorage\").record(undefined)],\n      \"Reset corrupted storage\"\n    );\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !corruptedstorage;\n  useEffect(() => {\n    if (shouldGoBack) {\n      isResettingRef.current = true;\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !corruptedstorage) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onReset}>\n      <FormSheet>\n        <View>\n          <Text className=\"pb-4 text-lg font-bold text-center\">🚨 Corrupted Storage 🚨</Text>\n        </View>\n        <View className=\"pb-4\">\n          <Text>\n            Something went <Text className=\"font-bold\">terribly wrong</Text>, and your{\" \"}\n            {corruptedstorage.local ? \"local\" : \"remote\"} storage and history got corrupted. This should never happen,\n            but it did.\n          </Text>\n        </View>\n        <View className=\"pb-4\">\n          {corruptedstorage.backup ? (\n            <Text className=\"font-bold text-center text-text-success\">\n              History was successfully backed up, user: <Text className=\"font-bold\">{corruptedstorage.userid}</Text>\n            </Text>\n          ) : (\n            <Text className=\"font-bold text-center text-text-error\">Could not back up the history</Text>\n          )}\n        </View>\n        <View className=\"pb-4\">\n          <Text>\n            Please contact the developer of this app, and he is going to look into this ASAP. You can contact us at{\" \"}\n            <Link href=\"mailto:info@liftosaur.com\">info@liftosaur.com</Link>.\n          </Text>\n        </View>\n        <View className=\"pb-4\">\n          {corruptedstorage.local ? (\n            <Text>\n              You can either wait until this is fixed (and close the app for now), or start with the empty state (but\n              your history and programs will be gone).\n            </Text>\n          ) : (\n            <Text className=\"pb-4\">\n              We will log out for now, and won't sync the changes to the cloud, to avoid even bigger mess.\n            </Text>\n          )}\n        </View>\n        <View className=\"items-center\">\n          <Button name=\"corrupted-state-reset\" kind=\"red\" onClick={onReset}>\n            {corruptedstorage.local ? \"Reset and start from scratch\" : \"Continue\"}\n          </Button>\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalCouponContent } from \"../../components/modalCoupon\";\n\nexport function NavModalCoupon(): JSX.Element {\n  const { dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalCouponContent dispatch={dispatch} onClose={onClose} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation, useRoute, StackActions } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalCreateProgramContent } from \"../../components/modalCreateProgram\";\nimport { EditProgram_create, EditProgram_createFromHistoryRecord } from \"../../models/editProgram\";\nimport { resolveAdhocRecord } from \"../utils\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalCreateProgram(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"createProgramModal\";\n    params: IRootStackParamList[\"createProgramModal\"];\n  }>();\n  const record = resolveAdhocRecord(\n    state,\n    route.params\n      ? { progressId: route.params.adhocProgressId, historyRecordId: route.params.adhocHistoryRecordId }\n      : undefined\n  );\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const onSelect = (name: string): void => {\n    if (record != null) {\n      EditProgram_createFromHistoryRecord(dispatch, name, record, state.storage.settings);\n      navigation.dispatch(StackActions.pop(2));\n    } else {\n      EditProgram_create(dispatch, name);\n      onClose();\n    }\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalCreateProgramContent onSelect={onSelect} onClose={onClose} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Modal_clear, Modal_setResult, useModalData, useModalDispatch } from \"../ModalStateContext\";\nimport { ModalCreateStateVariableContent } from \"../../components/editProgramExercise/progressions/modalCreateStateVariable\";\n\nexport function NavModalCreateStateVar(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"createStateVarModal\");\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"createStateVarModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet header=\"Add State Variable\">\n        <ModalCreateStateVariableContent\n          existingNames={data.existingNames}\n          onClose={onClose}\n          onCreate={(name, type, isUserPrompted) => {\n            Modal_setResult(modalDispatch, \"createStateVarModal\", { name, type, isUserPrompted });\n            Modal_clear(modalDispatch, \"createStateVarModal\");\n          }}\n        />\n      </FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { BottomSheetCustomExerciseContent } from \"../../components/bottomSheetCustomExercise\";\nimport { Exercise_handleCustomExerciseChange, Exercise_createCustomExercise } from \"../../models/exercise\";\nimport { Program_getProgram } from \"../../models/program\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalCustomExercise(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"customExerciseModal\";\n    params: IRootStackParamList[\"customExerciseModal\"];\n  }>();\n  const { exerciseId } = route.params;\n\n  const existingExercise = exerciseId ? state.storage.settings.exercises[exerciseId] : undefined;\n  const newExercise = useMemo(() => Exercise_createCustomExercise(\"\", [], [], []), []);\n  const exercise = existingExercise ?? newExercise;\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <SheetScreenContainer onClose={onClose}>\n      <TransparentModal onClose={onClose}>\n        <BottomSheetCustomExerciseContent\n          settings={state.storage.settings}\n          isLoggedIn={!!state.user?.id}\n          exercise={exercise}\n          dispatch={dispatch}\n          onChange={(action, ex, notes) => {\n            Exercise_handleCustomExerciseChange(dispatch, action, ex, notes, state.storage.settings, currentProgram);\n          }}\n          onClose={onClose}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalDateContent } from \"../../components/modalDate\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalDate(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{ key: string; name: \"dateModal\"; params: IRootStackParamList[\"dateModal\"] }>();\n  const { progressId } = route.params;\n\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const dateModal = progress?.ui?.dateModal;\n\n  const onClose = (): void => {\n    dispatch({ type: \"ConfirmDate\", id: progressId, date: undefined, time: undefined });\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !progress || !dateModal;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !dateModal) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalDateContent\n          dispatch={dispatch}\n          progressId={progressId}\n          date={dateModal.date ?? \"\"}\n          time={dateModal.time ?? 0}\n          onDone={() => navigation.goBack()}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalDayFromAdhocContent } from \"../../components/modalDayFromAdhoc\";\nimport { navigateToModal } from \"../navigationService\";\nimport { resolveAdhocRecord } from \"../utils\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalDayFromAdhoc(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"dayFromAdhocModal\";\n    params: IRootStackParamList[\"dayFromAdhocModal\"];\n  }>();\n  const { progressId, historyRecordId } = route.params;\n\n  const record = resolveAdhocRecord(state, { progressId, historyRecordId });\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !record;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !record) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth isFullHeight>\n      <FormSheet header=\"Program day from Adhoc workout\">\n        <ModalDayFromAdhocContent\n          initialCurrentProgramId={record.programId}\n          stats={state.storage.stats}\n          record={record}\n          dispatch={dispatch}\n          allPrograms={state.storage.programs}\n          settings={state.storage.settings}\n          onCreateProgram={() =>\n            navigateToModal(\"createProgramModal\", {\n              adhocProgressId: progressId,\n              adhocHistoryRecordId: historyRecordId,\n            })\n          }\n          onClose={onClose}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport { useNavigation, useRoute } from \"@react-navigation/native\";\nimport { lb } from \"lens-shmens\";\nimport { useAppState } from \"../StateContext\";\nimport {\n  Program_evaluate,\n  Program_getAllProgramExercises,\n  Program_getDayData,\n  Program_getDayName,\n  Program_getProgramDay,\n} from \"../../models/program\";\nimport {\n  ProgramDayText_apply,\n  ProgramDayText_identityChange,\n  ProgramDayText_replace,\n} from \"../../models/programDayText\";\nimport { ProgramExerciseSwap_workoutRemap, type IProgramExerciseSwapScope } from \"../../models/programExerciseSwap\";\nimport {\n  Progress_getCurrentProgress,\n  Progress_lbProgress,\n  Progress_remapProgramExerciseId,\n} from \"../../models/progress\";\nimport { IState, updateState } from \"../../models/state\";\nimport { PlannerKey_fromFullName } from \"../../pages/planner/plannerKey\";\nimport { CollectionUtils_setBy } from \"../../utils/collection\";\nimport { Dialog_alert, Dialog_choice, Dialog_confirm } from \"../../utils/dialog\";\nimport type { IDayData, IPlannerProgram, IProgram } from \"../../types\";\nimport type { IRootStackParamList } from \"../types\";\nimport { Text } from \"../../components/primitives/text\";\nimport { LiftoEditorHints_gestures } from \"../../components/primitives/liftoEditorHints\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { CustomKeyboardProvider } from \"../CustomKeyboardContext\";\nimport { LiftoEditorSheetProgram_resolve } from \"./liftoEditorSheetProgram\";\nimport { DayLiftoEditorSheet } from \"./DayLiftoEditorSheet\";\n\n// The day's position, resolved from its absolute day number against the current program —\n// re-resolved rather than remembered, since another surface can add or remove days while this\n// sheet is up and the indices it opened on would then point at a different day.\n//\n// The range check is the point of the guard, not a formality: Program_getWeekFromDay and\n// Program_getDayInWeek both fall back to 1 for a day past the end of the program, so a day that\n// no longer exists resolves to a perfectly valid-looking Week 1 / Day 1 — and the save would\n// land on Day 1's text.\nfunction dayDataFor(\n  program: IProgram & { planner: IPlannerProgram },\n  day: number,\n  settings: IState[\"storage\"][\"settings\"]\n): Required<IDayData> | undefined {\n  const totalDays = program.planner.weeks.reduce((memo, week) => memo + week.days.length, 0);\n  if (day < 1 || day > totalDays) {\n    return undefined;\n  }\n  return Program_getDayData(Program_evaluate(program, settings), day);\n}\n\nexport function NavModalDayLiftoEditor(): JSX.Element {\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"dayLiftoEditorModal\";\n    params: IRootStackParamList[\"dayLiftoEditorModal\"];\n  }>();\n  const params = route.params;\n  const { state, dispatch } = useAppState();\n  const settings = state.storage.settings;\n  const isFromWorkout = params?.fromWorkout ?? true;\n\n  // What the sheet mounted with — open-time values by nature. The editor reads its initial text\n  // once, and that text is also the baseline \"has anything changed\" is measured against, so a\n  // program that moves underneath must not move it.\n  const [opened] = useState(() => {\n    if (params == null) {\n      return undefined;\n    }\n    const program = LiftoEditorSheetProgram_resolve(state, params.programId, isFromWorkout);\n    if (program?.planner == null) {\n      return undefined;\n    }\n    const withPlanner = { ...program, planner: program.planner };\n    const dayData = dayDataFor(withPlanner, params.day, settings);\n    const day = dayData != null ? withPlanner.planner.weeks[dayData.week - 1]?.days[dayData.dayInWeek - 1] : undefined;\n    if (dayData == null || day == null) {\n      return undefined;\n    }\n    return {\n      headerLabel: Program_getDayName(Program_evaluate(withPlanner, settings), params.day),\n      initialText: day.exerciseText,\n    };\n  });\n  // The program this sheet edits against, read live rather than snapshotted, so a program that\n  // moves underneath is seen straight away instead of at the next save. Memoized on `resolved`\n  // because the narrowing spread would otherwise re-splice and re-evaluate every render.\n  const resolved = params != null ? LiftoEditorSheetProgram_resolve(state, params.programId, isFromWorkout) : undefined;\n  const program = useMemo(\n    (): (IProgram & { planner: IPlannerProgram }) | undefined =>\n      resolved?.planner != null ? { ...resolved, planner: resolved.planner } : undefined,\n    [resolved]\n  );\n  // Which day this sheet is on, resolved live from its absolute day number rather than kept from\n  // open. Another surface can add or remove days, and the week/day indices the sheet opened on\n  // would then address a different one. Analysis, the sheet's chrome and the save all read this\n  // one value, so they cannot disagree about which day is being edited.\n  const dayData = useMemo(\n    () => (program != null && params != null ? dayDataFor(program, params.day, settings) : undefined),\n    [program, params, settings]\n  );\n\n  const [editorMode, setEditorMode] = useState<\"structured\" | \"freeform\">(\"structured\");\n  // What the editor holds right now, in a ref rather than state: it changes on every keystroke\n  // and nothing in this render depends on it — only the close guard reads it, and only when\n  // asked. As state it would re-render the whole sheet per character.\n  const liveTextRef = useRef(opened?.initialText ?? \"\");\n  // The same text on a debounce, which is what the analysis below keys on. Splicing and\n  // evaluating the program is far too heavy to do per keystroke.\n  const [analyzedText, setAnalyzedText] = useState(opened?.initialText ?? \"\");\n  const analyzeTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const onTextChange = (newText: string): void => {\n    liveTextRef.current = newText;\n    if (analyzeTimerRef.current != null) {\n      clearTimeout(analyzeTimerRef.current);\n    }\n    analyzeTimerRef.current = setTimeout(() => setAnalyzedText(newText), 300);\n  };\n  useEffect(() => {\n    return () => {\n      if (analyzeTimerRef.current != null) {\n        clearTimeout(analyzeTimerRef.current);\n      }\n    };\n  }, []);\n\n  // The draft spliced into the program the sheet opened on and evaluated: one pass answers the\n  // error banner, what the pills resolve against, and which exercises this day now holds.\n  const analysis = useMemo(() => {\n    if (program == null || params == null || dayData == null) {\n      return undefined;\n    }\n    const planner = ProgramDayText_replace(program.planner, dayData, analyzedText);\n    const evaluatedProgram = Program_evaluate({ ...program, planner }, settings);\n    const error = evaluatedProgram.errors.find(\n      (e) => e.dayData.week === dayData.week && e.dayData.dayInWeek === dayData.dayInWeek\n    )?.error;\n    return {\n      evaluatedProgram,\n      error,\n      exercises: Program_getProgramDay(evaluatedProgram, params.day)?.exercises ?? [],\n    };\n  }, [program, params, dayData, analyzedText, settings]);\n\n  const isDirty = (): boolean => opened != null && liveTextRef.current.trim() !== opened.initialText.trim();\n  const isDirtyRef = useRef(isDirty);\n  isDirtyRef.current = isDirty;\n  // Set once a close is approved (or changes are saved), so the beforeRemove guard doesn't\n  // re-prompt on the navigation pop that follows.\n  const allowCloseRef = useRef(false);\n\n  const onClose = (): void => {\n    allowCloseRef.current = true;\n    navigation.goBack();\n  };\n\n  const shouldClose = async (): Promise<boolean> => {\n    if (isDirty() && !(await Dialog_confirm(\"Discard unsaved changes to this day?\"))) {\n      return false;\n    }\n    allowCloseRef.current = true;\n    return true;\n  };\n\n  // The sheet containers guard their own close affordances via shouldClose; this covers the\n  // paths that pop the route directly, like the Android hardware back button.\n  useEffect(() => {\n    return navigation.addListener(\"beforeRemove\", (e) => {\n      if (allowCloseRef.current || !isDirtyRef.current()) {\n        return;\n      }\n      e.preventDefault();\n      Dialog_confirm(\"Discard unsaved changes to this day?\").then((confirmed) => {\n        if (confirmed) {\n          allowCloseRef.current = true;\n          navigation.dispatch(e.data.action);\n        }\n      });\n    });\n  }, [navigation]);\n\n  // Saves the editor's live text, not the debounced copy: Save can land inside the debounce\n  // window, and the last thing typed has to be part of what's written.\n  const onDone = async (newText: string): Promise<void> => {\n    liveTextRef.current = newText;\n    if (params == null || opened == null || newText.trim() === opened.initialText.trim()) {\n      onClose();\n      return;\n    }\n    // Guarded here rather than trusted from the render above: the program can be deleted, or\n    // removed by a sync, between the sheet opening and Save, and writing this copy back would\n    // recreate it.\n    if (program == null) {\n      Dialog_alert(\"Couldn't find this program anymore, so the changes weren't saved.\");\n      onClose();\n      return;\n    }\n    const withPlanner = program;\n    // The same day the analysis above was about, not a second resolution of it — the two\n    // diverging is how a draft gets validated against one day and written into another.\n    if (dayData == null) {\n      Dialog_alert(\"Couldn't find this day in the program anymore, so the changes weren't saved.\");\n      onClose();\n      return;\n    }\n    // Asked only when the answer differs — one declaration and the two scopes are the same\n    // edit. Same question the per-exercise sheet asks, because it's the same edit reached from\n    // a different surface, and answering it wrong silently rewrites weeks the user can't see.\n    const identityChange = ProgramDayText_identityChange(withPlanner.planner, dayData, newText, settings);\n    let scope: IProgramExerciseSwapScope = \"all\";\n    if (identityChange != null && identityChange.declarations > 1 && !identityChange.isLadder) {\n      const choice = await Dialog_choice(\n        \"Change exercise\",\n        `${identityChange.oldName} is set up separately on ${identityChange.declarations} days of this program.`,\n        [\"Change only this day\", \"Change across whole program\"]\n      );\n      if (choice == null) {\n        return;\n      }\n      scope = choice === 0 ? \"one\" : \"all\";\n    }\n    // Everything the save has to get right about the program lives in here: the splice, the\n    // rewrite of every `...reuse` aimed at an exercise changed on this day, the labelling apart\n    // of a name that collides with another exercise, and the refusal of an edit that breaks a\n    // day it doesn't touch.\n    const applied = ProgramDayText_apply(withPlanner.planner, dayData, newText, settings, scope);\n    if (\"error\" in applied) {\n      Dialog_alert(applied.error.message);\n      return;\n    }\n    const updatedProgram = { ...withPlanner, planner: applied.planner };\n    const hasEditorDraft = state.editProgramStates[updatedProgram.id] != null;\n    if (!isFromWorkout && hasEditorDraft) {\n      // From the program editor the edit stays a draft — the editor's own Save commits it to\n      // storage, same as the per-exercise sheet.\n      updateState(\n        dispatch,\n        [lb<IState>().p(\"editProgramStates\").p(updatedProgram.id).p(\"current\").p(\"program\").record(updatedProgram)],\n        \"Update program from day editor\"\n      );\n    } else {\n      const lensUpdates = [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"programs\")\n          .recordModify((programs) => CollectionUtils_setBy(programs, \"id\", updatedProgram.id, updatedProgram)),\n      ];\n      // Mirror into an open program editor so it doesn't overwrite this edit on its own save.\n      if (hasEditorDraft) {\n        lensUpdates.push(\n          lb<IState>().p(\"editProgramStates\").p(updatedProgram.id).p(\"current\").p(\"program\").record(updatedProgram)\n        );\n      }\n      // An exercise renamed on this day carries its logged sets over rather than leaving the\n      // workout holding both the old entry and a fresh one. Silently, unlike the per-exercise\n      // sheet's prompt: there the user asked to change an exercise and the question is about\n      // what that should do to their log, here they retyped a line, and being asked about an\n      // exercise swap they never requested is the more confusing of the two.\n      const oldExercises = Program_getAllProgramExercises(Program_evaluate(withPlanner, settings));\n      const newExercises = Program_getAllProgramExercises(Program_evaluate(updatedProgram, settings));\n      for (const rename of applied.renames) {\n        const remap = ProgramExerciseSwap_workoutRemap(\n          Progress_getCurrentProgress(state),\n          updatedProgram.id,\n          oldExercises,\n          newExercises,\n          rename.oldKey,\n          rename.newKey\n        );\n        if (remap != null) {\n          lensUpdates.push(\n            Progress_lbProgress(0).recordModify((p) => Progress_remapProgramExerciseId(p, remap.oldKey, remap.newKey))\n          );\n        }\n      }\n      // Exercises added, removed or reordered here reach an in-progress workout through the\n      // ApplyProgramChangesToProgress listener, which fires off this very program change — the\n      // same path a Program screen edit or a sync takes.\n      updateState(dispatch, lensUpdates, \"Save program day changes\");\n    }\n    onClose();\n    // Last, and after the sheet is gone: a label the user never typed turning up in their\n    // program is otherwise unexplainable, and this is the only chance to say why.\n    const labelled = applied.renames.find((rename) => rename.label != null);\n    if (labelled != null && identityChange != null) {\n      Dialog_alert(\n        `This program already has a ${identityChange.newName} somewhere else, so this one is labelled \"${labelled.label}\" to keep the two apart.`\n      );\n    }\n  };\n\n  const exerciseFullNames = useMemo(\n    () =>\n      analysis != null\n        ? Array.from(new Set(Program_getAllProgramExercises(analysis.evaluatedProgram).map((e) => e.fullName)))\n        : [],\n    [analysis]\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldClose={shouldClose} shouldShowClose={true}>\n      <TransparentModal\n        onClose={onClose}\n        shouldClose={shouldClose}\n        fitContent={true}\n        safeAreaContent={\n          // In freeform mode swipes are off and the user is already typing, so the hint would\n          // be wrong there.\n          Platform.OS !== \"web\" && editorMode === \"structured\" ? (\n            // Solid rounded chip: the keypad slides in underneath the hint, and without a\n            // background it would show through the letters mid-animation.\n            <View className=\"self-center rounded-lg bg-background-default p-1 px-2\">\n              <Text className=\"text-xs text-center text-text-secondary\">{LiftoEditorHints_gestures}</Text>\n            </View>\n          ) : undefined\n        }\n      >\n        <CustomKeyboardProvider applySafeAreaBottom={false} fitContent={true} noShadow={true}>\n          {opened == null || analysis == null || dayData == null ? (\n            // The program or the day went missing between the tap and this render. Nothing to\n            // edit, and no fabricated program to fall back on that wouldn't save over something.\n            <View className=\"px-gutter py-6\">\n              <Text className=\"text-sm text-center text-text-secondary\">Couldn't find this day in the program.</Text>\n            </View>\n          ) : (\n            <DayLiftoEditorSheet\n              initialText={opened.initialText}\n              headerLabel={opened.headerLabel}\n              settings={settings}\n              evaluatedProgram={analysis.evaluatedProgram}\n              dayData={dayData}\n              exercises={analysis.exercises}\n              error={analysis.error}\n              exerciseFullNames={exerciseFullNames}\n              exerciseTypeFor={(fullName) => {\n                const key = PlannerKey_fromFullName(fullName, settings.exercises);\n                return analysis.exercises.find((e) => e.key === key)?.exerciseType;\n              }}\n              onTextChange={onTextChange}\n              onModeChange={setEditorMode}\n              onDone={onDone}\n            />\n          )}\n        </CustomKeyboardProvider>\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { PlannerDayStats } from \"../../pages/planner/components/plannerDayStats\";\nimport { IState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { PlannerProgram_evaluate } from \"../../pages/planner/models/plannerProgram\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalDayStats(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"dayStatsModal\";\n    params: IRootStackParamList[\"dayStatsModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const dayIndex = plannerState?.ui?.showDayStats;\n  const weekIndex = plannerState?.ui?.weekIndex ?? 0;\n  const planner = plannerState?.current?.program?.planner;\n  const settings = state.storage.settings;\n  const { evaluatedWeeks } = planner ? PlannerProgram_evaluate(planner, settings) : { evaluatedWeeks: [] };\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"showDayStats\").record(undefined), \"Close day stats\");\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || dayIndex == null || !evaluatedWeeks[weekIndex]?.[dayIndex];\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <PlannerDayStats\n          settings={settings}\n          evaluatedDay={evaluatedWeeks[weekIndex][dayIndex!]}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { useState, type JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Text } from \"../../components/primitives/text\";\nimport {\n  Thunk_postDebug,\n  Thunk_adminCheckKey,\n  Thunk_adminLoginAsUser,\n  Thunk_adminListDebugSnapshots,\n  Thunk_adminEnableServerSync,\n} from \"../../ducks/thunks\";\nimport { AdminDebug_isDebugAccountId } from \"../../models/adminDebug\";\nimport { CollectionUtils_sortBy, CollectionUtils_nonnull } from \"../../utils/collection\";\nimport { DateUtils_formatHHMMSS } from \"../../utils/date\";\nimport { ObjectUtils_values } from \"../../utils/object\";\nimport { Button } from \"../../components/button\";\nimport { Input } from \"../../components/input\";\nimport { ShareLog_share } from \"../../utils/shareLog\";\n\nexport function NavModalDebug(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const loadingItems = state.loading.items;\n  const items = CollectionUtils_sortBy(CollectionUtils_nonnull(ObjectUtils_values(loadingItems)), \"startTime\");\n\n  const [adminKey, setAdminKey] = useState(\"\");\n  const [isKeyValid, setIsKeyValid] = useState(false);\n  const [keyError, setKeyError] = useState<string | undefined>(undefined);\n  const [userId, setUserId] = useState(\"\");\n  const [storageId, setStorageId] = useState(\"\");\n  const [snapshotTimestamp, setSnapshotTimestamp] = useState(\"\");\n  const [snapshots, setSnapshots] = useState<string[] | undefined>(undefined);\n\n  return (\n    <ModalScreenContainer onClose={() => navigation.goBack()} isFullWidth>\n      <FormSheet>\n        <Text className=\"pb-2 font-bold\">Network calls</Text>\n        <View>\n          {items.map((item) => {\n            const startTime = DateUtils_formatHHMMSS(item.startTime);\n            const endTime = item.endTime || Date.now();\n            const duration = endTime - item.startTime;\n            const attempt = item.attempt || 0;\n            let color: string;\n            if (item.error) {\n              color = \"text-text-error\";\n            } else if (item.endTime) {\n              color = \"text-text-success\";\n            } else {\n              color = \"text-gray2-main\";\n            }\n            return (\n              <View key={item.startTime} className=\"pb-1\">\n                <Text className={color}>\n                  <Text className={`${color} font-bold`}>{startTime}</Text>: <Text className={color}>{item.type}</Text>\n                  {attempt > 0 ? <Text className={color}>({attempt + 1})</Text> : null} -{\" \"}\n                  <Text className={color}>{duration}ms</Text>\n                </Text>\n                {item.error && <Text className={color}>{item.error}</Text>}\n              </View>\n            );\n          })}\n        </View>\n        <View className=\"items-center mt-4\">\n          <Button name=\"send-debug-info\" kind=\"purple\" onClick={() => dispatch(Thunk_postDebug())}>\n            Send Debug Info\n          </Button>\n        </View>\n        <View className=\"items-center mt-4\">\n          <Button\n            name=\"share-device-logs\"\n            kind=\"purple\"\n            onClick={() => {\n              ShareLog_share();\n            }}\n          >\n            Share device logs\n          </Button>\n        </View>\n        <View className=\"pt-6 mt-6 border-t border-border-neutral\">\n          <Text className=\"pb-2 font-bold\">Admin access</Text>\n          {!isKeyValid ? (\n            <View>\n              <Input\n                identifier=\"admin-key\"\n                label=\"Admin key\"\n                type=\"password\"\n                changeType=\"oninput\"\n                changeHandler={(r) => {\n                  if (r.success) {\n                    setAdminKey(r.data);\n                  }\n                }}\n              />\n              {keyError && <Text className=\"pt-1 text-xs text-text-error\">{keyError}</Text>}\n              <View className=\"items-center mt-2\">\n                <Button\n                  name=\"admin-validate-key\"\n                  kind=\"purple\"\n                  onClick={() => {\n                    setKeyError(undefined);\n                    if (!adminKey.trim()) {\n                      return;\n                    }\n                    dispatch(\n                      Thunk_adminCheckKey(adminKey.trim(), (isValid) => {\n                        setIsKeyValid(isValid);\n                        if (!isValid) {\n                          setKeyError(\"Invalid admin key\");\n                        }\n                      })\n                    );\n                  }}\n                >\n                  Validate\n                </Button>\n              </View>\n            </View>\n          ) : (\n            <View>\n              <Text className=\"pb-2 text-xs text-text-success\">\n                Admin key valid. The session loads into an isolated, non-syncing local account (tagged DEBUG in\n                Account). Switch back / delete it there when done.\n              </Text>\n              {AdminDebug_isDebugAccountId(state.storage.tempUserId) && (\n                <View className=\"pb-4 mb-4 border-b border-border-neutral\">\n                  {state.nosync ? (\n                    <>\n                      <View className=\"items-center\">\n                        <Button\n                          name=\"debug-enable-server-sync\"\n                          kind=\"purple\"\n                          onClick={() => dispatch(Thunk_adminEnableServerSync(adminKey.trim()))}\n                        >\n                          Enable server sync (real round-trip)\n                        </Button>\n                      </View>\n                      <Text className=\"pt-1 text-xs text-gray2-main\">\n                        Syncs this debug sandbox to an isolated debug_ server account for the full authenticated\n                        sync/merge path. Hard-guarded server-side to the debug_ namespace — never the real account.\n                      </Text>\n                    </>\n                  ) : (\n                    <Text className=\"text-xs text-text-success\">\n                      ✓ Server sync enabled — syncing to {state.storage.tempUserId}\n                    </Text>\n                  )}\n                </View>\n              )}\n              <Input\n                identifier=\"admin-userid\"\n                label=\"User id\"\n                type=\"text\"\n                changeType=\"oninput\"\n                changeHandler={(r) => {\n                  if (r.success) {\n                    setUserId(r.data);\n                  }\n                }}\n              />\n              <View className=\"pt-2\">\n                <Input\n                  identifier=\"admin-storageid\"\n                  label=\"Storage id (optional)\"\n                  type=\"text\"\n                  changeType=\"oninput\"\n                  changeHandler={(r) => {\n                    if (r.success) {\n                      setStorageId(r.data);\n                    }\n                  }}\n                />\n              </View>\n              <View className=\"pt-2\">\n                <Input\n                  identifier=\"admin-snapshot-timestamp\"\n                  label=\"Local state snapshot timestamp (optional)\"\n                  type=\"text\"\n                  value={snapshotTimestamp}\n                  changeType=\"oninput\"\n                  changeHandler={(r) => {\n                    if (r.success) {\n                      setSnapshotTimestamp(r.data);\n                    }\n                  }}\n                />\n                <Text className=\"pt-1 text-xs text-gray2-main\">\n                  Loads the user's uploaded local IState (full device history), not the server storage.\n                </Text>\n                <View className=\"items-start mt-2\">\n                  <Button\n                    name=\"admin-list-snapshots\"\n                    kind=\"grayv2\"\n                    onClick={() => {\n                      if (!userId.trim()) {\n                        return;\n                      }\n                      dispatch(Thunk_adminListDebugSnapshots(userId.trim(), adminKey.trim(), setSnapshots));\n                    }}\n                  >\n                    List snapshots\n                  </Button>\n                </View>\n                {snapshots != null &&\n                  (snapshots.length > 0 ? (\n                    <View className=\"pt-2\">\n                      {snapshots.map((ts) => (\n                        <View key={ts} className=\"py-1\">\n                          <Button\n                            name=\"admin-select-snapshot\"\n                            kind=\"lightpurple\"\n                            onClick={() => setSnapshotTimestamp(ts)}\n                          >\n                            {ts}\n                          </Button>\n                        </View>\n                      ))}\n                    </View>\n                  ) : (\n                    <Text className=\"pt-2 text-xs text-gray2-main\">No snapshots found for this user.</Text>\n                  ))}\n              </View>\n              <View className=\"items-center mt-3\">\n                <Button\n                  name=\"admin-login-as-user\"\n                  kind=\"purple\"\n                  onClick={() => {\n                    if (!userId.trim()) {\n                      return;\n                    }\n                    dispatch(\n                      Thunk_adminLoginAsUser(\n                        userId.trim(),\n                        adminKey.trim(),\n                        storageId.trim() || undefined,\n                        snapshotTimestamp.trim() || undefined\n                      )\n                    );\n                  }}\n                >\n                  Login as user\n                </Button>\n              </View>\n            </View>\n          )}\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { useModalData, useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\nimport { EditDetailsForm } from \"../../components/editDetailsForm\";\n\nexport function NavModalEditDetails(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"editDetailsModal\");\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"editDetailsModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} zIndex={70}>\n      <FormSheet>\n        <EditDetailsForm\n          data={data}\n          onCancel={onClose}\n          onSubmit={(result) => {\n            Modal_setResult(modalDispatch, \"editDetailsModal\", result);\n            Modal_clear(modalDispatch, \"editDetailsModal\");\n            navigation.goBack();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Text } from \"../../components/primitives/text\";\nimport { Button } from \"../../components/button\";\nimport { IState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { pickerStateFromPlannerExercise } from \"../../components/editProgram/editProgramUtils\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalEditExerciseChange(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"editExerciseChangeModal\";\n    params: IRootStackParamList[\"editExerciseChangeModal\"];\n  }>();\n  const { programId } = route.params;\n  const settings = state.storage.settings;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const lbUi = lb<IPlannerState>().p(\"ui\");\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const editExerciseModal = plannerState?.ui?.editExerciseModal;\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(lbUi.p(\"editExerciseModal\").record(undefined), \"Close edit exercise modal\");\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || !editExerciseModal;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet\n        header={\n          <View className=\"py-2 text-center\">\n            <Text className=\"text-lg font-semibold text-center\">Change Exercise</Text>\n          </View>\n        }\n      >\n        <View className=\"flex-row w-full py-2\" style={{ gap: 16 }}>\n          <View className=\"flex-1\">\n            <Button\n              className=\"text-center\"\n              name=\"edit-exercise-change-one\"\n              data-testid=\"edit-exercise-change-one\"\n              testID=\"edit-exercise-change-one\"\n              kind=\"purple\"\n              onClick={() => {\n                const plannerExercise = editExerciseModal!.plannerExercise;\n                navigation.goBack();\n                setTimeout(() => {\n                  plannerDispatch(\n                    [\n                      lbUi.p(\"editExerciseModal\").record(undefined),\n                      lbUi.p(\"exercisePicker\").record({\n                        // A swap keeps whatever label told this instance apart from its siblings —\n                        // which exercise it is and what it is called are different questions, and\n                        // only one of them is being asked here.\n                        state: { ...pickerStateFromPlannerExercise(settings, plannerExercise), hideLabel: true },\n                        exerciseKey: plannerExercise.key,\n                        dayData: plannerExercise.dayData,\n                        change: \"one\",\n                      }),\n                    ],\n                    \"Change exercise for one instance\"\n                  );\n                }, 50);\n              }}\n            >\n              Change only for this week/day\n            </Button>\n          </View>\n          <View className=\"flex-1\">\n            <Button\n              className=\"text-center\"\n              name=\"edit-exercise-change-all\"\n              data-testid=\"edit-exercise-change-all\"\n              testID=\"edit-exercise-change-all\"\n              kind=\"purple\"\n              onClick={() => {\n                const plannerExercise = editExerciseModal!.plannerExercise;\n                navigation.goBack();\n                setTimeout(() => {\n                  plannerDispatch(\n                    [\n                      lbUi.p(\"editExerciseModal\").record(undefined),\n                      lbUi.p(\"exercisePicker\").record({\n                        state: { ...pickerStateFromPlannerExercise(settings, plannerExercise), hideLabel: true },\n                        exerciseKey: plannerExercise.key,\n                        dayData: plannerExercise.dayData,\n                        change: \"all\",\n                      }),\n                    ],\n                    \"Change exercise for all instances\"\n                  );\n                }, 50);\n              }}\n            >\n              Change across whole program\n            </Button>\n          </View>\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { MuscleGroupsContent } from \"../../components/muscleGroupsContent\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { lf } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { Muscle_createMuscleGroup, Muscle_deleteMuscleGroup, Muscle_restoreMuscleGroup } from \"../../models/muscle\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalEditMuscleGroups(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"editMuscleGroupsModal\";\n    params: IRootStackParamList[\"editMuscleGroupsModal\"];\n  }>();\n  const params = route.params;\n  const settings = state.storage.settings;\n\n  const onNewSettings = useCallback(\n    (newSettings: typeof settings) => {\n      updateState(dispatch, [lb<IState>().p(\"storage\").p(\"settings\").record(newSettings)], \"Update planner settings\");\n    },\n    [dispatch]\n  );\n\n  const onClose = (): void => {\n    if (params.context === \"editProgram\") {\n      const plannerState = state.editProgramStates?.[params.programId];\n      if (plannerState) {\n        const plannerDispatch = buildPlannerDispatch(\n          dispatch,\n          lb<IState>().p(\"editProgramStates\").p(params.programId),\n          plannerState\n        );\n        plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"showEditMuscleGroups\").record(false), \"Close muscle groups\");\n      }\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = params.context === \"editProgram\" && !state.editProgramStates?.[params.programId];\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  const content = (\n    <View className=\"px-gutter py-2\">\n      <MuscleGroupsContent\n        onCreate={(name) => {\n          onNewSettings(\n            lf(settings)\n              .p(\"muscleGroups\")\n              .modify((muscleGroups) => Muscle_createMuscleGroup(muscleGroups, name))\n          );\n        }}\n        onDelete={(muscleGroup) => {\n          onNewSettings(\n            lf(settings)\n              .p(\"muscleGroups\")\n              .modify((muscleGroups) => Muscle_deleteMuscleGroup(muscleGroups, muscleGroup))\n          );\n        }}\n        onRestore={(muscleGroup) => {\n          onNewSettings(\n            lf(settings)\n              .p(\"muscleGroups\")\n              .modify((muscleGroups) => Muscle_restoreMuscleGroup(muscleGroups, muscleGroup))\n          );\n        }}\n        settings={settings}\n      />\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { ExercisePickerContent } from \"../../components/exercisePicker/bottomSheetExercisePicker\";\nimport {\n  Program_evaluate,\n  Program_getProgramExerciseForKeyAndShortDayData,\n  Program_getExerciseTypesForWeekDay,\n} from \"../../models/program\";\nimport { Settings_toggleStarredExercise, Settings_changePickerSettings } from \"../../models/settings\";\nimport { Exercise_handleCustomExerciseChange } from \"../../models/exercise\";\nimport { IState } from \"../../models/state\";\nimport { buildCustomLensDispatch } from \"../../ducks/types\";\nimport { lb } from \"lens-shmens\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { UndoingFlag_set } from \"../../utils/undoingFlag\";\nimport {\n  IProgramExercisePickerChange,\n  ProgramExercisePickerChange_apply,\n} from \"../../models/programExercisePickerChange\";\nimport type { IRootStackParamList } from \"../types\";\nimport type {\n  ICustomExercise,\n  IExercisePickerSelectedExercise,\n  IPlannerProgram,\n  ISettings,\n  IShortDayData,\n} from \"../../types\";\nimport type { IExercisePickerSettings } from \"../../components/exercisePicker/exercisePickerSettings\";\nimport type { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport type { ILensDispatch } from \"../../utils/useLensReducer\";\n\nfunction onChangeExercise(\n  planner: IPlannerProgram,\n  settings: ISettings,\n  selectedExercises: IExercisePickerSelectedExercise[],\n  plannerExercise: IPlannerProgramExercise | undefined,\n  dayData: IShortDayData,\n  change: IProgramExercisePickerChange,\n  variationIndex: number | undefined,\n  plannerDispatch: ILensDispatch<IPlannerProgram>,\n  onStopIsUndoing: () => void\n): void {\n  if (!selectedExercises[0]) {\n    return;\n  }\n  UndoingFlag_set(true);\n  const result = ProgramExercisePickerChange_apply({\n    planner,\n    settings,\n    selectedExercises,\n    plannerExercise,\n    dayData,\n    change,\n    variationIndex,\n  });\n  if (result == null) {\n    return;\n  }\n  plannerDispatch(lb<IPlannerProgram>().record(result.planner), result.description);\n  if (result.isAdd) {\n    onStopIsUndoing();\n  }\n}\n\nexport function NavModalEditProgramExercisePicker(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"editProgramExercisePickerModal\";\n    params: IRootStackParamList[\"editProgramExercisePickerModal\"];\n  }>();\n  const { programId, dayData, change, exerciseKey, variationIndex } = route.params;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const program = plannerState?.current.program;\n  const planner = program?.planner;\n  const evaluatedProgram = program ? Program_evaluate(program, state.storage.settings) : undefined;\n  const exercisePickerState = plannerState?.ui.exercisePicker?.state;\n\n  const plannerExercise =\n    exerciseKey && evaluatedProgram\n      ? Program_getProgramExerciseForKeyAndShortDayData(evaluatedProgram, dayData, exerciseKey)\n      : undefined;\n\n  const plannerStateRef = useRef(plannerState);\n  plannerStateRef.current = plannerState;\n\n  const { base, programPlannerDispatch, pickerDispatch, stopIsUndoing } = useMemo(() => {\n    const plannerBase = buildPlannerDispatch(\n      dispatch,\n      lb<IState>().p(\"editProgramStates\").p(programId),\n      () => plannerStateRef.current as IPlannerState\n    );\n    return {\n      base: plannerBase,\n      programPlannerDispatch: buildCustomLensDispatch(\n        plannerBase,\n        lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\")\n      ),\n      pickerDispatch: buildCustomLensDispatch(plannerBase, lb<IPlannerState>().p(\"ui\").pi(\"exercisePicker\").p(\"state\")),\n      stopIsUndoing: () => {\n        plannerBase(\n          [\n            lb<IPlannerState>()\n              .p(\"ui\")\n              .recordModify((ui) => ({ ...ui, isUndoing: false })),\n          ],\n          \"stop-is-undoing\"\n        );\n      },\n    };\n  }, [dispatch, programId]);\n\n  const settingsRef = useRef(state.storage.settings);\n  settingsRef.current = state.storage.settings;\n  const programRef = useRef(program);\n  programRef.current = program;\n  const plannerRef = useRef(planner);\n  plannerRef.current = planner;\n  const plannerExerciseRef = useRef(plannerExercise);\n  plannerExerciseRef.current = plannerExercise;\n\n  const clearExercisePicker = useCallback((): void => {\n    base(lb<IPlannerState>().p(\"ui\").p(\"exercisePicker\").record(undefined), \"Close exercise picker\");\n  }, [base]);\n  useClearOnModalRemove(clearExercisePicker);\n\n  const onClose = useCallback((): void => {\n    navigation.goBack();\n  }, [navigation]);\n\n  const onChoose = useCallback(\n    (selectedExercises: IExercisePickerSelectedExercise[]) => {\n      const currentPlanner = plannerRef.current;\n      if (!currentPlanner) {\n        return;\n      }\n      onChangeExercise(\n        currentPlanner,\n        settingsRef.current,\n        selectedExercises,\n        plannerExerciseRef.current,\n        dayData,\n        change,\n        variationIndex,\n        programPlannerDispatch,\n        stopIsUndoing\n      );\n      onClose();\n    },\n    [dayData, change, variationIndex, programPlannerDispatch, stopIsUndoing, onClose]\n  );\n\n  const onChangeCustomExercise = useCallback(\n    (action: \"upsert\" | \"delete\", exercise: ICustomExercise, notes?: string) => {\n      Exercise_handleCustomExerciseChange(dispatch, action, exercise, notes, settingsRef.current, programRef.current);\n    },\n    [dispatch]\n  );\n\n  const onStar = useCallback((key: string) => Settings_toggleStarredExercise(dispatch, key), [dispatch]);\n  const onChangeSettings = useCallback(\n    (pickerSettings: IExercisePickerSettings) => Settings_changePickerSettings(dispatch, pickerSettings),\n    [dispatch]\n  );\n\n  const usedExerciseTypes = useMemo(\n    () =>\n      evaluatedProgram ? Program_getExerciseTypesForWeekDay(evaluatedProgram, dayData.week, dayData.dayInWeek) : [],\n    [evaluatedProgram, dayData.week, dayData.dayInWeek]\n  );\n\n  const shouldGoBack = !plannerState || !exercisePickerState || !evaluatedProgram || !planner || !program;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <SheetScreenContainer onClose={onClose}>\n      <TransparentModal onClose={onClose}>\n        <ExercisePickerContent\n          settings={state.storage.settings}\n          isLoggedIn={!!state.user?.id}\n          exercisePicker={exercisePickerState}\n          usedExerciseTypes={usedExerciseTypes}\n          evaluatedProgram={evaluatedProgram}\n          dispatch={pickerDispatch}\n          onChoose={onChoose}\n          onChangeCustomExercise={onChangeCustomExercise}\n          onStar={onStar}\n          onChangeSettings={onChangeSettings}\n          onClose={onClose}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { BottomSheetEditProgramV2Content } from \"../../components/bottomSheetEditProgramV2\";\nimport { Program_getProgram } from \"../../models/program\";\nimport { Thunk_generateAndCopyLink, Thunk_fetchRevisions } from \"../../ducks/thunks\";\nimport { UrlUtils_build } from \"../../utils/url\";\nimport { ClipboardUtils_copy } from \"../../utils/clipboard\";\nimport { navigateToModal } from \"../navigationService\";\nimport type { IRootStackParamList } from \"../types\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Dialog_alert } from \"../../utils/dialog\";\n\ndeclare let __HOST__: string;\n\nexport function NavModalEditProgramMenu(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"editProgramMenuModal\";\n    params: IRootStackParamList[\"editProgramMenuModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const program = Program_getProgram(state, programId);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const content = (\n    <BottomSheetEditProgramV2Content\n      isAffiliateEnabled={!!state.storage.settings.affiliateEnabled}\n      isLoadingRevisions={false}\n      isLoggedIn={!!state.user?.id}\n      onExportProgramToLink={() => {\n        const url = UrlUtils_build(`/user/p/${programId}`, __HOST__);\n        ClipboardUtils_copy(url.toString());\n        Dialog_alert(`Copied link to the clipboard: ${url}`);\n        onClose();\n      }}\n      onShareProgramToLink={() => {\n        if (program) {\n          dispatch(\n            Thunk_generateAndCopyLink(program, state.storage.settings, (url) => {\n              Dialog_alert(`Copied link to the clipboard: ${url}`);\n            })\n          );\n        }\n        onClose();\n      }}\n      onGenerateProgramImage={() => {\n        onClose();\n        navigateToModal(\"programImageExportModal\", { programId });\n      }}\n      onLoadRevisions={() => {\n        dispatch(\n          Thunk_fetchRevisions(programId, () => {\n            onClose();\n            navigateToModal(\"programRevisionsModal\", { programId });\n          })\n        );\n      }}\n      onClose={onClose}\n    />\n  );\n  return (\n    <SheetScreenContainer onClose={onClose}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { BottomSheetEditTargetContent } from \"../../components/bottomSheetEditTarget\";\nimport { lb } from \"lens-shmens\";\nimport { IHistoryRecord } from \"../../types\";\nimport { IState, updateState } from \"../../models/state\";\nimport { buildPlaygroundDispatch, getPlaygroundProgress } from \"./navModalPlaygroundUtils\";\nimport type { IRootStackParamList } from \"../types\";\nimport { KeyboardSheet } from \"../KeyboardSheet\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\n\nexport function NavModalEditTarget(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"editSetTargetModal\";\n    params: IRootStackParamList[\"editSetTargetModal\"];\n  }>();\n  const params = route.params;\n\n  let progress: IHistoryRecord | undefined;\n  let modalDispatch = dispatch;\n\n  if (params.context === \"workout\") {\n    progress = params.progressId === 0 ? state.storage.progress?.[0] : state.progress[params.progressId];\n  } else {\n    progress = getPlaygroundProgress(state, params.weekIndex, params.dayIndex);\n    modalDispatch = buildPlaygroundDispatch(\n      dispatch,\n      params.weekIndex,\n      params.dayIndex,\n      () => getPlaygroundProgress(state, params.weekIndex, params.dayIndex),\n      state.storage.settings,\n      { weight: {}, length: {}, percentage: {} }\n    );\n  }\n\n  const editSetModal = progress?.ui?.editSetModal;\n\n  useClearOnModalRemove(() => {\n    if (params.context === \"workout\") {\n      dispatch({\n        type: \"UpdateProgress\",\n        lensRecordings: [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"editSetModal\").record(undefined)],\n        desc: \"Close edit set modal\",\n      });\n    } else {\n      updateState(\n        dispatch,\n        [\n          lb<IState>()\n            .pi(\"playgroundState\")\n            .pi(\"progresses\")\n            .pi(params.weekIndex)\n            .p(\"days\")\n            .pi(params.dayIndex)\n            .p(\"progress\")\n            .pi(\"ui\", {})\n            .p(\"editSetModal\")\n            .record(undefined),\n        ],\n        \"Close edit set modal\"\n      );\n    }\n  });\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !progress || !editSetModal;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !progress || !editSetModal) {\n    return <></>;\n  }\n\n  return (\n    <KeyboardSheet onClose={onClose}>\n      <View className=\"bg-background-default\">\n        <BottomSheetEditTargetContent\n          editSetModal={editSetModal}\n          subscription={state.storage.subscription}\n          settings={state.storage.settings}\n          progress={progress}\n          dispatch={modalDispatch}\n          onClose={onClose}\n        />\n      </View>\n    </KeyboardSheet>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { useNavigation, useRoute } from \"@react-navigation/native\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { EmailAuthForm, IEmailAuthMode } from \"../../components/account\";\nimport { Thunk_pushScreen } from \"../../ducks/thunks\";\nimport { IState } from \"../../models/state\";\nimport type { IRootStackParamList } from \"../types\";\n\nconst modalTitles: Record<IEmailAuthMode, string> = {\n  signin: \"Sign in with Email\",\n  signup: \"Create Account\",\n  forgot: \"Forgot Password\",\n};\n\nexport function NavModalEmailAuth(): JSX.Element {\n  const { dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{ key: string; name: \"emailAuthModal\"; params: IRootStackParamList[\"emailAuthModal\"] }>();\n  const [mode, setMode] = useState<IEmailAuthMode>(\"signin\");\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const onSignIn = (newState: IState): void => {\n    onClose();\n    if (route.params?.navigateHomeOnSignIn && newState.storage.currentProgramId) {\n      dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n    }\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <View className=\"px-gutter pb-4\">\n          <Text className=\"mb-2 text-lg font-bold text-center\">{modalTitles[mode]}</Text>\n          <EmailAuthForm dispatch={dispatch} onSignIn={onSignIn} onModeChange={setMode} />\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalEquipmentContent } from \"../../components/modalEquipment\";\nimport { Progress_lbProgress } from \"../../models/progress\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport type { IRootStackParamList } from \"../types\";\n\nfunction NavModalEquipmentWorkout(props: { progressId: number }): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const { progressId } = props;\n\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const exerciseType = progress?.ui?.equipmentModal?.exerciseType;\n\n  const onClose = (): void => {\n    updateState(\n      dispatch,\n      [Progress_lbProgress(progressId).pi(\"ui\", {}).p(\"equipmentModal\").record(undefined)],\n      \"Close equipment modal\"\n    );\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !progress || !exerciseType;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !progress || !exerciseType) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ModalEquipmentContent\n          settings={state.storage.settings}\n          stats={state.storage.stats}\n          exercise={exerciseType}\n          entries={progress.entries}\n          dispatch={dispatch}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n\nfunction NavModalEquipmentPreview(props: { programId: string }): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const { programId } = props;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const previewEquipmentModal = plannerState?.ui?.previewEquipmentModal;\n  const exerciseType = previewEquipmentModal?.plannerExercise?.exerciseType;\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(\n        lb<IPlannerState>().pi(\"ui\").p(\"previewEquipmentModal\").record(undefined),\n        \"Close preview equipment modal\"\n      );\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || !exerciseType;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !exerciseType) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ModalEquipmentContent\n          settings={state.storage.settings}\n          stats={state.storage.stats}\n          exercise={exerciseType}\n          entries={[]}\n          dispatch={dispatch}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n\nexport function NavModalEquipment(): JSX.Element {\n  const route = useRoute<{ key: string; name: \"equipmentModal\"; params: IRootStackParamList[\"equipmentModal\"] }>();\n  const params = route.params;\n\n  if (params.context === \"preview\") {\n    return <NavModalEquipmentPreview programId={params.programId} />;\n  }\n  return <NavModalEquipmentWorkout progressId={params.progressId} />;\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { ExerciseCloneLibraryContent } from \"../../components/exercisePicker/bottomSheetExerciseCloneLibrary\";\nimport { Exercise_targetMuscles, Exercise_synergistMuscles } from \"../../models/exercise\";\nimport { ExerciseImageUtils_url } from \"../../models/exerciseImage\";\nimport { ObjectUtils_clone } from \"../../utils/object\";\nimport { useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\n\nexport function NavModalExerciseCloneLibrary(): JSX.Element {\n  const { state } = useAppState();\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const settings = state.storage.settings;\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"exerciseCloneLibraryModal\");\n    navigation.goBack();\n  };\n\n  return (\n    <SheetScreenContainer onClose={onClose}>\n      <TransparentModal onClose={onClose}>\n        <ExerciseCloneLibraryContent\n          showMuscles={true}\n          settings={settings}\n          onClose={onClose}\n          onSelect={(exercise) => {\n            const customExercise = settings.exercises[exercise.id];\n            const smallImageUrl = customExercise\n              ? customExercise.smallImageUrl\n              : ExerciseImageUtils_url(exercise, \"small\");\n            const largeImageUrl = customExercise\n              ? customExercise.largeImageUrl\n              : ExerciseImageUtils_url(exercise, \"large\");\n            const targetMuscles = ObjectUtils_clone(Exercise_targetMuscles(exercise, settings));\n            const synergistMuscles = ObjectUtils_clone(Exercise_synergistMuscles(exercise, settings));\n            const types = ObjectUtils_clone(exercise.types);\n            Modal_setResult(modalDispatch, \"exerciseCloneLibraryModal\", {\n              smallImageUrl,\n              largeImageUrl,\n              targetMuscles,\n              synergistMuscles,\n              types,\n            });\n            Modal_clear(modalDispatch, \"exerciseCloneLibraryModal\");\n            navigation.goBack();\n          }}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useContext } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { ExerciseImageLibraryContent } from \"../../components/exercisePicker/bottomSheetExerciseImageLibrary\";\nimport { AppContext } from \"../../components/appContext\";\nimport { Service } from \"../../api/service\";\nimport { useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\n\nexport function NavModalExerciseImageLibrary(): JSX.Element {\n  const { state } = useAppState();\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const appContext = useContext(AppContext);\n  const service = appContext.service ?? new Service(fetch);\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"exerciseImageLibraryModal\");\n    navigation.goBack();\n  };\n\n  return (\n    <SheetScreenContainer onClose={onClose}>\n      <TransparentModal onClose={onClose}>\n        <ExerciseImageLibraryContent\n          settings={state.storage.settings}\n          isLoggedIn={!!state.user?.id}\n          service={service}\n          onClose={onClose}\n          onSelect={(smallImageUrl, largeImageUrl) => {\n            Modal_setResult(modalDispatch, \"exerciseImageLibraryModal\", { smallImageUrl, largeImageUrl });\n            Modal_clear(modalDispatch, \"exerciseImageLibraryModal\");\n            navigation.goBack();\n          }}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useContext, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { BottomSheetItem } from \"../../components/bottomSheetItem\";\nimport { IconCamera } from \"../../components/icons/iconCamera\";\nimport { IconPicture } from \"../../components/icons/iconPicture\";\nimport { IconSpinner } from \"../../components/icons/iconSpinner\";\nimport { useModalDispatch, useModalData, Modal_setResult, Modal_clear, useModal } from \"../ModalStateContext\";\nimport { AppContext } from \"../../components/appContext\";\nimport { Service } from \"../../api/service\";\nimport { ImageUploader } from \"../../utils/imageUploader\";\nimport { ImagePicker_pick } from \"../../utils/imagePicker\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Dialog_alert } from \"../../utils/dialog\";\n\nexport function NavModalExerciseImageSource(): JSX.Element {\n  const { state } = useAppState();\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"exerciseImageSourceModal\");\n  const exerciseId = data?.exerciseId ?? \"\";\n  const appContext = useContext(AppContext);\n  const service = appContext.service ?? new Service(fetch);\n  const isLoggedIn = !!state.user?.id;\n  const [isUploading, setIsUploading] = useState(false);\n\n  const openImageLibrary = useModal(\"exerciseImageLibraryModal\", (result) => {\n    Modal_setResult(modalDispatch, \"exerciseImageSourceModal\", result);\n    Modal_clear(modalDispatch, \"exerciseImageSourceModal\");\n    navigation.goBack();\n  });\n\n  const upload = async (source: \"camera\" | \"photo-library\"): Promise<void> => {\n    if (!isLoggedIn) {\n      Dialog_alert(\"You need to be logged in to upload custom exercise images\");\n      return;\n    }\n    setIsUploading(true);\n    try {\n      const uri = await ImagePicker_pick(source);\n      if (uri) {\n        const imageUploader = new ImageUploader(service);\n        const url = await imageUploader.uploadBase64Image(uri, exerciseId);\n        Modal_setResult(modalDispatch, \"exerciseImageSourceModal\", { smallImageUrl: url });\n      }\n    } catch (e) {\n      console.error(\"Error uploading image\", e);\n      Dialog_alert(\"Failed to upload image. Please try again.\");\n    } finally {\n      setIsUploading(false);\n      Modal_clear(modalDispatch, \"exerciseImageSourceModal\");\n      navigation.goBack();\n    }\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  const onCloseSheet = (): void => {\n    Modal_clear(modalDispatch, \"exerciseImageSourceModal\");\n    navigation.goBack();\n  };\n\n  const content = (\n    <View className=\"bg-background-default\">\n      <View>\n        <Text className=\"text-xs text-center text-text-secondary\">Prefer 2:3 aspect ratio</Text>\n        <BottomSheetItem\n          name=\"from-image-library\"\n          title=\"From Image Library\"\n          onClick={() => {\n            openImageLibrary({});\n          }}\n        />\n        <BottomSheetItem\n          title=\"From Camera\"\n          name=\"from-camera\"\n          icon={isUploading ? <IconSpinner width={18} height={18} /> : <IconCamera size={24} />}\n          description=\"Take a photo\"\n          onClick={() => upload(\"camera\")}\n        />\n        <BottomSheetItem\n          title=\"From Photo Library\"\n          name=\"from-photo-library\"\n          icon={isUploading ? <IconSpinner width={18} height={18} /> : <IconPicture size={24} />}\n          description=\"Pick photo from your photo library\"\n          onClick={() => upload(\"photo-library\")}\n        />\n      </View>\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onCloseSheet} shouldShowClose={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useEffect, useMemo, useRef, useState } from \"react\";\nimport { StackActions, useNavigation, useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ILiftoEditorExercisePickerModalData, useModal } from \"../ModalStateContext\";\nimport {\n  IEvaluatedProgram,\n  Program_evaluate,\n  Program_findPlannerExercise,\n  Program_getAllProgramExercises,\n} from \"../../models/program\";\nimport { ILiftoEditorReuseCandidates, LiftoEditorReuse_candidates } from \"../../components/liftoEditorReuse\";\nimport {\n  ILiftoEditorStateVarsContext,\n  LiftoEditorStateVars_contextFor,\n} from \"../../components/primitives/liftoEditorStateVars\";\nimport type {\n  ILiftoEditorAcrossField,\n  ILiftoEditorStateVarsTarget,\n} from \"../../components/primitives/liftoEditorActions\";\nimport { LiftoEditorBrain_exerciseFullName, LiftoEditorParseCache } from \"../../components/primitives/liftoEditorBrain\";\nimport {\n  IProgramExerciseIdentity,\n  IProgramExerciseParsedName,\n  IProgramExerciseSwap,\n  ProgramExerciseSwap_detect,\n  ProgramExerciseSwap_identity,\n  ProgramExerciseSwap_scope,\n  IProgramExerciseSwapScope,\n} from \"../../models/programExerciseSwap\";\nimport { Progress_getCurrentProgress } from \"../../models/progress\";\nimport {\n  ExerciseLiftoEditorDraft_create,\n  ExerciseLiftoEditorDraft_fromEditor,\n  ExerciseLiftoEditorDraft_isDirty,\n  ExerciseLiftoEditorDraft_mountText,\n  IExerciseLiftoEditorDraft,\n} from \"../../models/exerciseLiftoEditorDraft\";\nimport {\n  ExerciseDraftToProgram_analyze,\n  ExerciseDraftToProgram_apply,\n  ExerciseDraftToProgram_snapshot,\n  ExerciseDraftToProgram_writePreview,\n  IExerciseDraftToProgramOptions,\n} from \"../../models/exerciseDraftToProgram\";\nimport {\n  ExerciseLiftoEditorSave_decide,\n  ExerciseLiftoEditorSave_lenses,\n  ExerciseLiftoEditorSave_withScope,\n} from \"../../models/exerciseLiftoEditorSave\";\nimport {\n  IProgramExerciseSharedSection,\n  ProgramExerciseText_blurb,\n  ProgramExerciseText_sharedSections,\n  ProgramExerciseText_split,\n} from \"../../models/programExerciseText\";\nimport type { IPlannerProgramExercise } from \"../../pages/planner/models/types\";\nimport { LiftoEditorFocusProvider } from \"../../components/liftoEditorFocus\";\nimport { updateState } from \"../../models/state\";\nimport { Dialog_alert, Dialog_choice, Dialog_confirm } from \"../../utils/dialog\";\nimport type { IDayData, IPlannerProgram, IProgram } from \"../../types\";\nimport type { IRootStackParamList } from \"../types\";\nimport { Platform, View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { LiftoEditorHints_gestures } from \"../../components/primitives/liftoEditorHints\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { CustomKeyboardProvider } from \"../CustomKeyboardContext\";\nimport { LiftoEditorSheetProgram_resolve } from \"./liftoEditorSheetProgram\";\nimport { ExerciseLiftoEditorSheet } from \"./ExerciseLiftoEditorSheet\";\nimport type {\n  IExerciseLiftoEditorSheetAnalysis,\n  IExerciseLiftoEditorSheetInstanceOption,\n  IExerciseLiftoEditorSheetLiveError,\n  IExerciseLiftoEditorSheetSharedProperty,\n} from \"./exerciseLiftoEditorSheetTypes\";\n\n// In a single-week program the week name is the same on every chip, so only day names carry\n// information there.\nfunction instanceLabel(evaluatedProgram: IEvaluatedProgram | undefined, dayData: IDayData): string {\n  const week = dayData.week != null ? evaluatedProgram?.weeks[dayData.week - 1] : undefined;\n  const day = dayData.dayInWeek != null ? week?.days[dayData.dayInWeek - 1] : undefined;\n  if (week == null || day == null) {\n    return `Week ${dayData.week ?? 1} · Day ${dayData.dayInWeek ?? 1}`;\n  }\n  return evaluatedProgram != null && evaluatedProgram.weeks.length === 1 ? day.name : `${week.name} · ${day.name}`;\n}\n\n// The sheet shows these sections, but they're written on another day's line and govern every\n// week — without saying so, editing one looks like a change to just this day. Abbreviated\n// rather than instanceLabel's form: the caption is a one-line aside and the instance chips\n// already spell out custom week/day names.\nfunction sharedProperties(shared: IProgramExerciseSharedSection[]): IExerciseLiftoEditorSheetSharedProperty[] {\n  return shared.map((s) => ({\n    property: s.property,\n    text: s.text,\n    ownerLabel: `W${s.owners[0].dayData.week} · D${s.owners[0].dayData.dayInWeek}`,\n    ownerDayData: s.owners[0].dayData,\n  }));\n}\n\nexport function NavModalExerciseLiftoEditor(): JSX.Element {\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"exerciseLiftoEditorModal\";\n    params: IRootStackParamList[\"exerciseLiftoEditorModal\"];\n  }>();\n  const params = route.params;\n  const { state, dispatch } = useAppState();\n  const isFromWorkout = params?.fromWorkout ?? true;\n  const settings = state.storage.settings;\n  // The program this sheet edits against, read live rather than snapshotted. Everything below\n  // derives from this one value, so the declaration a splice targets and the planner it splices\n  // into are always the same version — and a program that moves underneath, whether a stacked\n  // sheet saving it or a sync landing, is seen straight away instead of at the next save.\n  //\n  // The sheet holds no copy of it because it has nothing to hold: the only pending edit here is\n  // the editor's text, which lives in editRef and is spliced in at save. Re-evaluating is\n  // kept off unrelated re-renders by the memo below, which is what the snapshot this replaced\n  // was really for.\n  const resolved = params != null ? LiftoEditorSheetProgram_resolve(state, params.programId, isFromWorkout) : undefined;\n  // A whole-program rewrite that hasn't been saved yet. It can't wait in the editor's text the\n  // way an ordinary edit does — it reaches lines this sheet isn't showing — so it waits here,\n  // and Done writes it while closing without saving drops it. Set only by the across-program\n  // sheet; undefined the rest of the time, which is what keeps the program read live.\n  const [pendingPlanner, setPendingPlanner] = useState<IPlannerProgram | undefined>(undefined);\n  // Memoized rather than rebuilt per render: the narrowing spread would otherwise be a new\n  // object every time and re-evaluate the whole program on every unrelated re-render.\n  const program = useMemo((): (IProgram & { planner: IPlannerProgram }) | undefined => {\n    if (resolved?.planner == null) {\n      return undefined;\n    }\n    return { ...resolved, planner: pendingPlanner ?? resolved.planner };\n  }, [resolved, pendingPlanner]);\n  // Which exercise this sheet is on. Not `params.key` — that is the key it opened with, and a\n  // rename folded into a whole-program edit moves it. Everything below resolves through this, so\n  // when the key moves the sheet follows instead of losing track of its own exercise.\n  const [exerciseKey, setExerciseKey] = useState(params?.key);\n  const [selectedDayData, setSelectedDayData] = useState<Required<IDayData> | undefined>(undefined);\n  const [editorMode, setEditorMode] = useState<\"structured\" | \"freeform\">(\"structured\");\n  const [isSharedVisible, setIsSharedVisible] = useState(false);\n  // Set by the shared-sections toggle; the body remounts on it and takes it as its initialText.\n  const [bodyText, setBodyText] = useState<string | undefined>(undefined);\n  // Only the explicit toggle remounts. Freeform hides the sections in place, and remounting\n  // there would drop the user back into structured mode mid-edit.\n  const [remountKey, setRemountKey] = useState(0);\n\n  const evaluatedProgram = useMemo(\n    () => (program != null ? Program_evaluate(program, settings) : undefined),\n    [program, settings]\n  );\n  const editTarget = useMemo(\n    () =>\n      exerciseKey != null && params != null ? { exerciseKey, day: params.dayData.day, selectedDayData } : undefined,\n    [exerciseKey, params, selectedDayData]\n  );\n  const snapshot = useMemo(\n    () =>\n      program != null && editTarget != null\n        ? ExerciseDraftToProgram_snapshot(program, editTarget, settings)\n        : undefined,\n    [program, editTarget, settings]\n  );\n  const instances = snapshot?.instances ?? [];\n  const activeDayData = selectedDayData ?? snapshot?.declarationDayData;\n  const currentExercise = snapshot?.currentExercise;\n  const currentDeclaration = snapshot?.declaration;\n  const sharedSections = snapshot?.sharedSections ?? [];\n  const currentBlurbText = snapshot?.blurb ?? \"\";\n  const blurbTextFor = (declaration: IPlannerProgramExercise | undefined): string =>\n    program != null && declaration != null ? ProgramExerciseText_blurb(program.planner, declaration) : \"\";\n\n  // A ref written synchronously by every edit, so Save reads what a flushed panel write produced\n  // in the same call, without waiting for the render that carries it into `program`.\n  const editRef = useRef<{ draft: IExerciseLiftoEditorDraft; pendingPlanner: IPlannerProgram | undefined }>({\n    draft: ExerciseLiftoEditorDraft_create(currentBlurbText, sharedSections),\n    pendingPlanner: undefined,\n  });\n  const setPending = (planner: IPlannerProgram | undefined): void => {\n    editRef.current.pendingPlanner = planner;\n    setPendingPlanner(planner);\n  };\n  const onDraftText = (text: string): void => {\n    editRef.current.draft = ExerciseLiftoEditorDraft_fromEditor(editRef.current.draft, text);\n  };\n  // Set once a close is approved (or changes are saved), so the beforeRemove guard doesn't\n  // re-prompt on the navigation pop that follows.\n  const allowCloseRef = useRef(false);\n\n  // Remount rather than edit-in-place: the body's editor asserts inside Runestone when a\n  // multi-section suffix is spliced into a live document. Only the mounting text is recomputed —\n  // the draft is the record of what changed and is left alone, so toggling can neither lose an\n  // edit nor reset the dirty state.\n  const onToggleShared = (): void => {\n    const isVisible = !isSharedVisible;\n    setIsSharedVisible(isVisible);\n    setBodyText(ExerciseLiftoEditorDraft_mountText(editRef.current.draft, isVisible));\n    setRemountKey((key) => key + 1);\n  };\n\n  // Freeform drops the sections out of the text itself; what the user did to them is already in\n  // the draft, so only visibility changes here.\n  const onSharedHidden = (localBlurb: string): void => {\n    setIsSharedVisible(false);\n    setBodyText(localBlurb);\n  };\n\n  // The body asks; the sheet answers, because only the sheet knows what is pending — the body's\n  // mounted text is recomposed by the shared-sections toggle and stops tracking \"changed\".\n  const onSelectInstance = async (instance: IExerciseLiftoEditorSheetInstanceOption): Promise<void> => {\n    if (isDirty() && !(await Dialog_confirm(\"Discard unsaved changes to this exercise?\"))) {\n      return;\n    }\n    setPending(undefined);\n    const next = instances.find(\n      (e) => e.dayData.week === instance.dayData.week && e.dayData.dayInWeek === instance.dayData.dayInWeek\n    );\n    // Resolved here rather than read from the memo: that still describes the instance being\n    // left, and the draft's baseline has to be the one it will be compared against.\n    const nextShared =\n      evaluatedProgram != null && next != null ? ProgramExerciseText_sharedSections(evaluatedProgram, next) : [];\n    editRef.current.draft = ExerciseLiftoEditorDraft_create(blurbTextFor(next), nextShared);\n    setBodyText(undefined);\n    setIsSharedVisible(false);\n    setRemountKey((key) => key + 1);\n    setSelectedDayData(instance.dayData);\n  };\n\n  // A whole-program rewrite normally rewrites the line on screen too — that is the point of\n  // invoking it from this exercise's weight — so the editor is left showing text the program no\n  // longer has, and its baselines describe a line that no longer exists. Re-projected on the\n  // render after the rewrite lands, because the new line can only be read off the new program.\n  //\n  // Same four steps as switching instance: rebuild the record, drop the shared-section override,\n  // remount so the editor picks the text up.\n  const needsReprojectRef = useRef(false);\n  useEffect(() => {\n    if (!needsReprojectRef.current || currentDeclaration == null) {\n      return;\n    }\n    needsReprojectRef.current = false;\n    editRef.current.draft = ExerciseLiftoEditorDraft_create(currentBlurbText, sharedSections);\n    setBodyText(undefined);\n    setIsSharedVisible(false);\n    setRemountKey((key) => key + 1);\n  }, [currentDeclaration, sharedSections]);\n\n  // The key the fold resolved to, held until the sheet actually comes back with a result: cancel\n  // the modal and nothing was folded, so the sheet is still on the key it had.\n  const foldedKeyRef = useRef<string | undefined>(undefined);\n  const openAcrossProgram = useModal(\"acrossProgramModal\", (planner) => {\n    setPending(planner);\n    if (foldedKeyRef.current != null) {\n      setExerciseKey(foldedKeyRef.current);\n    }\n    needsReprojectRef.current = true;\n  });\n\n  // Fold, then apply. The across-program sheet groups by value, so it has to be looking at what\n  // is on screen — including edits not yet folded into the program. A line that doesn't parse\n  // has nothing to fold, and applying on top of the last good version would silently drop the\n  // typing, so it is refused with the error the banner is already showing.\n  const onEditAcrossProgram = async (\n    field: ILiftoEditorAcrossField,\n    exerciseFullName: string | undefined\n  ): Promise<void> => {\n    if (params == null || snapshot == null) {\n      return;\n    }\n    // A pending rename is folded in along with everything else, and folding it means choosing how\n    // far it reaches. The fold defaults that to \"all\" — harmless where its planner is thrown\n    // away, but here it is kept, so an unsaved one-day rename would quietly become a program-wide\n    // one. Same question the save asks, asked before the fold rather than after it.\n    const swap = detectSwap(editRef.current.draft.localBlurb.trim(), snapshot.declaration);\n    if (swap != null && (await requestSwapScope(swap.isLadder)) == null) {\n      return;\n    }\n    const folded = ExerciseDraftToProgram_apply(\n      snapshot,\n      editRef.current.draft,\n      editRef.current.draft.localBlurb,\n      foldOptions()\n    );\n    if (folded == null || \"error\" in folded.applied) {\n      Dialog_alert(\"Fix the error in this exercise first, then you can change it across the program.\");\n      return;\n    }\n    // Resolved from the folded planner, not from `params.key`: that is the key the sheet opened\n    // on, and a rename folded in just now has already moved it. Looking the old one up would find\n    // nothing, or — worse — a leftover declaration of the exercise that used to be here.\n    const target = Program_findPlannerExercise(\n      folded.applied.planner,\n      settings,\n      exerciseFullName ?? snapshot.currentExercise.fullName\n    );\n    if (target == null) {\n      Dialog_alert(\"Couldn't tell which exercise this is. Fix any errors on this line and try again.\");\n      return;\n    }\n    foldedKeyRef.current = target.key;\n    openAcrossProgram({\n      planner: folded.applied.planner,\n      exerciseKey: target.key,\n      exerciseFullName: target.fullName,\n      field,\n    });\n  };\n\n  // The sheet's own derived answers follow `program` on their own. The body does not: it holds\n  // the editor session, and its last analysis was of a text that hasn't changed, so nothing\n  // tells it to ask again when the program moves underneath — a stacked sheet saving this\n  // exercise's reuse target, or a sync landing. This revision is that signal.\n  const [analysisRevision, setAnalysisRevision] = useState(0);\n  useEffect(() => {\n    setAnalysisRevision((revision) => revision + 1);\n  }, [program]);\n\n  const onClose = (): void => {\n    allowCloseRef.current = true;\n    navigation.goBack();\n  };\n\n  // Pushes a second editor sheet for the reuse target on top of this one, so Done/close\n  // pops back to the referring exercise.\n  const onEditReuse = (targetName: string): void => {\n    if (evaluatedProgram == null || params == null) {\n      return;\n    }\n    const target = Program_getAllProgramExercises(evaluatedProgram).find(\n      (e) => e.fullName === targetName || e.name === targetName || e.key === targetName\n    );\n    if (target == null) {\n      Dialog_alert(`Couldn't find \"${targetName}\" in this program.`);\n      return;\n    }\n    navigation.dispatch(\n      StackActions.push(\"exerciseLiftoEditorModal\", {\n        programId: params.programId,\n        key: target.key,\n        dayData: target.dayData,\n        fromWorkout: params.fromWorkout,\n      })\n    );\n  };\n\n  // One cache for the sheet's own parses; the editor below keeps its own.\n  const parseCacheRef = useRef<LiftoEditorParseCache | undefined>(undefined);\n  const parseName = (text: string): IProgramExerciseParsedName | undefined => {\n    const cache = parseCacheRef.current ?? new LiftoEditorParseCache();\n    parseCacheRef.current = cache;\n    return LiftoEditorBrain_exerciseFullName(cache, text);\n  };\n  const detectSwap = (text: string, declaration: IPlannerProgramExercise): IProgramExerciseSwap | undefined => {\n    const parsed = parseName(text);\n    return parsed != null ? ProgramExerciseSwap_detect(parsed, declaration, state.storage.settings) : undefined;\n  };\n\n  // A bare full name is parsed too rather than picked apart by hand — it is the same grammar,\n  // and the cache makes the extra parse a lookup.\n  const exerciseFor = (fullName: string | undefined): IProgramExerciseIdentity | undefined => {\n    const parsed = fullName != null ? parseName(fullName) : undefined;\n    return parsed != null ? ProgramExerciseSwap_identity(parsed, state.storage.settings) : undefined;\n  };\n\n  // Asked when the exercise changes — before the picker, or on Apply — rather than at save,\n  // where the user has long moved on. Kept here because the body remounts.\n  const swapScopeRef = useRef<IProgramExerciseSwapScope | undefined>(undefined);\n  const askSwapScope = async (declarations: number): Promise<IProgramExerciseSwapScope | undefined> => {\n    const choice = await Dialog_choice(\n      \"Change exercise\",\n      `This exercise is set up separately on ${declarations} days of this program.`,\n      [\"Change only this day\", \"Change across whole program\"]\n    );\n    if (choice == null) {\n      return undefined;\n    }\n    swapScopeRef.current = choice === 0 ? \"one\" : \"all\";\n    return swapScopeRef.current;\n  };\n  const requestSwapScope = async (isLadder: boolean): Promise<IProgramExerciseSwapScope | undefined> => {\n    const declarations = Math.max(instances.length, 1);\n    const scope = ProgramExerciseSwap_scope(isLadder, declarations, swapScopeRef.current);\n    return scope === \"ask\" ? askSwapScope(declarations) : scope;\n  };\n\n  // The pill knows a swap is coming before the picker opens; freeform only knows once the\n  // text is applied, so there the question is asked on Apply.\n  const onBeforeChangeExercise = async (): Promise<boolean> => {\n    // The picked exercise isn't known yet, but an exercise that is already a ladder can only\n    // be changed as one, so that is enough to know the question doesn't apply.\n    const isLadder = (currentExercise?.exerciseVariations?.length ?? 0) > 1;\n    return (await requestSwapScope(isLadder)) != null;\n  };\n\n  const onBeforeApply = async (text: string): Promise<boolean> => {\n    if (currentDeclaration == null) {\n      return true;\n    }\n    const { localBlurb } = ProgramExerciseText_split(text.trim(), sharedSections);\n    const swap = detectSwap(localBlurb.trim(), currentDeclaration);\n    if (swap == null) {\n      return true;\n    }\n    return (await requestSwapScope(swap.isLadder)) != null;\n  };\n\n  // The label notice comes last so it does not compete with the remap confirmation for the screen.\n  const onDone = async (newText: string): Promise<void> => {\n    onDraftText(newText);\n    if (params == null) {\n      onClose();\n      return;\n    }\n    // From the edit ref, not the render's memo: a panel write flushed by this same Save is in the\n    // ref already and reaches `program` only on the next render.\n    const liveProgram =\n      resolved?.planner != null\n        ? { ...resolved, planner: editRef.current.pendingPlanner ?? resolved.planner }\n        : undefined;\n    let decision = ExerciseLiftoEditorSave_decide({\n      program: liveProgram,\n      target: editTarget,\n      draft: editRef.current.draft,\n      hasPendingPlanner: editRef.current.pendingPlanner != null,\n      isFromWorkout,\n      hasEditorDraft: liveProgram != null && state.editProgramStates[liveProgram.id] != null,\n      progress: Progress_getCurrentProgress(state),\n      cachedScope: swapScopeRef.current,\n      settings,\n      detectSwap,\n    });\n    if (decision.kind === \"askScope\") {\n      const scope = await askSwapScope(decision.declarations);\n      if (scope == null) {\n        return;\n      }\n      decision = ExerciseLiftoEditorSave_withScope(decision.prepared, scope);\n    }\n    if (decision.kind === \"close\") {\n      onClose();\n      return;\n    }\n    if (decision.kind === \"alert\") {\n      Dialog_alert(decision.message);\n      if (decision.closes) {\n        onClose();\n      }\n      return;\n    }\n    const plan = decision.plan;\n    const remapAccepted =\n      plan.remap != null && (!plan.remap.needsConfirmation || (await Dialog_confirm(plan.remap.question)));\n    updateState(dispatch, ExerciseLiftoEditorSave_lenses(plan, remapAccepted), plan.description);\n    if (plan.labelNotice != null) {\n      Dialog_alert(plan.labelNotice);\n    }\n    onClose();\n  };\n\n  const foldOptions = (): IExerciseDraftToProgramOptions => ({\n    swapScope: swapScopeRef.current ?? \"all\",\n    detectSwap,\n  });\n\n  const analyzeText = (newText: string, options: { withPreview: boolean }): IExerciseLiftoEditorSheetAnalysis =>\n    ExerciseDraftToProgram_analyze(snapshot, editRef.current.draft, newText, foldOptions(), options.withPreview);\n\n  const applyPreview = (panelText: string): { blurb: string } | { error: IExerciseLiftoEditorSheetLiveError } => {\n    if (snapshot == null) {\n      return { error: { message: \"There's nothing to write here yet.\" } };\n    }\n    const written = ExerciseDraftToProgram_writePreview(snapshot, editRef.current.draft, panelText, foldOptions());\n    if (\"error\" in written) {\n      return written;\n    }\n    // Removing an inherited value writes a program equal to the current one, and that is not\n    // unsaved work.\n    if (!written.unchanged) {\n      editRef.current.draft = written.draft;\n      setPending(written.planner);\n      setIsSharedVisible(false);\n      setBodyText(written.blurb);\n    }\n    return { blurb: written.blurb };\n  };\n\n  // The local line only: shared sections are noise most of the time, so the body splices them\n  // in on request rather than the sheet opening with them.\n  // bodyText is whatever the shared-sections toggle last composed; without it, the plain local\n  // line. Either way it is exactly what the body is mounted with, so it doubles as the baseline\n  // the close guard compares the draft against.\n  // Never a stand-in for a declaration that couldn't be found — that case doesn't reach the editor\n  // at all now (see the guard below the hooks); blurbTextFor's \"\" only keeps it total.\n  const initialText = bodyText ?? currentBlurbText;\n  // A pending whole-program rewrite counts: it is unsaved work even when the line on screen is\n  // back to matching the program, which is exactly what re-projecting leaves behind. Without it\n  // Done would take the \"nothing changed\" exit and drop the rewrite on the floor.\n  const panelPendingRef = useRef(false);\n  const isDirty = (): boolean =>\n    ExerciseLiftoEditorDraft_isDirty(editRef.current.draft) ||\n    editRef.current.pendingPlanner != null ||\n    panelPendingRef.current;\n  const isDirtyRef = useRef(isDirty);\n  isDirtyRef.current = isDirty;\n\n  const shouldClose = async (): Promise<boolean> => {\n    if (isDirty() && !(await Dialog_confirm(\"Discard unsaved changes to this exercise?\"))) {\n      return false;\n    }\n    allowCloseRef.current = true;\n    return true;\n  };\n\n  // The sheet containers guard their own close affordances via shouldClose; this covers\n  // the paths that pop the route directly, like the Android hardware back button.\n  useEffect(() => {\n    return navigation.addListener(\"beforeRemove\", (e) => {\n      if (allowCloseRef.current || !isDirtyRef.current()) {\n        return;\n      }\n      e.preventDefault();\n      Dialog_confirm(\"Discard unsaved changes to this exercise?\").then((confirmed) => {\n        if (confirmed) {\n          allowCloseRef.current = true;\n          navigation.dispatch(e.data.action);\n        }\n      });\n    });\n  }, [navigation]);\n\n  const dayData = activeDayData ?? params?.dayData;\n  const headerLabel = dayData != null ? instanceLabel(evaluatedProgram, dayData) : \"Week 1 · Day 1\";\n  const instanceOptions: IExerciseLiftoEditorSheetInstanceOption[] = instances.map((e) => ({\n    dayData: e.dayData,\n    label: instanceLabel(evaluatedProgram, e.dayData),\n    isSelected: dayData != null && e.dayData.week === dayData.week && e.dayData.dayInWeek === dayData.dayInWeek,\n  }));\n  const exerciseFullNames =\n    evaluatedProgram != null\n      ? Array.from(new Set(Program_getAllProgramExercises(evaluatedProgram).map((e) => e.fullName)))\n      : [];\n  const reuseCandidates: ILiftoEditorReuseCandidates | undefined =\n    evaluatedProgram != null && exerciseKey != null && currentExercise != null && dayData != null\n      ? LiftoEditorReuse_candidates(exerciseKey, !!currentExercise.notused, evaluatedProgram, dayData)\n      : undefined;\n  // Resolved per press against the draft's program: the reuse target comes from the live text,\n  // so it can name an exercise this declaration didn't reuse when the sheet opened.\n  const stateVarsFor = (target: ILiftoEditorStateVarsTarget): ILiftoEditorStateVarsContext =>\n    LiftoEditorStateVars_contextFor(\n      target,\n      currentExercise,\n      evaluatedProgram != null ? Program_getAllProgramExercises(evaluatedProgram) : [],\n      settings\n    );\n  const pickerData: ILiftoEditorExercisePickerModalData | undefined =\n    evaluatedProgram != null && params != null && currentExercise != null && dayData != null\n      ? {\n          exerciseType: currentExercise.exerciseType,\n          label: currentExercise.label,\n          templateName: currentExercise.exerciseType == null ? currentExercise.name : undefined,\n          evaluatedProgram,\n          dayData,\n          // This declaration's own slot doesn't conflict with itself, and the program still\n          // holds whatever it had when the sheet opened — so without this, swapping away from\n          // an exercise makes it impossible to swap back to.\n          excludeUsedExerciseTypes: currentExercise.exerciseType != null ? [currentExercise.exerciseType] : undefined,\n        }\n      : undefined;\n\n  // Nothing to edit, so nothing that looks like an editor. A lookup that fails here is always a bug\n  // or a stale navigation — the key was renamed, the program moved underneath, the caller resolved\n  // against the wrong copy — and the failure mode that matters is the plausible one: a sheet that\n  // opens on *something* reads as the user's program until they notice it isn't. Both save paths\n  // already refuse when this is null, so an editor here could only ever take input and drop it.\n  if (currentDeclaration == null) {\n    return (\n      <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n        <TransparentModal onClose={onClose} fitContent={true}>\n          <View className=\"items-center px-6 py-8\">\n            <Text className=\"text-base font-bold text-center text-text-primary\">\n              Couldn't find this exercise in the program\n            </Text>\n            <Text className=\"mt-2 text-sm text-center text-text-secondary\">\n              It may have been renamed or removed since this screen was opened.\n            </Text>\n          </View>\n        </TransparentModal>\n      </SheetScreenContainer>\n    );\n  }\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldClose={shouldClose} shouldShowClose={true}>\n      <TransparentModal\n        onClose={onClose}\n        shouldClose={shouldClose}\n        fitContent={true}\n        safeAreaContent={\n          // In freeform mode swipes are off and the user is already typing, so the hint\n          // would be wrong there.\n          Platform.OS !== \"web\" && editorMode === \"structured\" ? (\n            // Solid rounded chip: the keypad slides in underneath the hint, and without a\n            // background it would show through the letters mid-animation.\n            <View className=\"self-center rounded-lg bg-background-default p-1 px-2\">\n              <Text className=\"text-xs text-center text-text-secondary\">{LiftoEditorHints_gestures}</Text>\n            </View>\n          ) : undefined\n        }\n      >\n        <CustomKeyboardProvider applySafeAreaBottom={false} fitContent={true} noShadow={true}>\n          <LiftoEditorFocusProvider>\n            <ExerciseLiftoEditorSheet\n              // The controller reads initialText only once, so switching instance or revealing the\n              // shared sections has to remount it. Keyed on nothing but the counter those two bump:\n              // the day is derived from the program now, and a program rebased underneath must\n              // never be able to remount the editor out from under what the user has typed.\n              key={remountKey}\n              initialText={initialText}\n              headerLabel={headerLabel}\n              instances={instanceOptions}\n              sharedProperties={sharedProperties(sharedSections)}\n              isSharedVisible={isSharedVisible}\n              onToggleShared={onToggleShared}\n              onSharedHidden={onSharedHidden}\n              onSelectInstance={onSelectInstance}\n              onTextChange={(text) => {\n                onDraftText(text);\n              }}\n              onModeChange={setEditorMode}\n              exerciseFullNames={exerciseFullNames}\n              pickerData={pickerData}\n              exerciseFor={exerciseFor}\n              onEditReuse={onEditReuse}\n              onEditAcrossProgram={onEditAcrossProgram}\n              reuseCandidates={reuseCandidates}\n              stateVarsFor={stateVarsFor}\n              analyzeText={analyzeText}\n              analysisRevision={analysisRevision}\n              applyPreview={applyPreview}\n              onPanelPendingChange={(isPending) => {\n                panelPendingRef.current = isPending;\n              }}\n              onBeforeChangeExercise={onBeforeChangeExercise}\n              onBeforeApply={onBeforeApply}\n              onDone={onDone}\n            />\n          </LiftoEditorFocusProvider>\n        </CustomKeyboardProvider>\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { Button } from \"../../components/button\";\nimport { ExercisePickerOptionsMuscles } from \"../../components/exercisePicker/exercisePickerOptionsMuscles\";\nimport { IMuscle } from \"../../types\";\nimport { useModalData, useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\n\nexport function NavModalExerciseMusclesPicker(): JSX.Element {\n  const { state } = useAppState();\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"exerciseMusclesPickerModal\");\n  const [selectedMuscles, setSelectedMuscles] = useState<IMuscle[]>(data?.selectedMuscles ?? []);\n\n  const onClose = (): void => {\n    Modal_setResult(modalDispatch, \"exerciseMusclesPickerModal\", selectedMuscles);\n    Modal_clear(modalDispatch, \"exerciseMusclesPickerModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  const header = (\n    <View collapsable={false} className=\"flex-row items-center py-4\">\n      <Text className=\"flex-1 text-base font-semibold leading-scaled-6 text-center\">{data.title}</Text>\n      <View className=\"absolute right-4\">\n        <Button\n          kind=\"purple\"\n          data-testid=\"done-selecting-muscles\"\n          testID=\"done-selecting-muscles\"\n          name=\"done-selecting-muscles\"\n          buttonSize=\"md\"\n          onPress={onClose}\n        >\n          Done\n        </Button>\n      </View>\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet header={header}>\n        <ExercisePickerOptionsMuscles\n          selectedValues={selectedMuscles}\n          onSelect={(muscle) => {\n            setSelectedMuscles((prev) => {\n              const current = new Set(prev);\n              if (current.has(muscle)) {\n                current.delete(muscle);\n              } else {\n                current.add(muscle);\n              }\n              return Array.from(current).sort();\n            });\n          }}\n          settings={state.storage.settings}\n        />\n      </FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { ExercisePickerContent } from \"../../components/exercisePicker/bottomSheetExercisePicker\";\nimport {\n  Progress_lbProgress,\n  Progress_isCurrent,\n  Progress_forceUpdateEntryIndex,\n  Progress_addExercise,\n  Progress_changeExercise,\n} from \"../../models/progress\";\nimport {\n  Program_getFullProgram,\n  Program_evaluate,\n  Program_fullProgram,\n  Program_isEmpty,\n  Program_getProgramExerciseByTypeWeekAndDay,\n  Program_nextHistoryEntry,\n  Program_getDayData,\n} from \"../../models/program\";\nimport {\n  Settings_toggleStarredExercise,\n  Settings_changePickerSettings,\n  Settings_addRecentSwap,\n} from \"../../models/settings\";\nimport { Exercise_handleCustomExerciseChange } from \"../../models/exercise\";\nimport { updateState, updateProgress } from \"../../models/state\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { buildCustomDispatch } from \"../../ducks/types\";\nimport { Thunk_postevent } from \"../../ducks/thunks\";\nimport { ICustomExercise, IExercisePickerSelectedExercise, IHistoryRecord } from \"../../types\";\nimport { lb } from \"lens-shmens\";\nimport type { IRootStackParamList } from \"../types\";\nimport type { IExercisePickerSettings } from \"../../components/exercisePicker/exercisePickerSettings\";\n\nexport function NavModalExercisePicker(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"exercisePickerModal\";\n    params: IRootStackParamList[\"exercisePickerModal\"];\n  }>();\n  const { progressId } = route.params;\n\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const exercisePickerState = progress?.ui?.exercisePicker?.state;\n\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getFullProgram(state, state.storage.currentProgramId) : undefined;\n  const program =\n    progress && Progress_isCurrent(progress)\n      ? Program_getFullProgram(state, progress.programId) ||\n        (currentProgram ? Program_fullProgram(currentProgram, state.storage.settings) : undefined)\n      : undefined;\n  const evaluatedProgram = program ? Program_evaluate(program, state.storage.settings) : undefined;\n  const evaluatedCurrentProgram =\n    Program_isEmpty(evaluatedProgram) && currentProgram\n      ? Program_evaluate(currentProgram, state.storage.settings)\n      : evaluatedProgram;\n\n  const pickerDispatch = useMemo(\n    () => buildCustomDispatch(dispatch, Progress_lbProgress(progressId).pi(\"ui\", {}).pi(\"exercisePicker\").pi(\"state\")),\n    [dispatch, progressId]\n  );\n\n  const settingsRef = useRef(state.storage.settings);\n  settingsRef.current = state.storage.settings;\n  const statsRef = useRef(state.storage.stats);\n  statsRef.current = state.storage.stats;\n  const historyRef = useRef(state.storage.history);\n  historyRef.current = state.storage.history;\n  const programRef = useRef(program);\n  programRef.current = program;\n  const evaluatedCurrentProgramRef = useRef(evaluatedCurrentProgram);\n  evaluatedCurrentProgramRef.current = evaluatedCurrentProgram;\n  const progressRef = useRef(progress);\n  progressRef.current = progress;\n  const exercisePickerStateRef = useRef(exercisePickerState);\n  exercisePickerStateRef.current = exercisePickerState;\n\n  const clearExercisePicker = useCallback((): void => {\n    updateState(\n      dispatch,\n      [Progress_lbProgress(progressId).pi(\"ui\", {}).p(\"exercisePicker\").record(undefined)],\n      \"Close exercise picker\"\n    );\n  }, [dispatch, progressId]);\n  useClearOnModalRemove(clearExercisePicker);\n\n  const onClose = useCallback((): void => {\n    navigation.goBack();\n  }, [navigation]);\n\n  const onChoose = useCallback(\n    (selectedExercises: IExercisePickerSelectedExercise[]) => {\n      const currentProgress = progressRef.current;\n      const currentPickerState = exercisePickerStateRef.current;\n      const currentSettings = settingsRef.current;\n      const currentEvaluatedProgram = evaluatedCurrentProgramRef.current;\n      if (!currentProgress || !currentPickerState) {\n        return;\n      }\n      for (const exercise of selectedExercises) {\n        if (exercise.type === \"adhoc\") {\n          if (currentPickerState.entryIndex == null) {\n            Progress_addExercise(dispatch, exercise.exerciseType, currentProgress.entries.length);\n          } else {\n            const previousExercise = currentProgress.entries[currentPickerState.entryIndex]?.exercise;\n            if (previousExercise != null) {\n              Settings_addRecentSwap(dispatch, previousExercise, exercise.exerciseType);\n            }\n            Progress_changeExercise(\n              dispatch,\n              currentSettings,\n              historyRef.current,\n              currentEvaluatedProgram,\n              currentProgress.id,\n              exercise.exerciseType,\n              currentPickerState.entryIndex,\n              !!currentSettings.workoutSettings.shouldKeepProgramExerciseId\n            );\n          }\n        } else if (exercise.type === \"program\" && currentEvaluatedProgram) {\n          const programExercise = Program_getProgramExerciseByTypeWeekAndDay(\n            currentEvaluatedProgram,\n            exercise.exerciseType,\n            exercise.week,\n            exercise.dayInWeek\n          );\n          if (programExercise && programExercise.exerciseType) {\n            if (currentPickerState.entryIndex == null) {\n              const newEntryIndex = currentProgress.entries.length;\n              updateProgress(\n                dispatch,\n                [\n                  lb<IHistoryRecord>()\n                    .p(\"entries\")\n                    .recordModify((entries) => {\n                      const nextHistoryEntry = Program_nextHistoryEntry(\n                        currentEvaluatedProgram,\n                        Program_getDayData(currentEvaluatedProgram, currentEvaluatedProgram.nextDay),\n                        entries.length,\n                        { ...programExercise, exerciseType: exercise.exerciseType },\n                        statsRef.current,\n                        currentSettings\n                      );\n                      return [...entries, nextHistoryEntry].map((e, i) => ({ ...e, index: i }));\n                    }),\n                  lb<IHistoryRecord>().p(\"currentEntryIndex\").record(newEntryIndex),\n                ],\n                \"add-exercise\"\n              );\n            } else {\n              const nextHistoryEntry = Program_nextHistoryEntry(\n                currentEvaluatedProgram,\n                Program_getDayData(currentEvaluatedProgram, currentEvaluatedProgram.nextDay),\n                currentPickerState.entryIndex,\n                { ...programExercise, exerciseType: exercise.exerciseType },\n                statsRef.current,\n                currentSettings\n              );\n              updateProgress(\n                dispatch,\n                [lb<IHistoryRecord>().p(\"entries\").i(currentPickerState.entryIndex).record(nextHistoryEntry)],\n                \"change-program-exercise\"\n              );\n            }\n          }\n        }\n      }\n      if (selectedExercises.length > 0) {\n        if (currentPickerState.entryIndex == null) {\n          dispatch(Thunk_postevent(\"workout-add-exercise\", { count: selectedExercises.length }));\n        } else {\n          dispatch(Thunk_postevent(\"workout-swap-exercise\"));\n        }\n      }\n      setTimeout(() => {\n        Progress_forceUpdateEntryIndex(dispatch);\n      }, 0);\n      navigation.goBack();\n    },\n    [dispatch, navigation]\n  );\n\n  const onChangeCustomExercise = useCallback(\n    (action: \"upsert\" | \"delete\", exercise: ICustomExercise, notes?: string) => {\n      Exercise_handleCustomExerciseChange(dispatch, action, exercise, notes, settingsRef.current, programRef.current);\n    },\n    [dispatch]\n  );\n\n  const onStar = useCallback((key: string) => Settings_toggleStarredExercise(dispatch, key), [dispatch]);\n  const onChangeSettings = useCallback(\n    (pickerSettings: IExercisePickerSettings) => Settings_changePickerSettings(dispatch, pickerSettings),\n    [dispatch]\n  );\n\n  const entries = progress?.entries;\n  const usedExerciseTypes = useMemo(() => (entries ? entries.map((e) => e.exercise) : []), [entries]);\n\n  const shouldGoBack = !progress || !exercisePickerState;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <SheetScreenContainer onClose={onClose}>\n      <TransparentModal onClose={onClose}>\n        <ExercisePickerContent\n          settings={state.storage.settings}\n          isLoggedIn={!!state.user?.id}\n          exercisePicker={exercisePickerState}\n          usedExerciseTypes={usedExerciseTypes}\n          evaluatedProgram={evaluatedCurrentProgram}\n          dispatch={pickerDispatch}\n          onChoose={onChoose}\n          onChangeCustomExercise={onChangeCustomExercise}\n          onStar={onStar}\n          onChangeSettings={onChangeSettings}\n          onClose={onClose}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { PlannerExerciseStats } from \"../../pages/planner/components/plannerExerciseStats\";\nimport { IState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { PlannerProgram_evaluate } from \"../../pages/planner/models/plannerProgram\";\nimport { navigateToModal } from \"../navigationService\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalExerciseStats(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"exerciseStatsModal\";\n    params: IRootStackParamList[\"exerciseStatsModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const focusedExercise = plannerState?.ui?.focusedExercise;\n  const planner = plannerState?.current?.program?.planner;\n  const settings = state.storage.settings;\n  const { evaluatedWeeks } = planner ? PlannerProgram_evaluate(planner, settings) : { evaluatedWeeks: [] };\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"showExerciseStats\").record(undefined), \"Close exercise stats\");\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || !focusedExercise || !plannerState.ui?.showExerciseStats;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <PlannerExerciseStats\n          dispatch={plannerDispatch}\n          settings={settings}\n          evaluatedWeeks={evaluatedWeeks}\n          weekIndex={focusedExercise!.weekIndex}\n          dayIndex={focusedExercise!.dayIndex}\n          exerciseLine={focusedExercise!.exerciseLine}\n          hideSwap={true}\n          onEditMuscleGroupsOverride={(exercise) => {\n            onClose();\n            navigateToModal(\"musclesOverrideModal\", { exerciseType: exercise });\n          }}\n          onEditMuscleGroups={() => {\n            onClose();\n            navigateToModal(\"editMuscleGroupsModal\", { context: \"editProgram\", programId });\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { Button } from \"../../components/button\";\nimport { ExercisePickerOptions, IFilterValue } from \"../../components/exercisePicker/exercisePickerOptions\";\nimport { exerciseKinds, IExerciseKind } from \"../../types\";\nimport { StringUtils_capitalize } from \"../../utils/string\";\nimport { ObjectUtils_keys, ObjectUtils_mapValues } from \"../../utils/object\";\nimport { useModalData, useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\nimport { FormSheet } from \"../FormSheet\";\n\nexport function NavModalExerciseTypesPicker(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"exerciseTypesPickerModal\");\n  const initialTypes = data?.selectedTypes ?? [];\n\n  const [typeValues, setTypeValues] = useState<Record<IExerciseKind, IFilterValue>>(() =>\n    exerciseKinds.reduce<Record<IExerciseKind, IFilterValue>>(\n      (memo, type) => {\n        memo[type] = {\n          label: StringUtils_capitalize(type),\n          isSelected: initialTypes.includes(type),\n        };\n        return memo;\n      },\n      {} as Record<IExerciseKind, IFilterValue>\n    )\n  );\n\n  const onClose = (): void => {\n    const selectedTypes = ObjectUtils_keys(typeValues).filter((k) => typeValues[k].isSelected);\n    Modal_setResult(modalDispatch, \"exerciseTypesPickerModal\", selectedTypes);\n    Modal_clear(modalDispatch, \"exerciseTypesPickerModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  const header = (\n    <View collapsable={false} className=\"flex-row items-center mb-4\">\n      <Text className=\"flex-1 text-base font-semibold leading-scaled-6 text-center\">Types</Text>\n      <View className=\"absolute right-4\">\n        <Button kind=\"purple\" name=\"done-selecting-types\" buttonSize=\"md\" onPress={onClose}>\n          Done\n        </Button>\n      </View>\n    </View>\n  );\n\n  return (\n    <FormSheet header={header}>\n      <ExercisePickerOptions\n        values={typeValues}\n        onSelect={(key) => {\n          setTypeValues(\n            ObjectUtils_mapValues(typeValues, (type: IFilterValue, k: IExerciseKind) => {\n              if (k === key) {\n                return { ...type, isSelected: !type.isSelected };\n              }\n              return type;\n            })\n          );\n        }}\n      />\n    </FormSheet>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalGraphsContent } from \"../../components/modalGraphs\";\nimport { usePerfRenderCount } from \"../../utils/usePerfRenderCount\";\n\nexport function NavModalGraphs(): JSX.Element {\n  usePerfRenderCount(\"NavModalGraphs\");\n  const navigation = useNavigation();\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <ModalGraphsContent isHidden={false} onClose={onClose} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import type { JSX } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { lb } from \"lens-shmens\";\nimport { IState, updateState } from \"../../models/state\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { HearAboutUsSurvey } from \"../../components/hearAboutUs/hearAboutUsSurvey\";\nimport {\n  HearAboutUs_selectSource,\n  HearAboutUs_updatePartial,\n  HearAboutUs_finalize,\n  HearAboutUs_appendRequest,\n  HearAboutUs_markDone,\n  HearAboutUs_logShown,\n  HearAboutUs_skip,\n} from \"../../models/hearAboutUs\";\n\nexport function NavModalHearAboutUs(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const resolutionRef = useRef<\"answered\" | \"later\" | \"dismissed\">(\"dismissed\");\n  const hasResultRef = useRef(false);\n  hasResultRef.current = state.storage.hearAboutUs?.result != null;\n\n  useClearOnModalRemove(() => {\n    updateState(dispatch, [lb<IState>().p(\"showHearAboutUs\").record(false)], \"Close hear-about-us\");\n    const resolution = resolutionRef.current;\n    if (resolution === \"answered\") {\n      return;\n    }\n    if (resolution === \"later\") {\n      HearAboutUs_appendRequest(dispatch);\n      return;\n    }\n    // \"dismissed\" (incl. swipe/back): only stop asking if the user gave us nothing — a chosen source\n    // is already persisted and suppresses future asks on its own.\n    if (!hasResultRef.current) {\n      HearAboutUs_skip(dispatch);\n      HearAboutUs_markDone(dispatch);\n    }\n  });\n\n  useEffect(() => {\n    HearAboutUs_logShown(dispatch);\n  }, [dispatch]);\n\n  return (\n    <ModalScreenContainer onClose={() => navigation.goBack()} isFullWidth>\n      <FormSheet noPadding>\n        <HearAboutUsSurvey\n          context=\"backfill\"\n          variant=\"sheet\"\n          initialAnswer={state.storage.hearAboutUs?.result}\n          onSelectSource={(s) => HearAboutUs_selectSource(dispatch, s)}\n          onChange={(p) => HearAboutUs_updatePartial(dispatch, p)}\n          onComplete={(payload) => {\n            resolutionRef.current = \"answered\";\n            HearAboutUs_finalize(dispatch, payload);\n            navigation.goBack();\n          }}\n          onSkip={() => {\n            resolutionRef.current = \"dismissed\";\n            navigation.goBack();\n          }}\n          onMaybeLater={() => {\n            resolutionRef.current = \"later\";\n            navigation.goBack();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Text } from \"../../components/primitives/text\";\nimport { Link } from \"../../components/link\";\nimport { HelpComponents } from \"../../components/help/helpRegistry\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalHelp(): JSX.Element {\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"helpModal\";\n    params: IRootStackParamList[\"helpModal\"];\n  }>();\n  const { helpKey } = route.params;\n  const Component = HelpComponents[helpKey];\n  const onClose = (): void => navigation.goBack();\n  const insets = useSafeAreaInsets();\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        {Component ? <Component /> : null}\n        <View className=\"w-full h-px mt-4 mb-2 bg-border-neutral\" />\n        <Text className=\"text-sm text-text-secondary\">\n          If you still have questions, or if you encountered a bug, have a feature idea, or just want to share some\n          feedback - don't hesitate to{\" \"}\n          <Link className=\"text-sm\" href=\"mailto:info@liftosaur.com\">\n            contact us\n          </Link>\n          ! Or join our{\" \"}\n          <Link className=\"text-sm\" href=\"https://discord.com/invite/AAh3cvdBRs\">\n            Discord server\n          </Link>{\" \"}\n          and ask your question there.\n        </Text>\n        <View style={{ height: insets.bottom }} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalImportFromLinkContent } from \"../../components/modalImportFromLink\";\nimport { Thunk_importFromLink } from \"../../ducks/thunks\";\n\nexport function NavModalImportFromLink(): JSX.Element {\n  const { dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalImportFromLinkContent\n          onSubmit={(link) => {\n            if (link) {\n              dispatch(Thunk_importFromLink(link));\n            }\n            onClose();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalImportFromOtherAppsContent } from \"../../components/modalImportFromOtherApps\";\n\nexport function NavModalImportFromOtherApps(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ModalImportFromOtherAppsContent settings={state.storage.settings} dispatch={dispatch} onClose={onClose} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View, Pressable } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { useModalData, useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\n\nexport function NavModalInputSelect(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"inputSelectModal\");\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"inputSelectModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  const content = (\n    <View className=\"bg-background-default\">\n      {data.hint && (\n        <View className=\"pt-4 pr-6\">\n          <Text className=\"text-xs text-text-secondary\">{data.hint}</Text>\n        </View>\n      )}\n      <View\n        className=\"flex-col py-2\"\n        data-testid={data.name ? `select-options-${data.name}` : undefined}\n        testID={data.name ? `select-options-${data.name}` : undefined}\n      >\n        {data.emptyLabel != null && (\n          <Pressable\n            data-testid=\"select-option-empty\"\n            testID=\"select-option-empty\"\n            className={`py-2 px-2 ${data.selectedValue == null ? \"bg-background-subtle rounded\" : \"\"}`}\n            onPress={() => {\n              Modal_setResult(modalDispatch, \"inputSelectModal\", \"\");\n              Modal_clear(modalDispatch, \"inputSelectModal\");\n              navigation.goBack();\n            }}\n          >\n            <Text>{data.emptyLabel}</Text>\n          </Pressable>\n        )}\n        {data.values.map(([key, label], i) => (\n          <Pressable\n            data-testid={`select-option-${key}`}\n            testID={`select-option-${key}`}\n            key={key}\n            className={`py-2 px-2 ${key === data.selectedValue ? \"bg-background-subtle rounded\" : \"\"} ${\n              i !== 0 && key !== data.selectedValue ? \"border-t border-border-neutral\" : \"\"\n            }`}\n            onPress={() => {\n              Modal_setResult(modalDispatch, \"inputSelectModal\", key);\n              Modal_clear(modalDispatch, \"inputSelectModal\");\n              navigation.goBack();\n            }}\n          >\n            <Text>{label}</Text>\n          </Pressable>\n        ))}\n      </View>\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { BottomSheetMonthCalendarContent } from \"../../components/bottomSheetMonthCalendar\";\nimport { History_getPersonalRecords } from \"../../models/history\";\nimport { CollectionUtils_sort } from \"../../utils/collection\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { DateUtils_firstDayOfWeekTimestamp } from \"../../utils/date\";\nimport { Progress_isCurrent } from \"../../models/progress\";\n\nexport function NavModalMonthCalendar(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const sortedHistory = useMemo(\n    () =>\n      CollectionUtils_sort(state.storage.history, (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()),\n    [state.storage.history]\n  );\n  const prs = History_getPersonalRecords(sortedHistory);\n\n  const startWeekFromMonday = state.storage.settings.startWeekFromMonday;\n  const firstDayOfWeeks = useMemo(() => {\n    const set = new Set<number>();\n    for (const record of sortedHistory) {\n      if (!Progress_isCurrent(record)) {\n        set.add(DateUtils_firstDayOfWeekTimestamp(record.endTime ?? record.startTime, startWeekFromMonday));\n      }\n    }\n    if (set.size === 0) {\n      set.add(DateUtils_firstDayOfWeekTimestamp(Date.now(), startWeekFromMonday));\n    }\n    return CollectionUtils_sort(Array.from(set));\n  }, [sortedHistory, startWeekFromMonday]);\n\n  const selectedFirstDayOfWeek = firstDayOfWeeks[firstDayOfWeeks.length - 1];\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <TransparentModal onClose={onClose}>\n        <BottomSheetMonthCalendarContent\n          prs={prs}\n          firstDayOfWeeks={firstDayOfWeeks}\n          history={sortedHistory}\n          startWeekFromMonday={startWeekFromMonday}\n          selectedFirstDayOfWeek={selectedFirstDayOfWeek}\n          visibleRecords={sortedHistory.length}\n          onClick={(historyRecord) => {\n            updateState(\n              dispatch,\n              [lb<IState>().p(\"scrollToHistoryRecordId\").record(historyRecord.id)],\n              \"Scroll to history record from calendar\"\n            );\n            onClose();\n          }}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ExercisePickerOptionsMuscles } from \"../../components/exercisePicker/exercisePickerOptionsMuscles\";\nimport { Button } from \"../../components/button\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { lf } from \"lens-shmens\";\nimport { Muscle_getMusclesFromScreenMuscle, Muscle_updateMuscleGroup } from \"../../models/muscle\";\nimport { CollectionUtils_remove } from \"../../utils/collection\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalMuscleGroupMusclePicker(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"muscleGroupMusclePickerModal\";\n    params: IRootStackParamList[\"muscleGroupMusclePickerModal\"];\n  }>();\n  const { muscleGroup } = route.params;\n  const settings = state.storage.settings;\n  const muscles = Muscle_getMusclesFromScreenMuscle(muscleGroup, settings);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const header = (\n    <View className=\"flex-row items-center px-gutter pt-4 pb-3\">\n      <Text className=\"flex-1 text-base font-semibold text-center\">Choose Muscles</Text>\n      <View className=\"absolute right-4\">\n        <Button\n          kind=\"purple\"\n          buttonSize=\"md\"\n          name=\"done-selecting-muscles\"\n          data-testid=\"done-selecting-muscles\"\n          testID=\"done-selecting-muscles\"\n          onClick={onClose}\n        >\n          Done\n        </Button>\n      </View>\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet header={header}>\n        <ExercisePickerOptionsMuscles\n          dontGroup={true}\n          settings={settings}\n          selectedValues={muscles}\n          onSelect={(muscle) => {\n            const existingMuscles = Muscle_getMusclesFromScreenMuscle(muscleGroup, state.storage.settings);\n            const newMuscles = existingMuscles.includes(muscle)\n              ? CollectionUtils_remove(existingMuscles, muscle)\n              : [...existingMuscles, muscle];\n            updateState(\n              dispatch,\n              [\n                lb<IState>()\n                  .p(\"storage\")\n                  .p(\"settings\")\n                  .p(\"muscleGroups\")\n                  .record(\n                    lf(state.storage.settings)\n                      .p(\"muscleGroups\")\n                      .modify((mg) => Muscle_updateMuscleGroup(mg, muscleGroup, newMuscles)).muscleGroups\n                  ),\n              ],\n              \"Update muscle group muscles\"\n            );\n          }}\n        />\n      </FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport {\n  MusclesOverrideList,\n  getInitialMusclesAndMultipliers,\n  getDefaultMusclesAndMultipliersAsObject,\n  getMultiplierValue,\n} from \"../../components/bottomSheetMusclesOverride\";\nimport { Button } from \"../../components/button\";\nimport { LinkButton } from \"../../components/linkButton\";\nimport { ISettings } from \"../../types\";\nimport { updateSettings } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { Exercise_get, Exercise_toKey } from \"../../models/exercise\";\nimport { ObjectUtils_clone, ObjectUtils_isEqual } from \"../../utils/object\";\nimport { useModal } from \"../ModalStateContext\";\nimport { CollectionUtils_sort } from \"../../utils/collection\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalMusclesOverride(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"musclesOverrideModal\";\n    params: IRootStackParamList[\"musclesOverrideModal\"];\n  }>();\n  const { exerciseType } = route.params;\n  const settings = state.storage.settings;\n  const exercise = Exercise_get(exerciseType, settings.exercises);\n\n  const [musclesAndMultipliers, setMusclesAndMultipliers] = useState(\n    getInitialMusclesAndMultipliers(exercise, settings)\n  );\n\n  const openMusclePicker = useModal(\"exerciseMusclesPickerModal\", (selectedMuscles) => {\n    setMusclesAndMultipliers((mms) => {\n      const existing = new Map(mms.map((mm) => [mm.muscle, mm]));\n      const next = selectedMuscles.map((muscle) => existing.get(muscle) ?? { muscle, multiplier: 1 });\n      return CollectionUtils_sort(next, (a, b) => a.muscle.localeCompare(b.muscle));\n    });\n  });\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const onSave = (): void => {\n    const muscleMultipliers: Partial<Record<string, number>> = {};\n    for (const mm of musclesAndMultipliers) {\n      muscleMultipliers[mm.muscle] = getMultiplierValue(mm.multiplier);\n    }\n    const exerciseData = settings.exerciseData;\n    const newExerciseData = ObjectUtils_clone(exerciseData);\n    if (ObjectUtils_isEqual(muscleMultipliers, getDefaultMusclesAndMultipliersAsObject(exercise, settings))) {\n      delete newExerciseData[Exercise_toKey(exercise)];\n    } else {\n      const ed = newExerciseData[Exercise_toKey(exercise)] || {};\n      ed.muscleMultipliers = muscleMultipliers;\n      newExerciseData[Exercise_toKey(exercise)] = ed;\n    }\n    updateSettings(\n      dispatch,\n      lb<ISettings>().p(\"exerciseData\").record(newExerciseData),\n      \"Update exercise muscle override\"\n    );\n    onClose();\n  };\n\n  const header = (\n    <View className=\"flex-row items-center py-4\">\n      <View className=\"items-center flex-1\">\n        <Text className=\"text-base font-semibold leading-scaled-6\">Override Muscles</Text>\n        <LinkButton\n          data-testid=\"toggle-muscle-overrides\"\n          testID=\"toggle-muscle-overrides\"\n          name=\"toggle-muscle-overrides\"\n          className=\"text-xs\"\n          onClick={() =>\n            openMusclePicker({\n              title: \"Toggle Muscles\",\n              name: \"muscle-override-picker\",\n              selectedMuscles: musclesAndMultipliers.map((mm) => mm.muscle),\n            })\n          }\n        >\n          + Add Muscles\n        </LinkButton>\n      </View>\n      <View className=\"absolute right-4\">\n        <Button\n          kind=\"purple\"\n          buttonSize=\"md\"\n          name=\"save-muscle-overrides\"\n          data-testid=\"save-muscle-overrides\"\n          testID=\"save-muscle-overrides\"\n          onPress={onSave}\n        >\n          Save\n        </Button>\n      </View>\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet header={header}>\n        <MusclesOverrideList\n          musclesAndMultipliers={musclesAndMultipliers}\n          setMusclesAndMultipliers={setMusclesAndMultipliers}\n          helps={state.storage.helps}\n          settings={settings}\n          dispatch={dispatch}\n        />\n      </FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalNewEquipmentContent } from \"../../components/modalNewEquipment\";\nimport { IState, updateState } from \"../../models/state\";\nimport { IAllEquipment } from \"../../types\";\nimport { lb } from \"lens-shmens\";\nimport { UidFactory_generateUid } from \"../../utils/generator\";\nimport { Equipment_build } from \"../../models/equipment\";\n\nexport function NavModalNewEquipment(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const selectedGym =\n    state.storage.settings.gyms.find((g) => g.id === state.selectedGymId) ?? state.storage.settings.gyms[0];\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalNewEquipmentContent\n          onClose={onClose}\n          onSelect={(name) => {\n            if (selectedGym) {\n              updateState(\n                dispatch,\n                [\n                  lb<IState>()\n                    .p(\"storage\")\n                    .p(\"settings\")\n                    .p(\"gyms\")\n                    .findBy(\"id\", selectedGym.id)\n                    .p(\"equipment\")\n                    .recordModify((oldEquipment: IAllEquipment) => {\n                      const id = `equipment-${UidFactory_generateUid(8)}`;\n                      return { ...oldEquipment, [id]: Equipment_build(name) };\n                    }),\n                ],\n                \"Add new equipment\"\n              );\n            }\n            onClose();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation, useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalNewFixedWeightContent } from \"../../components/modalNewFixedWeight\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { Weight_build, Weight_eqeq } from \"../../models/weight\";\nimport { IAllEquipment, IEquipment } from \"../../types\";\nimport { equipmentName } from \"../../models/exercise\";\nimport { Equipment_getEquipmentOfGym } from \"../../models/equipment\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalNewFixedWeight(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"newFixedWeightModal\";\n    params: IRootStackParamList[\"newFixedWeightModal\"];\n  }>();\n  const equipment: IEquipment = route.params.equipment;\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const selectedGym =\n    state.storage.settings.gyms.find((g) => g.id === state.selectedGymId) ?? state.storage.settings.gyms[0];\n  const equipmentData = selectedGym?.equipment[equipment];\n  const units = equipmentData?.unit ?? state.storage.settings.units;\n  const allEquipment = Equipment_getEquipmentOfGym(state.storage.settings, state.selectedGymId);\n  const name = equipmentName(equipment, allEquipment);\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalNewFixedWeightContent\n          units={units}\n          name={name}\n          onClose={onClose}\n          onSelect={(value) => {\n            if (selectedGym && equipmentData) {\n              const newWeight = Weight_build(value, units);\n              const existing = equipmentData.fixed.filter((p) => p.unit === units);\n              if (existing.every((p) => !Weight_eqeq(p, newWeight))) {\n                updateState(\n                  dispatch,\n                  [\n                    lb<IState>()\n                      .p(\"storage\")\n                      .p(\"settings\")\n                      .p(\"gyms\")\n                      .findBy(\"id\", selectedGym.id)\n                      .p(\"equipment\")\n                      .recordModify((all: IAllEquipment) => {\n                        const current = all[equipment];\n                        if (!current) {\n                          return all;\n                        }\n                        return { ...all, [equipment]: { ...current, fixed: [...current.fixed, newWeight] } };\n                      }),\n                  ],\n                  \"Add fixed weight\"\n                );\n              }\n            }\n            onClose();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalNewGymContent } from \"../../components/modalNewGym\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { UidFactory_generateUid } from \"../../utils/generator\";\nimport { Settings_defaultEquipment } from \"../../models/settings\";\n\nexport function NavModalNewGym(): JSX.Element {\n  const { dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalNewGymContent\n          onClose={onClose}\n          onSelect={(name) => {\n            updateState(\n              dispatch,\n              [\n                lb<IState>()\n                  .p(\"storage\")\n                  .p(\"settings\")\n                  .p(\"gyms\")\n                  .recordModify((oldGyms) => {\n                    const id = `gym-${UidFactory_generateUid(8)}`;\n                    return [...oldGyms, { vtype: \"gym\" as const, id, name, equipment: Settings_defaultEquipment() }];\n                  }),\n              ],\n              \"Add new gym\"\n            );\n            onClose();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { BottomSheetNextWorkoutContent } from \"../../components/bottomSheetNextWorkout\";\nimport { Program_getProgram } from \"../../models/program\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\n\nexport function NavModalNextWorkout(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const content = (\n    <BottomSheetNextWorkoutContent\n      currentProgram={currentProgram}\n      allPrograms={state.storage.programs}\n      settings={state.storage.settings}\n      stats={state.storage.stats}\n      dispatch={dispatch}\n      onClose={onClose}\n    />\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useState } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { BottomSheetItem } from \"../../components/bottomSheetItem\";\nimport { IconCamera } from \"../../components/icons/iconCamera\";\nimport { IconPicture } from \"../../components/icons/iconPicture\";\nimport { IconSpinner } from \"../../components/icons/iconSpinner\";\nimport { ImagePicker_pick } from \"../../utils/imagePicker\";\nimport { useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\n\nexport function NavModalPhotoPicker(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const [isLoading, setIsLoading] = useState(false);\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"photoPickerModal\");\n    navigation.goBack();\n  };\n\n  const pickPhoto = async (source: \"camera\" | \"photo-library\"): Promise<void> => {\n    setIsLoading(true);\n    const data = await ImagePicker_pick(source);\n    setIsLoading(false);\n    Modal_setResult(modalDispatch, \"photoPickerModal\", data ?? \"\");\n    Modal_clear(modalDispatch, \"photoPickerModal\");\n    navigation.goBack();\n  };\n\n  const content = (\n    <View className=\"pb-4\">\n      <BottomSheetItem\n        title=\"From Camera\"\n        name=\"from-camera\"\n        icon={isLoading ? <IconSpinner width={18} height={18} /> : <IconCamera size={24} />}\n        isFirst={true}\n        description=\"Take a photo\"\n        onClick={() => pickPhoto(\"camera\")}\n      />\n      <BottomSheetItem\n        title=\"From Photo Library\"\n        name=\"from-photo-library\"\n        icon={isLoading ? <IconSpinner width={18} height={18} /> : <IconPicture size={24} />}\n        description=\"Pick photo from your photo library\"\n        onClick={() => pickPhoto(\"photo-library\")}\n      />\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true} fitContent={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalPlannerSettingsContent } from \"../../pages/planner/components/modalPlannerSettings\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb, ILensRecordingPayload } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { navigateToModal } from \"../navigationService\";\nimport type { IRootStackParamList } from \"../types\";\nimport { ISettings } from \"../../types\";\n\nexport function NavModalPlannerSettings(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"plannerSettingsModal\";\n    params: IRootStackParamList[\"plannerSettingsModal\"];\n  }>();\n  const params = route.params;\n  const settings = state.storage.settings;\n\n  const settingsDispatch = useCallback(\n    (recording: ILensRecordingPayload<ISettings> | ILensRecordingPayload<ISettings>[], desc: string): void => {\n      const recordings = Array.isArray(recording) ? recording : [recording];\n      const stateRecordings = recordings.map((r) => r.prepend(lb<IState>().p(\"storage\").p(\"settings\").get()));\n      updateState(dispatch, stateRecordings, desc);\n    },\n    [dispatch]\n  );\n\n  const onClose = (): void => {\n    if (params.context === \"editProgram\") {\n      const plannerState = state.editProgramStates?.[params.programId];\n      if (plannerState) {\n        const plannerDispatch = buildPlannerDispatch(\n          dispatch,\n          lb<IState>().p(\"editProgramStates\").p(params.programId),\n          plannerState\n        );\n        plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"showSettingsModal\").record(false), \"Close settings modal\");\n      }\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = params.context === \"editProgram\" && !state.editProgramStates?.[params.programId];\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <ModalPlannerSettingsContent\n          inApp={true}\n          settings={settings}\n          dispatch={settingsDispatch}\n          onShowEditMuscleGroups={() => {\n            navigateToModal(\"editMuscleGroupsModal\", params);\n          }}\n          onClose={onClose}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation, useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalPlatesContent } from \"../../components/modalPlates\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { Weight_build, Weight_eqeq } from \"../../models/weight\";\nimport { IAllEquipment, IEquipment } from \"../../types\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalPlates(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{ key: string; name: \"newPlateModal\"; params: IRootStackParamList[\"newPlateModal\"] }>();\n  const equipment: IEquipment = route.params.equipment;\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const selectedGym =\n    state.storage.settings.gyms.find((g) => g.id === state.selectedGymId) ?? state.storage.settings.gyms[0];\n  const equipmentData = selectedGym?.equipment[equipment];\n  const units = equipmentData?.unit ?? state.storage.settings.units;\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ModalPlatesContent\n          units={units}\n          onClose={onClose}\n          onSelect={(value) => {\n            if (selectedGym && equipmentData) {\n              const newWeight = Weight_build(value, units);\n              const existingPlates = equipmentData.plates.filter((p) => p.weight.unit === units);\n              if (existingPlates.every((p) => !Weight_eqeq(p.weight, newWeight))) {\n                updateState(\n                  dispatch,\n                  [\n                    lb<IState>()\n                      .p(\"storage\")\n                      .p(\"settings\")\n                      .p(\"gyms\")\n                      .findBy(\"id\", selectedGym.id)\n                      .p(\"equipment\")\n                      .recordModify((all: IAllEquipment) => {\n                        const current = all[equipment];\n                        if (!current) {\n                          return all;\n                        }\n                        return {\n                          ...all,\n                          [equipment]: { ...current, plates: [...current.plates, { weight: newWeight, num: 2 }] },\n                        };\n                      }),\n                  ],\n                  \"Add plate\"\n                );\n              }\n            }\n            onClose();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect, useMemo } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ProgramPreviewPlaygroundExerciseEditContent } from \"../../components/preview/programPreviewPlaygroundExerciseEditModal\";\nimport {\n  Program_evaluate,\n  Program_getProgramExercise,\n  Program_getDayData,\n  Program_stateValue,\n} from \"../../models/program\";\nimport { Exercise_toKey } from \"../../models/exercise\";\nimport { Weight_build } from \"../../models/weight\";\nimport { EditProgramLenses_properlyUpdateStateVariable } from \"../../models/editProgramLenses\";\nimport { PlannerProgramExercise_getState } from \"../../pages/planner/models/plannerProgramExercise\";\nimport { IEvaluatedProgram } from \"../../models/program\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport {\n  playgroundOnProgramChange,\n  playgroundOnSettingsChange,\n} from \"../../components/preview/programPreviewPlayground\";\nimport { IProgramPreviewPlaygroundState } from \"../../components/preview/programPreviewPlaygroundSetup\";\nimport { IPlannerProgramExercise, IPlannerState } from \"../../pages/planner/models/types\";\nimport { ILensDispatch } from \"../../utils/useLensReducer\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { ProgramToPlanner } from \"../../models/programToPlanner\";\nimport type { IRootStackParamList } from \"../types\";\nimport { ISettings } from \"../../types\";\n\nfunction buildGlobalPlaygroundDispatch(\n  globalDispatch: ReturnType<typeof useAppState>[\"dispatch\"]\n): ILensDispatch<IProgramPreviewPlaygroundState> {\n  return (lensRecordings, desc) => {\n    const recordings = Array.isArray(lensRecordings) ? lensRecordings : [lensRecordings];\n    updateState(\n      globalDispatch,\n      recordings.map((lr) =>\n        lb<IState>()\n          .pi(\"playgroundState\")\n          .recordModify((s) => lr.fn(s))\n      ),\n      desc\n    );\n  };\n}\n\nfunction NavModalPlaygroundEditExercisePlayground(props: { weekIndex: number; dayIndex: number }): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const { weekIndex, dayIndex } = props;\n\n  const playgroundState = state.playgroundState;\n  const daySetup = playgroundState?.progresses[weekIndex]?.days[dayIndex];\n  const progress = daySetup?.progress;\n  const editModal = progress?.ui?.editModal;\n  const day = daySetup?.day;\n\n  const evaluatedProgram = playgroundState\n    ? Program_evaluate(playgroundState.program, playgroundState.settings)\n    : undefined;\n\n  const programExercise =\n    editModal && evaluatedProgram && day != null\n      ? Program_getProgramExercise(day, evaluatedProgram, editModal.programExerciseId)\n      : undefined;\n\n  const playgroundDispatch = useMemo(() => buildGlobalPlaygroundDispatch(dispatch), [dispatch]);\n\n  const clearEditModal = useCallback(() => {\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .pi(\"playgroundState\")\n          .pi(\"progresses\")\n          .pi(weekIndex)\n          .p(\"days\")\n          .pi(dayIndex)\n          .p(\"progress\")\n          .pi(\"ui\", {})\n          .p(\"editModal\")\n          .record(undefined),\n      ],\n      \"Close playground edit modal\"\n    );\n  }, [dispatch, weekIndex, dayIndex]);\n\n  useEffect(() => {\n    return () => clearEditModal();\n  }, [clearEditModal]);\n\n  const onClose = (): void => {\n    clearEditModal();\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !playgroundState || !progress || !editModal || !evaluatedProgram || !programExercise;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ProgramPreviewPlaygroundExerciseEditContent\n          programExercise={programExercise!}\n          settings={playgroundState!.settings}\n          onClose={onClose}\n          onEditStateVariable={(stateKey, newValue) => {\n            const dayData = Program_getDayData(evaluatedProgram!, day!);\n            const lensRecording = EditProgramLenses_properlyUpdateStateVariable(\n              lb<IEvaluatedProgram>()\n                .p(\"weeks\")\n                .i(dayData.week - 1)\n                .p(\"days\")\n                .i(dayData.dayInWeek - 1)\n                .p(\"exercises\")\n                .find((e) => e.key === editModal!.programExerciseId),\n              {\n                [stateKey]: Program_stateValue(PlannerProgramExercise_getState(programExercise!), stateKey, newValue),\n              }\n            );\n            const newEvalProgram = lensRecording.reduce((acc, lens) => lens.fn(acc), evaluatedProgram!);\n            playgroundOnProgramChange(playgroundDispatch, newEvalProgram, state.storage.stats, playgroundState!);\n          }}\n          onEditVariable={(variableKey, newValue) => {\n            if (!programExercise!.exerciseType) {\n              return;\n            }\n            const exerciseType = Exercise_toKey(programExercise!.exerciseType);\n            const currentSettings = playgroundState!.settings;\n            const newSettings = {\n              ...currentSettings,\n              exerciseData: {\n                ...currentSettings.exerciseData,\n                [exerciseType]: {\n                  ...currentSettings.exerciseData[exerciseType],\n                  [variableKey]: Weight_build(newValue, currentSettings.units),\n                },\n              },\n            };\n            playgroundOnSettingsChange(playgroundDispatch, newSettings, state.storage.stats, evaluatedProgram!);\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n\nfunction NavModalPlaygroundEditExercisePreview(props: { programId: string }): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const { programId } = props;\n  const settings = state.storage.settings;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const previewExerciseModal = plannerState?.ui?.previewExerciseModal;\n  const programExercise = previewExerciseModal?.plannerExercise;\n  const day = previewExerciseModal?.day;\n\n  const evaluatedProgram = plannerState ? Program_evaluate(plannerState.current.program, settings) : undefined;\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(\n        lb<IPlannerState>().pi(\"ui\").p(\"previewExerciseModal\").record(undefined),\n        \"Close preview exercise modal\"\n      );\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || !programExercise || !evaluatedProgram || day == null;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <NavModalPreviewExerciseEditContent\n      programExercise={programExercise!}\n      settings={settings}\n      evaluatedProgram={evaluatedProgram!}\n      day={day!}\n      plannerDispatch={plannerDispatch}\n      onClose={onClose}\n    />\n  );\n}\n\nfunction NavModalPreviewExerciseEditContent(props: {\n  programExercise: IPlannerProgramExercise;\n  settings: ISettings;\n  evaluatedProgram: IEvaluatedProgram;\n  day: number;\n  plannerDispatch: ILensDispatch<IPlannerState>;\n  onClose: () => void;\n}): JSX.Element {\n  const { programExercise, settings, evaluatedProgram, day, plannerDispatch, onClose } = props;\n  return (\n    <ModalScreenContainer onClose={onClose}>\n      <FormSheet>\n        <ProgramPreviewPlaygroundExerciseEditContent\n          hideVariables={true}\n          programExercise={programExercise}\n          settings={settings}\n          onClose={onClose}\n          onEditStateVariable={(stateKey, newValue) => {\n            const dayData = Program_getDayData(evaluatedProgram, day);\n            const lensRecording = EditProgramLenses_properlyUpdateStateVariable(\n              lb<IEvaluatedProgram>()\n                .p(\"weeks\")\n                .i(dayData.week - 1)\n                .p(\"days\")\n                .i(dayData.dayInWeek - 1)\n                .p(\"exercises\")\n                .find((e) => e.key === programExercise.key),\n              {\n                [stateKey]: Program_stateValue(PlannerProgramExercise_getState(programExercise), stateKey, newValue),\n              }\n            );\n            const newEvaluatedProgram = lensRecording.reduce((acc, lens) => lens.fn(acc), evaluatedProgram);\n            const newPlanner = new ProgramToPlanner(newEvaluatedProgram, settings).convertToPlanner();\n            plannerDispatch(\n              lb<IPlannerState>().p(\"current\").p(\"program\").p(\"planner\").record(newPlanner),\n              \"Update state variables from preview exercise modal\"\n            );\n          }}\n          onEditVariable={() => {}}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n\nexport function NavModalPlaygroundEditExercise(): JSX.Element {\n  const route = useRoute<{\n    key: string;\n    name: \"playgroundEditModal\";\n    params: IRootStackParamList[\"playgroundEditModal\"];\n  }>();\n  const params = route.params;\n\n  if (params.context === \"preview\") {\n    return <NavModalPlaygroundEditExercisePreview programId={params.programId} />;\n  }\n  return <NavModalPlaygroundEditExercisePlayground weekIndex={params.weekIndex} dayIndex={params.dayIndex} />;\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { useAppContext } from \"../../components/appContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { ModalPlannerPictureExportContent } from \"../../pages/planner/components/modalPlannerPictureExport\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalProgramImageExport(): JSX.Element {\n  const { state } = useAppState();\n  const { service } = useAppContext();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"programImageExportModal\";\n    params: IRootStackParamList[\"programImageExportModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const program = plannerState?.current.program;\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !program;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !program) {\n    return <></>;\n  }\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <TransparentModal onClose={onClose}>\n        <ModalPlannerPictureExportContent\n          settings={state.storage.settings}\n          userId={state.user?.id}\n          client={service.client}\n          isChanged={false}\n          program={program}\n          onClose={onClose}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalProgramInfoContent } from \"../../components/modalProgramInfo\";\nimport { Program_cloneProgram, Program_previewProgram } from \"../../models/program\";\nimport { Settings_doesProgramHaveUnset1RMs } from \"../../models/settings\";\nimport { Thunk_postevent, Thunk_pushScreen } from \"../../ducks/thunks\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalProgramInfo(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"programInfoModal\";\n    params: IRootStackParamList[\"programInfoModal\"];\n  }>();\n  const { programId, hasCustomPrograms } = route.params;\n  const settings = state.storage.settings;\n  const program = state.programs.find((p) => p.id === programId);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !program;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  // Per-program browse signal - the list row tap has no durable log, so this is the only way to\n  // see which built-in programs users open vs actually add (see onSelect below).\n  useEffect(() => {\n    if (program?.id) {\n      dispatch(Thunk_postevent(\"program-info-open\", { programId: program.id }));\n    }\n  }, [programId]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <ModalProgramInfoContent\n          program={program!}\n          hasCustomPrograms={hasCustomPrograms}\n          settings={settings}\n          onClose={onClose}\n          onPreview={() => {\n            onClose();\n            setTimeout(() => {\n              Program_previewProgram(dispatch, program!.id, false);\n            }, 50);\n          }}\n          onSelect={() => {\n            if (program?.id) {\n              dispatch(Thunk_postevent(\"program-clone\", { programId: program.id }));\n            }\n            Program_cloneProgram(dispatch, program!, settings);\n            onClose();\n            setTimeout(() => {\n              if (Settings_doesProgramHaveUnset1RMs(program!, settings)) {\n                dispatch(Thunk_pushScreen(\"onerms\"));\n              } else {\n                dispatch(Thunk_pushScreen(\"main\", undefined, { tab: \"home\" }));\n              }\n            }, 50);\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalProgramNextDayContent } from \"../../components/modalProgramNextDay\";\nimport { Program_getProgram } from \"../../models/program\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalProgramNextDay(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"programNextDayModal\";\n    params: IRootStackParamList[\"programNextDayModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const program = Program_getProgram(state, programId);\n  const plannerState = state.editProgramStates?.[programId];\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  if (!program) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <ModalProgramNextDayContent\n          stats={state.storage.stats}\n          initialCurrentProgramId={program.id}\n          allPrograms={[program]}\n          settings={state.storage.settings}\n          onSelect={(_, day) => {\n            updateState(\n              dispatch,\n              [lb<IState>().p(\"storage\").p(\"programs\").findBy(\"id\", program.id).p(\"nextDay\").record(day)],\n              `Select program day ${program.name} - ${day}`\n            );\n            if (plannerState) {\n              const plannerDispatch = buildPlannerDispatch(\n                dispatch,\n                lb<IState>().p(\"editProgramStates\").p(programId),\n                plannerState\n              );\n              plannerDispatch(\n                [lb<IPlannerState>().p(\"current\").p(\"program\").p(\"nextDay\").record(day)],\n                `Select program day ${program.name} - ${day}`\n              );\n            }\n          }}\n          onClose={onClose}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect, useMemo } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { useAppContext } from \"../../components/appContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { TransparentModal } from \"../TransparentModal\";\nimport { ModalPlannerProgramRevisionsContent } from \"../../pages/planner/modalPlannerProgramRevisions\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { IState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { PlannerProgram_evaluateText } from \"../../pages/planner/models/plannerProgram\";\nimport type { IRootStackParamList } from \"../types\";\nimport { Service_adminTarget } from \"../../api/service\";\n\nexport function NavModalProgramRevisions(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const { service } = useAppContext();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"programRevisionsModal\";\n    params: IRootStackParamList[\"programRevisionsModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const revisions = (state.revisions || {})[programId] || [];\n\n  const plannerDispatch = useMemo(() => {\n    if (!plannerState) {\n      return undefined;\n    }\n    return buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState);\n  }, [dispatch, programId, plannerState]);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || revisions.length === 0;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !plannerState || !plannerDispatch) {\n    return <></>;\n  }\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <TransparentModal onClose={onClose}>\n        <ModalPlannerProgramRevisionsContent\n          programId={programId}\n          client={service.client}\n          revisions={revisions}\n          admin={Service_adminTarget(state.adminKey, state.user?.id)}\n          onClose={onClose}\n          onRestore={(text) => {\n            window.isUndoing = true;\n            const weeks = PlannerProgram_evaluateText(text);\n            plannerDispatch(\n              lb<IPlannerState>().p(\"current\").p(\"program\").pi(\"planner\").p(\"weeks\").record(weeks),\n              \"stop-is-undoing\"\n            );\n            onClose();\n          }}\n        />\n      </TransparentModal>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { useModalData, useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\nimport { RepMaxCalculator } from \"../../components/repMaxCalculator\";\n\nexport function NavModalRepMaxCalculator(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"repMaxCalculatorModal\");\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"repMaxCalculatorModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <View data-testid=\"modal-rep-max-calculator\" testID=\"modal-rep-max-calculator\">\n          <RepMaxCalculator\n            backLabel=\"Back\"\n            unit={data.unit}\n            onSelect={(weightValue) => {\n              if (weightValue != null) {\n                Modal_setResult(modalDispatch, \"repMaxCalculatorModal\", weightValue);\n              }\n              Modal_clear(modalDispatch, \"repMaxCalculatorModal\");\n              navigation.goBack();\n            }}\n          />\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { lb } from \"lens-shmens\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { WeightRoundingInfoContent } from \"../../components/weightRoundingInfo\";\nimport { Progress_getProgressById, Progress_lbProgress } from \"../../models/progress\";\nimport { updateProgress, updateState } from \"../../models/state\";\nimport { buildPlaygroundDispatch, getPlaygroundProgress } from \"./navModalPlaygroundUtils\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { IHistoryRecord } from \"../../types\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalRoundingInfo(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"roundingInfoModal\";\n    params: IRootStackParamList[\"roundingInfoModal\"];\n  }>();\n  const { context } = route.params;\n  const isPlayground = context === \"playground\";\n\n  const settings = isPlayground ? (state.playgroundState?.settings ?? state.storage.settings) : state.storage.settings;\n\n  let progress: IHistoryRecord | undefined;\n  let modalDispatch = dispatch;\n  if (context === \"playground\") {\n    const { weekIndex, dayIndex } = route.params;\n    progress = getPlaygroundProgress(state, weekIndex, dayIndex);\n    modalDispatch = buildPlaygroundDispatch(\n      dispatch,\n      weekIndex,\n      dayIndex,\n      () => getPlaygroundProgress(state, weekIndex, dayIndex),\n      settings,\n      state.storage.stats\n    );\n  } else {\n    progress = Progress_getProgressById(state, route.params.progressId);\n  }\n\n  const roundingModal = progress?.ui?.roundingModal;\n  const entry = roundingModal ? progress?.entries[roundingModal.entryIndex] : undefined;\n  const set = roundingModal ? entry?.sets[roundingModal.setIndex] : undefined;\n\n  const shouldGoBack = roundingModal == null || entry == null || set == null;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  useClearOnModalRemove(() => {\n    if (context === \"playground\") {\n      updateProgress(\n        modalDispatch,\n        [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"roundingModal\").record(undefined)],\n        \"close-rounding-info\"\n      );\n    } else {\n      updateState(\n        dispatch,\n        [Progress_lbProgress(route.params.progressId).pi(\"ui\", {}).p(\"roundingModal\").record(undefined)],\n        \"close-rounding-info\"\n      );\n    }\n  });\n\n  if (shouldGoBack || entry == null || set == null) {\n    return <></>;\n  }\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <WeightRoundingInfoContent set={set} exerciseType={entry.exercise} settings={settings} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { Text } from \"../../components/primitives/text\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { n } from \"../../utils/math\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalSetSplit(): JSX.Element {\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"setSplitModal\";\n    params: IRootStackParamList[\"setSplitModal\"];\n  }>();\n  const { exercises } = route.params;\n\n  return (\n    <ModalScreenContainer onClose={() => navigation.goBack()} shouldShowClose={true}>\n      <FormSheet>\n        <View className=\"py-2\">\n          {exercises.map((exercise) => {\n            const totalSets = exercise.strengthSets + exercise.hypertrophySets;\n            return (\n              <Text\n                key={exercise.exerciseName}\n                className={`font-bold ${exercise.isSynergist ? \"text-text-secondary\" : \"text-text-primary\"}`}\n              >\n                {exercise.exerciseName}: {n(totalSets)} ({n(exercise.strengthSets)}s, {n(exercise.hypertrophySets)}h)\n              </Text>\n            );\n          })}\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { SetTimerBannerContent } from \"../../components/setTimerBanner\";\nimport { Program_evaluate, Program_fullProgram, Program_getProgramExercise } from \"../../models/program\";\nimport { buildPlaygroundDispatch, getPlaygroundProgress } from \"./navModalPlaygroundUtils\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { Progress_getActiveSetTimer } from \"../../models/progress\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalSetTimer(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{ key: string; name: \"setTimerModal\"; params: IRootStackParamList[\"setTimerModal\"] }>();\n  const { context } = route.params;\n  const isPlayground = context === \"playground\";\n\n  // Playground edits (exercise vars, units) live on playgroundState.settings, not the global storage copy — use\n  // it so the dispatch, program evaluation, and display all run against what the user actually sees.\n  const settings = isPlayground ? (state.playgroundState?.settings ?? state.storage.settings) : state.storage.settings;\n\n  let progress: ReturnType<typeof getPlaygroundProgress>;\n  let modalDispatch = dispatch;\n\n  if (context === \"playground\") {\n    const { weekIndex, dayIndex } = route.params;\n    progress = getPlaygroundProgress(state, weekIndex, dayIndex);\n    modalDispatch = buildPlaygroundDispatch(\n      dispatch,\n      weekIndex,\n      dayIndex,\n      () => getPlaygroundProgress(state, weekIndex, dayIndex),\n      settings,\n      // Real stats, not empty — a timed set's completion/auto-fire can run update scripts that read\n      // stats/bodyweight/history (the in-card playground path passes these through too).\n      state.storage.stats\n    );\n  } else {\n    const { progressId } = route.params;\n    progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  }\n\n  const setTimerModal = progress != null ? Progress_getActiveSetTimer(progress) : undefined;\n\n  const evaluatedProgram = isPlayground\n    ? state.playgroundState?.program\n      ? Program_evaluate(Program_fullProgram(state.playgroundState.program, settings), settings)\n      : undefined\n    : undefined;\n  const entry = setTimerModal != null ? progress?.entries[setTimerModal.entryIndex] : undefined;\n  const programExercise =\n    evaluatedProgram && progress\n      ? Program_getProgramExercise(progress.day, evaluatedProgram, entry?.programExerciseId)\n      : undefined;\n\n  useClearOnModalRemove(() => modalDispatch({ type: \"CloseSetTimerAction\", isPlayground }));\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  // Reindexing remaps entryIndex only, so the named set can be gone after a deletion; the banner then\n  // renders null and stops its own tick, stranding an empty sheet. Deliberately checks the set rather than\n  // \"banner rendered null\" — it also renders null under the AMRAP modal, which must stay mounted.\n  const timedSet = entry != null && setTimerModal != null ? entry.sets[setTimerModal.setIndex] : undefined;\n  const shouldGoBack = !progress || !setTimerModal || entry == null || timedSet == null;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !progress || !setTimerModal) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} maxWidth=\"480px\" isFullWidth>\n      <FormSheet>\n        <SetTimerBannerContent\n          progress={progress}\n          settings={settings}\n          setTimerModal={setTimerModal}\n          dispatch={modalDispatch}\n          onClose={onClose}\n          isPlayground={isPlayground}\n          programExercise={programExercise}\n          otherStates={evaluatedProgram?.states}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { lb } from \"lens-shmens\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { SetTimerEditContent } from \"../../components/setTimerEdit\";\nimport { Progress_getProgress } from \"../../models/progress\";\nimport { Exercise_getIsUnilateral } from \"../../models/exercise\";\nimport { updateProgress } from \"../../models/state\";\nimport { buildPlaygroundDispatch, getPlaygroundProgress } from \"./navModalPlaygroundUtils\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { IHistoryRecord } from \"../../types\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalSetTimerEdit(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"setTimerEditModal\";\n    params: IRootStackParamList[\"setTimerEditModal\"];\n  }>();\n  const { context } = route.params;\n  const isPlayground = context === \"playground\";\n\n  const settings = isPlayground ? (state.playgroundState?.settings ?? state.storage.settings) : state.storage.settings;\n\n  let progress: IHistoryRecord | undefined;\n  let modalDispatch = dispatch;\n  if (context === \"playground\") {\n    const { weekIndex, dayIndex } = route.params;\n    progress = getPlaygroundProgress(state, weekIndex, dayIndex);\n    modalDispatch = buildPlaygroundDispatch(\n      dispatch,\n      weekIndex,\n      dayIndex,\n      () => getPlaygroundProgress(state, weekIndex, dayIndex),\n      settings,\n      state.storage.stats\n    );\n  } else {\n    progress = Progress_getProgress(state);\n  }\n\n  const editModal = progress?.ui?.setTimerEditModal;\n  const entry = editModal ? progress?.entries[editModal.entryIndex] : undefined;\n  const set = editModal ? entry?.sets[editModal.setIndex] : undefined;\n\n  const shouldGoBack = editModal == null || set == null;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  useClearOnModalRemove(() =>\n    updateProgress(\n      modalDispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"setTimerEditModal\").record(undefined)],\n      \"close-set-timer-edit\"\n    )\n  );\n\n  if (shouldGoBack || editModal == null || entry == null || set == null) {\n    return <></>;\n  }\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        <SetTimerEditContent\n          set={set}\n          entryIndex={editModal.entryIndex}\n          setIndex={editModal.setIndex}\n          isUnilateral={Exercise_getIsUnilateral(entry.exercise, settings)}\n          dispatch={modalDispatch}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import type { JSX } from \"react\";\nimport { useState } from \"react\";\nimport { View, Image, Platform } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Text } from \"../../components/primitives/text\";\nimport { Button } from \"../../components/button\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { Thunk_log, Thunk_pushScreen } from \"../../ducks/thunks\";\nimport { useClearOnModalRemove } from \"../useClearOnModalRemove\";\nimport { HostConfig_resolveUrl } from \"../../utils/hostConfig\";\n\nexport function NavModalSignupRequest(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const [imageAspect, setImageAspect] = useState(1);\n\n  const lbSaveSignupRequestDate = [\n    lb<IState>().p(\"showSignupRequest\").record(false),\n    lb<IState>()\n      .p(\"storage\")\n      .p(\"signupRequests\")\n      .recordModify((r) => [...r, Date.now()]),\n  ];\n\n  useClearOnModalRemove(() => updateState(dispatch, lbSaveSignupRequestDate, \"Close signup request\"));\n\n  const onClose = (): void => {\n    dispatch(Thunk_log(\"ls-signup-request-close\"));\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} isFullWidth>\n      <FormSheet>\n        <View className=\"items-center\">\n          <Text className=\"pb-4 text-xl font-bold text-center\">Please Sign Up!</Text>\n          <View className=\"mx-8\" style={{ maxWidth: 320, width: \"100%\" }}>\n            <Image\n              source={{ uri: HostConfig_resolveUrl(\"/images/buff-coder-thumbsup.png\") }}\n              style={{ width: \"100%\", aspectRatio: imageAspect }}\n              resizeMode=\"contain\"\n              onLoad={(e) => {\n                const source = (e?.nativeEvent as { source?: { width?: number; height?: number } } | undefined)?.source;\n                if (source?.width && source?.height) {\n                  setImageAspect(source.width / source.height);\n                }\n              }}\n              accessibilityLabel=\"Buff coder showing thumbs up\"\n            />\n          </View>\n          <Text className=\"mt-4 text-center\">\n            You finished <Text className=\"font-bold text-text-error\">{state.storage.history.length} workouts</Text>{\" \"}\n            already! This is awesome! Consider <Text className=\"font-bold\">signing up</Text> so your workout history\n            would be backed up in the cloud.\n          </Text>\n          {Platform.OS === \"ios\" && (\n            <Text className=\"mt-4 text-center\">\n              It's a one-click process via <Text className=\"font-bold\">Sign-in with Apple</Text>.\n            </Text>\n          )}\n          {Platform.OS === \"android\" && (\n            <Text className=\"mt-4 text-center\">\n              It's a quick process via <Text className=\"font-bold\">Sign-in with Google</Text>.\n            </Text>\n          )}\n          <View className=\"flex-row items-center justify-center mt-4\">\n            <Button\n              name=\"modal-signup-request-later\"\n              type=\"button\"\n              kind=\"grayv2\"\n              data-testid=\"modal-signup-request-later\"\n              testID=\"modal-signup-request-later\"\n              className=\"mr-3 ls-signup-request-maybe-later\"\n              onClick={() => {\n                navigation.goBack();\n              }}\n            >\n              Maybe later\n            </Button>\n            <Button\n              name=\"modal-signup-request-submit\"\n              kind=\"purple\"\n              data-testid=\"modal-signup-request-submit\"\n              testID=\"modal-signup-request-submit\"\n              className=\"ls-signup-request-signup\"\n              onClick={() => {\n                dispatch(Thunk_pushScreen(\"account\"));\n                navigation.goBack();\n              }}\n            >\n              Sign up\n            </Button>\n          </View>\n        </View>\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { WorkoutSocialShareSheet } from \"../../components/workoutSocialShareSheet\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalSocialShare(): JSX.Element {\n  const { state } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{ key: string; name: \"socialShareModal\"; params: IRootStackParamList[\"socialShareModal\"] }>();\n  const { type, progressId, historyRecordId } = route.params;\n\n  const record =\n    historyRecordId != null\n      ? state.storage.history.find((h) => h.id === historyRecordId)\n      : progressId == null\n        ? state.storage.history[0]\n        : progressId === 0\n          ? state.storage.progress?.[0]\n          : state.progress[progressId];\n\n  const content = (\n    <WorkoutSocialShareSheet\n      history={state.storage.history}\n      record={record}\n      settings={state.storage.settings}\n      type={type}\n      isHidden={false}\n    />\n  );\n\n  return (\n    <SheetScreenContainer onClose={() => navigation.goBack()} shouldShowClose={true}>\n      <FormSheet noPadding>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { KeyboardSheet } from \"../KeyboardSheet\";\nimport { Modal_clear, Modal_setResult, useModalData, useModalDispatch } from \"../ModalStateContext\";\nimport { LiftoEditorStateVarsSheet } from \"../../components/liftoEditorStateVarsSheet\";\n\nexport function NavModalStateVars(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const { state } = useAppState();\n  const data = useModalData(\"stateVarsModal\");\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"stateVarsModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  return (\n    <KeyboardSheet header=\"State Variables\" onClose={onClose}>\n      <View className=\"px-4 pb-4 bg-background-default\">\n        <LiftoEditorStateVarsSheet\n          entries={data.entries}\n          hasUnparsed={data.hasUnparsed}\n          defaults={data.defaults}\n          defaultsMetadata={data.defaultsMetadata}\n          sourceName={data.sourceName}\n          progressScript={data.progressScript}\n          updateScript={data.updateScript}\n          exerciseType={data.exerciseType}\n          settings={state.storage.settings}\n          onDone={(args) => {\n            Modal_setResult(modalDispatch, \"stateVarsModal\", args);\n            Modal_clear(modalDispatch, \"stateVarsModal\");\n            navigation.goBack();\n          }}\n        />\n      </View>\n    </KeyboardSheet>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { ModalStatsContent } from \"../../components/modalStats\";\n\nexport function NavModalStatsSettings(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <ModalStatsContent isHidden={false} settings={state.storage.settings} dispatch={dispatch} onClose={onClose} />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { View, Image } from \"react-native\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { Text } from \"../../components/primitives/text\";\nimport type { IRootStackParamList } from \"../types\";\nimport { ImagePreloader_uri } from \"../../utils/imagePreloader\";\nimport { SubscriptionInfoImages_get } from \"../../components/subscriptionInfoImages\";\n\ninterface ISectionProps {\n  title: string;\n  description: JSX.Element;\n  imageUri: string;\n  imageAlt: string;\n  aspect: number;\n}\n\nfunction Section(props: ISectionProps): JSX.Element {\n  return (\n    <>\n      <View className=\"px-gutter\">\n        <Text className=\"pt-4 pb-2 text-lg font-bold\">{props.title}</Text>\n        {props.description}\n      </View>\n      <View className=\"items-center\">\n        <Image\n          source={{ uri: ImagePreloader_uri(props.imageUri) }}\n          style={{ width: \"100%\", aspectRatio: props.aspect }}\n          resizeMode=\"contain\"\n          accessibilityLabel={props.imageAlt}\n        />\n      </View>\n    </>\n  );\n}\n\nexport function NavModalSubscriptionInfo(): JSX.Element {\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"subscriptionInfoModal\";\n    params: IRootStackParamList[\"subscriptionInfoModal\"];\n  }>();\n  const { type } = route.params;\n  const image = SubscriptionInfoImages_get(type);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>\n        {type === \"platesCalculator\" && (\n          <Section\n            title=\"Plates Calculator\"\n            imageUri={image.uri}\n            aspect={image.aspect}\n            imageAlt=\"Plates Calculator screenshot\"\n            description={\n              <>\n                <Text className=\"pb-2\">What plates to add to each side of a bar to get the necessary weight</Text>\n                <Text className=\"pb-4\">\n                  E.g. on a screenshot below it says that to get <Text className=\"font-bold\">175lb</Text>, you need to\n                  add <Text className=\"font-bold\">45lb</Text> plate and <Text className=\"font-bold\">2 x 10lb</Text>{\" \"}\n                  plates to the each side of the bar.\n                </Text>\n              </>\n            }\n          />\n        )}\n        {type === \"graphs\" && (\n          <Section\n            title=\"Graphs\"\n            imageUri={image.uri}\n            aspect={image.aspect}\n            imageAlt=\"Graphs screenshot\"\n            description={\n              <Text className=\"pb-4\">\n                Shows graphs of exercises and also bodyweight and measurements. You can overlay bodyweight graph on\n                exercise graphs to see how your bodyweight affected your progress. It can also show calculated 1 rep\n                max, a unified metric of your strength.\n              </Text>\n            }\n          />\n        )}\n        {type === \"notifications\" && (\n          <Section\n            title=\"Rest Timer Notifications\"\n            imageUri={image.uri}\n            aspect={image.aspect}\n            imageAlt=\"Notification screenshot\"\n            description={\n              <Text className=\"pb-4\">\n                When the rest timer runs out, you'll get a notification it's time to start a new set\n              </Text>\n            }\n          />\n        )}\n        {type === \"weekInsights\" && (\n          <Section\n            title=\"Week Insights\"\n            imageUri={image.uri}\n            aspect={image.aspect}\n            imageAlt=\"Week Insights Screenshot\"\n            description={\n              <Text className=\"pb-4\">\n                After each week you'll see how many sets you finished per type, per muscle group, etc, and whether it's\n                within recommended range.\n              </Text>\n            }\n          />\n        )}\n        {type === \"watch\" && (\n          <Section\n            title=\"Apple Watch App\"\n            imageUri={image.uri}\n            aspect={image.aspect}\n            imageAlt=\"Apple Watch app screenshot\"\n            description={\n              <Text className=\"pb-4\">\n                Track your workouts directly from your wrist - log sets, see your next exercise, and run the rest timer\n                without reaching for your phone.\n              </Text>\n            }\n          />\n        )}\n        {type === \"mcp\" && (\n          <Section\n            title=\"API & MCP\"\n            imageUri={image.uri}\n            aspect={image.aspect}\n            imageAlt=\"MCP screenshot\"\n            description={\n              <Text className=\"pb-4\">\n                Give Claude, ChatGPT, or Gemini access to your workouts and programs via MCP. Or use the API to build\n                your own custom integrations.\n              </Text>\n            }\n          />\n        )}\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { useModalData, useModalDispatch, Modal_setResult, Modal_clear } from \"../ModalStateContext\";\nimport { TextInputModalContent } from \"../../components/textInputModalContent\";\n\nexport function NavModalTextInput(): JSX.Element {\n  const navigation = useNavigation();\n  const modalDispatch = useModalDispatch();\n  const data = useModalData(\"textInputModal\");\n\n  const onClose = (): void => {\n    Modal_clear(modalDispatch, \"textInputModal\");\n    navigation.goBack();\n  };\n\n  if (!data) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} zIndex={70}>\n      <FormSheet>\n        <TextInputModalContent\n          data={data}\n          onClose={onClose}\n          onSubmit={(value) => {\n            Modal_setResult(modalDispatch, \"textInputModal\", value);\n            Modal_clear(modalDispatch, \"textInputModal\");\n            navigation.goBack();\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { TourModalContent } from \"../../components/tour/tourModal\";\nimport { IState, updateState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\n\nexport function NavModalTour(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  const stateTour = state.tour;\n\n  const onClose = (): void => {\n    updateState(dispatch, [lb<IState>().p(\"tour\").record(undefined)], \"Close tour\");\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !stateTour;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !stateTour) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={false}>\n      <FormSheet noPadding={true}>\n        <TourModalContent\n          stateTour={stateTour}\n          state={state}\n          onClose={onClose}\n          onStepSeen={(flag) => {\n            if (!state.storage.helps.includes(flag)) {\n              updateState(\n                dispatch,\n                [\n                  lb<IState>()\n                    .p(\"storage\")\n                    .p(\"helps\")\n                    .recordModify((hlps) => [...hlps, flag]),\n                ],\n                `Mark tour step ${flag} as seen`\n              );\n            }\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { WeekInsightsDetails } from \"../../components/weekInsights\";\nimport { History_getPersonalRecords } from \"../../models/history\";\nimport { CollectionUtils_sort } from \"../../utils/collection\";\nimport { getWeekHistory } from \"../../components/programHistory\";\nimport { WeekInsightsUtils_calculateSetResults } from \"../../utils/weekInsightsUtils\";\nimport { navigateToModal } from \"../navigationService\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalWeekInsightsDetails(): JSX.Element {\n  const { state } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"weekInsightsDetailsModal\";\n    params: IRootStackParamList[\"weekInsightsDetailsModal\"];\n  }>();\n  const { selectedFirstDayOfWeek } = route.params;\n  const settings = state.storage.settings;\n\n  const sortedHistory = useMemo(\n    () =>\n      CollectionUtils_sort(state.storage.history, (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()),\n    [state.storage.history]\n  );\n  const prs = History_getPersonalRecords(sortedHistory);\n  const thisWeekHistory = getWeekHistory(sortedHistory, selectedFirstDayOfWeek, settings.startWeekFromMonday);\n  const setResults = WeekInsightsUtils_calculateSetResults(thisWeekHistory, settings);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <WeekInsightsDetails\n          thisWeekHistory={thisWeekHistory}\n          prs={prs}\n          setResults={setResults}\n          settings={settings}\n          onOpenPlannerSettings={() => {\n            navigateToModal(\"plannerSettingsModal\", { context: \"programHistory\" });\n          }}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useCallback, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { PlannerWeekStats } from \"../../pages/planner/components/plannerWeekStats\";\nimport { IState } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { IPlannerState } from \"../../pages/planner/models/types\";\nimport { buildPlannerDispatch } from \"../../utils/plannerDispatch\";\nimport { PlannerProgram_evaluate } from \"../../pages/planner/models/plannerProgram\";\nimport { navigateToModal } from \"../navigationService\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalWeekStats(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"weekStatsModal\";\n    params: IRootStackParamList[\"weekStatsModal\"];\n  }>();\n  const { programId } = route.params;\n\n  const plannerState = state.editProgramStates?.[programId];\n  const plannerDispatch = useCallback(\n    plannerState\n      ? buildPlannerDispatch(dispatch, lb<IState>().p(\"editProgramStates\").p(programId), plannerState)\n      : () => {},\n    [dispatch, programId, plannerState]\n  );\n\n  const weekIndex = plannerState?.ui?.showWeekStats;\n  const planner = plannerState?.current?.program?.planner;\n  const settings = state.storage.settings;\n  const { evaluatedWeeks } = planner ? PlannerProgram_evaluate(planner, settings) : { evaluatedWeeks: [] };\n\n  const onClose = (): void => {\n    if (plannerState) {\n      plannerDispatch(lb<IPlannerState>().p(\"ui\").p(\"showWeekStats\").record(undefined), \"Close week stats\");\n    }\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !plannerState || weekIndex == null || !evaluatedWeeks[weekIndex];\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack) {\n    return <></>;\n  }\n\n  return (\n    <ModalScreenContainer onClose={onClose} shouldShowClose={true} isFullWidth={true}>\n      <FormSheet>\n        <PlannerWeekStats\n          onEditSettings={() => {\n            navigateToModal(\"plannerSettingsModal\", { context: \"editProgram\", programId });\n          }}\n          evaluatedDays={evaluatedWeeks[weekIndex!]}\n          settings={settings}\n        />\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { ModalScreenContainer } from \"../ModalScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { IWhatsNew, WhatsNew_all } from \"../../models/whatsnew\";\nimport { WhatsNew_updateStorage } from \"../../models/whatsnewUtils\";\nimport { DateUtils_format, DateUtils_fromYYYYMMDDStr } from \"../../utils/date\";\nimport { ObjectUtils_keys } from \"../../utils/object\";\nimport { Text } from \"../../components/primitives/text\";\nimport { SimpleMarkdown } from \"../../components/simpleMarkdown\";\nimport { useScrollProgressiveList } from \"../../utils/useScrollProgressiveList\";\n\nexport function NavModalWhatsnew(): JSX.Element {\n  const { dispatch } = useAppState();\n  const navigation = useNavigation();\n\n  useEffect(() => {\n    return navigation.addListener(\"beforeRemove\", () => {\n      WhatsNew_updateStorage(dispatch);\n    });\n  }, [navigation, dispatch]);\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const sortedWhatsnewRecords = useMemo(() => {\n    const all = WhatsNew_all();\n    const list = ObjectUtils_keys(all).reduce<[string, IWhatsNew][]>((memo, dateStr) => {\n      memo.push([dateStr, all[dateStr]]);\n      return memo;\n    }, []);\n    list.sort((a, b) => parseInt(b[0], 10) - parseInt(a[0], 10));\n    return list;\n  }, []);\n\n  const { visibleItems, onScroll } = useScrollProgressiveList(sortedWhatsnewRecords, { batchSize: 10 });\n\n  return (\n    <ModalScreenContainer onClose={onClose} overflowHidden isFullHeight>\n      <FormSheet header=\"What's new?\" onScroll={onScroll}>\n        {visibleItems.map(([dateStr, whatsNewRecord]) => {\n          const date = DateUtils_format(DateUtils_fromYYYYMMDDStr(dateStr, \"\"), true);\n          return (\n            <View key={dateStr} className=\"pb-6\">\n              <Text className=\"text-xs font-bold text-text-secondary\">{date}</Text>\n              <Text className=\"text-sm font-bold\">{whatsNewRecord.title}</Text>\n              <SimpleMarkdown value={whatsNewRecord.body} />\n            </View>\n          );\n        })}\n      </FormSheet>\n    </ModalScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { View, Platform } from \"react-native\";\nimport { Dialog_alert } from \"../../utils/dialog\";\nimport { useRoute, useNavigation, StackActions } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { BottomSheetItem } from \"../../components/bottomSheetItem\";\nimport { WorkoutShareBottomSheetItem } from \"../../components/workoutShareBottomSheetItem\";\nimport { IconInstagram } from \"../../components/icons/iconInstagram\";\nimport { IconTiktok } from \"../../components/icons/iconTiktok\";\nimport { IconLink } from \"../../components/icons/iconLink\";\nimport { IconDoc } from \"../../components/icons/iconDoc\";\nimport { IconHeart } from \"../../components/icons/iconHeart\";\nimport { ClipboardUtils_copy } from \"../../utils/clipboard\";\nimport { Share_generateLink } from \"../../models/share\";\nimport { WorkoutOutcome_healthPayload } from \"../../models/workoutOutcome\";\nimport { Thunk_saveWorkoutToHealth } from \"../../ducks/thunks\";\nimport { LiftohistorySerializer_serialize } from \"../../liftohistory/liftohistorySerializer\";\nimport { HealthSync_eligibleForAppleHealth, HealthSync_eligibleForGoogleHealth } from \"../../lib/healthSync\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalWorkoutShare(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"workoutShareModal\";\n    params: IRootStackParamList[\"workoutShareModal\"];\n  }>();\n  const { progressId } = route.params;\n\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const isMobile = Platform.OS === \"ios\" || Platform.OS === \"android\";\n\n  const replaceWithSocialShare = (type: \"igstory\" | \"igfeed\" | \"tiktok\"): void => {\n    navigation.dispatch(StackActions.replace(\"socialShareModal\", { type, progressId }));\n  };\n\n  const shouldGoBack = !progress;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !progress) {\n    return <></>;\n  }\n\n  const onClose = (): void => {\n    navigation.goBack();\n  };\n\n  const isIos = Platform.OS === \"ios\";\n  const healthName = isIos ? \"Apple Health\" : \"Google Health\";\n  const shouldShowHealthSync = HealthSync_eligibleForAppleHealth() || HealthSync_eligibleForGoogleHealth();\n\n  const content = (\n    <View className=\"pb-4\">\n      {isMobile && (\n        <>\n          <BottomSheetItem\n            name=\"share-to-igstory\"\n            title=\"Share to Instagram Story\"\n            isFirst={true}\n            description={\"\"}\n            icon={<IconInstagram size={24} />}\n            onClick={() => replaceWithSocialShare(\"igstory\")}\n          />\n          <BottomSheetItem\n            name=\"share-to-igfeed\"\n            title=\"Share to Instagram Feed\"\n            description={\"\"}\n            icon={<IconInstagram size={24} />}\n            onClick={() => replaceWithSocialShare(\"igfeed\")}\n          />\n          <BottomSheetItem\n            name=\"share-to-tiktok\"\n            title=\"Share to Tiktok\"\n            description={\"\"}\n            icon={<IconTiktok width={24} height={24} />}\n            onClick={() => replaceWithSocialShare(\"tiktok\")}\n          />\n          {shouldShowHealthSync && (\n            <BottomSheetItem\n              name=\"submit-to-health\"\n              title={`Sync to ${healthName}`}\n              description={\"\"}\n              icon={<IconHeart size={24} />}\n              onClick={() => {\n                dispatch(\n                  Thunk_saveWorkoutToHealth({\n                    ...WorkoutOutcome_healthPayload(progress),\n                    source: \"finish\",\n                    successAlert: true,\n                  })\n                );\n                onClose();\n              }}\n            />\n          )}\n        </>\n      )}\n      <BottomSheetItem\n        name=\"share-to-link\"\n        title=\"Copy link to workout\"\n        isFirst={!isMobile}\n        description={\"\"}\n        icon={<IconLink />}\n        onClick={() => {\n          if (state.user?.id) {\n            const link = Share_generateLink(state.user.id, progress.id);\n            ClipboardUtils_copy(link);\n            Dialog_alert(\"Copied!\");\n          } else {\n            Dialog_alert(\"You should be logged in to copy link to a workout\");\n          }\n        }}\n      />\n      <WorkoutShareBottomSheetItem\n        history={state.storage.history}\n        record={progress}\n        settings={state.storage.settings}\n      />\n      <BottomSheetItem\n        name=\"share-to-text\"\n        title=\"Copy as Text\"\n        description={\"\"}\n        icon={<IconDoc width={24} height={24} />}\n        onClick={() => {\n          const text = LiftohistorySerializer_serialize(progress, state.storage.settings);\n          ClipboardUtils_copy(text);\n          Dialog_alert(\"Copied!\");\n          onClose();\n        }}\n      />\n    </View>\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true} fitContent={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { useRoute, useNavigation } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { SheetScreenContainer } from \"../SheetScreenContainer\";\nimport { FormSheet } from \"../FormSheet\";\nimport { BottomSheetWorkoutSupersetContent } from \"../../components/bottomSheetWorkoutSuperset\";\nimport { IHistoryRecord } from \"../../types\";\nimport { updateProgress } from \"../../models/state\";\nimport { lb } from \"lens-shmens\";\nimport type { IRootStackParamList } from \"../types\";\n\nexport function NavModalWorkoutSuperset(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navigation = useNavigation();\n  const route = useRoute<{\n    key: string;\n    name: \"supersetPickerModal\";\n    params: IRootStackParamList[\"supersetPickerModal\"];\n  }>();\n  const { progressId } = route.params;\n\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const exerciseSuperset = progress?.ui?.showSupersetPicker;\n\n  const onClose = (): void => {\n    updateProgress(\n      dispatch,\n      [lb<IHistoryRecord>().pi(\"ui\", {}).p(\"showSupersetPicker\").record(undefined)],\n      \"Close superset picker\"\n    );\n    navigation.goBack();\n  };\n\n  const shouldGoBack = !progress || !exerciseSuperset;\n  useEffect(() => {\n    if (shouldGoBack) {\n      navigation.goBack();\n    }\n  }, [shouldGoBack]);\n\n  if (shouldGoBack || !progress || !exerciseSuperset) {\n    return <></>;\n  }\n\n  const content = (\n    <BottomSheetWorkoutSupersetContent\n      progress={progress}\n      entry={exerciseSuperset}\n      settings={state.storage.settings}\n      onSelect={(selectedEntry) => {\n        updateProgress(\n          dispatch,\n          [lb<IHistoryRecord>().p(\"entries\").findBy(\"id\", exerciseSuperset.id).p(\"superset\").record(selectedEntry)],\n          \"select-superset-entry\"\n        );\n      }}\n      onClose={onClose}\n    />\n  );\n\n  return (\n    <SheetScreenContainer onClose={onClose} shouldShowClose={true}>\n      <FormSheet>{content}</FormSheet>\n    </SheetScreenContainer>\n  );\n}\n","import { Program_getProgram } from \"../../models/program\";\nimport type { IState } from \"../../models/state\";\nimport type { IProgram } from \"../../types\";\n\n// From the program editor the source of truth is the unsaved draft in editProgramStates, not\n// the last saved program — reading storage there would edit stale text and clobber the user's\n// other pending edits on save. From a workout there is no draft to speak of.\nexport function LiftoEditorSheetProgram_resolve(\n  state: IState,\n  programId: string,\n  isFromWorkout: boolean\n): IProgram | undefined {\n  const draft = !isFromWorkout ? state.editProgramStates[programId]?.current.program : undefined;\n  return draft ?? Program_getProgram(state, programId);\n}\n","import { IHistoryRecord, ISettings, IStats } from \"../../types\";\nimport { IDispatch } from \"../../ducks/types\";\nimport { IState, updateState } from \"../../models/state\";\nimport { buildCardsReducer, ICardsAction } from \"../../ducks/reducer\";\nimport { lb } from \"lens-shmens\";\n\nexport function getPlaygroundProgress(state: IState, weekIndex: number, dayIndex: number): IHistoryRecord | undefined {\n  return state.playgroundState?.progresses[weekIndex]?.days[dayIndex]?.progress;\n}\n\nconst cardActionTypes: Set<ICardsAction[\"type\"]> = new Set([\n  \"UpdateProgress\",\n  \"ChangeAMRAPAction\",\n  \"CompleteSetAction\",\n  \"CheckSetTimerAction\",\n  \"CloseSetTimerAction\",\n  \"StartSetTimerWorkAction\",\n]);\n\nfunction isCardsAction(action: unknown): action is ICardsAction {\n  return (\n    typeof action === \"object\" &&\n    action != null &&\n    \"type\" in action &&\n    cardActionTypes.has((action as ICardsAction).type)\n  );\n}\n\nexport function buildPlaygroundDispatch(\n  dispatch: IDispatch,\n  weekIndex: number,\n  dayIndex: number,\n  getProgress: () => IHistoryRecord | undefined,\n  settings: ISettings,\n  stats: IStats\n): IDispatch {\n  const lbProgress = lb<IState>()\n    .pi(\"playgroundState\")\n    .pi(\"progresses\")\n    .pi(weekIndex)\n    .p(\"days\")\n    .pi(dayIndex)\n    .p(\"progress\");\n\n  return ((action: Parameters<IDispatch>[0]) => {\n    if (isCardsAction(action)) {\n      const progress = getProgress();\n      if (progress) {\n        const newProgress = buildCardsReducer([], settings, stats, undefined)(progress, action);\n        updateState(dispatch, [lbProgress.record(newProgress)], action.type);\n      }\n    } else {\n      dispatch(action);\n    }\n  }) as IDispatch;\n}\n","export function NavOptionsChanged_isChanged<T extends object>(prev: T | undefined, next: T): boolean {\n  if (prev == null) {\n    return true;\n  }\n  const prevKeys = Object.keys(prev);\n  const nextKeys = Object.keys(next);\n  if (prevKeys.length !== nextKeys.length) {\n    return true;\n  }\n  for (const key of nextKeys as Array<keyof T>) {\n    if (prev[key] !== next[key]) {\n      return true;\n    }\n  }\n  return false;\n}\n","export function getNavigationService(): Promise<typeof import(\"./navigationService\")> {\n  return import(\"./navigationService\");\n}\n\nexport function getNavigationRef(): Promise<typeof import(\"./navigationRef\")> {\n  return import(\"./navigationRef\");\n}\n\nexport function getNavigationContext(): Promise<(typeof import(\"@react-navigation/native\"))[\"NavigationContext\"]> {\n  return import(\"@react-navigation/native\").then((mod) => mod.NavigationContext);\n}\n","import { createNavigationContainerRef } from \"@react-navigation/native\";\nimport type { IRootStackParamList } from \"./types\";\n\nexport const navigationRef = createNavigationContainerRef<IRootStackParamList>();\n","import { CommonActions, type NavigationState, type PartialState } from \"@react-navigation/native\";\nimport { navigationRef } from \"./navigationRef\";\nimport { Screen_tab, IScreen } from \"../models/screen\";\nimport type { ITab, IScreenData } from \"../models/screen\";\nimport type { IAllScreenParamList, IRootStackParamList } from \"./types\";\nimport { PerfNavTracker_recordTap } from \"../utils/perfNavTracker\";\nimport { HermesProfile_captureOnce } from \"../utils/hermesProfile\";\n\nexport type IRootStack = \"onboarding\" | \"mainTabs\" | \"subscription\";\n\nexport type IModalScreen = Exclude<keyof IRootStackParamList, \"onboarding\" | \"mainTabs\" | \"subscription\">;\n\nexport function navigateToModal<T extends IModalScreen>(\n  ...args: undefined extends IRootStackParamList[T]\n    ? [name: T] | [name: T, params: IRootStackParamList[T]]\n    : [name: T, params: IRootStackParamList[T]]\n): void {\n  const [name, params] = args;\n  if (!navigationRef.isReady()) {\n    return;\n  }\n  PerfNavTracker_recordTap(name);\n  navigationRef.dispatch(CommonActions.navigate({ name: name as string, params: params as object | undefined }));\n}\n\nexport function getCurrentTab(): ITab | undefined {\n  if (!navigationRef.isReady()) {\n    return undefined;\n  }\n  const navState = navigationRef.getRootState();\n  if (!navState) {\n    return undefined;\n  }\n  const rootRoute = navState.routes[navState.index ?? 0];\n  if (rootRoute.name !== \"mainTabs\") {\n    return undefined;\n  }\n  const tabsState = rootRoute.state as NavigationState | undefined;\n  if (!tabsState) {\n    return undefined;\n  }\n  const activeTab = tabsState.routes[tabsState.index ?? 0];\n  return activeTab.name as ITab;\n}\n\nfunction getCurrentRoot(): IRootStack | undefined {\n  if (!navigationRef.isReady()) {\n    return undefined;\n  }\n  const navState = navigationRef.getRootState();\n  if (!navState) {\n    return undefined;\n  }\n  return navState.routes[navState.index ?? 0].name as IRootStack;\n}\n\nexport interface INavigateOpts {\n  tab?: ITab;\n  stack?: IRootStack;\n}\n\nexport function navigateTo<T extends IScreen>(screen: T, params?: IAllScreenParamList[T], opts?: INavigateOpts): void {\n  if (!navigationRef.isReady()) {\n    return;\n  }\n  PerfNavTracker_recordTap(screen);\n  if (screen === \"progress\") {\n    // Started on the tap, not on the navigation state change, so the profiler is already running\n    // while the screen mounts. Three seconds covers the mount and the deferred graph and history.\n    HermesProfile_captureOnce(\"open-workout\", 3000);\n  } else if (screen === \"editProgram\") {\n    HermesProfile_captureOnce(\"open-program\", 4000);\n  }\n\n  if (opts?.stack === \"subscription\") {\n    navigationRef.dispatch(CommonActions.navigate({ name: \"subscription\", params: params as object | undefined }));\n    return;\n  }\n\n  if (opts?.tab) {\n    const resetState: PartialState<NavigationState> = {\n      index: 0,\n      routes: [\n        {\n          name: \"mainTabs\",\n          state: {\n            routes: [\n              {\n                name: opts.tab,\n                state: {\n                  index: 0,\n                  routes: [{ name: screen, params }],\n                },\n              },\n            ],\n          },\n        },\n      ],\n    };\n    navigationRef.dispatch(CommonActions.reset(resetState));\n    return;\n  }\n\n  const currentRoot = getCurrentRoot();\n\n  if (currentRoot === \"onboarding\") {\n    navigationRef.dispatch(CommonActions.navigate({ name: \"onboarding\", params: { screen, params } }));\n  } else if (currentRoot === \"mainTabs\") {\n    const tab = getCurrentTab() ?? Screen_tab(screen);\n    navigationRef.dispatch(\n      CommonActions.navigate({\n        name: \"mainTabs\",\n        params: {\n          screen: tab,\n          params: {\n            screen,\n            params,\n            initial: false,\n          },\n        },\n      })\n    );\n  } else {\n    navigationRef.dispatch(CommonActions.navigate({ name: screen as string, params: params as object | undefined }));\n  }\n}\n\nexport function goBack(): void {\n  if (!navigationRef.isReady()) {\n    return;\n  }\n  if (navigationRef.canGoBack()) {\n    navigationRef.goBack();\n  }\n}\n\nexport function getCurrentRouteName(): string | undefined {\n  if (!navigationRef.isReady()) {\n    return undefined;\n  }\n  return navigationRef.getCurrentRoute()?.name;\n}\n\nexport function getCurrentScreenData(): IScreenData | undefined {\n  if (!navigationRef.isReady()) {\n    return undefined;\n  }\n  const route = navigationRef.getCurrentRoute();\n  if (!route) {\n    return undefined;\n  }\n  return { name: route.name, params: route.params } as IScreenData;\n}\n","import type { NavigationState, PartialState } from \"@react-navigation/native\";\nimport { navigationRef } from \"./navigationRef\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_cleanupRemovedScreens, screensWithEditState } from \"../ducks/thunks\";\nimport { IScreenData } from \"../models/screen\";\n\ntype INavState = NavigationState | PartialState<NavigationState>;\n\nfunction collectScreens(navState: INavState, into: Map<string, IScreenData>): void {\n  for (const route of navState.routes) {\n    if (route.key != null && screensWithEditState.indexOf(route.name as IScreenData[\"name\"]) !== -1) {\n      into.set(route.key, { name: route.name, params: route.params } as IScreenData);\n    }\n    if (route.state != null) {\n      collectScreens(route.state, into);\n    }\n  }\n}\n\nfunction screenStateIdentity(screen: IScreenData): string {\n  if (screen.name === \"progress\") {\n    return `progress:${screen.params?.id ?? 0}`;\n  } else if (screen.name === \"editProgram\") {\n    return `editProgram:${screen.params?.programId}`;\n  }\n  return `${screen.name}:${JSON.stringify(screen.params ?? {})}`;\n}\n\n// Screens can be removed without going through Thunk_pullScreen — Android system\n// back, iOS swipe-back, and the stack resets navigateTo does for cross-tab\n// navigation. Per-screen edit state (state.progress, editProgramStates) must be\n// cleaned on ANY removal, otherwise id-less actions that resolve their target\n// from those maps silently hit the wrong record. Diffing route keys on every\n// navigation state change catches all removal paths uniformly.\nexport function ScreenRemovalCleanup_subscribe(dispatch: IDispatch): () => void {\n  let prevScreens = new Map<string, IScreenData>();\n  if (navigationRef.isReady()) {\n    const rootState = navigationRef.getRootState();\n    if (rootState != null) {\n      collectScreens(rootState, prevScreens);\n    }\n  }\n  return navigationRef.addListener(\"state\", (e) => {\n    const screens = new Map<string, IScreenData>();\n    if (e.data.state != null) {\n      collectScreens(e.data.state, screens);\n    }\n    // Flows like Program_editAction init the new screen's edit state BEFORE the\n    // stack reset removes the old route for the same programId — the new route\n    // (different key, same identity) must keep that state, so only clean up when\n    // no surviving route references it.\n    const currentIdentities = new Set<string>();\n    for (const screen of screens.values()) {\n      currentIdentities.add(screenStateIdentity(screen));\n    }\n    const removed: IScreenData[] = [];\n    for (const [key, screen] of prevScreens) {\n      if (!screens.has(key) && !currentIdentities.has(screenStateIdentity(screen))) {\n        removed.push(screen);\n      }\n    }\n    prevScreens = screens;\n    if (removed.length > 0) {\n      dispatch(Thunk_cleanupRemovedScreens(removed));\n    }\n  });\n}\n","import { JSX } from \"react\";\nimport { RouteProp, useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { NavScreenContent } from \"../NavScreenContent\";\nimport { useAppContext } from \"../../components/appContext\";\nimport { IFoodStackParamList } from \"../types\";\nimport { ScreenFood } from \"../../components/screenFood\";\nimport { ScreenFoodAdd } from \"../../components/screenFoodAdd\";\nimport { ScreenFoodLibrary } from \"../../components/screenFoodLibrary\";\nimport { ScreenFoodItem } from \"../../components/screenFoodItem\";\nimport { ScreenFoodGoals } from \"../../components/screenFoodGoals\";\nimport { ScreenFoodTemplates } from \"../../components/screenFoodTemplates\";\n\nexport function NavScreenFood(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const route = useRoute<RouteProp<IFoodStackParamList, \"food\">>();\n  return (\n    <NavScreenContent>\n      <ScreenFood\n        dispatch={dispatch}\n        stats={state.storage.stats}\n        goals={state.storage.settings.nutritionGoals}\n        library={state.storage.foodLibrary || []}\n        templates={state.storage.mealTemplates || []}\n        units={state.storage.settings.units}\n        initialDate={route.params?.date}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenFoodAdd(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const { service } = useAppContext();\n  const route = useRoute<RouteProp<IFoodStackParamList, \"foodAdd\">>();\n  return (\n    <NavScreenContent>\n      <ScreenFoodAdd\n        dispatch={dispatch}\n        service={service}\n        stats={state.storage.stats}\n        library={state.storage.foodLibrary || []}\n        date={route.params.date}\n        meal={route.params.meal}\n        editTimestamp={route.params.editTimestamp}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenFoodLibrary(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenFoodLibrary dispatch={dispatch} library={state.storage.foodLibrary || []} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenFoodItem(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const { service } = useAppContext();\n  const route = useRoute<RouteProp<IFoodStackParamList, \"foodItem\">>();\n  return (\n    <NavScreenContent>\n      <ScreenFoodItem\n        dispatch={dispatch}\n        service={service}\n        stats={state.storage.stats}\n        library={state.storage.foodLibrary || []}\n        id={route.params.id}\n        kind={route.params.kind}\n        prefill={route.params.prefill}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenFoodGoals(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenFoodGoals dispatch={dispatch} goals={state.storage.settings.nutritionGoals} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenFoodTemplates(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const route = useRoute<RouteProp<IFoodStackParamList, \"foodTemplates\">>();\n  return (\n    <NavScreenContent>\n      <ScreenFoodTemplates\n        dispatch={dispatch}\n        stats={state.storage.stats}\n        templates={state.storage.mealTemplates || []}\n        date={route.params.date}\n        meal={route.params.meal}\n      />\n    </NavScreenContent>\n  );\n}\n","import { JSX, useContext, useEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { BottomTabBarHeightCallbackContext, type BottomTabBarProps } from \"@react-navigation/bottom-tabs\";\nimport type { NavigationState } from \"@react-navigation/native\";\nimport { useTrackedState, useTrackedDispatch, untrack } from \"../TrackedStateContext\";\nimport { buildNavCommon } from \"../utils\";\nimport { Footer2View } from \"../../components/footer2\";\nimport type { IScreen, ITab } from \"../../models/screen\";\n\nconst screensWithoutFooter: string[] = [\"subscription\", \"onerms\"];\n\nfunction getTopRouteOfActiveTab(tabState: BottomTabBarProps[\"state\"]): IScreen | undefined {\n  const activeTab = tabState.routes[tabState.index];\n  const tabStackState = activeTab.state as NavigationState | undefined;\n  if (!tabStackState) {\n    return undefined;\n  }\n  return tabStackState.routes[tabStackState.index ?? 0].name as IScreen;\n}\n\nexport function Footer2Wrapper(props: BottomTabBarProps): JSX.Element | null {\n  const state = useTrackedState();\n  const dispatch = useTrackedDispatch();\n  // BottomTabView only learns the tab bar's height if the bar reports it; with a custom\n  // tabBar that never does, BottomTabBarHeightContext keeps react-navigation's estimate for\n  // the *default* bar, which is shorter than this footer. Anything positioning against the\n  // tab bar — the editor dock — reads that value, so report the measured height instead.\n  const setTabBarHeight = useContext(BottomTabBarHeightCallbackContext);\n  const topRoute = getTopRouteOfActiveTab(props.state);\n  const isHidden = topRoute != null && screensWithoutFooter.includes(topRoute);\n  useEffect(() => {\n    if (isHidden) {\n      setTabBarHeight?.(0);\n    }\n  }, [isHidden, setTabBarHeight]);\n  if (isHidden) {\n    return null;\n  }\n  const currentTab = props.state.routes[props.state.index].name as ITab;\n  const navCommon = untrack(buildNavCommon(state));\n  return (\n    <View onLayout={(e) => setTabBarHeight?.(e.nativeEvent.layout.height)}>\n      <Footer2View dispatch={dispatch} navCommon={navCommon} currentTab={currentTab} />\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { NavScreenContent } from \"../NavScreenContent\";\nimport { ScreenGraphs as ScreenGraphsComponent } from \"../../components/screenGraphs\";\nimport { useScreenPerf } from \"../../utils/useScreenPerf\";\nimport { usePerfRenderCount } from \"../../utils/usePerfRenderCount\";\n\nexport function NavScreenGraphs(): JSX.Element {\n  useScreenPerf(\"graphsList\");\n  usePerfRenderCount(\"NavScreenGraphs\");\n  return (\n    <NavScreenContent>\n      <ScreenGraphsComponent />\n    </NavScreenContent>\n  );\n}\n","import { JSX, useEffect } from \"react\";\nimport { View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useRoute } from \"@react-navigation/native\";\nimport { useTrackedState, useTrackedDispatch, untrack } from \"../TrackedStateContext\";\nimport { buildNavCommon } from \"../utils\";\nimport { ProgramHistoryView } from \"../../components/programHistory\";\nimport { ChooseProgramView } from \"../../components/chooseProgram\";\nimport { Program_getProgram } from \"../../models/program\";\nimport { useScreenPerf } from \"../../utils/useScreenPerf\";\nimport { ImagePreloader_preload } from \"../../utils/imagePreloader\";\n\nconst subscriptionImages = [\"/images/subscriptionhero.png\"];\n\nexport function NavScreenMain(): JSX.Element {\n  const state = useTrackedState();\n  const dispatch = useTrackedDispatch();\n  useScreenPerf(\"main\");\n\n  useEffect(() => {\n    for (const path of subscriptionImages) {\n      ImagePreloader_preload(path);\n    }\n  }, []);\n  const navCommon = untrack(buildNavCommon(state));\n  const route = useRoute<{ key: string; name: \"main\"; params?: { historyRecordId?: number } }>();\n  const ongoingProgress = untrack(state.storage.progress?.[0]);\n  const currentProgram = untrack(\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined\n  );\n  const insets = useSafeAreaInsets();\n\n  if (currentProgram == null) {\n    return (\n      <View className=\"flex-1 bg-background-default\" style={{ paddingTop: insets.top }}>\n        <ChooseProgramView\n          navCommon={navCommon}\n          settings={untrack(state.storage.settings)}\n          dispatch={dispatch}\n          progress={ongoingProgress}\n          programs={untrack(state.programs || [])}\n          programsIndex={untrack(state.programsIndex || [])}\n          customPrograms={untrack(state.storage.programs || [])}\n          editProgramId={ongoingProgress?.programId}\n          hasBottomNav={true}\n        />\n      </View>\n    );\n  }\n\n  return (\n    <View className=\"flex-1 bg-background-default\" style={{ paddingTop: insets.top }}>\n      <ProgramHistoryView\n        progress={ongoingProgress}\n        navCommon={navCommon}\n        program={currentProgram}\n        settings={untrack(state.storage.settings)}\n        history={untrack(state.storage.history)}\n        subscription={untrack(state.storage.subscription)}\n        dispatch={dispatch}\n        initialHistoryRecordId={route.params?.historyRecordId}\n      />\n    </View>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { buildNavCommon } from \"../utils\";\nimport { NavScreenContent } from \"../NavScreenContent\";\nimport { ScreenSettings as ScreenSettingsComponent } from \"../../components/screenSettings\";\nimport { ScreenAccount as ScreenAccountComponent } from \"../../components/screenAccount\";\nimport { ScreenApiKeys as ScreenApiKeysComponent } from \"../../components/screenApiKeys\";\nimport { ScreenTimers as ScreenTimersComponent } from \"../../components/screenTimers\";\nimport { ScreenEquipment } from \"../../components/screenEquipment\";\nimport { ScreenGyms as ScreenGymsComponent } from \"../../components/screenGyms\";\nimport { ScreenExercises as ScreenExercisesComponent } from \"../../components/screenExercises\";\nimport { ScreenAppleHealthSettings as ScreenAppleHealthSettingsComponent } from \"../../components/screenAppleHealthSettings\";\nimport { ScreenGoogleHealthSettings as ScreenGoogleHealthSettingsComponent } from \"../../components/screenGoogleHealthSettings\";\nimport { ScreenMuscleGroups as ScreenMuscleGroupsComponent } from \"../../components/screenMuscleGroups\";\nimport { ScreenStats as ScreenStatsComponent } from \"../../components/screenStats\";\nimport { ScreenMeasurements as ScreenMeasurementsComponent } from \"../../components/screenMeasurements\";\nimport { ScreenSleepNutrition as ScreenSleepNutritionComponent } from \"../../components/screenSleepNutrition\";\nimport { ScreenExerciseStats as ScreenExerciseStatsComponent } from \"../../components/screenExerciseStats\";\nimport { ScreenRecentImports as ScreenRecentImportsComponent } from \"../../components/screenRecentImports\";\nimport { ScreenImportPreview as ScreenImportPreviewComponent } from \"../../components/screenImportPreview\";\nimport { Program_getProgram } from \"../../models/program\";\nimport { Exercise_find, Exercise_toKey } from \"../../models/exercise\";\nimport { Equipment_getEquipmentOfGym } from \"../../models/equipment\";\nimport { Thunk_pullScreen } from \"../../ducks/thunks\";\nimport { useAppContext } from \"../../components/appContext\";\n\nexport function NavScreenSettings(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const subscription = state.storage.subscription;\n  const settings = state.storage.settings;\n  const stats = state.storage.stats;\n  const loading = state.loading;\n  const user = state.user;\n  const tempUserId = state.storage.tempUserId;\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n  const isOngoingProgress = (state.storage.progress?.length ?? 0) > 0;\n  const navCommon = useMemo(\n    () => ({\n      loading,\n      currentProgram,\n      settings,\n      isOngoingProgress,\n      stats,\n      userId: user?.id,\n    }),\n    [loading, currentProgram, settings, isOngoingProgress, stats, user]\n  );\n  return (\n    <NavScreenContent>\n      <ScreenSettingsComponent\n        stats={stats}\n        tempUserId={tempUserId}\n        navCommon={navCommon}\n        subscription={subscription}\n        dispatch={dispatch}\n        user={user}\n        currentProgramName={currentProgram?.name || \"\"}\n        settings={settings}\n        importSessions={state.storage.importSessions}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenAccount(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenAccountComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        email={state.user?.email}\n        userId={state.user?.id}\n        nosync={state.nosync}\n        storage={state.storage}\n        subscriptionStatus={state.subscriptionStatus}\n        subscriptionStatusLoading={state.subscriptionStatusLoading}\n        ownedLifetime={state.ownedLifetime}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenTimers(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenTimersComponent navCommon={navCommon} dispatch={dispatch} timers={state.storage.settings.timers} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenPlates(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  const allEquipment = Equipment_getEquipmentOfGym(state.storage.settings, state.selectedGymId);\n  return (\n    <ScreenEquipment\n      stats={state.storage.stats}\n      navCommon={navCommon}\n      allEquipment={allEquipment}\n      expandedEquipment={state.defaultEquipmentExpanded}\n      selectedGymId={state.selectedGymId}\n      dispatch={dispatch}\n      settings={state.storage.settings}\n    />\n  );\n}\n\nexport function NavScreenGyms(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenGymsComponent\n        navCommon={navCommon}\n        expandedEquipment={state.defaultEquipmentExpanded}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenExercises(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n  if (currentProgram == null) {\n    throw new Error(\"Opened 'exercises' screen, but 'currentProgram' is null\");\n  }\n  return (\n    <NavScreenContent>\n      <ScreenExercisesComponent\n        navCommon={navCommon}\n        settings={state.storage.settings}\n        dispatch={dispatch}\n        program={currentProgram}\n        history={state.storage.history}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenAppleHealth(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenAppleHealthSettingsComponent navCommon={navCommon} dispatch={dispatch} settings={state.storage.settings} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenGoogleHealth(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenGoogleHealthSettingsComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenMuscleGroups(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenMuscleGroupsComponent navCommon={navCommon} dispatch={dispatch} settings={state.storage.settings} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenStats(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenStatsComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n        stats={state.storage.stats}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenMeasurements(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  const route = useRoute<{ key: string; name: \"measurements\"; params?: { key?: import(\"../../types\").IStatsKey } }>();\n  return (\n    <NavScreenContent>\n      <ScreenMeasurementsComponent\n        navCommon={navCommon}\n        subscription={state.storage.subscription}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n        stats={state.storage.stats}\n        initialKey={route.params?.key}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenSleepNutrition(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenSleepNutritionComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n        subscription={state.storage.subscription}\n        stats={state.storage.stats}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenExerciseStats(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n  const exercise = state.viewExerciseType\n    ? Exercise_find(state.viewExerciseType, state.storage.settings.exercises)\n    : undefined;\n  if (exercise == null) {\n    setTimeout(() => dispatch(Thunk_pullScreen()), 0);\n    return (\n      <NavScreenContent>\n        <></>\n      </NavScreenContent>\n    );\n  }\n  return (\n    <NavScreenContent>\n      <ScreenExerciseStatsComponent\n        navCommon={navCommon}\n        currentProgram={currentProgram}\n        key={Exercise_toKey(exercise)}\n        history={state.storage.history}\n        dispatch={dispatch}\n        exerciseType={exercise}\n        settings={state.storage.settings}\n        subscription={state.storage.subscription}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenApiKeys(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const { service } = useAppContext();\n  const navCommon = buildNavCommon(state);\n  return (\n    <NavScreenContent>\n      <ScreenApiKeysComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        service={service}\n        subscription={state.storage.subscription}\n        userId={state.user?.id}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenRecentImports(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenRecentImportsComponent dispatch={dispatch} importSessions={state.storage.importSessions} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenImportPreview(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const preview = state.importPreview;\n  if (preview == null) {\n    return <View className=\"flex-1 bg-background-default\" />;\n  }\n  return (\n    <View className=\"flex-1 bg-background-default\">\n      <ScreenImportPreviewComponent\n        dispatch={dispatch}\n        preview={preview}\n        history={state.storage.history}\n        settings={state.storage.settings}\n      />\n    </View>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useAppState } from \"../StateContext\";\nimport { buildNavCommon } from \"../utils\";\nimport { NavScreenContent } from \"../NavScreenContent\";\nimport { ScreenFirst as ScreenFirstComponent } from \"../../components/screenFirst\";\nimport { ScreenUnitSelector } from \"../../components/screenUnitSelector\";\nimport {\n  ScreenSetupEquipment as ScreenSetupEquipmentComponent,\n  ScreenSetupPlates as ScreenSetupPlatesComponent,\n} from \"../../components/screenSetupEquipment\";\nimport { ScreenProgramSelect as ScreenProgramSelectComponent } from \"../../components/screenProgramSelect\";\nimport { ScreenHearAboutUs as ScreenHearAboutUsComponent } from \"../../components/screenHearAboutUs\";\nimport { ChooseProgramView } from \"../../components/chooseProgram\";\nimport { ScreenProgramPreview as ScreenProgramPreviewComponent } from \"../../components/screenProgramPreview\";\nimport { Progress_getCurrentProgress } from \"../../models/progress\";\nimport { Thunk_pullScreen } from \"../../ducks/thunks\";\nimport { usePlaygroundModalBridges } from \"../usePlaygroundModalBridges\";\n\nexport function NavScreenFirst(): JSX.Element {\n  const { dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenFirstComponent dispatch={dispatch} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenUnits(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenUnitSelector settings={state.storage.settings} dispatch={dispatch} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenSetupEquipment(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <ScreenSetupEquipmentComponent\n      stats={state.storage.stats}\n      navCommon={navCommon}\n      dispatch={dispatch}\n      settings={state.storage.settings}\n    />\n  );\n}\n\nexport function NavScreenSetupPlates(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <ScreenSetupPlatesComponent\n      stats={state.storage.stats}\n      navCommon={navCommon}\n      dispatch={dispatch}\n      settings={state.storage.settings}\n    />\n  );\n}\n\nexport function NavScreenHearAboutUs(): JSX.Element {\n  const { dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenHearAboutUsComponent dispatch={dispatch} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenProgramSelectOnboarding(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenProgramSelectComponent dispatch={dispatch} settings={state.storage.settings} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenProgramsOnboarding(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <View className=\"flex-1 bg-background-default\">\n      <ChooseProgramView\n        navCommon={navCommon}\n        settings={state.storage.settings}\n        dispatch={dispatch}\n        progress={Progress_getCurrentProgress(state)}\n        programs={state.programs || []}\n        programsIndex={state.programsIndex || []}\n        customPrograms={state.storage.programs || []}\n        editProgramId={Progress_getCurrentProgress(state)?.programId}\n      />\n    </View>\n  );\n}\n\nexport function NavScreenProgramPreviewOnboarding(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n\n  usePlaygroundModalBridges(state);\n\n  if (state.previewProgram?.id == null) {\n    setTimeout(() => dispatch(Thunk_pullScreen()), 0);\n    return (\n      <NavScreenContent>\n        <></>\n      </NavScreenContent>\n    );\n  }\n  return (\n    <NavScreenContent>\n      <ScreenProgramPreviewComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n        selectedProgramId={state.previewProgram.id}\n        programs={state.previewProgram.showCustomPrograms ? state.storage.programs : state.programs}\n        subscription={state.storage.subscription}\n      />\n    </NavScreenContent>\n  );\n}\n","import { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { buildNavCommon } from \"../utils\";\nimport { NavScreenContent } from \"../NavScreenContent\";\nimport { useConfirmScreenLeave } from \"../useConfirmScreenLeave\";\nimport { ChooseProgramView } from \"../../components/chooseProgram\";\nimport { ScreenEditProgram as ScreenEditProgramComponent } from \"../../components/screenEditProgram\";\nimport { ScreenMusclesProgram } from \"../../components/muscles/screenMusclesProgram\";\nimport { ScreenMusclesDay } from \"../../components/muscles/screenMusclesDay\";\nimport { Screen1RM } from \"../../components/screen1RM\";\nimport { ScreenProgramSelect as ScreenProgramSelectComponent } from \"../../components/screenProgramSelect\";\nimport { ScreenProgramPreview as ScreenProgramPreviewComponent } from \"../../components/screenProgramPreview\";\nimport { Program_getProgram, Program_fullProgram } from \"../../models/program\";\nimport { Progress_getCurrentProgress } from \"../../models/progress\";\nimport { FallbackScreen } from \"../../components/fallbackScreen\";\nimport { Thunk_pullScreen } from \"../../ducks/thunks\";\nimport { useAppContext } from \"../../components/appContext\";\nimport { usePlaygroundModalBridges } from \"../usePlaygroundModalBridges\";\n\nexport function NavScreenPrograms(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <View className=\"flex-1 bg-background-default\">\n      <ChooseProgramView\n        navCommon={navCommon}\n        settings={state.storage.settings}\n        dispatch={dispatch}\n        progress={Progress_getCurrentProgress(state)}\n        programs={state.programs || []}\n        programsIndex={state.programsIndex || []}\n        customPrograms={state.storage.programs || []}\n        editProgramId={Progress_getCurrentProgress(state)?.programId}\n        hasBottomNav={true}\n      />\n    </View>\n  );\n}\n\nexport function NavScreenEditProgram(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const { service } = useAppContext();\n  usePlaygroundModalBridges(state);\n  const navCommon = buildNavCommon(state);\n  const route = useRoute<{ key: string; name: \"editProgram\"; params: { programId: string } }>();\n  const programId = route.params.programId;\n  useConfirmScreenLeave(state, dispatch, { name: \"editProgram\", params: { programId } });\n  const plannerState = state.editProgramStates[programId];\n  const editProgram = Program_getProgram(\n    state,\n    plannerState ? plannerState.current.program.id : Progress_getCurrentProgress(state)?.programId\n  );\n  return (\n    <FallbackScreen state={{ plannerState, editProgram }} dispatch={dispatch}>\n      {({ plannerState: plannerState2, editProgram: editProgram2 }) => (\n        <ScreenEditProgramComponent\n          client={service.client}\n          helps={state.storage.helps}\n          navCommon={navCommon}\n          subscription={state.storage.subscription}\n          settings={state.storage.settings}\n          dispatch={dispatch}\n          originalProgram={editProgram2}\n          plannerState={plannerState2}\n          revisions={(state.revisions || {})[editProgram2.id] || []}\n          isLoggedIn={state.user != null}\n        />\n      )}\n    </FallbackScreen>\n  );\n}\n\nexport function NavScreenMuscles(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  const type = state.muscleView || {\n    type: \"program\" as const,\n    programId: state.storage.currentProgramId || state.storage.programs[0]?.id,\n  };\n  if (type.programId == null) {\n    throw new Error(\"Opened 'muscles' screen, but 'state.storage.currentProgramId' is null\");\n  }\n  let program = Program_getProgram(state, type.programId);\n  if (program == null) {\n    throw new Error(\"Opened 'muscles' screen, but 'program' is null\");\n  }\n  program = Program_fullProgram(program, state.storage.settings);\n  if (type.type === \"program\") {\n    return (\n      <NavScreenContent>\n        <ScreenMusclesProgram\n          navCommon={navCommon}\n          dispatch={dispatch}\n          program={program}\n          settings={state.storage.settings}\n        />\n      </NavScreenContent>\n    );\n  }\n  return (\n    <NavScreenContent>\n      <ScreenMusclesDay\n        navCommon={navCommon}\n        dispatch={dispatch}\n        program={program}\n        day={type.day ?? 1}\n        settings={state.storage.settings}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenOnerms(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n  if (currentProgram == null) {\n    throw new Error(\"Opened 'onerms' screen, but 'currentProgram' is null\");\n  }\n  return (\n    <Screen1RM navCommon={navCommon} dispatch={dispatch} program={currentProgram} settings={state.storage.settings} />\n  );\n}\n\nexport function NavScreenProgramSelect(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  return (\n    <NavScreenContent>\n      <ScreenProgramSelectComponent dispatch={dispatch} settings={state.storage.settings} />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenProgramPreview(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n\n  usePlaygroundModalBridges(state);\n\n  if (state.previewProgram?.id == null) {\n    setTimeout(() => dispatch(Thunk_pullScreen()), 0);\n    return (\n      <NavScreenContent>\n        <></>\n      </NavScreenContent>\n    );\n  }\n  return (\n    <NavScreenContent>\n      <ScreenProgramPreviewComponent\n        navCommon={navCommon}\n        dispatch={dispatch}\n        settings={state.storage.settings}\n        selectedProgramId={state.previewProgram.id}\n        programs={state.previewProgram.showCustomPrograms ? state.storage.programs : state.programs}\n        subscription={state.storage.subscription}\n      />\n    </NavScreenContent>\n  );\n}\n","import { JSX, useMemo } from \"react\";\nimport { useRoute } from \"@react-navigation/native\";\nimport { useAppState } from \"../StateContext\";\nimport { buildNavCommon } from \"../utils\";\nimport { NavScreenContent } from \"../NavScreenContent\";\nimport { ScreenWorkout } from \"../../components/screenWorkout\";\nimport { ScreenFinishDay as ScreenFinishDayComponent } from \"../../components/screenFinishDay\";\nimport { ScreenSubscription as ScreenSubscriptionComponent } from \"../../components/screenSubscription\";\nimport { Progress_isCurrent } from \"../../models/progress\";\nimport { Program_getFullProgram, Program_getProgram, Program_fullProgram } from \"../../models/program\";\nimport { FallbackScreen } from \"../../components/fallbackScreen\";\nimport { useEqual } from \"../../utils/useEqual\";\nimport { useConfirmScreenLeave } from \"../useConfirmScreenLeave\";\n\nexport function NavScreenProgress(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const route = useRoute<{ key: string; name: string; params?: { id?: number } }>();\n  const progressId = route.params?.id ?? 0;\n  useConfirmScreenLeave(state, dispatch, { name: \"progress\", params: { id: progressId } });\n  const subscription = useEqual(state.storage.subscription);\n  const settings = state.storage.settings;\n  const stats = state.storage.stats;\n  const helps = state.storage.helps;\n  const history = state.storage.history;\n  const allPrograms = state.storage.programs;\n  const loading = state.loading;\n  const userId = state.user?.id;\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n  const progress = progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n  const program = progress\n    ? Progress_isCurrent(progress)\n      ? Program_getFullProgram(state, progress.programId) ||\n        (currentProgram ? Program_fullProgram(currentProgram, settings) : undefined)\n      : undefined\n    : undefined;\n  const isOngoingProgress = (state.storage.progress?.length ?? 0) > 0;\n  const navCommon = useMemo(\n    () => ({\n      loading,\n      currentProgram,\n      settings,\n      isOngoingProgress,\n      stats,\n      userId,\n    }),\n    [loading, currentProgram, settings, isOngoingProgress, stats, userId]\n  );\n\n  return (\n    <FallbackScreen state={{ progress }} dispatch={dispatch}>\n      {({ progress: progress2 }) => (\n        <ScreenWorkout\n          navCommon={navCommon}\n          stats={stats}\n          helps={helps}\n          history={history}\n          subscription={subscription}\n          userId={userId}\n          progress={progress2}\n          allPrograms={allPrograms}\n          program={program}\n          currentProgram={currentProgram}\n          dispatch={dispatch}\n          settings={settings}\n        />\n      )}\n    </FallbackScreen>\n  );\n}\n\nexport function NavScreenFinishDay(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const route = useRoute<{ key: string; name: string; params?: { id?: number } }>();\n  return (\n    <NavScreenContent>\n      <ScreenFinishDayComponent\n        stats={state.storage.stats}\n        allPrograms={state.storage.programs}\n        currentProgramId={state.storage.currentProgramId}\n        settings={state.storage.settings}\n        dispatch={dispatch}\n        history={state.storage.history}\n        historyRecordId={route.params?.id}\n        userId={state.user?.id}\n      />\n    </NavScreenContent>\n  );\n}\n\nexport function NavScreenSubscription(): JSX.Element {\n  const { state, dispatch } = useAppState();\n  const navCommon = buildNavCommon(state);\n  return (\n    <ScreenSubscriptionComponent\n      history={state.storage.history}\n      prices={{ ...state.storage.subscriptionPrices, ...state.prices }}\n      offers={state.offers}\n      appleOffer={state.appleOffer}\n      googleOffer={state.googleOffer}\n      subscription={state.storage.subscription}\n      subscriptionLoading={state.subscriptionLoading}\n      subscriptionStatus={state.subscriptionStatus}\n      ownedLifetime={state.ownedLifetime}\n      dispatch={dispatch}\n      navCommon={navCommon}\n    />\n  );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\n\n// Flag-driven modals are opened by a screen effect that watches a redux flag and\n// navigates on a false->true edge. If the flag is only cleared inside the modal's\n// own close handler, an Android hardware/gesture back (which pops the native-stack\n// screen without invoking that handler) leaves the flag set, and the edge-guarded\n// watcher can never reopen the modal. Clearing on `beforeRemove` covers every\n// dismissal path, so the flag always returns to falsy.\nexport function useClearOnModalRemove(clear: () => void): void {\n  const navigation = useNavigation();\n  const clearRef = useRef(clear);\n  clearRef.current = clear;\n\n  useEffect(() => {\n    return navigation.addListener(\"beforeRemove\", () => clearRef.current());\n  }, [navigation]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { BackHandler, Platform } from \"react-native\";\nimport { CommonActions, useNavigation, usePreventRemove } from \"@react-navigation/native\";\nimport { IState } from \"../models/state\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IScreenData, Screen_shouldConfirmNavigation } from \"../models/screen\";\nimport { Thunk_confirmScreenLeave } from \"../ducks/thunks\";\nimport { untrack } from \"./TrackedStateContext\";\n\n// Single confirmation point for leaving screens with unsaved edits. Unlike the\n// old Thunk_pullScreen dialog, usePreventRemove also intercepts Android system\n// back, header back, and cross-tab stack resets. Prevention is armed only\n// while there are actual unsaved changes, so navigation stays native otherwise.\nexport function useConfirmScreenLeave(state: IState, dispatch: IDispatch, screen: IScreenData): void {\n  const navigation = useNavigation();\n  const confirmation = Screen_shouldConfirmNavigation(untrack(state), screen);\n  const shouldConfirm = confirmation != null;\n  const screenRef = useRef(screen);\n  screenRef.current = screen;\n\n  // The iOS swipe-back completes natively BEFORE the JS pop action can be\n  // prevented (native-stack dispatches pop from onDismissed), which desyncs the\n  // JS route state from the native stack. The gesture must be disabled while\n  // dirty instead; every other prevented path is JS-initiated and safe.\n  useEffect(() => {\n    navigation.setOptions({ gestureEnabled: !shouldConfirm });\n  }, [navigation, shouldConfirm]);\n\n  // Android back at the root of a tab stack doesn't remove any route — the tab\n  // navigator switches tabs (backBehavior) — so usePreventRemove never fires.\n  // Intercept the hardware back directly for that case; in-stack pops (index > 0)\n  // fall through to react-navigation, where usePreventRemove handles them.\n  useEffect(() => {\n    if (Platform.OS !== \"android\" || !shouldConfirm) {\n      return undefined;\n    }\n    const subscription = BackHandler.addEventListener(\"hardwareBackPress\", () => {\n      if (!navigation.isFocused() || (navigation.getState()?.index ?? 0) > 0) {\n        return false;\n      }\n      dispatch(Thunk_confirmScreenLeave(screenRef.current, CommonActions.goBack()));\n      return true;\n    });\n    return () => subscription.remove();\n  }, [navigation, dispatch, shouldConfirm]);\n\n  usePreventRemove(shouldConfirm, ({ data }) => {\n    dispatch(Thunk_confirmScreenLeave(screen, data.action));\n  });\n}\n","import { useEffect, useRef } from \"react\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport type { INavHeaderOptions } from \"./NavHeader\";\nimport { NavOptionsChanged_isChanged } from \"./navOptionsChanged\";\n\nexport function useNavOptions(options: INavHeaderOptions): void {\n  const navigation = useNavigation();\n  const prevRef = useRef<INavHeaderOptions | undefined>(undefined);\n  useEffect(() => {\n    if (!NavOptionsChanged_isChanged(prevRef.current, options)) {\n      return;\n    }\n    prevRef.current = options;\n    navigation.setOptions(options);\n  });\n}\n","import { RefObject, useCallback, useMemo, useRef } from \"react\";\nimport {\n  Animated,\n  LayoutChangeEvent,\n  NativeScrollEvent,\n  NativeSyntheticEvent,\n  Platform,\n  ScrollView,\n  View,\n} from \"react-native\";\nimport { INavScreenScrollContextValue, INavScreenScrollListener } from \"./NavScreenScrollContext\";\n\nexport interface INavScreenScrollOptions {\n  footerHeight: number;\n  stickyHeaderHeight: number;\n  // Fired only when the answer flips, so a screen can react to \"is scrolled at all\" without\n  // re-rendering on every frame of a scroll.\n  onScrolledChange?: (isScrolled: boolean) => void;\n}\n\nexport interface INavScreenScroll {\n  contextValue: INavScreenScrollContextValue;\n  scrollRef: RefObject<ScrollView | null>;\n  // Spans exactly the scroll area, for measuring where it ends on screen.\n  viewportRef: RefObject<View | null>;\n  // The native-driven Animated.event; the JS listener rides along inside it.\n  onScroll: ReturnType<typeof Animated.event>;\n  onLayout: (e: LayoutChangeEvent) => void;\n  onContentSizeChange: (width: number, height: number) => void;\n}\n\n// Everything a scroll area has to publish for the content inside it to position against:\n// the offset (both as a ref and as a native-driven Animated.Value), the viewport to measure,\n// and a listener registry. Extracted from NavScreenContent so surfaces that aren't screens —\n// a bottom sheet with its own scroller — can provide the same context rather than leaving it\n// null, which is what silently disables caret reveal and drag auto-scroll inside a modal.\nexport function useNavScreenScroll(options: INavScreenScrollOptions): INavScreenScroll {\n  const scrollRef = useRef<ScrollView>(null);\n  const viewportRef = useRef<View>(null);\n  const scrollYRef = useRef(0);\n  const scrollAnimatedY = useRef(new Animated.Value(0)).current;\n  const scrollListenersRef = useRef<Set<INavScreenScrollListener>>(new Set());\n  const layoutSizeRef = useRef({ width: 0, height: 0 });\n  const contentSizeRef = useRef({ width: 0, height: 0 });\n  const isScrolledRef = useRef(false);\n  const onScrolledChangeRef = useRef(options.onScrolledChange);\n  onScrolledChangeRef.current = options.onScrolledChange;\n\n  const onScrollEvent = useCallback((e: NativeSyntheticEvent<NativeScrollEvent>) => {\n    const y = e.nativeEvent.contentOffset.y;\n    scrollYRef.current = y;\n    layoutSizeRef.current = e.nativeEvent.layoutMeasurement;\n    contentSizeRef.current = e.nativeEvent.contentSize;\n    const isScrolled = y > 0;\n    if (isScrolled !== isScrolledRef.current) {\n      isScrolledRef.current = isScrolled;\n      onScrolledChangeRef.current?.(isScrolled);\n    }\n    scrollListenersRef.current.forEach((listener) => listener(e));\n  }, []);\n\n  // Listeners (e.g. useProgressiveItems) only ever see fresh onScroll events. When a screen isn't\n  // tall enough to scroll, no such event fires, so a listener that gates work on a near-bottom scroll\n  // would never advance. Replay the current scroll state on layout/content-size changes and on\n  // registration so those listeners can detect \"already at the bottom / not scrollable\".\n  const notifyListeners = useCallback((listeners: INavScreenScrollListener[]) => {\n    const layout = layoutSizeRef.current;\n    const content = contentSizeRef.current;\n    if (layout.height <= 0 || content.height <= 0) {\n      return;\n    }\n    const syntheticEvent = {\n      nativeEvent: {\n        contentOffset: { x: 0, y: scrollYRef.current },\n        contentSize: content,\n        layoutMeasurement: layout,\n      },\n    } as NativeSyntheticEvent<NativeScrollEvent>;\n    listeners.forEach((listener) => listener(syntheticEvent));\n  }, []);\n\n  const onContentSizeChange = useCallback(\n    (width: number, height: number) => {\n      contentSizeRef.current = { width, height };\n      notifyListeners([...scrollListenersRef.current]);\n    },\n    [notifyListeners]\n  );\n\n  const onLayout = useCallback(\n    (e: LayoutChangeEvent) => {\n      layoutSizeRef.current = { width: e.nativeEvent.layout.width, height: e.nativeEvent.layout.height };\n      notifyListeners([...scrollListenersRef.current]);\n    },\n    [notifyListeners]\n  );\n\n  const addScrollListener = useCallback(\n    (listener: INavScreenScrollListener) => {\n      scrollListenersRef.current.add(listener);\n      notifyListeners([listener]);\n      return () => {\n        scrollListenersRef.current.delete(listener);\n      };\n    },\n    [notifyListeners]\n  );\n\n  const { footerHeight, stickyHeaderHeight } = options;\n  const contextValue = useMemo(\n    () => ({\n      scrollRef,\n      scrollYRef,\n      contentSizeRef,\n      scrollAnimatedY,\n      viewportRef,\n      footerHeight,\n      stickyHeaderHeight,\n      addScrollListener,\n    }),\n    [scrollAnimatedY, footerHeight, stickyHeaderHeight, addScrollListener]\n  );\n\n  // The JS listeners above always trail the scroll by a frame or two, which is invisible for\n  // anything that only reacts to where the scroll ended up, but reads as rubber-banding for\n  // anything drawn at a scroll-derived position. Those get scrollAnimatedY instead, which the\n  // native animation driver keeps in lockstep with the scroll itself.\n  const onScroll = useMemo(\n    () =>\n      Animated.event([{ nativeEvent: { contentOffset: { y: scrollAnimatedY } } }], {\n        useNativeDriver: Platform.OS !== \"web\",\n        listener: onScrollEvent,\n      }),\n    [scrollAnimatedY, onScrollEvent]\n  );\n\n  return { contextValue, scrollRef, viewportRef, onScroll, onLayout, onContentSizeChange };\n}\n","import { useEffect, useRef } from \"react\";\nimport { navigateToModal } from \"./navigationService\";\nimport { IState } from \"../models/state\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_maybeShowOnloadModal } from \"../ducks/thunks\";\n\n// Run a side effect exactly once — the first time `isReady` flips true.\nfunction useRunOnceWhenReady(isReady: boolean, fn: () => void): void {\n  const fnRef = useRef(fn);\n  fnRef.current = fn;\n  const didRun = useRef(false);\n  useEffect(() => {\n    if (!isReady || didRun.current) {\n      return;\n    }\n    didRun.current = true;\n    fnRef.current();\n  }, [isReady]);\n}\n\n// Fire `onEdge` on the false->true edge of `condition`, but only once nav is ready.\nfunction useEdgeEffect(isReady: boolean, condition: boolean, onEdge: () => void): void {\n  const onEdgeRef = useRef(onEdge);\n  onEdgeRef.current = onEdge;\n  const prev = useRef(false);\n  useEffect(() => {\n    if (!isReady) {\n      return;\n    }\n    if (condition && !prev.current) {\n      onEdgeRef.current();\n    }\n    prev.current = condition;\n  }, [isReady, condition]);\n}\n\nexport function useOnloadModals(state: IState, dispatch: IDispatch, isNavReady: boolean): void {\n  useEdgeEffect(isNavReady, !!(state.showWhatsNew && state.storage.whatsNew != null), () =>\n    navigateToModal(\"whatsnewModal\")\n  );\n  useEdgeEffect(isNavReady, !!state.showHearAboutUs, () => navigateToModal(\"hearAboutUsModal\"));\n  useRunOnceWhenReady(isNavReady, () => dispatch(Thunk_maybeShowOnloadModal()));\n}\n","import { useEffect, useRef } from \"react\";\nimport { IState } from \"../models/state\";\nimport { navigateToModal } from \"./navigationService\";\nimport { Progress_getActiveSetTimer } from \"../models/progress\";\n\ninterface IPlaygroundModalState {\n  editSetModal: boolean;\n  amrapModal: boolean;\n  editModal: boolean;\n  setTimerEditModal: boolean;\n  roundingModal: boolean;\n  // The set-timer nonce (not a boolean) so we push only for a genuinely new timer, like workout mode does.\n  setTimerNonce: number | undefined;\n}\n\nfunction findActivePlaygroundModal(\n  state: IState\n): { weekIndex: number; dayIndex: number; modal: IPlaygroundModalState } | undefined {\n  const progresses = state.playgroundState?.progresses;\n  if (!progresses) {\n    return undefined;\n  }\n  for (let weekIndex = 0; weekIndex < progresses.length; weekIndex++) {\n    const week = progresses[weekIndex];\n    for (let dayIndex = 0; dayIndex < week.days.length; dayIndex++) {\n      const progress = week.days[dayIndex].progress;\n      const ui = progress.ui;\n      // Track the raw nonce (no amrap gating): a timed AMRAP keeps the same setTimer/nonce behind the amrap\n      // modal, so the nonce comparison below naturally avoids re-pushing the set-timer route that's still\n      // mounted underneath — gating on `amrapModal == null` here would instead read as a fresh open.\n      const setTimerNonce = Progress_getActiveSetTimer(progress)?.nonce;\n      if (\n        ui?.editSetModal ||\n        progress.amrapModal ||\n        ui?.editModal ||\n        ui?.setTimerEditModal ||\n        ui?.roundingModal ||\n        setTimerNonce != null\n      ) {\n        return {\n          weekIndex,\n          dayIndex,\n          modal: {\n            editSetModal: ui?.editSetModal != null,\n            amrapModal: progress.amrapModal != null,\n            editModal: ui?.editModal != null,\n            setTimerEditModal: ui?.setTimerEditModal != null,\n            roundingModal: ui?.roundingModal != null,\n            setTimerNonce,\n          },\n        };\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function usePlaygroundModalBridges(state: IState): void {\n  const active = findActivePlaygroundModal(state);\n\n  const prevEditSetModal = useRef(false);\n  const prevAmrapModal = useRef(false);\n  const prevEditModal = useRef(false);\n  const prevSetTimerEditModal = useRef(false);\n  const prevRoundingModal = useRef(false);\n  const prevSetTimerNonce = useRef<number | undefined>(undefined);\n\n  useEffect(() => {\n    if (active?.modal.editSetModal && !prevEditSetModal.current) {\n      navigateToModal(\"editSetTargetModal\", {\n        context: \"playground\",\n        weekIndex: active.weekIndex,\n        dayIndex: active.dayIndex,\n      });\n    }\n    prevEditSetModal.current = active?.modal.editSetModal ?? false;\n  }, [active?.modal.editSetModal, active?.weekIndex, active?.dayIndex]);\n\n  useEffect(() => {\n    if (active?.modal.amrapModal && !prevAmrapModal.current) {\n      const progress = state.playgroundState?.progresses[active.weekIndex]?.days[active.dayIndex]?.progress;\n      const amrapModal = progress?.amrapModal;\n      if (amrapModal) {\n        navigateToModal(\"amrapModal\", {\n          ...amrapModal,\n          context: \"playground\",\n          weekIndex: active.weekIndex,\n          dayIndex: active.dayIndex,\n        });\n      }\n    }\n    prevAmrapModal.current = active?.modal.amrapModal ?? false;\n  }, [active?.modal.amrapModal, active?.weekIndex, active?.dayIndex]);\n\n  useEffect(() => {\n    if (active?.modal.editModal && !prevEditModal.current) {\n      navigateToModal(\"playgroundEditModal\", {\n        context: \"playground\",\n        weekIndex: active.weekIndex,\n        dayIndex: active.dayIndex,\n      });\n    }\n    prevEditModal.current = active?.modal.editModal ?? false;\n  }, [active?.modal.editModal, active?.weekIndex, active?.dayIndex]);\n\n  useEffect(() => {\n    if (active?.modal.setTimerEditModal && !prevSetTimerEditModal.current) {\n      navigateToModal(\"setTimerEditModal\", {\n        context: \"playground\",\n        weekIndex: active.weekIndex,\n        dayIndex: active.dayIndex,\n      });\n    }\n    prevSetTimerEditModal.current = active?.modal.setTimerEditModal ?? false;\n  }, [active?.modal.setTimerEditModal, active?.weekIndex, active?.dayIndex]);\n\n  useEffect(() => {\n    if (active?.modal.roundingModal && !prevRoundingModal.current) {\n      navigateToModal(\"roundingInfoModal\", {\n        context: \"playground\",\n        weekIndex: active.weekIndex,\n        dayIndex: active.dayIndex,\n      });\n    }\n    prevRoundingModal.current = active?.modal.roundingModal ?? false;\n  }, [active?.modal.roundingModal, active?.weekIndex, active?.dayIndex]);\n\n  useEffect(() => {\n    const nonce = active?.modal.setTimerNonce;\n    // Push only when a genuinely new timer starts (nonce changes when a timed set's clock begins, and on each\n    // EMOM/auto advance). A timed AMRAP keeps the same nonce, so answering it (incl. \"Log & keep timing\")\n    // doesn't re-push the set-timer route still mounted underneath. Don't reset on clear — a new timer gets a\n    // new nonce, and clearing already pops the route via NavModalSetTimer's shouldGoBack.\n    if (active && nonce != null && nonce !== prevSetTimerNonce.current) {\n      prevSetTimerNonce.current = nonce;\n      navigateToModal(\"setTimerModal\", {\n        context: \"playground\",\n        weekIndex: active.weekIndex,\n        dayIndex: active.dayIndex,\n      });\n    }\n  }, [active?.modal.setTimerNonce, active?.weekIndex, active?.dayIndex]);\n}\n","import type { INavCommon, IState } from \"../models/state\";\nimport { Program_getProgram } from \"../models/program\";\nimport { untrack } from \"./TrackedStateContext\";\nimport type { IScreen } from \"../models/screen\";\nimport type { IHistoryRecord } from \"../types\";\nimport type { NavigationState } from \"@react-navigation/native\";\n\nexport interface IAdhocRecordParams {\n  progressId?: number;\n  historyRecordId?: number;\n}\n\nexport function resolveAdhocRecord(state: IState, params: IAdhocRecordParams | undefined): IHistoryRecord | undefined {\n  if (params == null) {\n    return undefined;\n  }\n  if (params.historyRecordId != null) {\n    return state.storage.history.find((h) => h.id === params.historyRecordId);\n  }\n  const { progressId } = params;\n  if (progressId == null) {\n    return undefined;\n  }\n  return progressId === 0 ? state.storage.progress?.[0] : state.progress[progressId];\n}\n\nexport function buildNavCommon(state: IState): INavCommon {\n  const currentProgram =\n    state.storage.currentProgramId != null ? Program_getProgram(state, state.storage.currentProgramId) : undefined;\n  return {\n    loading: untrack(state.loading),\n    currentProgram: untrack(currentProgram),\n    settings: untrack(state.storage.settings),\n    isOngoingProgress: (state.storage.progress?.length ?? 0) > 0,\n    stats: untrack(state.storage.stats),\n    userId: state.user?.id,\n  };\n}\n\nexport function getActiveScreenName(navState: NavigationState | undefined): IScreen | undefined {\n  if (!navState) {\n    return undefined;\n  }\n  const activeTab = navState.routes[navState.index ?? 0];\n  const tabState = activeTab.state as NavigationState | undefined;\n  if (!tabState) {\n    return undefined;\n  }\n  const activeRoute = tabState.routes[tabState.index ?? 0];\n  return activeRoute.name as IScreen;\n}\n\nexport function getActiveStackDepth(navState: NavigationState | undefined): number {\n  if (!navState) {\n    return 1;\n  }\n  const activeTab = navState.routes[navState.index ?? 0];\n  const tabState = activeTab.state as NavigationState | undefined;\n  if (!tabState) {\n    return 1;\n  }\n  return tabState.routes.length;\n}\n","import { useEffect } from \"react\";\nimport { lb, lbu } from \"lens-shmens\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { UndoingFlag_set } from \"../../../utils/undoingFlag\";\n\nexport interface IUndoRedoState<T> {\n  history: {\n    past: T[];\n    future: T[];\n    lastHistoryTs?: number;\n  };\n  current: T;\n}\n\nexport function undoRedoMiddleware<T, S extends IUndoRedoState<T>>(dispatch: ILensDispatch<S>, oldState: S): void {\n  const lastHistoryTsGetter = { lastHistoryTs: lb<S>().p(\"history\").p(\"lastHistoryTs\").get() };\n  dispatch(\n    [\n      lbu<S, typeof lastHistoryTsGetter>(lastHistoryTsGetter)\n        .p(\"history\")\n        .recordModify((history, getters) => {\n          const lastHistoryTs = getters.lastHistoryTs?.valueOf();\n          if (lastHistoryTs != null && Date.now() - lastHistoryTs < 500) {\n            return history;\n          } else {\n            return { ...history, past: [...history.past, oldState.current], future: [], lastHistoryTs: Date.now() };\n          }\n        }),\n    ],\n    \"Record history\"\n  );\n}\n\nexport function canUndo<T, S extends IUndoRedoState<T>>(state: S): T | undefined {\n  return state.history.past[state.history.past.length - 1];\n}\n\nexport function canRedo<T, S extends IUndoRedoState<T>>(state: S): T | undefined {\n  return state.history.future[0];\n}\n\nexport function undo<T, S extends IUndoRedoState<T>>(dispatch: ILensDispatch<S>, state: S): void {\n  const previousState = canUndo<T, S>(state);\n  if (previousState) {\n    dispatch(\n      [\n        lb<S>()\n          .p(\"history\")\n          .recordModify((history) => {\n            UndoingFlag_set(true);\n            return {\n              past: state.history.past.slice(0, state.history.past.length - 1),\n              future: [state.current, ...history.future],\n            };\n          }),\n        lb<S>().p(\"current\").record(previousState),\n      ],\n      \"undo\"\n    );\n  }\n}\n\nexport function redo<T, S extends IUndoRedoState<T>>(dispatch: ILensDispatch<S>, state: S): void {\n  const nextState = canRedo<T, S>(state);\n  if (nextState) {\n    dispatch(\n      [\n        lb<S>()\n          .p(\"history\")\n          .recordModify((history) => {\n            UndoingFlag_set(true);\n            return {\n              past: [...history.past, state.current],\n              future: state.history.future.slice(1, state.history.future.length),\n            };\n          }),\n        lb<S>().p(\"current\").record(nextState),\n      ],\n      \"undo\"\n    );\n  }\n}\n\nexport function useUndoRedo<T, S extends IUndoRedoState<T>>(\n  state: S,\n  dispatch: ILensDispatch<S>,\n  additionalDeps: unknown[] = [],\n  shouldEnable?: () => boolean\n): void {\n  useEffect(() => {\n    UndoingFlag_set(false);\n    if (typeof window === \"undefined\" || typeof window.addEventListener !== \"function\") {\n      return;\n    }\n    function onKeyPress(event: KeyboardEvent): void {\n      if (\n        !(event.target instanceof HTMLTextAreaElement) &&\n        !(event.target instanceof HTMLInputElement) &&\n        (event.key === \"z\" || event.key === \"Z\") &&\n        (event.ctrlKey || event.metaKey) &&\n        (!shouldEnable || shouldEnable())\n      ) {\n        if (!event.shiftKey) {\n          event.preventDefault();\n          undo(dispatch, state);\n        } else {\n          event.preventDefault();\n          redo(dispatch, state);\n        }\n      }\n    }\n    window.addEventListener(\"keydown\", onKeyPress);\n    return () => window.removeEventListener(\"keydown\", onKeyPress);\n  }, [state, ...additionalDeps]);\n}\n","import { JSX, useEffect, useRef, useState } from \"react\";\nimport { View, ScrollView, useWindowDimensions, LayoutChangeEvent, PixelRatio } from \"react-native\";\nimport { GroupHeader } from \"../../../components/groupHeader\";\nimport { Dialog_alert } from \"../../../utils/dialog\";\nimport { Modal } from \"../../../components/modal\";\nimport { IPlannerProgram, IProgram, ISettings } from \"../../../types\";\nimport { IProgramShareOutputOptions, ProgramShareOutput } from \"../../../components/programShareOutput\";\nimport { Button } from \"../../../components/button\";\nimport { IconSpinner } from \"../../../components/icons/iconSpinner\";\nimport { MenuItemEditable } from \"../../../components/menuItemEditable\";\nimport { CollectionUtils_removeAll, CollectionUtils_remove } from \"../../../utils/collection\";\nimport { LinkButton } from \"../../../components/linkButton\";\nimport { StringUtils_dashcase } from \"../../../utils/string\";\nimport { ImageShareUtils } from \"../../../utils/imageshare\";\nimport { ScrollableTabs } from \"../../../components/scrollableTabs\";\nimport { Program_toUrl } from \"../../../models/program\";\n\ninterface IModalPlannerPictureExportProps {\n  settings: ISettings;\n  client: Window[\"fetch\"];\n  userId?: string;\n  program: IProgram;\n  isChanged: boolean;\n  url?: string;\n  onClose: () => void;\n}\n\nfunction getInitialDaysToShow(program: IPlannerProgram): number[] {\n  let dayIndex = 0;\n  const initialDaysToShow: number[] = [];\n  program.weeks.forEach((w) =>\n    w.days.forEach(() => {\n      initialDaysToShow.push(dayIndex);\n      dayIndex += 1;\n    })\n  );\n  return initialDaysToShow;\n}\n\nexport function ModalPlannerPictureExportContent(props: IModalPlannerPictureExportProps): JSX.Element {\n  const sourceRef = useRef<View>(null);\n  const sourceSizeRef = useRef<{ width: number; height: number } | undefined>(undefined);\n  const layoutResolveRef = useRef<(() => void) | null>(null);\n  const planner = props.program.planner!;\n  const [url, setUrl] = useState(!props.isChanged && props.url ? props.url : undefined);\n  const [isCapturing, setIsCapturing] = useState(false);\n\n  const initialDaysToShow = getInitialDaysToShow(planner);\n  const [config, setConfig] = useState<IProgramShareOutputOptions>({\n    showInfo: true,\n    showDayDescription: true,\n    showWeekDescription: true,\n    showQRCode: true,\n    columns: 1,\n    daysToShow: initialDaysToShow,\n  });\n\n  useEffect(() => {\n    if (url == null) {\n      Program_toUrl(props.program, props.settings, props.client, props.userId).then((url2) => {\n        setUrl(url2);\n      });\n    }\n  }, []);\n\n  const { width } = useWindowDimensions();\n  const isWide = width >= 640;\n\n  const onSourceLayout = (e: LayoutChangeEvent): void => {\n    sourceSizeRef.current = { width: e.nativeEvent.layout.width, height: e.nativeEvent.layout.height };\n    const resolve = layoutResolveRef.current;\n    layoutResolveRef.current = null;\n    resolve?.();\n  };\n\n  const waitForSourceLayout = (): Promise<void> => {\n    return new Promise<void>((resolve) => {\n      layoutResolveRef.current = resolve;\n      setTimeout(() => {\n        if (layoutResolveRef.current === resolve) {\n          layoutResolveRef.current = null;\n          resolve();\n        }\n      }, 3000);\n    });\n  };\n\n  const offscreenSource = isCapturing ? (\n    <View\n      collapsable={false}\n      style={{ position: \"absolute\", left: -100000, top: 0 }}\n      pointerEvents=\"none\"\n      onLayout={onSourceLayout}\n    >\n      <ProgramShareOutput ref={sourceRef} settings={props.settings} program={planner} options={config} url={url} />\n    </View>\n  ) : null;\n\n  const settingsTab = (\n    <SettingsTab\n      program={planner}\n      initialDaysToShow={initialDaysToShow}\n      sourceRef={sourceRef}\n      sourceSizeRef={sourceSizeRef}\n      programName={props.program.name}\n      config={config}\n      setConfig={setConfig}\n      setIsCapturing={setIsCapturing}\n      waitForSourceLayout={waitForSourceLayout}\n    />\n  );\n\n  if (isWide) {\n    const preview = <ProgramShareOutput settings={props.settings} program={planner} options={config} url={url} />;\n    return (\n      <View className=\"flex-row flex-1\">\n        {offscreenSource}\n        <View\n          className=\"p-4 border-r bg-background-subtle border-border-neutral\"\n          style={{ borderTopLeftRadius: 8, borderBottomLeftRadius: 8, minWidth: 256 }}\n        >\n          <ScrollView>{settingsTab}</ScrollView>\n        </View>\n        <View className=\"flex-1\" style={{ minWidth: 384 }}>\n          <ScrollView contentContainerClassName=\"pb-4\">\n            <View className=\"px-4 py-2\">\n              <GroupHeader size=\"large\" name=\"Preview\" />\n            </View>\n            <ScrollView horizontal>{preview}</ScrollView>\n          </ScrollView>\n        </View>\n      </View>\n    );\n  }\n\n  return (\n    <View className=\"flex-1\">\n      {offscreenSource}\n      <ScrollableTabs\n        defaultIndex={0}\n        fillHeight={true}\n        tabs={[\n          {\n            label: \"Settings\",\n            children: () => <ScrollView contentContainerClassName=\"px-4 pt-2 pb-8\">{settingsTab}</ScrollView>,\n          },\n          {\n            label: \"Preview\",\n            children: () => (\n              <ScrollView contentContainerClassName=\"pb-8\">\n                <ScrollView horizontal>\n                  <View>\n                    <ProgramShareOutput settings={props.settings} program={planner} options={config} url={url} />\n                  </View>\n                </ScrollView>\n              </ScrollView>\n            ),\n          },\n        ]}\n      />\n    </View>\n  );\n}\n\nexport function ModalPlannerPictureExport(props: IModalPlannerPictureExportProps): JSX.Element {\n  return (\n    <Modal shouldShowClose={true} onClose={props.onClose} noPaddings={true}>\n      <ModalPlannerPictureExportContent {...props} />\n    </Modal>\n  );\n}\n\ninterface ISettingsTabProps {\n  program: IPlannerProgram;\n  initialDaysToShow: number[];\n  sourceRef: React.RefObject<View | null>;\n  sourceSizeRef: React.RefObject<{ width: number; height: number } | undefined>;\n  programName: string;\n  config: IProgramShareOutputOptions;\n  setConfig: (config: IProgramShareOutputOptions) => void;\n  setIsCapturing: (v: boolean) => void;\n  waitForSourceLayout: () => Promise<void>;\n}\n\nfunction getWeekDayMapping(program: IPlannerProgram): Record<number, Record<number, number>> {\n  let dayIndex = 0;\n  return program.weeks.reduce<Record<number, Record<number, number>>>((acc, week, weekIndex) => {\n    week.days.forEach((day, dayInWeekIndex) => {\n      acc[weekIndex] = acc[weekIndex] || {};\n      acc[weekIndex][dayInWeekIndex] = dayIndex;\n      dayIndex += 1;\n    });\n    return acc;\n  }, {});\n}\n\nfunction SettingsTab(props: ISettingsTabProps): JSX.Element {\n  const [isLoading, setIsLoading] = useState(false);\n  const { config, setConfig, sourceRef, sourceSizeRef, setIsCapturing, waitForSourceLayout } = props;\n\n  async function save(): Promise<void> {\n    const maxSize = 16384;\n    setIsLoading(true);\n    setIsCapturing(true);\n    const pixelRatio = PixelRatio.get();\n    try {\n      await waitForSourceLayout();\n      const size = sourceSizeRef.current;\n      const pixelW = size ? Math.round(size.width * pixelRatio) : 0;\n      const pixelH = size ? Math.round(size.height * pixelRatio) : 0;\n      console.log(\n        `[picture-export] size points=${size?.width}x${size?.height} pixelRatio=${pixelRatio} pixels=${pixelW}x${pixelH}`\n      );\n      if (size && (size.width >= maxSize || size.height >= maxSize)) {\n        Dialog_alert(\n          `The image is too large to generate - max size is 16384x16384 points, and the image would be ${size.width}x${size.height} points (${pixelW}x${pixelH} px). Try to set more columns, or disable some weeks/days.`\n        );\n        return;\n      }\n      const maxPixelDimension = 8192;\n      let captureWidth = size?.width;\n      let captureHeight = size?.height;\n      if (size) {\n        const longest = Math.max(size.width, size.height);\n        if (longest > maxPixelDimension) {\n          const scale = maxPixelDimension / longest;\n          captureWidth = Math.floor(size.width * scale);\n          captureHeight = Math.floor(size.height * scale);\n        }\n      }\n      console.log(`[picture-export] capturing at ${captureWidth}x${captureHeight} px`);\n      const t0 = Date.now();\n      const dataUrl = await ImageShareUtils.generateImageDataUrl(sourceRef, {\n        width: captureWidth,\n        height: captureHeight,\n      });\n      console.log(`[picture-export] captureRef ok in ${Date.now() - t0}ms -> ${dataUrl.slice(0, 80)}`);\n      const filename = StringUtils_dashcase(props.programName) + \".png\";\n      const imageShareUtils = new ImageShareUtils(dataUrl, filename);\n      await imageShareUtils.shareOrDownload();\n    } catch (error) {\n      const err = error as { message?: string; stack?: string; name?: string };\n      console.error(\"[picture-export] capture failed\", err?.name, err?.message, err?.stack);\n      const size = sourceSizeRef.current;\n      const pixelW = size ? Math.round(size.width * pixelRatio) : 0;\n      const pixelH = size ? Math.round(size.height * pixelRatio) : 0;\n      Dialog_alert(\n        `Failed to generate image (${pixelW}x${pixelH} px @${pixelRatio}x). ${err?.message ?? \"Unknown error\"}. Likely too large for the device — try more columns or fewer days.`\n      );\n    } finally {\n      setIsCapturing(false);\n      setIsLoading(false);\n    }\n  }\n  const weekDayMapping = getWeekDayMapping(props.program);\n\n  return (\n    <View>\n      <View className=\"flex-row items-center justify-center my-2\">\n        <Button\n          disabled={isLoading}\n          name=\"export-program-picture\"\n          kind=\"purple\"\n          className=\"w-48\"\n          onClick={() => save()}\n        >\n          {isLoading ? <IconSpinner width={12} height={12} color=\"white\" /> : \"Generate image\"}\n        </Button>\n      </View>\n      <GroupHeader size=\"large\" name=\"Export program to image\" />\n      <MenuItemEditable\n        name=\"Include program details\"\n        type=\"boolean\"\n        value={config.showInfo ? \"true\" : \"false\"}\n        onChange={(v) => setConfig({ ...config, showInfo: v === \"true\" })}\n      />\n      <MenuItemEditable\n        name=\"Include QR Code\"\n        type=\"boolean\"\n        value={config.showQRCode ? \"true\" : \"false\"}\n        onChange={(v) => setConfig({ ...config, showQRCode: v === \"true\" })}\n      />\n      <MenuItemEditable\n        name=\"Include week descriptions\"\n        type=\"boolean\"\n        value={config.showWeekDescription ? \"true\" : \"false\"}\n        onChange={(v) => setConfig({ ...config, showWeekDescription: v === \"true\" })}\n      />\n      <MenuItemEditable\n        name=\"Include day descriptions\"\n        type=\"boolean\"\n        value={config.showDayDescription ? \"true\" : \"false\"}\n        onChange={(v) => setConfig({ ...config, showDayDescription: v === \"true\" })}\n      />\n      <MenuItemEditable\n        name=\"Columns\"\n        type=\"number\"\n        value={config.columns.toString()}\n        onChange={(v) => {\n          if (v != null && !isNaN(Number(v)) && Number(v) > 0) {\n            setConfig({ ...config, columns: Number(v) });\n          }\n        }}\n      />\n      <GroupHeader name=\"Days to show\" topPadding={true} />\n      <View className=\"flex-row gap-2\">\n        <View>\n          <LinkButton\n            className=\"text-sm\"\n            name=\"select-all\"\n            onClick={() => setConfig({ ...config, daysToShow: props.initialDaysToShow })}\n          >\n            Select All\n          </LinkButton>\n        </View>\n        <View>\n          <LinkButton className=\"text-sm\" name=\"deselect-all\" onClick={() => setConfig({ ...config, daysToShow: [] })}>\n            Deselect All\n          </LinkButton>\n        </View>\n      </View>\n      {props.program.weeks.map((week, weekIndex) => {\n        const dayIndexes = week.days.map((_, i) => weekDayMapping[weekIndex][i]);\n        const allDaysSelected = dayIndexes.every((di) => config.daysToShow.includes(di));\n        return (\n          <View key={weekIndex}>\n            <MenuItemEditable\n              name={`Week ${weekIndex + 1}`}\n              type=\"boolean\"\n              value={allDaysSelected ? \"true\" : \"false\"}\n              onChange={(v) => {\n                if (v === \"true\") {\n                  setConfig({ ...config, daysToShow: Array.from(new Set([...config.daysToShow, ...dayIndexes])) });\n                } else {\n                  setConfig({ ...config, daysToShow: CollectionUtils_removeAll(config.daysToShow, dayIndexes) });\n                }\n              }}\n            />\n            {week.days.map((_, i) => {\n              const dayIndex = weekDayMapping[weekIndex][i];\n              const daySelected = config.daysToShow.includes(dayIndex);\n              return (\n                <MenuItemEditable\n                  key={dayIndex}\n                  prefix={<View className=\"w-4\" />}\n                  name={`• Day ${i + 1}`}\n                  type=\"boolean\"\n                  value={daySelected ? \"true\" : \"false\"}\n                  onChange={(v) => {\n                    if (v === \"true\") {\n                      setConfig({ ...config, daysToShow: Array.from(new Set([...config.daysToShow, dayIndex])) });\n                    } else {\n                      setConfig({ ...config, daysToShow: CollectionUtils_remove(config.daysToShow, dayIndex) });\n                    }\n                  }}\n                />\n              );\n            })}\n          </View>\n        );\n      })}\n    </View>\n  );\n}\n","import { memo, useCallback, type JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../../components/primitives/text\";\nimport { lb } from \"lens-shmens\";\nimport { GroupHeader } from \"../../../components/groupHeader\";\nimport { Input, IValidationError } from \"../../../components/input\";\nimport { MenuItemValue } from \"../../../components/menuItemEditable\";\nimport { Modal } from \"../../../components/modal\";\nimport { ISettings, IUnit, IScreenMuscle } from \"../../../types\";\nimport { ObjectUtils_keys, ObjectUtils_fromArray } from \"../../../utils/object\";\nimport { Muscle_getAvailableMuscleGroups, Muscle_getMuscleGroupName } from \"../../../models/muscle\";\nimport { Settings_withWeeklyRangeSetsBound } from \"../../../models/settings\";\nimport { LinkButton } from \"../../../components/linkButton\";\nimport { IconSpinner } from \"../../../components/icons/iconSpinner\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { IEither } from \"../../../utils/types\";\n\nexport type IPlannerSettingsSaveStatus = \"saving\" | \"saved\" | \"error\";\n\ninterface IModalPlannerSettingsProps {\n  settings: ISettings;\n  inApp: boolean;\n  saveStatus?: IPlannerSettingsSaveStatus;\n  onShowEditMuscleGroups: () => void;\n  dispatch: ILensDispatch<ISettings>;\n  onClose: () => void;\n}\n\nfunction SaveStatus(props: { status: IPlannerSettingsSaveStatus }): JSX.Element {\n  if (props.status === \"saving\") {\n    return <IconSpinner width={12} height={12} />;\n  }\n  return (\n    <Text className={`text-xs ${props.status === \"error\" ? \"text-text-error\" : \"text-text-secondary\"}`}>\n      {props.status === \"error\" ? \"Failed to save\" : \"Saved\"}\n    </Text>\n  );\n}\n\nfunction parseAndClamp(\n  e: IEither<string, Set<IValidationError>>,\n  min?: number,\n  max?: number,\n  isInt: boolean = true\n): number | undefined {\n  if (!e.success) {\n    return undefined;\n  }\n  const value = isInt ? parseInt(e.data, 10) : parseFloat(e.data);\n  if (isNaN(value)) {\n    return undefined;\n  }\n  let clamped = value;\n  if (min != null) {\n    clamped = Math.max(min, clamped);\n  }\n  if (max != null) {\n    clamped = Math.min(max, clamped);\n  }\n  return clamped;\n}\n\nexport function ModalPlannerSettingsContent(props: IModalPlannerSettingsProps): JSX.Element {\n  const { dispatch, settings } = props;\n  const availableMuscleGroups = Muscle_getAvailableMuscleGroups(settings);\n\n  let allWeeklySetsMin: number | undefined;\n  if (\n    ObjectUtils_keys(settings.planner.weeklyRangeSets).every(\n      (k) => settings.planner.weeklyRangeSets[k]?.[0] === settings.planner.weeklyRangeSets.abs?.[0]\n    )\n  ) {\n    allWeeklySetsMin = settings.planner.weeklyRangeSets.abs?.[0];\n  }\n\n  let allWeeklySetsMax: number | undefined;\n  if (\n    ObjectUtils_keys(settings.planner.weeklyRangeSets).every(\n      (k) => settings.planner.weeklyRangeSets[k]?.[1] === settings.planner.weeklyRangeSets.abs?.[1]\n    )\n  ) {\n    allWeeklySetsMax = settings.planner.weeklyRangeSets.abs?.[1];\n  }\n\n  let allWeeklyFrequency: number | undefined;\n  if (\n    ObjectUtils_keys(settings.planner.weeklyFrequency).every(\n      (k) => settings.planner.weeklyFrequency[k] === settings.planner.weeklyFrequency.abs\n    )\n  ) {\n    allWeeklyFrequency = settings.planner.weeklyFrequency.abs;\n  }\n\n  const onUnits = useCallback(\n    (newValue?: string) => {\n      dispatch(\n        lb<ISettings>()\n          .p(\"units\")\n          .record(newValue as IUnit),\n        \"Update units\"\n      );\n    },\n    [dispatch]\n  );\n\n  const onSynergistMultiplier = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0, undefined, false);\n      if (v != null) {\n        dispatch(lb<ISettings>().p(\"planner\").p(\"synergistMultiplier\").record(v), \"Update synergist\");\n      }\n    },\n    [dispatch]\n  );\n\n  const onRestTimer = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        dispatch(lb<ISettings>().p(\"timers\").p(\"workout\").record(v), \"Update rest timer\");\n      }\n    },\n    [dispatch]\n  );\n\n  const onSetsSplitPreset = useCallback(\n    (newValue?: string) => {\n      if (newValue === \"strength\") {\n        dispatch(\n          [\n            lb<ISettings>().p(\"planner\").p(\"strengthSetsPct\").record(70),\n            lb<ISettings>().p(\"planner\").p(\"hypertrophySetsPct\").record(30),\n          ],\n          \"Strength preset\"\n        );\n      } else if (newValue === \"hypertrophy\") {\n        dispatch(\n          [\n            lb<ISettings>().p(\"planner\").p(\"strengthSetsPct\").record(30),\n            lb<ISettings>().p(\"planner\").p(\"hypertrophySetsPct\").record(70),\n          ],\n          \"Hypertrophy preset\"\n        );\n      }\n    },\n    [dispatch]\n  );\n\n  const onStrengthPct = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0, 100);\n      if (v != null) {\n        dispatch(lb<ISettings>().p(\"planner\").p(\"strengthSetsPct\").record(v), \"Update strength %\");\n      }\n    },\n    [dispatch]\n  );\n\n  const onHypertrophyPct = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0, 100);\n      if (v != null) {\n        dispatch(lb<ISettings>().p(\"planner\").p(\"hypertrophySetsPct\").record(v), \"Update hypertrophy %\");\n      }\n    },\n    [dispatch]\n  );\n\n  const onMuscleGroupsPreset = useCallback(\n    (newValue?: string) => {\n      const presets: Record<string, [[number, number], number]> = {\n        novice: [[10, 12], 2],\n        intermediate: [[13, 15], 3],\n        advanced: [[16, 20], 4],\n      };\n      const preset = newValue && presets[newValue];\n      if (preset) {\n        const [range, freq] = preset;\n        dispatch(\n          [\n            lb<ISettings>()\n              .p(\"planner\")\n              .p(\"weeklyRangeSets\")\n              .record(ObjectUtils_fromArray(availableMuscleGroups.map((e) => [e, range]))),\n            lb<ISettings>()\n              .p(\"planner\")\n              .p(\"weeklyFrequency\")\n              .record(ObjectUtils_fromArray(availableMuscleGroups.map((e) => [e, freq]))),\n          ],\n          `${newValue} preset`\n        );\n      }\n    },\n    [dispatch, availableMuscleGroups]\n  );\n\n  const onChangeAllMin = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        const newValues = ObjectUtils_fromArray(\n          availableMuscleGroups.map((mg) => [\n            mg,\n            [v, settings.planner.weeklyRangeSets[mg]?.[1] ?? 0] as [number, number],\n          ])\n        );\n        dispatch(lb<ISettings>().p(\"planner\").p(\"weeklyRangeSets\").record(newValues), \"Change all min\");\n      }\n    },\n    [dispatch, availableMuscleGroups, settings.planner.weeklyRangeSets]\n  );\n\n  const onChangeAllMax = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        const newValues = ObjectUtils_fromArray(\n          availableMuscleGroups.map((mg) => [\n            mg,\n            [settings.planner.weeklyRangeSets[mg]?.[0] ?? 0, v] as [number, number],\n          ])\n        );\n        dispatch(lb<ISettings>().p(\"planner\").p(\"weeklyRangeSets\").record(newValues), \"Change all max\");\n      }\n    },\n    [dispatch, availableMuscleGroups, settings.planner.weeklyRangeSets]\n  );\n\n  const onChangeAllFreq = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        const newValues = ObjectUtils_fromArray(availableMuscleGroups.map((mg) => [mg, v]));\n        dispatch(lb<ISettings>().p(\"planner\").p(\"weeklyFrequency\").record(newValues), \"Change all freq\");\n      }\n    },\n    [dispatch, availableMuscleGroups]\n  );\n\n  return (\n    <View className=\"pb-4\">\n      <GroupHeader size=\"large\" name=\"Muscle Settings\" />\n      <View className=\"flex-row items-start\">\n        <Text className=\"flex-1 text-xs text-text-secondary\">\n          These apply to your whole account, not just this program.\n        </Text>\n        {props.saveStatus != null && (\n          <View className=\"ml-2\">\n            <SaveStatus status={props.saveStatus} />\n          </View>\n        )}\n      </View>\n      <View className=\"mt-2\" style={!props.inApp ? { minWidth: 512 } : undefined}>\n        {!props.inApp && (\n          <View className=\"mb-1\">\n            <View className=\"flex-row items-center\">\n              <Text className=\"mr-2\">Units:</Text>\n              <MenuItemValue\n                name=\"Sets split preset\"\n                setPatternError={() => undefined}\n                type=\"desktop-select\"\n                value={settings.units}\n                values={[\n                  [\"lb\", \"lb\"],\n                  [\"kg\", \"kg\"],\n                ]}\n                onChange={onUnits}\n              />\n            </View>\n          </View>\n        )}\n        <View className=\"flex-row mb-2\" style={{ gap: props.inApp ? 4 : 16 }}>\n          {!props.inApp && (\n            <View className=\"flex-1\">\n              <Input\n                label=\"Rest Timer\"\n                min={0}\n                type=\"number\"\n                value={settings.timers.workout ?? 180}\n                changeHandler={onRestTimer}\n              />\n            </View>\n          )}\n          <View className=\"flex-1\">\n            <Input\n              label=\"Synergist multiplier\"\n              min={0}\n              type=\"number\"\n              value={settings.planner.synergistMultiplier}\n              changeHandler={onSynergistMultiplier}\n            />\n          </View>\n        </View>\n        <View className=\"mt-4 mb-1\">\n          <View className=\"flex-row items-center\">\n            <Text className=\"mr-2\">Sets split preset:</Text>\n            <MenuItemValue\n              name=\"Sets split preset\"\n              setPatternError={() => undefined}\n              type=\"desktop-select\"\n              value=\"\"\n              values={[\n                [\"\", \"\"],\n                [\"strength\", \"Strength\"],\n                [\"hypertrophy\", \"Hypertrophy\"],\n              ]}\n              onChange={onSetsSplitPreset}\n            />\n          </View>\n        </View>\n        <View className=\"flex-row mb-2\" style={{ gap: props.inApp ? 4 : 16 }}>\n          <View className=\"flex-1\">\n            <Input\n              label=\"Strength sets %\"\n              min={0}\n              max={100}\n              type=\"number\"\n              value={settings.planner.strengthSetsPct}\n              changeHandler={onStrengthPct}\n            />\n          </View>\n          <View className=\"flex-1\">\n            <Input\n              label=\"Hypertrophy sets %\"\n              min={0}\n              max={100}\n              type=\"number\"\n              value={settings.planner.hypertrophySetsPct}\n              changeHandler={onHypertrophyPct}\n            />\n          </View>\n        </View>\n        <Text className=\"mt-8 text-base font-bold\">Weekly Sets Per Muscle Group</Text>\n        <View className=\"mb-2\">\n          <LinkButton className=\"text-xs\" name=\"planner-settings-muscle-groups\" onPress={props.onShowEditMuscleGroups}>\n            Edit Muscle Groups\n          </LinkButton>\n        </View>\n        <View className=\"mb-1\">\n          <View className=\"flex-row items-center\">\n            <Text className=\"mr-2\">Muscle Groups sets preset:</Text>\n            <MenuItemValue\n              name=\"Sets split preset\"\n              setPatternError={() => undefined}\n              type=\"desktop-select\"\n              value=\"\"\n              values={[\n                [\"\", \"\"],\n                [\"novice\", \"Novice\"],\n                [\"intermediate\", \"Intermediate\"],\n                [\"advanced\", \"Advanced\"],\n              ]}\n              onChange={onMuscleGroupsPreset}\n            />\n          </View>\n        </View>\n        <View>\n          <View className={`${!props.inApp ? \"flex-row\" : \"\"} items-start mb-2`}>\n            <Text className=\"w-scaled-32 text-sm font-bold text-text-error\">Change All</Text>\n            <View className=\"flex-row flex-1 w-full gap-2\">\n              <View className=\"flex-1\">\n                <Input\n                  label=\"Min\"\n                  min={0}\n                  labelSize=\"xs\"\n                  type=\"number\"\n                  value={allWeeklySetsMin}\n                  changeHandler={onChangeAllMin}\n                />\n              </View>\n              <View className=\"flex-1\">\n                <Input\n                  label=\"Max\"\n                  min={0}\n                  labelSize=\"xs\"\n                  type=\"number\"\n                  value={allWeeklySetsMax}\n                  changeHandler={onChangeAllMax}\n                />\n              </View>\n              <View style={{ flex: 1.5 }}>\n                <Input\n                  label=\"Freq, days\"\n                  labelSize=\"xs\"\n                  min={0}\n                  type=\"number\"\n                  value={allWeeklyFrequency}\n                  changeHandler={onChangeAllFreq}\n                />\n              </View>\n            </View>\n          </View>\n          {availableMuscleGroups.map((muscleGroup) => {\n            return (\n              <MuscleGroupRow\n                key={muscleGroup}\n                muscleGroup={muscleGroup}\n                muscleGroupName={Muscle_getMuscleGroupName(muscleGroup, settings)}\n                min={settings.planner.weeklyRangeSets[muscleGroup]?.[0]}\n                max={settings.planner.weeklyRangeSets[muscleGroup]?.[1]}\n                freq={settings.planner.weeklyFrequency[muscleGroup]}\n                inApp={props.inApp}\n                dispatch={dispatch}\n              />\n            );\n          })}\n        </View>\n      </View>\n    </View>\n  );\n}\n\ninterface IMuscleGroupRowProps {\n  muscleGroup: IScreenMuscle;\n  muscleGroupName: string;\n  min: number | undefined;\n  max: number | undefined;\n  freq: number | undefined;\n  inApp: boolean;\n  dispatch: ILensDispatch<ISettings>;\n}\n\nconst MuscleGroupRow = memo(function MuscleGroupRow(props: IMuscleGroupRowProps): JSX.Element {\n  const { muscleGroup, dispatch } = props;\n\n  const onMin = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        dispatch(\n          lb<ISettings>()\n            .p(\"planner\")\n            .p(\"weeklyRangeSets\")\n            .p(muscleGroup)\n            .recordModify((range) => Settings_withWeeklyRangeSetsBound(range, \"min\", v)),\n          `Update ${muscleGroup} min`\n        );\n      }\n    },\n    [dispatch, muscleGroup]\n  );\n\n  const onMax = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        dispatch(\n          lb<ISettings>()\n            .p(\"planner\")\n            .p(\"weeklyRangeSets\")\n            .p(muscleGroup)\n            .recordModify((range) => Settings_withWeeklyRangeSetsBound(range, \"max\", v)),\n          `Update ${muscleGroup} max`\n        );\n      }\n    },\n    [dispatch, muscleGroup]\n  );\n\n  const onFreq = useCallback(\n    (e: IEither<string, Set<IValidationError>>) => {\n      const v = parseAndClamp(e, 0);\n      if (v != null) {\n        dispatch(\n          lb<ISettings>().p(\"planner\").p(\"weeklyFrequency\").p(muscleGroup).record(v),\n          `Update ${muscleGroup} freq`\n        );\n      }\n    },\n    [dispatch, muscleGroup]\n  );\n\n  return (\n    <View className={`${!props.inApp ? \"flex-row\" : \"\"} items-start mb-2`}>\n      <Text className=\"w-scaled-32 text-xs font-bold\">{props.muscleGroupName}</Text>\n      <View className=\"flex-row flex-1 w-full gap-2\">\n        <View className=\"flex-1\">\n          <Input label=\"Min\" min={0} type=\"number\" labelSize=\"xs\" value={props.min} changeHandler={onMin} />\n        </View>\n        <View className=\"flex-1\">\n          <Input label=\"Max\" labelSize=\"xs\" min={0} type=\"number\" value={props.max} changeHandler={onMax} />\n        </View>\n        <View style={{ flex: 1.5 }}>\n          <Input label=\"Freq, days\" min={0} labelSize=\"xs\" type=\"number\" value={props.freq} changeHandler={onFreq} />\n        </View>\n      </View>\n    </View>\n  );\n});\n\nexport function ModalPlannerSettings(props: IModalPlannerSettingsProps): JSX.Element {\n  return (\n    <Modal shouldShowClose={true} onClose={props.onClose}>\n      <ModalPlannerSettingsContent {...props} />\n    </Modal>\n  );\n}\n","import type { JSX } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport { FastText } from \"../../../components/primitives/fastText\";\nimport { PlannerHighlighter_segments } from \"../plannerHighlighter\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { StyledText, StyledText_cls } from \"../../../utils/styledText\";\nimport { useRem } from \"../../../utils/useRem\";\n\nconst MONO_FONT_FAMILY = Platform.select({\n  web: \"Iosevka Web, Iosevka, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n  ios: \"Iosevka\",\n  android: \"Iosevka-Regular\",\n  default: \"monospace\",\n});\n\ninterface IPlannerCodeBlockProps {\n  script: string;\n  className?: string;\n  // Readers who can't scroll sideways to the rest of the line (a panel inside another\n  // scroller) take the ragged wrap over the missing half. Newlines and indentation survive it.\n  wrap?: boolean;\n}\n\nfunction colorForClass(clazz: string | null): string | undefined {\n  if (!clazz) {\n    return undefined;\n  }\n  const syntax = Tailwind_semantic().syntax;\n  if (clazz.includes(\"tok-variableName\")) {\n    return syntax.variable;\n  }\n  if (clazz.includes(\"tok-keyword\")) {\n    return syntax.keyword;\n  }\n  if (clazz.includes(\"tok-literal\")) {\n    return syntax.literal;\n  }\n  if (clazz.includes(\"tok-meta\")) {\n    return syntax.attributeName;\n  }\n  if (clazz.includes(\"tok-comment\")) {\n    return syntax.comment;\n  }\n  if (clazz.includes(\"tok-atom\")) {\n    return syntax.atom;\n  }\n  if (clazz.includes(\"tok-propertyName\")) {\n    return syntax.comment;\n  }\n  if (clazz.includes(\"tok-attributeName\")) {\n    return syntax.attributeName;\n  }\n  if (clazz.includes(\"tok-attributeValue\")) {\n    return syntax.attributeValue;\n  }\n  if (clazz.includes(\"tok-number\")) {\n    return syntax.literal;\n  }\n  if (clazz.includes(\"tok-string\")) {\n    return syntax.variable;\n  }\n  return undefined;\n}\n\nexport function PlannerCodeBlock(props: IPlannerCodeBlockProps): JSX.Element {\n  const cls = StyledText_cls(useRem());\n  const fontSize = cls(props.className ?? \"text-base\").fontSize;\n  const builder = new StyledText();\n  for (const segment of PlannerHighlighter_segments(props.script)) {\n    const color = colorForClass(segment.clazz);\n    builder.add(segment.text, color != null ? { color } : undefined);\n  }\n  const { text, fragments } = builder.build();\n  // No internal scroller: callers that need horizontal scroll wrap this in a ScrollView\n  // (e.g. simpleMarkdown, editProgramV2TextExercises) or rely on web `.code.block` overflow.\n  return (\n    <View className=\"block code\">\n      <FastText\n        text={text}\n        fragments={fragments}\n        fontFamily={MONO_FONT_FAMILY}\n        fontSize={fontSize}\n        color={Tailwind_semantic().text.primary}\n        noWrap={!props.wrap}\n        preserveWhitespace={props.wrap}\n      />\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../../components/primitives/text\";\nimport { PlannerStats } from \"./plannerStats\";\nimport { PlannerStatsUtils_calculateSetResults } from \"../models/plannerStatsUtils\";\nimport { IPlannerEvalResult } from \"../plannerExerciseEvaluator\";\nimport { ISettings } from \"../../../types\";\n\ninterface IPlannerDayStatsProps {\n  settings: ISettings;\n  evaluatedDay: IPlannerEvalResult;\n  hideTitle?: boolean;\n}\n\nexport function PlannerDayStats(props: IPlannerDayStatsProps): JSX.Element {\n  const { settings } = props;\n\n  const evaluatedDay = props.evaluatedDay;\n  if (!evaluatedDay.success) {\n    return <></>;\n  }\n  const setResults = PlannerStatsUtils_calculateSetResults([evaluatedDay], settings);\n\n  return (\n    <View>\n      {!props.hideTitle && <Text className=\"mb-2 text-xl font-bold\">Day Stats</Text>}\n      <PlannerStats setResults={setResults} settings={settings} colorize={false} frequency={false} />\n    </View>\n  );\n}\n","import { JSX, useEffect, useRef } from \"react\";\nimport { IAllCustomExercises } from \"../../../types\";\nimport { PlannerEditor } from \"../plannerEditor\";\nimport { PlannerSyntaxError } from \"../plannerExerciseEvaluator\";\nimport type { IEditorError, IEditorTheme } from \"../../../editorTypes\";\n\ninterface IProps {\n  name: string;\n  onChange?: (newValue: string) => void;\n  onLineChange?: (newValue: number) => void;\n  onBlur?: (event: FocusEvent, newValue: string) => void;\n  error?: PlannerSyntaxError;\n  lineNumbers?: boolean;\n  // The program editors' error presentation (dark-red band, white text) follows\n  // lineNumbers by default; hosts without a gutter (the editor sheet) opt in explicitly.\n  redError?: boolean;\n  onCustomErrorCta?: (error: IEditorError) => JSX.Element | undefined;\n  customExercises: IAllCustomExercises;\n  exerciseFullNames: string[];\n  value?: string;\n  height?: number;\n  autoHeight?: boolean;\n  minHeight?: number;\n  maxHeight?: number;\n  // On web the editor lives in the main DOM and inherits the app's theme class, so this is unused here.\n  theme?: IEditorTheme;\n  hasHistory?: boolean;\n}\n\nexport function PlannerEditorView(props: IProps): JSX.Element {\n  const onChange = (value: string): void => {\n    if (props.onChange && !window.isUndoing) {\n      props.onChange(value);\n    }\n  };\n\n  const codeEditor = useRef<PlannerEditor | undefined>(undefined);\n  useEffect(() => {\n    const ce = new PlannerEditor({\n      onChange: onChange,\n      onLineChange: props.onLineChange,\n      onBlur: props.onBlur,\n      value: props.value,\n      error: props.error,\n      lineNumbers: props.lineNumbers,\n      hasHistory: props.hasHistory,\n      customExercises: props.customExercises,\n    });\n    ce.attach(divRef.current!);\n    codeEditor.current = ce;\n    return () => {\n      ce.destroy();\n      codeEditor.current = undefined;\n    };\n  }, []);\n\n  useEffect(() => {\n    if (codeEditor.current) {\n      codeEditor.current.setCustomExercises(props.customExercises);\n    }\n  }, [props.customExercises]);\n\n  useEffect(() => {\n    if (codeEditor.current) {\n      codeEditor.current.setExerciseFullNames(props.exerciseFullNames);\n    }\n  }, [props.exerciseFullNames]);\n\n  useEffect(() => {\n    if (codeEditor.current) {\n      codeEditor.current.args.onLineChange = props.onLineChange;\n    }\n  }, [props.onLineChange]);\n\n  useEffect(() => {\n    if (codeEditor.current) {\n      codeEditor.current.setError(props.error);\n    }\n  }, [props.error]);\n\n  useEffect(() => {\n    if (window.isUndoing) {\n      const ce = codeEditor.current;\n      if (ce && props.value != null) {\n        ce.setValue(props.value);\n      }\n    }\n  }, [props.value]);\n\n  const divRef = useRef<HTMLDivElement>(null);\n\n  let className =\n    \"block w-full px-2 py-2 leading-normal border rounded-lg appearance-none bg-background-default focus:outline-none focus:shadow-outline\";\n  if (props.error != null) {\n    className += \" border-red-500\";\n  } else {\n    className += \" border-border-neutral\";\n  }\n\n  return (\n    <div className=\"planner-editor-view\" style={{ fontFamily: \"Iosevka Web, Iosevka\" }}>\n      <div\n        className={\n          (props.redError ?? props.lineNumbers) ? \"planner-editor-error sticky bg-background-darkred z-30\" : \"\"\n        }\n      >\n        {props.error && (\n          <EvalResult\n            redTheme={props.redError ?? props.lineNumbers}\n            error={props.error}\n            onCustomErrorCta={props.onCustomErrorCta}\n          />\n        )}\n      </div>\n      <div data-testid=\"planner-editor\" className={className} ref={divRef}></div>\n    </div>\n  );\n}\n\ninterface IEvalResultProps {\n  error?: PlannerSyntaxError;\n  redTheme?: boolean;\n  onCustomErrorCta?: (error: IEditorError) => JSX.Element | undefined;\n}\n\nexport function EvalResult(props: IEvalResultProps): JSX.Element | null {\n  if (props.error) {\n    const customErrorCta = props.onCustomErrorCta && props.onCustomErrorCta(props.error);\n    return (\n      <span className=\"px-2 text-sm\">\n        <span className={props.redTheme ? \"text-text-alwayswhite\" : \"text-text-error\"}>Error: </span>\n        <span className={`font-bold ${props.redTheme ? \"text-text-alwayswhite\" : \"text-text-error\"}`}>\n          {props.error.message}\n        </span>\n        <span className=\"ml-2\">{customErrorCta}</span>\n      </span>\n    );\n  } else {\n    return null;\n  }\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { Linking, Pressable, View } from \"react-native\";\nimport { ActiveGraphContext, IActiveGraphContext } from \"../../../components/activeGraphContext\";\nimport { Text } from \"../../../components/primitives/text\";\nimport { ExerciseImage } from \"../../../components/exerciseImage\";\nimport {\n  IExercise,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroups,\n  Exercise_toExternalUrl,\n} from \"../../../models/exercise\";\nimport { Weight_rpeMultiplier } from \"../../../models/weight\";\nimport { ISettings } from \"../../../types\";\nimport {\n  PlannerProgramExercise_numberOfSets,\n  PlannerProgramExercise_numberOfSetsThisWeek,\n  PlannerProgramExercise_sets,\n} from \"../models/plannerProgramExercise\";\nimport { IPlannerProgramExercise, IPlannerState } from \"../models/types\";\nimport { IPlannerEvalResult } from \"../plannerExerciseEvaluator\";\nimport { PlannerGraph } from \"../plannerGraph\";\nimport { LinkButton } from \"../../../components/linkButton\";\nimport { ILensDispatch } from \"../../../utils/useLensReducer\";\nimport { lb } from \"lens-shmens\";\nimport { PlannerKey_fromPlannerExercise } from \"../plannerKey\";\nimport { IconExternalLink } from \"../../../components/icons/iconExternalLink\";\nimport { ExerciseImageUtils_exists } from \"../../../models/exerciseImage\";\nimport { Muscle_getMuscleGroupName } from \"../../../models/muscle\";\nimport { PlannerSidePanelStats_findExercise } from \"../models/plannerSidePanelStats\";\nimport { PlannerExerciseSwap_openByKey } from \"../models/plannerExerciseSwap\";\nimport { useRem } from \"../../../utils/useRem\";\n\ninterface IPlannerExerciseStatsProps {\n  settings: ISettings;\n  evaluatedWeeks: IPlannerEvalResult[][];\n  weekIndex: number;\n  dispatch: ILensDispatch<IPlannerState>;\n  dayIndex: number;\n  exerciseLine: number;\n  hideSwap?: boolean;\n  onEditMuscleGroupsOverride?: (exerciseType: IExercise) => void;\n  onEditMuscleGroups?: () => void;\n}\n\nexport function PlannerExerciseStats(props: IPlannerExerciseStatsProps): JSX.Element {\n  const result = PlannerSidePanelStats_findExercise(\n    props.weekIndex,\n    props.dayIndex,\n    props.exerciseLine,\n    props.evaluatedWeeks,\n    props.settings\n  );\n  if (!result) {\n    return <></>;\n  }\n  const evaluatedWeek = props.evaluatedWeeks[props.weekIndex];\n  const { exercise, evaluatedExercise } = result;\n\n  const targetMuscles = Exercise_targetMuscles(exercise, props.settings);\n  const synergeticMuscles = Exercise_synergistMuscles(exercise, props.settings);\n  const targetMuscleGroups = Exercise_targetMusclesGroups(exercise, props.settings).map((w) =>\n    Muscle_getMuscleGroupName(w, props.settings)\n  );\n  const synergeticMuscleGroups = Exercise_synergistMusclesGroups(exercise, props.settings)\n    .map((w) => Muscle_getMuscleGroupName(w, props.settings))\n    .filter((w) => targetMuscleGroups.indexOf(w) === -1);\n\n  const intensityGraphData = getIntensityPerWeeks(props.evaluatedWeeks, props.dayIndex, exercise.name);\n  const volumeGraphData = getVolumePerWeeks(props.evaluatedWeeks, props.dayIndex, exercise.name);\n  const intensityKey = JSON.stringify(intensityGraphData);\n  const volumeKey = JSON.stringify(volumeGraphData);\n  const rem = useRem();\n  const [activeGraphId, setActiveGraphId] = useState<string | null>(null);\n  const activeGraphValue = useMemo<IActiveGraphContext>(\n    () => ({ activeId: activeGraphId, setActive: setActiveGraphId }),\n    [activeGraphId]\n  );\n  const graphIdBase = `planner-stats-${exercise.id}-${props.dayIndex}-${props.exerciseLine}`;\n\n  return (\n    <ActiveGraphContext.Provider value={activeGraphValue}>\n      <View>\n        <View className=\"flex-row gap-4 mb-2\">\n          <View className=\"w-12\">\n            <ExerciseImage exerciseType={exercise} size=\"small\" width={rem * 3} />\n          </View>\n          <View className=\"flex-1\">\n            {ExerciseImageUtils_exists(exercise, \"small\") ? (\n              <Pressable\n                className=\"flex-row items-center mb-2\"\n                onPress={() => {\n                  const url = Exercise_toExternalUrl(exercise);\n                  Linking.openURL(url).catch(() => undefined);\n                }}\n              >\n                <Text className=\"text-lg font-bold underline text-text-link\">{evaluatedExercise.name}</Text>\n                <View className=\"mb-1 ml-1\">\n                  <IconExternalLink size={16} color=\"#607284\" />\n                </View>\n              </Pressable>\n            ) : (\n              <Text className=\"mb-2 text-lg font-bold\">{evaluatedExercise.name}</Text>\n            )}\n            {!props.hideSwap && (\n              <View>\n                <LinkButton\n                  name=\"planner-swap-exercise\"\n                  className=\"text-xs\"\n                  data-testid=\"planner-swap-exercise\"\n                  testID=\"planner-swap-exercise\"\n                  onClick={() => {\n                    const exerciseKey = PlannerKey_fromPlannerExercise(evaluatedExercise, props.settings);\n                    const dayData = { week: props.weekIndex + 1, dayInWeek: props.dayIndex + 1 };\n                    props.dispatch(\n                      lb<IPlannerState>().recordModify((state) =>\n                        PlannerExerciseSwap_openByKey(state, props.settings, dayData, exerciseKey)\n                      ),\n                      \"Swap exercise\"\n                    );\n                  }}\n                >\n                  Swap Exercise\n                </LinkButton>\n              </View>\n            )}\n            <Text className=\"text-xs\">\n              <Text className=\"text-xs text-text-secondary\">Sets this day: </Text>\n              <Text className=\"text-xs\">{PlannerProgramExercise_numberOfSets(evaluatedExercise)}</Text>\n            </Text>\n            <Text className=\"text-xs\">\n              <Text className=\"text-xs text-text-secondary\">Sets this week: </Text>\n              <Text className=\"text-xs\">\n                {PlannerProgramExercise_numberOfSetsThisWeek(evaluatedExercise.name, evaluatedWeek)}\n              </Text>\n            </Text>\n          </View>\n        </View>\n        <Text className=\"mt-1 text-xs\">\n          <Text className=\"text-xs text-text-secondary\">Target Muscles: </Text>\n          <Text className=\"text-xs font-bold\">{targetMuscles.join(\", \")}</Text>\n        </Text>\n        <Text className=\"text-xs\">\n          <Text className=\"text-xs text-text-secondary\">Synergist Muscles: </Text>\n          <Text className=\"text-xs font-bold\">{synergeticMuscles.join(\", \")}</Text>\n        </Text>\n        <View>\n          <LinkButton\n            name=\"edit-muscle-groups\"\n            className=\"text-xs\"\n            onClick={() => {\n              if (props.onEditMuscleGroupsOverride) {\n                props.onEditMuscleGroupsOverride(exercise);\n              } else {\n                props.dispatch(\n                  [lb<IPlannerState>().pi(\"ui\").p(\"showMuscleGroupsOverride\").record(exercise)],\n                  \"Edit exercise muscles\"\n                );\n              }\n            }}\n          >\n            Edit Exercise Muscles\n          </LinkButton>\n        </View>\n        <Text className=\"mt-1 text-xs\">\n          <Text className=\"text-xs text-text-secondary\">Target Muscles Groups: </Text>\n          <Text className=\"text-xs font-bold\">{targetMuscleGroups.join(\", \")}</Text>\n        </Text>\n        <Text className=\"text-xs\">\n          <Text className=\"text-xs text-text-secondary\">Synergist Muscle Groups: </Text>\n          <Text className=\"text-xs font-bold\">{synergeticMuscleGroups.join(\", \")}</Text>\n        </Text>\n        <View>\n          <LinkButton\n            name=\"edit-muscle-groups\"\n            className=\"text-xs\"\n            onClick={() => {\n              if (props.onEditMuscleGroups) {\n                props.onEditMuscleGroups();\n              } else {\n                props.dispatch(\n                  [lb<IPlannerState>().pi(\"ui\").p(\"showEditMuscleGroups\").record(true)],\n                  \"Edit muscle groups\"\n                );\n              }\n            }}\n          >\n            Edit Muscle Groups\n          </LinkButton>\n        </View>\n        {intensityGraphData[0].length > 1 && (\n          <View>\n            <PlannerGraph\n              key={intensityKey}\n              id={`${graphIdBase}-intensity`}\n              title=\"Intensity w/w\"\n              color=\"red\"\n              yAxisLabel=\"Intensity\"\n              data={intensityGraphData}\n            />\n          </View>\n        )}\n        {volumeGraphData[0].length > 1 && (\n          <View>\n            <PlannerGraph\n              key={volumeKey}\n              id={`${graphIdBase}-volume`}\n              title=\"Volume w/w\"\n              color=\"orange\"\n              yAxisLabel=\"Volume\"\n              data={volumeGraphData}\n            />\n          </View>\n        )}\n      </View>\n    </ActiveGraphContext.Provider>\n  );\n}\n\nfunction getIntensityPerWeeks(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  dayIndex: number,\n  exerciseName: string\n): [number[], number[]] {\n  const data: [number[], number[]] = [[], []];\n  for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n    const evaluatedWeek = evaluatedWeeks[weekIndex];\n    let exercise: IPlannerProgramExercise | undefined;\n    const evaluatedDay = evaluatedWeek[dayIndex] as IPlannerEvalResult | undefined;\n    if (evaluatedDay?.success) {\n      exercise = evaluatedDay.data.find((e) => e.name === exerciseName);\n    }\n    if (!exercise) {\n      continue;\n    }\n    const weights = PlannerProgramExercise_sets(exercise).map((s) => {\n      const weight = s.percentage\n        ? s.percentage * 100\n        : Weight_rpeMultiplier(s.repRange?.maxrep ?? 1, s.rpe ?? 10) * 100;\n      return Number(weight.toFixed(2));\n    });\n    data[0].push(weekIndex + 1);\n    data[1].push(Math.max(...weights));\n  }\n  return data;\n}\n\nfunction getVolumePerWeeks(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  dayIndex: number,\n  exerciseName: string\n): [number[], number[]] {\n  const data: [number[], number[]] = [[], []];\n  for (let weekIndex = 0; weekIndex < evaluatedWeeks.length; weekIndex++) {\n    const evaluatedWeek = evaluatedWeeks[weekIndex];\n    let exercise: IPlannerProgramExercise | undefined;\n    const evaluatedDay = evaluatedWeek[dayIndex] as IPlannerEvalResult | undefined;\n    if (evaluatedDay?.success) {\n      exercise = evaluatedDay.data.find((e) => e.name === exerciseName);\n    }\n    if (!exercise) {\n      continue;\n    }\n    const volume = Number(\n      PlannerProgramExercise_sets(exercise)\n        .reduce((acc, s) => {\n          if (!s.repRange) {\n            return acc;\n          }\n          const reps = s.repRange.maxrep ?? 0;\n          const weight = s.percentage ? s.percentage * 100 : Weight_rpeMultiplier(reps, s.rpe ?? 10) * 100;\n          return acc + s.repRange.numberOfSets * weight * reps;\n        }, 0)\n        .toFixed(2)\n    );\n    data[0].push(weekIndex + 1);\n    data[1].push(volume);\n  }\n  return data;\n}\n","import { JSX, useLayoutEffect, useRef, useState } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport { Text } from \"../../../components/primitives/text\";\nimport { ISetResults, ISetSplit } from \"../models/types\";\nimport { ObjectUtils_keys } from \"../../../utils/object\";\nimport { PlannerWeekMuscles } from \"./plannerWeekMuscles\";\nimport { LinkButton } from \"../../../components/linkButton\";\nimport { Pressable } from \"../../../components/primitives/pressable\";\nimport { IconMuscleSettings } from \"../../../components/icons/iconMuscleSettings\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\nimport { IScreenMuscle, ISettings } from \"../../../types\";\nimport { n } from \"../../../utils/math\";\nimport { Muscle_getMuscleGroupName } from \"../../../models/muscle\";\nimport { getNavigationService } from \"../../../navigation/navUtils\";\nimport { CollectionUtils_sort } from \"../../../utils/collection\";\nimport { TooltipPlacement_place } from \"../../../utils/tooltipPlacement\";\n\ninterface IPlannerWeekStatsProps {\n  setResults: ISetResults;\n  colorize: boolean;\n  frequency: boolean;\n  settings: ISettings;\n  onEditSettings?: () => void;\n  editSettingsLabel?: string;\n}\n\nexport function PlannerStats(props: IPlannerWeekStatsProps): JSX.Element {\n  const { setResults, settings, frequency, onEditSettings } = props;\n  return (\n    <View className=\"mb-2\" data-testid=\"planner-stats\" testID=\"planner-stats\">\n      <Text className=\"text-sm\">\n        <Text className=\"text-sm text-text-secondary\">Total Sets:</Text> {setResults.total}\n      </Text>\n      <Text className=\"text-sm\">\n        <Text className=\"text-sm text-text-secondary\">Strength Sets: </Text>\n        <Text\n          className={`text-sm ${\n            props.colorize ? colorPctValue(setResults.total, setResults.strength, settings.planner.strengthSetsPct) : \"\"\n          }`}\n        >\n          {setResults.strength}\n          {setResults.total > 0 ? `, ${Math.round((setResults.strength * 100) / setResults.total)}%` : \"\"}\n        </Text>\n      </Text>\n      <Text className=\"mb-2 text-sm\">\n        <Text className=\"text-sm text-text-secondary\">Hypertrophy Sets: </Text>\n        <Text\n          className={`text-sm ${\n            props.colorize\n              ? colorPctValue(setResults.total, setResults.hypertrophy, settings.planner.hypertrophySetsPct)\n              : \"\"\n          }`}\n        >\n          {setResults.hypertrophy}\n          {setResults.total > 0 ? `, ${Math.round((setResults.hypertrophy * 100) / setResults.total)}%` : \"\"}\n        </Text>\n      </Text>\n      <Text className=\"text-sm\">\n        <StatLabel label=\"Upper Sets\" />{\" \"}\n        <PlannerSetSplit\n          split={setResults.upper}\n          settings={settings}\n          shouldIncludeFrequency={frequency}\n          textSize=\"text-sm\"\n        />\n      </Text>\n      <Text className=\"text-sm\">\n        <StatLabel label=\"Lower Sets\" />{\" \"}\n        <PlannerSetSplit\n          split={setResults.lower}\n          settings={settings}\n          shouldIncludeFrequency={frequency}\n          textSize=\"text-sm\"\n        />\n      </Text>\n      <Text className=\"text-sm\">\n        <StatLabel label=\"Core Sets\" />{\" \"}\n        <PlannerSetSplit\n          split={setResults.core}\n          settings={settings}\n          shouldIncludeFrequency={frequency}\n          textSize=\"text-sm\"\n        />\n      </Text>\n      <Text className=\"text-sm\">\n        <StatLabel label=\"Push Sets\" />{\" \"}\n        <PlannerSetSplit\n          split={setResults.push}\n          settings={settings}\n          shouldIncludeFrequency={frequency}\n          textSize=\"text-sm\"\n        />\n      </Text>\n      <Text className=\"text-sm\">\n        <StatLabel label=\"Pull Sets\" />{\" \"}\n        <PlannerSetSplit\n          split={setResults.pull}\n          settings={settings}\n          shouldIncludeFrequency={frequency}\n          textSize=\"text-sm\"\n        />\n      </Text>\n      <Text className=\"mb-4 text-sm\">\n        <StatLabel label=\"Legs Sets\" />{\" \"}\n        <PlannerSetSplit\n          split={setResults.legs}\n          settings={settings}\n          shouldIncludeFrequency={frequency}\n          textSize=\"text-sm\"\n        />\n      </Text>\n\n      <View className=\"w-32 mb-2\">\n        <PlannerWeekMuscles settings={props.settings} data={setResults.muscleGroup} />\n      </View>\n\n      {onEditSettings && (\n        <View className=\"py-2\">\n          {props.editSettingsLabel != null ? (\n            <Pressable\n              className=\"flex-row items-center gap-2 nm-planner-stats-edit-settings\"\n              testID=\"planner-stats-edit-settings\"\n              onPress={() => onEditSettings()}\n            >\n              <IconMuscleSettings color={Tailwind_semantic().text.link} />\n              <Text className=\"text-sm font-semibold text-text-link\">{props.editSettingsLabel}</Text>\n            </Pressable>\n          ) : (\n            <LinkButton name=\"planner-stats-edit-settings\" className=\"text-xs\" onClick={() => onEditSettings()}>\n              Edit Weekly Muscle Range Settings\n            </LinkButton>\n          )}\n        </View>\n      )}\n\n      {ObjectUtils_keys(setResults.muscleGroup).map((muscleGroup) => {\n        return (\n          <Text key={muscleGroup} className=\"text-sm\">\n            <StatLabel label={Muscle_getMuscleGroupName(muscleGroup, props.settings)} />{\" \"}\n            <PlannerSetSplit\n              split={setResults.muscleGroup[muscleGroup]}\n              settings={settings}\n              shouldIncludeFrequency={frequency}\n              muscle={props.colorize ? muscleGroup : undefined}\n              textSize=\"text-sm\"\n            />\n          </Text>\n        );\n      })}\n    </View>\n  );\n}\n\nfunction StatLabel(props: { label: string }): JSX.Element {\n  return <Text className=\"text-sm text-text-secondary\">{props.label}:</Text>;\n}\n\nexport function PlannerSetSplit(props: {\n  split: ISetSplit;\n  settings: ISettings;\n  shouldIncludeFrequency: boolean;\n  muscle?: IScreenMuscle;\n  textSize?: string;\n}): JSX.Element {\n  const { split, settings, shouldIncludeFrequency, muscle } = props;\n  const isDesktopWeb = Platform.OS === \"web\";\n  const [tooltipAnchor, setTooltipAnchor] = useState<DOMRect | undefined>(undefined);\n  const total = split.strength + split.hypertrophy;\n  const frequency = Object.keys(split.frequency).length;\n  const setColor = muscle\n    ? colorRangeValue(\n        total,\n        settings.planner.weeklyRangeSets[muscle]?.[0] ?? 0,\n        settings.planner.weeklyRangeSets[muscle]?.[1] ?? 0\n      )\n    : \"\";\n  const setDirection = muscle\n    ? directionValue(\n        total,\n        settings.planner.weeklyRangeSets[muscle]?.[0] ?? 0,\n        settings.planner.weeklyRangeSets[muscle]?.[1] ?? 0\n      )\n    : \"\";\n  const frequencyColor = muscle ? colorThresholdValue(frequency, settings.planner.weeklyFrequency[muscle] ?? 0) : \"\";\n\n  const handlePress =\n    !isDesktopWeb && split.exercises.length > 0\n      ? () =>\n          getNavigationService().then(({ navigateToModal }) =>\n            navigateToModal(\"setSplitModal\", { exercises: split.exercises })\n          )\n      : undefined;\n\n  const textSize = props.textSize ?? \"\";\n\n  const totalNode = (\n    <Text className={`${textSize} ${setColor}`.trim()}>\n      {n(total, 0)}\n      {setDirection}\n    </Text>\n  );\n\n  const trailingNode = (\n    <>\n      {\" \"}\n      {total > 0 && (\n        <Text className={textSize}>\n          ({split.strength > 0 && <Text className={textSize}>{n(split.strength, 0)}s</Text>}\n          {split.strength > 0 && split.hypertrophy > 0 && \", \"}\n          {split.hypertrophy > 0 && <Text className={textSize}>{n(split.hypertrophy, 0)}h</Text>})\n        </Text>\n      )}\n      {shouldIncludeFrequency && frequency > 0 && (\n        <Text className={`${textSize} ${frequencyColor}`.trim()}>, {Object.keys(split.frequency).length}d</Text>\n      )}\n    </>\n  );\n\n  if (isDesktopWeb) {\n    const hasExercises = split.exercises.length > 0;\n    return (\n      <Text className={textSize}>\n        <span\n          onMouseEnter={(e) => hasExercises && setTooltipAnchor(e.currentTarget.getBoundingClientRect())}\n          onMouseLeave={() => setTooltipAnchor(undefined)}\n          onClick={(e) => {\n            const rect = e.currentTarget.getBoundingClientRect();\n            setTooltipAnchor((anchor) => (anchor == null && hasExercises ? rect : undefined));\n          }}\n        >\n          {totalNode}\n          {tooltipAnchor != null && hasExercises && <PlannerStatsTooltip split={split} anchor={tooltipAnchor} />}\n        </span>\n        {trailingNode}\n      </Text>\n    );\n  }\n\n  return (\n    <Text onPress={handlePress} className={textSize}>\n      {totalNode}\n      {trailingNode}\n    </Text>\n  );\n}\n\nfunction PlannerStatsTooltip(props: { split: ISetSplit; anchor: DOMRect }): JSX.Element | null {\n  const ref = useRef<HTMLDivElement>(null);\n  const [position, setPosition] = useState<{ left: number; top: number } | undefined>(undefined);\n  const { anchor } = props;\n  useLayoutEffect(() => {\n    const el = ref.current;\n    if (el != null) {\n      const size = { width: el.offsetWidth, height: el.offsetHeight };\n      setPosition(\n        TooltipPlacement_place(anchor, size, {\n          width: document.documentElement.clientWidth,\n          height: document.documentElement.clientHeight,\n        })\n      );\n    }\n  }, [anchor]);\n  const exercises = CollectionUtils_sort(props.split.exercises, (a, b) => {\n    if ((a.isSynergist && b.isSynergist) || (!a.isSynergist && !b.isSynergist)) {\n      return a.exerciseName.localeCompare(b.exerciseName);\n    } else if (a.isSynergist) {\n      return 1;\n    } else {\n      return -1;\n    }\n  });\n  if (exercises.length === 0) {\n    return null;\n  }\n\n  return (\n    <div\n      ref={ref}\n      className=\"fixed z-50 px-3 py-2 text-xs border bg-background-default border-border-neutral rounded-xl text-text-primary\"\n      style={{\n        left: position?.left ?? 0,\n        top: position?.top ?? 0,\n        visibility: position == null ? \"hidden\" : \"visible\",\n      }}\n    >\n      <ul style={{ minWidth: \"14rem\" }}>\n        {exercises.map((exercise) => {\n          const totalSets = exercise.strengthSets + exercise.hypertrophySets;\n          return (\n            <li\n              key={exercise.exerciseName}\n              className={`font-bold ${exercise.isSynergist ? \"text-text-secondary\" : \"text-text-primary\"}`}\n            >\n              {exercise.exerciseName}: {n(totalSets)} ({n(exercise.strengthSets)}s, {n(exercise.hypertrophySets)}h)\n            </li>\n          );\n        })}\n      </ul>\n    </div>\n  );\n}\n\nexport function colorPctValue(total: number, num: number, target: number): string {\n  const strengthPct = total > 0 ? Math.round((num * 100) / total) : 0;\n  if (strengthPct >= target) {\n    return \"text-text-success\";\n  } else if (strengthPct >= target - 10) {\n    return \"text-icon-yellow\";\n  } else {\n    return \"text-text-error\";\n  }\n}\n\nexport function colorRangeValue(value: number, min: number, max: number): string {\n  if (value >= min && value <= max) {\n    return \"text-text-success\";\n  } else if (value >= min * 0.7 && value <= max * 1.3) {\n    return \"text-icon-yellow\";\n  } else {\n    return \"text-text-error\";\n  }\n}\n\nexport function directionValue(value: number, min: number, max: number): string {\n  if (value < min) {\n    return \"↑\";\n  } else if (value > max) {\n    return \"↓\";\n  } else {\n    return \"\";\n  }\n}\n\nfunction colorThresholdValue(value: number, threshold: number): string {\n  if (value >= threshold) {\n    return \"text-text-success\";\n  } else if (value >= threshold * 0.5) {\n    return \"text-icon-yellow\";\n  } else {\n    return \"text-text-error\";\n  }\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { ObjectUtils_keys } from \"../../../utils/object\";\nimport { BackMusclesSvg, IMuscleStyle } from \"../../../components/muscles/images/backMusclesSvg\";\nimport { FrontMusclesSvg } from \"../../../components/muscles/images/frontMusclesSvg\";\nimport { IMuscleGroupSetSplit } from \"../models/types\";\nimport { ISettings, IScreenMuscle } from \"../../../types\";\nimport { Tailwind_semantic } from \"../../../utils/tailwindConfig\";\n\ninterface IPlannerMusclesProps {\n  settings: ISettings;\n  data: IMuscleGroupSetSplit;\n}\n\nexport function PlannerWeekMuscles(props: IPlannerMusclesProps): JSX.Element {\n  const muscleData = ObjectUtils_keys(props.data).reduce<Partial<Record<IScreenMuscle, IMuscleStyle>>>((memo, key) => {\n    const setNumber = props.data[key].strength + props.data[key].hypertrophy;\n    const [, max] = props.settings.planner.weeklyRangeSets[key] ?? [0, 0];\n    const value = setNumber / max;\n    memo[key] = { opacity: value, fill: Tailwind_semantic().text.link };\n    return memo;\n  }, {});\n\n  return (\n    <View className=\"flex-row\">\n      <View className=\"relative flex-1\">\n        <BackMusclesSvg defaultOpacity={0} muscles={muscleData} contour={{ fill: Tailwind_semantic().text.link }} />\n      </View>\n      <View className=\"relative flex-1\">\n        <FrontMusclesSvg defaultOpacity={0} muscles={muscleData} contour={{ fill: Tailwind_semantic().text.link }} />\n      </View>\n    </View>\n  );\n}\n","import type { JSX } from \"react\";\nimport { View } from \"react-native\";\nimport { Text } from \"../../../components/primitives/text\";\nimport { PlannerStats } from \"./plannerStats\";\nimport { PlannerStatsUtils_calculateSetResults } from \"../models/plannerStatsUtils\";\nimport { IPlannerEvalResult } from \"../plannerExerciseEvaluator\";\nimport { ISettings } from \"../../../types\";\n\ninterface IPlannerWeekStatsProps {\n  evaluatedDays: IPlannerEvalResult[];\n  hideTitle?: boolean;\n  settings: ISettings;\n  onEditSettings?: () => void;\n  editSettingsLabel?: string;\n}\n\nexport function PlannerWeekStats(props: IPlannerWeekStatsProps): JSX.Element {\n  const { settings } = props;\n\n  const evaluatedDays = props.evaluatedDays;\n  const setResults = PlannerStatsUtils_calculateSetResults(evaluatedDays, settings);\n\n  return (\n    <View>\n      {!props.hideTitle && <Text className=\"mb-2 text-xl font-bold\">Week Stats</Text>}\n      <PlannerStats\n        onEditSettings={props.onEditSettings}\n        editSettingsLabel={props.editSettingsLabel}\n        setResults={setResults}\n        settings={settings}\n        colorize={true}\n        frequency={true}\n      />\n    </View>\n  );\n}\n","import { JSX, useEffect, useState } from \"react\";\nimport { View, ScrollView, Pressable, Platform } from \"react-native\";\nimport { IServiceAdminTarget, Service } from \"../../api/service\";\nimport { Dialog_confirm } from \"../../utils/dialog\";\nimport { ActionSheet_show } from \"../../utils/actionSheet\";\nimport { Button } from \"../../components/button\";\nimport { IconSpinner } from \"../../components/icons/iconSpinner\";\nimport { IconArrowDown2 } from \"../../components/icons/iconArrowDown2\";\nimport { IconArrowUp } from \"../../components/icons/iconArrowUp\";\nimport { LinkButton } from \"../../components/linkButton\";\nimport { Modal } from \"../../components/modal\";\nimport { Text } from \"../../components/primitives/text\";\nimport { DateUtils_parseYYYYMMDDHHMM, DateUtils_formatWithTime } from \"../../utils/date\";\nimport { IEither } from \"../../utils/types\";\nimport { PlannerCodeBlock } from \"./components/plannerCodeBlock\";\nimport { SheetDragHandle } from \"../../navigation/TransparentModal\";\n\ninterface IModalPlannerProgramRevisionsProps {\n  client: Window[\"fetch\"];\n  programId: string;\n  revisions: string[];\n  admin?: IServiceAdminTarget;\n  onClose: () => void;\n  onRestore: (text: string) => void;\n}\n\ntype IProgramRevisionState =\n  | {\n      isLoading: true;\n      promise: Promise<IEither<string, string>>;\n    }\n  | {\n      isLoading: false;\n      result: IEither<string, string>;\n    };\n\nexport function ModalPlannerProgramRevisionsContent(props: IModalPlannerProgramRevisionsProps): JSX.Element {\n  const initialCurrentRevision = props.revisions[0];\n  const [currentRevision, setCurrentRevision] = useState<string>(initialCurrentRevision);\n  const [state, setState] = useState<Partial<Record<string, IProgramRevisionState>>>({});\n  const service = new Service(props.client);\n\n  function loadRevision(revision: string): void {\n    setCurrentRevision(revision);\n    if (state[revision]) {\n      return;\n    }\n    const result = service.getProgramRevision(props.programId, revision, props.admin);\n    setState((prevState) => ({\n      ...prevState,\n      [revision]: { isLoading: true, promise: result },\n    }));\n    result.then((r) => {\n      setState((prevState) => ({\n        ...prevState,\n        [revision]: { isLoading: false, result: r },\n      }));\n    });\n  }\n\n  useEffect(() => {\n    loadRevision(currentRevision);\n  }, []);\n\n  const programRevision = state[currentRevision];\n  const [isPickerExpanded, setIsPickerExpanded] = useState(false);\n\n  const revisionLabels = props.revisions.map((revision) => {\n    const date = DateUtils_parseYYYYMMDDHHMM(revision);\n    return date ? DateUtils_formatWithTime(date) : revision;\n  });\n  const currentLabel = revisionLabels[props.revisions.indexOf(currentRevision)] ?? currentRevision;\n\n  function openPicker(): void {\n    if (Platform.OS === \"web\") {\n      setIsPickerExpanded((v) => !v);\n      return;\n    }\n    const options = [...revisionLabels, \"Cancel\"];\n    ActionSheet_show({ title: \"Version History\", options, cancelButtonIndex: options.length - 1 }, (buttonIndex) => {\n      if (buttonIndex != null && buttonIndex < props.revisions.length) {\n        loadRevision(props.revisions[buttonIndex]);\n      }\n    });\n  }\n\n  const picker = (\n    <View className=\"border-b bg-background-subtle border-border-neutral\">\n      <SheetDragHandle>\n        <Pressable className=\"flex-row items-center justify-between p-4\" onPress={openPicker}>\n          <View className=\"flex-1 pr-3\">\n            <Text className=\"text-xs text-text-secondary\">Version</Text>\n            <Text className=\"font-bold\">{currentLabel}</Text>\n          </View>\n          {Platform.OS === \"web\" && isPickerExpanded ? <IconArrowUp /> : <IconArrowDown2 />}\n        </Pressable>\n      </SheetDragHandle>\n      {Platform.OS === \"web\" && isPickerExpanded && (\n        <View className=\"px-4 pb-3\" style={{ maxHeight: 220 }}>\n          <ScrollView>\n            {props.revisions.map((revision, i) => (\n              <View key={revision} className=\"py-1\">\n                {revision === currentRevision ? (\n                  <Text className=\"font-bold\">{revisionLabels[i]}</Text>\n                ) : (\n                  <LinkButton\n                    name=\"change-program-revision\"\n                    onClick={() => {\n                      loadRevision(revision);\n                      setIsPickerExpanded(false);\n                    }}\n                  >\n                    {revisionLabels[i]}\n                  </LinkButton>\n                )}\n              </View>\n            ))}\n          </ScrollView>\n        </View>\n      )}\n    </View>\n  );\n\n  return (\n    <View className=\"flex-col flex-1\">\n      {picker}\n      <View className=\"flex-1\">\n        {!programRevision || programRevision.isLoading ? (\n          <View className=\"items-center justify-center flex-1\">\n            <IconSpinner width={40} height={40} />\n          </View>\n        ) : programRevision.result.success ? (\n          <View className=\"flex-1\">\n            <ScrollView className=\"flex-1\" contentContainerClassName=\"p-4\">\n              <PlannerCodeBlock script={programRevision.result.data} />\n            </ScrollView>\n            <View className=\"items-center p-4 border-t bg-background-subtle border-border-neutral\">\n              <Button\n                name=\"restore-program-revision\"\n                kind=\"purple\"\n                onClick={async () => {\n                  if (\n                    programRevision.result.success &&\n                    (await Dialog_confirm(\n                      \"Are you sure you want to restore this version? It'll overwrite your current changes.\"\n                    ))\n                  ) {\n                    props.onRestore(programRevision.result.data);\n                  }\n                }}\n              >\n                Restore\n              </Button>\n            </View>\n          </View>\n        ) : (\n          <View className=\"p-4\">\n            <Text>{programRevision.result.error}</Text>\n          </View>\n        )}\n      </View>\n    </View>\n  );\n}\n\nexport function ModalPlannerProgramRevisions(props: IModalPlannerProgramRevisionsProps): JSX.Element {\n  return (\n    <Modal\n      innerClassName=\"flex flex-col\"\n      isFullWidth={true}\n      isFullHeight={true}\n      onClose={props.onClose}\n      shouldShowClose={true}\n      noPaddings={true}\n    >\n      <ModalPlannerProgramRevisionsContent {...props} />\n    </Modal>\n  );\n}\n","import { SyntaxNode, Tree } from \"@lezer/common\";\nimport { parser as plannerExerciseParser } from \"../plannerExerciseParser\";\nimport { PlannerNodeName } from \"../plannerExerciseStyles\";\n\n// What belongs to an exercise, as a question about the *document* rather than about any one\n// feature. Everything below is derived from one walk, so dragging a line, dragging a grid strip\n// and showing a description in the editor cannot answer it differently — which they used to.\n//\n// The rule is the language's, taken from plannerExerciseEvaluator's `latestDescriptions`: the\n// `//` lines above an exercise are its descriptions, so they belong to it and travel with it.\n// A blank line with no `//` above it is spacing — it belongs to the place it was written and\n// stays there. A `///` ends one description run and begins the next, but it does *not* detach\n// what is above it; the exercise still gets both runs, so a `///` sitting between two of them is\n// inside the block and travels with it. That last case barely exists in practice and does not\n// survive a save — regenerating a day hoists `///` above the descriptions (see planner.test.ts,\n// \"properly compacts multiple empty lines in-between descriptions\") — which is why it isn't\n// worth a second rule to keep such a comment pinned in place.\nexport interface IPlannerDocumentBlockSpan {\n  fullName: string;\n  // Start of the movable block: the exercise plus the description lines attached to it.\n  from: number;\n  // End of the block's text. The grammar's ExerciseExpression swallows the line break that ends\n  // it (`linebreakOrEof`), which the last exercise of a day doesn't have — so a caller slicing\n  // or replacing `[from, to)` gets the block itself either way, without taking the next line's\n  // place along with it.\n  to: number;\n  // The exercise expression itself, for callers that need to look inside it.\n  exerciseFrom: number;\n  exerciseTo: number;\n  // 1-based line the exercise starts on, which is how an evaluated IPlannerProgramExercise\n  // identifies where it came from (`line`) — so a caller holding one can find its span here.\n  line: number;\n}\n\n// `tree` lets a caller that already parsed this text — an editor holding an incrementally\n// reparsed tree — reuse it instead of paying for a second parse per keystroke.\nexport function PlannerDocument_blockSpans(text: string, tree?: Tree): IPlannerDocumentBlockSpan[] {\n  const spans: IPlannerDocumentBlockSpan[] = [];\n  // Counted forward alongside the spans rather than per span, so a day doesn't rescan its own\n  // prefix once for every exercise in it.\n  let counted = 0;\n  let line = 1;\n  for (const { exercise, runs } of attachedRuns(topLevelNodes(text, tree))) {\n    for (let at = counted; at < exercise.from; at += 1) {\n      if (text[at] === \"\\n\") {\n        line += 1;\n      }\n    }\n    counted = exercise.from;\n    const variations = exercise.getChild(PlannerNodeName.ExerciseVariations);\n    // Every `//` line the evaluator attached, not only the ones it would count as descriptions:\n    // an empty `//` is the marker that stops one being inherited, and leaving it behind when its\n    // exercise moves would silently turn the inheritance back on.\n    const first = runs.find((run) => run.length > 0);\n    spans.push({\n      fullName:\n        variations != null\n          ? text.slice(variations.from, variations.to).trim()\n          : text.slice(exercise.from, exercise.to).trim().split(\"\\n\")[0],\n      from: startOfLine(text, first != null ? first[0].from : exercise.from),\n      to: endOfExercise(text, exercise),\n      exerciseFrom: exercise.from,\n      exerciseTo: exercise.to,\n      line,\n    });\n  }\n  return spans;\n}\n\n// The one walk: each exercise with the `//` runs the evaluator hands it, shaped exactly like\n// `latestDescriptions` — empty runs included, since a blank line between two descriptions pushes\n// one and their count is what decides whether the empty ones are dropped.\nfunction attachedRuns(nodes: SyntaxNode[]): { exercise: SyntaxNode; runs: SyntaxNode[][] }[] {\n  const attached: { exercise: SyntaxNode; runs: SyntaxNode[][] }[] = [];\n  let runs: SyntaxNode[][] = [];\n  for (const node of nodes) {\n    if (node.name === PlannerNodeName.LineComment) {\n      if (runs.length === 0) {\n        runs.push([]);\n      }\n      runs[runs.length - 1].push(node);\n    } else if (node.name === PlannerNodeName.EmptyExpression || node.name === PlannerNodeName.TripleLineComment) {\n      if (runs.length > 0) {\n        runs.push([]);\n      }\n    } else if (node.name === PlannerNodeName.ExerciseExpression) {\n      attached.push({ exercise: node, runs });\n      runs = [];\n    }\n  }\n  // Runs left over at the end are attached to nothing: the evaluator drops whatever is still\n  // pending when the text runs out, so they are comments rather than descriptions.\n  return attached;\n}\n\n// The same attachment, read as descriptions rather than as a block: which runs the workout\n// actually shows, which one is current, and what each one occupies on the page.\nexport interface IPlannerDocumentDescription {\n  // The run as written: its first `//` through the end of its last line.\n  from: number;\n  to: number;\n  // What removing it has to take: its whole lines, indentation included, plus the blank line\n  // separating it from the run it sits next to — but never the blank line under an exercise,\n  // which spaces the day out rather than belonging to this run.\n  removeFrom: number;\n  removeTo: number;\n  // Where a `!` goes to make this run current: past the `//` and the whitespace after it.\n  markerAt: number;\n  // The `!` it already carries, with the whitespace after it, so making another run current can\n  // take the whole prefix away.\n  marker?: { from: number; to: number };\n  isCurrent: boolean;\n}\n\n// Every exercise's descriptions, in the order the evaluator reads them. Exercises with none are\n// left out, and so are the runs that say nothing — those are markers, not descriptions.\nexport function PlannerDocument_descriptions(text: string, tree?: Tree): IPlannerDocumentDescription[][] {\n  const groups: IPlannerDocumentDescription[][] = [];\n  for (const { runs } of attachedRuns(topLevelNodes(text, tree))) {\n    const described = describeRuns(text, runs);\n    if (described.length > 0) {\n      groups.push(described);\n    }\n  }\n  return groups;\n}\n\n// The run covering `index`, and where it sits among the descriptions of its own exercise — what\n// every editing surface actually asks.\nexport function PlannerDocument_descriptionAt(\n  text: string,\n  index: number,\n  tree?: Tree\n): { siblings: IPlannerDocumentDescription[]; index: number } | undefined {\n  for (const siblings of PlannerDocument_descriptions(text, tree)) {\n    const found = siblings.findIndex((d) => index >= d.from && index <= d.to);\n    if (found !== -1) {\n      return { siblings, index: found };\n    }\n  }\n  return undefined;\n}\n\n// A description line as the evaluator reads it: trimmed, with its `//` dropped.\nfunction lineValue(text: string, node: SyntaxNode): string {\n  return text.slice(node.from, node.to).trim().replace(/^\\/\\//, \"\");\n}\n\nfunction markerOf(text: string, run: SyntaxNode[]): { from: number; to: number } | undefined {\n  const at = markerPosition(text, run[0]);\n  if (text[at] !== \"!\") {\n    return undefined;\n  }\n  let to = at + 1;\n  while (to < text.length && (text[to] === \" \" || text[to] === \"\\t\")) {\n    to += 1;\n  }\n  return { from: at, to };\n}\n\n// The grammar's LineComment starts at the `//`, so the content begins two characters in — past\n// whatever whitespace follows, tabs included: the evaluator's `/^\\s*!/` accepts any of it.\nfunction markerPosition(text: string, node: SyntaxNode): number {\n  let at = node.from + 2;\n  while (at < text.length && (text[at] === \" \" || text[at] === \"\\t\")) {\n    at += 1;\n  }\n  return at;\n}\n\n// Mirrors plannerExerciseEvaluator: the marker is read off the runs as written, then the ones\n// that say nothing are dropped — but only when there is more than one, and the drop happens\n// after the marker is stripped. So a run that is nothing but a marker takes the currency away\n// with it, and nothing is left current.\nfunction describeRuns(text: string, runs: SyntaxNode[][]): IPlannerDocumentDescription[] {\n  const markers = runs.map((run) => (run.length > 0 ? markerOf(text, run) : undefined));\n  const markedIndex = markers.findIndex((marker) => marker != null);\n  const values = runs.map((run, i) => {\n    const joined = run.map((node) => lineValue(text, node)).join(\"\\n\");\n    return markers[i] != null ? joined.replace(/^\\s*!/, \"\") : joined;\n  });\n  const kept = runs.map((_, i) => i).filter((i) => runs[i].length > 0 && (runs.length === 1 || values[i] !== \"\"));\n  const currentIndex = kept.indexOf(markedIndex);\n  return kept.map((rawIndex, i) => {\n    const run = runs[rawIndex];\n    const last = run[run.length - 1];\n    const lineStart = startOfLine(text, run[0].from);\n    // LineComment swallows the line break that ends it, except at the end of the text.\n    const lineEnd = last.to;\n    const after = blankLinesAfter(text, lineEnd);\n    const before = blankLinesBefore(text, lineStart);\n    const hasRunAbove = rawIndex > 0 && runs[rawIndex - 1].length > 0;\n    const takesAfter = after > lineEnd;\n    return {\n      from: run[0].from,\n      to: endOfLine(text, last),\n      removeFrom: takesAfter || !hasRunAbove ? lineStart : before,\n      removeTo: takesAfter ? after : lineEnd,\n      markerAt: markerPosition(text, run[0]),\n      marker: markers[rawIndex],\n      isCurrent: i === (currentIndex === -1 ? 0 : currentIndex),\n    };\n  });\n}\n\nfunction endOfLine(text: string, node: SyntaxNode): number {\n  let end = node.to;\n  while (end > node.from && (text[end - 1] === \"\\n\" || text[end - 1] === \"\\r\")) {\n    end -= 1;\n  }\n  return end;\n}\n\n// Forward over whole blank lines only. A line that merely starts with spaces is the next\n// exercise's own indentation and stays with it.\nfunction blankLinesAfter(text: string, at: number): number {\n  let cursor = at;\n  for (;;) {\n    let end = cursor;\n    while (end < text.length && text[end] !== \"\\n\") {\n      if (text[end] !== \" \" && text[end] !== \"\\t\" && text[end] !== \"\\r\") {\n        return cursor;\n      }\n      end += 1;\n    }\n    if (end >= text.length) {\n      return cursor;\n    }\n    cursor = end + 1;\n  }\n}\n\n// Backward over whole blank lines, stopping just after the line break that ends the last line\n// with something on it — that break belongs to that line.\nfunction blankLinesBefore(text: string, at: number): number {\n  let cursor = at;\n  while (cursor > 0 && text[cursor - 1] === \"\\n\") {\n    let start = cursor - 1;\n    while (start > 0 && text[start - 1] !== \"\\n\") {\n      if (text[start - 1] !== \" \" && text[start - 1] !== \"\\t\" && text[start - 1] !== \"\\r\") {\n        return cursor;\n      }\n      start -= 1;\n    }\n    cursor = start;\n  }\n  return cursor;\n}\n\nfunction topLevelNodes(text: string, tree?: Tree): SyntaxNode[] {\n  const parsed = tree ?? plannerExerciseParser.parse(text);\n  const nodes: SyntaxNode[] = [];\n  for (let node = parsed.topNode.firstChild; node != null; node = node.nextSibling) {\n    nodes.push(node);\n  }\n  return nodes;\n}\n\nfunction endOfExercise(text: string, exercise: SyntaxNode): number {\n  let end = exercise.to;\n  while (end > exercise.from && (text[end - 1] === \"\\n\" || text[end - 1] === \"\\r\")) {\n    end -= 1;\n  }\n  return end;\n}\n\nfunction startOfLine(text: string, index: number): number {\n  let start = index;\n  while (start > 0 && text[start - 1] !== \"\\n\") {\n    const ch = text[start - 1];\n    if (ch !== \" \" && ch !== \"\\t\") {\n      return index;\n    }\n    start -= 1;\n  }\n  return start;\n}\n","import {\n  IEvaluatedProgram,\n  Program_evaluate,\n  Program_getNumberOfExerciseInstances,\n  Program_getProgramExerciseForKeyAndShortDayData,\n} from \"../../../models/program\";\nimport { pickerStateFromPlannerExercise } from \"../../../components/editProgram/editProgramUtils\";\nimport { ISettings, IShortDayData } from \"../../../types\";\nimport { IPlannerProgramExercise, IPlannerState, IPlannerUi } from \"./types\";\n\nexport function PlannerExerciseSwap_open(\n  ui: IPlannerUi,\n  evaluatedProgram: IEvaluatedProgram,\n  settings: ISettings,\n  plannerExercise: IPlannerProgramExercise,\n  dayData: IShortDayData\n): IPlannerUi {\n  if (Program_getNumberOfExerciseInstances(evaluatedProgram, plannerExercise.key) > 1) {\n    return { ...ui, editExerciseModal: { plannerExercise } };\n  }\n  return {\n    ...ui,\n    exercisePicker: {\n      state: { ...pickerStateFromPlannerExercise(settings, plannerExercise), hideLabel: true },\n      dayData,\n      exerciseKey: plannerExercise.key,\n      change: \"one\",\n    },\n  };\n}\n\nexport function PlannerExerciseSwap_openByKey(\n  state: IPlannerState,\n  settings: ISettings,\n  dayData: IShortDayData,\n  exerciseKey: string\n): IPlannerState {\n  const evaluatedProgram = Program_evaluate(state.current.program, settings);\n  const plannerExercise = Program_getProgramExerciseForKeyAndShortDayData(evaluatedProgram, dayData, exerciseKey);\n  if (plannerExercise == null) {\n    return state;\n  }\n  return { ...state, ui: PlannerExerciseSwap_open(state.ui, evaluatedProgram, settings, plannerExercise, dayData) };\n}\n","import { IPlannerProgramWeek, ISettings } from \"../../../types\";\nimport { IEither } from \"../../../utils/types\";\nimport { IPlannerEvalFullResult, IPlannerEvalResult, PlannerSyntaxError } from \"../plannerExerciseEvaluator\";\nimport {\n  PlannerProgram_evaluateFull,\n  PlannerProgram_generateFullText,\n  PlannerProgram_parseText,\n} from \"./plannerProgram\";\nimport { IPlannerEditMode, IPlannerFullText, IPlannerState, IPlannerUi } from \"./types\";\n\nexport type IPlannerWebMode = \"grid\" | \"perday\" | \"full\";\n\nexport interface IPlannerFullTextCommit {\n  weeks?: IPlannerProgramWeek[];\n  error?: PlannerSyntaxError;\n}\n\nexport function PlannerMode_current(ui: IPlannerUi): IPlannerWebMode {\n  return ui.mode === \"grid\" || ui.mode === \"full\" ? ui.mode : \"perday\";\n}\n\nexport function PlannerMode_canSwitch(evaluatedWeeks: IPlannerEvalResult[][], to: IPlannerEditMode): boolean {\n  if (to !== \"grid\") {\n    return true;\n  }\n  return evaluatedWeeks.every((week) => week.every((day) => day.success));\n}\n\nexport function PlannerMode_isValid(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  fullEvaluation?: IPlannerEvalFullResult\n): boolean {\n  return fullEvaluation != null ? fullEvaluation.success : PlannerMode_canSwitch(evaluatedWeeks, \"grid\");\n}\n\nexport function PlannerMode_isStructureError(error: PlannerSyntaxError | undefined): boolean {\n  return error?.details.type === \"dayWithoutWeek\" || error?.details.type === \"exerciseWithoutDay\";\n}\n\nexport function PlannerMode_switch(\n  state: IPlannerState,\n  to: IPlannerWebMode\n): IEither<Pick<IPlannerState, \"ui\" | \"fulltext\">, PlannerSyntaxError> {\n  const from = PlannerMode_current(state.ui);\n  if (from === to) {\n    return { success: true, data: { ui: state.ui, fulltext: state.fulltext } };\n  }\n  if (from === \"full\" && state.fulltext != null) {\n    const parsed = PlannerProgram_parseText(state.fulltext.text);\n    if (!parsed.success) {\n      return parsed;\n    }\n  }\n  const ui: IPlannerUi = { ...state.ui, mode: to };\n  if (to === \"full\") {\n    const weeks = state.current.program.planner?.weeks ?? [];\n    return { success: true, data: { ui, fulltext: { text: PlannerProgram_generateFullText(weeks) } } };\n  }\n  return { success: true, data: { ui, fulltext: undefined } };\n}\n\n// A program edit made outside the Full Program editor regenerates its text, so it is refused while that text does not parse\nexport function PlannerMode_outsideEditError(state: IPlannerState): string | undefined {\n  if (PlannerMode_current(state.ui) !== \"full\" || state.fulltext == null) {\n    return undefined;\n  }\n  const parsed = PlannerProgram_parseText(state.fulltext.text);\n  return parsed.success ? undefined : parsed.error.message;\n}\n\nexport function PlannerMode_commitFullText(text: string, settings: ISettings): IPlannerFullTextCommit {\n  const parsed = PlannerProgram_parseText(text);\n  if (!parsed.success) {\n    return { error: parsed.error };\n  }\n  const evaluated = PlannerProgram_evaluateFull(text, settings).evaluatedWeeks;\n  return { weeks: parsed.data, error: evaluated.success ? undefined : evaluated.error };\n}\n\nexport function PlannerMode_applyFullText(state: IPlannerState, text: string): IPlannerState {\n  const fulltext = { ...state.fulltext, text };\n  const planner = state.current.program.planner;\n  const parsed = PlannerProgram_parseText(text);\n  if (!parsed.success || planner == null) {\n    return { ...state, fulltext };\n  }\n  const program = { ...state.current.program, planner: { ...planner, weeks: parsed.data } };\n  return { ...state, fulltext, current: { ...state.current, program } };\n}\n\nexport function PlannerMode_fullTextAfter(\n  oldState: IPlannerState,\n  newState: IPlannerState\n): IPlannerFullText | undefined {\n  const planner = newState.current.program.planner;\n  if (\n    PlannerMode_current(newState.ui) !== \"full\" ||\n    newState.fulltext == null ||\n    newState.fulltext !== oldState.fulltext ||\n    planner == null ||\n    planner === oldState.current.program.planner\n  ) {\n    return undefined;\n  }\n  const text = PlannerProgram_generateFullText(planner.weeks);\n  return text === newState.fulltext.text ? undefined : { ...newState.fulltext, text };\n}\n","// A superset group name is written into the program text as `superset: <name>`, and the grammar\n// parses it as `ExerciseName { NonSeparator+ }`. A name holding one of NonSeparator's excluded\n// characters doesn't just lose the superset - the whole day stops parsing and comes back empty.\nexport const PlannerNames_supersetNamePattern = \"[^/{}()#\\\\[\\\\]|!]+\";\n\nexport const PlannerNames_supersetNameMessage = \"Name can't contain / { } ( ) # [ ] | !\";\n","import { IPlannerProgramExerciseWarmupSet, IPlannerProgramProperty, IExportedPlannerProgram } from \"./types\";\nimport { parser as plannerExerciseParser } from \"../plannerExerciseParser\";\nimport {\n  IPlannerEvalFullResult,\n  IPlannerEvalResult,\n  PlannerExerciseEvaluator,\n  PlannerSyntaxError,\n} from \"../plannerExerciseEvaluator\";\nimport {\n  IAllCustomExercises,\n  IAllEquipment,\n  IDayData,\n  IExerciseType,\n  IPlannerProgram,\n  IPlannerProgramWeek,\n  IProgram,\n  ISettings,\n} from \"../../../types\";\nimport {\n  ObjectUtils_isEqual,\n  ObjectUtils_clone,\n  ObjectUtils_filter,\n  ObjectUtils_findKeyByExpression,\n} from \"../../../utils/object\";\nimport { IPlannerExerciseEvaluatorTextWeek, PlannerExerciseEvaluatorText } from \"../plannerExerciseEvaluatorText\";\nimport { IPlannerTopLineItem } from \"../plannerExerciseEvaluator\";\nimport {\n  IEvaluatedProgram,\n  IExportedProgram,\n  Program_evaluate,\n  Program_create,\n  Program_getAllProgramExercises,\n  Program_exportedPlannerProgramToExportedProgram,\n} from \"../../../models/program\";\nimport {\n  PlannerEvaluator_compareExerciseOrder,\n  PlannerEvaluator_evaluate,\n  PlannerEvaluator_evaluateFull,\n} from \"../plannerEvaluator\";\nimport { IWeightChange } from \"../../../models/programExercise\";\nimport { Storage_getDefault, Storage_get } from \"../../../models/storage\";\nimport { Weight_eqNull } from \"../../../models/weight\";\nimport { PP_iterate2, PP_iterate } from \"../../../models/pp\";\nimport { IEither } from \"../../../utils/types\";\nimport { getLatestMigrationVersion } from \"../../../migrations/migrations\";\nimport { ProgramToPlanner } from \"../../../models/programToPlanner\";\nimport { PlannerKey_fromLabelNameAndEquipment, PlannerKey_fromExerciseType } from \"../plannerKey\";\nimport { Exercise_get } from \"../../../models/exercise\";\nimport { UidFactory_generateUid } from \"../../../utils/generator\";\nimport { CollectionUtils_compact } from \"../../../utils/collection\";\n\nexport type IExerciseTypeToProperties = Record<string, (IPlannerProgramProperty & { dayData: Required<IDayData> })[]>;\nexport type IExerciseTypeToWarmupSets = Record<string, IPlannerProgramExerciseWarmupSet[] | undefined>;\n\nexport class PlannerDayDataError extends Error {\n  constructor(\n    message: string,\n    public readonly dayData: Required<IDayData>\n  ) {\n    super(message);\n  }\n}\n\nexport type IDereuseDecision = \"all\" | \"weight\" | \"rpe\" | \"timer\";\n\nexport function PlannerProgram_isValid(program: IPlannerProgram | undefined, settings: ISettings): boolean {\n  if (!program) {\n    return false;\n  }\n  const { evaluatedWeeks } = PlannerProgram_evaluate(program, settings);\n  return evaluatedWeeks.every((week) => week.every((day) => day.success));\n}\n\nexport function PlannerProgram_replaceWeight(\n  program: IEvaluatedProgram,\n  programExerciseId: string,\n  weightChanges: IWeightChange[]\n): IEvaluatedProgram {\n  if (weightChanges.every((wc) => ObjectUtils_isEqual(wc.originalWeight, wc.weight))) {\n    return program;\n  }\n  const newEvalutedProgram = ObjectUtils_clone(program);\n  PP_iterate2(newEvalutedProgram.weeks, (ex) => {\n    if (ex.key === programExerciseId) {\n      for (const setVariation of ex.evaluatedSetVariations) {\n        for (const set of setVariation.sets) {\n          const weightChange = weightChanges.find((wc) => Weight_eqNull(wc.originalWeight, set.weight));\n          if (weightChange != null) {\n            set.weight = weightChange.weight;\n          }\n        }\n      }\n    }\n  });\n  return newEvalutedProgram;\n}\n\n// Evaluation throws PlannerSyntaxError rather than returning it, and its prototype chain\n// doesn't survive the ES5 downlevel — `instanceof Error` is false for it, so a caught planner\n// error has to be read structurally or it stringifies to \"[object Object]\".\nexport function PlannerProgram_thrownErrorMessage(error: unknown): string {\n  if (typeof error === \"object\" && error != null && typeof (error as { message?: unknown }).message === \"string\") {\n    return (error as { message: string }).message;\n  }\n  return String(error);\n}\n\nexport function PlannerProgram_replaceExercise(\n  planner: IPlannerProgram,\n  key: string,\n  newLabel: string | undefined,\n  toExerciseType: IExerciseType | string,\n  settings: ISettings,\n  dayData?: Required<IDayData>\n): IPlannerProgram {\n  const evaluatedProgram = ObjectUtils_clone(Program_evaluate({ ...Program_create(\"Temp\"), planner }, settings));\n  const allExercises = Program_getAllProgramExercises(evaluatedProgram);\n  let labelSuffix: string | undefined = undefined;\n  let noConflicts = false;\n\n  function getLabel(label?: string): string | undefined {\n    return (newLabel ?? label) || labelSuffix\n      ? CollectionUtils_compact([newLabel ?? label, labelSuffix]).join(\"-\")\n      : undefined;\n  }\n\n  if (dayData) {\n    noConflicts = true;\n  }\n\n  while (!noConflicts) {\n    const conflictingExercises = allExercises.filter((e) => {\n      const newKey =\n        typeof toExerciseType === \"string\"\n          ? PlannerKey_fromLabelNameAndEquipment(getLabel(e.label), toExerciseType, undefined, settings.exercises)\n          : PlannerKey_fromExerciseType(toExerciseType, getLabel(e.label));\n      return (\n        e.key === newKey && (!dayData || (dayData.week !== e.dayData.week && dayData.dayInWeek !== e.dayData.dayInWeek))\n      );\n    });\n    if (conflictingExercises.length > 0) {\n      noConflicts = false;\n      labelSuffix = UidFactory_generateUid(3);\n    } else {\n      noConflicts = true;\n    }\n  }\n\n  const renameMapping: Record<string, { to: string; dayData?: Required<IDayData> }> = {};\n  PP_iterate2(evaluatedProgram.weeks, (exercise, weekIndex, dayInWeekIndex) => {\n    if (exercise.key === key) {\n      if (!dayData || (dayData.week === weekIndex + 1 && dayData.dayInWeek === dayInWeekIndex + 1)) {\n        exercise.exerciseType = typeof toExerciseType === \"string\" ? undefined : toExerciseType;\n        const newLabel2 = getLabel(exercise.label);\n        exercise.label = newLabel2;\n        // Replacing collapses any multi-variation ladder into a single current variation for the new\n        // target, so serialization/identity come from the new exercise instead of the stale ladder.\n        const newName =\n          typeof toExerciseType === \"string\" ? toExerciseType : Exercise_get(toExerciseType, settings.exercises).name;\n        exercise.exerciseVariations = [{ exerciseType: exercise.exerciseType, name: newName, isCurrent: true }];\n        if (typeof toExerciseType === \"string\") {\n          exercise.notused = true;\n          exercise.fullName = `${newLabel2 ? `${newLabel2}: ` : \"\"}${toExerciseType}`;\n        }\n        const newKey =\n          typeof toExerciseType === \"string\"\n            ? PlannerKey_fromLabelNameAndEquipment(newLabel2, toExerciseType, undefined, settings.exercises)\n            : PlannerKey_fromExerciseType(toExerciseType, newLabel2);\n        renameMapping[exercise.key] = { to: newKey, dayData };\n        exercise.key = newKey;\n      }\n    }\n  });\n  return new ProgramToPlanner(evaluatedProgram, settings).convertToPlanner({ renameMapping });\n}\n\nexport function PlannerProgram_replaceAndValidateExercise(\n  program: IProgram,\n  key: string,\n  toExerciseType: IExerciseType,\n  settings: ISettings,\n  dayData?: Required<IDayData>\n): IEither<IProgram, string> {\n  const newPlanner = PlannerProgram_replaceExercise(\n    program.planner!,\n    key,\n    undefined,\n    toExerciseType,\n    settings,\n    dayData\n  );\n  const { evaluatedWeeks } = PlannerEvaluator_evaluate(newPlanner, settings);\n  let error: PlannerSyntaxError | undefined;\n  for (const week of evaluatedWeeks) {\n    for (const day of week) {\n      if (!day.success) {\n        error = day.error;\n        break;\n      }\n    }\n  }\n  if (error) {\n    return { success: false, error: error.message };\n  } else {\n    return { success: true, data: { ...program, planner: newPlanner } };\n  }\n}\n\nexport function PlannerProgram_modifyTopLineItems(\n  aPlannerProgram: IPlannerProgram,\n  settings: ISettings,\n  firstPass: (\n    line: IPlannerTopLineItem,\n    weekIndex: number,\n    dayInWeekIndex: number,\n    dayIndex: number,\n    lineIndex: number\n  ) => IPlannerTopLineItem\n): IPlannerProgram {\n  let dayIndex = 0;\n  const plannerProgram = ObjectUtils_clone(aPlannerProgram);\n  const mapping = plannerProgram.weeks.map((week, weekIndex) => {\n    return week.days.map((day, dayInWeekIndex) => {\n      const tree = plannerExerciseParser.parse(day.exerciseText);\n      const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", {\n        day: dayIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n        week: weekIndex + 1,\n      });\n      dayIndex += 1;\n      const map = evaluator.topLineMap(tree.topNode);\n      return map;\n    });\n  });\n\n  dayIndex = 0;\n  for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n    const week = mapping[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex += 1) {\n      const day = week[dayInWeekIndex];\n      for (let lineIndex = 0; lineIndex < day.length; lineIndex += 1) {\n        const line = day[lineIndex];\n        const newLine = firstPass(line, weekIndex, dayInWeekIndex, dayIndex, lineIndex);\n        day[lineIndex] = newLine;\n      }\n      dayIndex += 1;\n    }\n  }\n\n  for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n    const programWeek = plannerProgram.weeks[weekIndex];\n    const week = mapping[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex += 1) {\n      const day = week[dayInWeekIndex];\n      const programDay = programWeek.days[dayInWeekIndex];\n      let str = \"\";\n      for (const line of day) {\n        str += PlannerProgram_topLineItemToText(line);\n      }\n      programDay.exerciseText = str.trim();\n    }\n  }\n\n  return plannerProgram;\n}\n\nexport function PlannerProgram_topLineItemToText(line: IPlannerTopLineItem): string {\n  let str = \"\";\n  if (line.type === \"description\") {\n    //\n  } else if (line.type === \"exercise\") {\n    if (!line.used) {\n      if (line.descriptions && line.descriptions.length > 0) {\n        str += `${line.descriptions.join(\"\\n\\n\")}\\n`;\n      }\n      let repeatStr = \"\";\n      if ((line.order != null && line.order !== 0) || (line.repeatRanges && line.repeatRanges.length > 0)) {\n        const repeatParts = [];\n        if (line.order != null && line.order !== 0) {\n          repeatParts.push(line.order);\n        }\n        if (line.repeatRanges && line.repeatRanges.length > 0) {\n          repeatParts.push(line.repeatRanges.join(\",\"));\n        }\n        repeatStr = `[${repeatParts.join(\",\")}]`;\n      }\n      str += `${line.fullName}${repeatStr} / ${line.sections}\\n`;\n    }\n  } else {\n    str += line.value + \"\\n\";\n  }\n  return str;\n}\n\nexport function PlannerProgram_switchToUnit(plannerProgram: IPlannerProgram, settings: ISettings): IPlannerProgram {\n  const newPlannerProgram = ObjectUtils_clone(plannerProgram);\n  for (const week of newPlannerProgram.weeks) {\n    for (const day of week.days) {\n      const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\");\n      const tree = plannerExerciseParser.parse(day.exerciseText);\n      day.exerciseText = evaluator.switchWeightsToUnit(tree.topNode, settings);\n    }\n  }\n  return newPlannerProgram;\n}\n\nexport function PlannerProgram_hasNonSelectedWeightUnit(plannerProgram: IPlannerProgram, settings: ISettings): boolean {\n  for (const week of plannerProgram.weeks) {\n    for (const day of week.days) {\n      const tree = plannerExerciseParser.parse(day.exerciseText);\n      const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\");\n      if (evaluator.hasWeightInUnit(tree.topNode, settings.units === \"kg\" ? \"lb\" : \"kg\")) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nexport function PlannerProgram_compact(\n  oldPlannerProgram: IPlannerProgram,\n  plannerProgram: IPlannerProgram,\n  settings: ISettings,\n  additionalRepeatingExercises?: Set<string>,\n  renameMapping?: Record<string, { to: string; dayData?: Required<IDayData> }>\n): IPlannerProgram {\n  let dayIndex = 0;\n  const repeatingExercises = new Set<string>();\n  const { evaluatedWeeks } = PlannerProgram_evaluate(ObjectUtils_clone(oldPlannerProgram), settings);\n  const { evaluatedWeeks: newEvaluatedWeeks } = PlannerProgram_evaluate(ObjectUtils_clone(plannerProgram), settings);\n  for (const ev of [evaluatedWeeks, newEvaluatedWeeks]) {\n    PP_iterate(ev, (exercise) => {\n      if (exercise.repeat != null && exercise.repeat.length > 0) {\n        repeatingExercises.add(exercise.key);\n      }\n    });\n  }\n  for (const ex of additionalRepeatingExercises || []) {\n    repeatingExercises.add(ex);\n  }\n\n  // The weeks that actually spell a repeating exercise out. A range may reach backwards\n  // (`tmpl[1-3]` written in week 3), so it can't just be scanned forward from the first week the\n  // exercise shows up in - that week may be a materialized copy with nothing to declare. There can\n  // be more than one declaration per key/day (`tmp[1-3]` in week 3 and `tmp[4-5]` in week 4), and\n  // each one owns its own range, so this is a set rather than a single week.\n  const declaringWeekIndexes: Record<string, Set<number>> = {};\n  PP_iterate(evaluatedWeeks, (exercise, weekIndex, dayInWeekIndex) => {\n    if (!exercise.isRepeat && exercise.repeat != null && exercise.repeat.length > 0) {\n      const declaringKey = `${exercise.key}_${dayInWeekIndex}`;\n      declaringWeekIndexes[declaringKey] = declaringWeekIndexes[declaringKey] || new Set();\n      declaringWeekIndexes[declaringKey].add(weekIndex);\n    }\n  });\n\n  // declaringWeekIndexes is keyed by the old program's exercise keys, while the lines being\n  // compacted come from the newly printed text - PlannerProgram_replaceExercise renames keys in\n  // between. Both the declaring lookup and claimWeek's `repeating` check have to go back through\n  // the rename to find the exercise they're talking about.\n  function oldKeyFor(value: string, weekIndex: number, dayInWeekIndex: number): string {\n    if (!renameMapping) {\n      return value;\n    }\n    const beforeRenaming = ObjectUtils_findKeyByExpression(\n      renameMapping,\n      (_, v) =>\n        v.to === value &&\n        (v.dayData == null || (v.dayData.week === weekIndex + 1 && v.dayData.dayInWeek === dayInWeekIndex + 1))\n    );\n    return beforeRenaming ?? value;\n  }\n\n  const lastDescriptions: Partial<Record<number, string | undefined>> = {};\n  plannerProgram.weeks.forEach((week) => {\n    week.days.forEach((day, dayInWeekIndex) => {\n      if (lastDescriptions[dayInWeekIndex] == null) {\n        lastDescriptions[dayInWeekIndex] = day.description;\n      } else if (lastDescriptions[dayInWeekIndex] === day.description) {\n        day.description = undefined;\n      } else {\n        lastDescriptions[dayInWeekIndex] = day.description;\n      }\n    });\n  });\n\n  const mapping = plannerProgram.weeks.map((week, weekIndex) => {\n    return week.days.map((day, dayInWeekIndex) => {\n      const tree = plannerExerciseParser.parse(day.exerciseText);\n      const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", {\n        day: dayIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n        week: weekIndex + 1,\n      });\n      dayIndex += 1;\n      const map = evaluator.topLineMap(tree.topNode);\n      return map;\n    });\n  });\n\n  // Declaring weeks go first, so a range written backwards (`tmpl[1-3]` in week 3) keeps the\n  // spelled-out line in the week that spells it out. Everything left over then compacts forward,\n  // which is what a repeat broken up by a mid-program change (`Squat[1-5]` splitting into `[1-2]`,\n  // week 3, `[4-5]`) needs.\n  for (const declaringPass of [true, false]) {\n    for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n      const week = mapping[weekIndex];\n      for (dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n        const day = week[dayIndex];\n        for (const line of day) {\n          if (line.type !== \"exercise\" || line.used || !repeatingExercises.has(line.value)) {\n            continue;\n          }\n          const declaringWeeks = declaringWeekIndexes[`${oldKeyFor(line.value, weekIndex, dayIndex)}_${dayIndex}`];\n          if (!!declaringWeeks?.has(weekIndex) !== declaringPass) {\n            continue;\n          }\n          const claimWeek = (repeatWeekIndex: number): boolean => {\n            const repeatDay = mapping[repeatWeekIndex]?.[dayIndex];\n            const repeatedExercises = (repeatDay || []).filter((e) => {\n              if (\n                e.type !== \"exercise\" ||\n                e.used ||\n                e.value !== line.value ||\n                e.sectionsToReuse !== line.sectionsToReuse ||\n                e.exerciseIndex !== line.exerciseIndex ||\n                !ObjectUtils_isEqual(e.descriptions || [], line.descriptions || [])\n              ) {\n                return false;\n              }\n              const oldKey = oldKeyFor(line.value, repeatWeekIndex, dayIndex);\n              // A week that spells the exercise out owns its own range - only materialized copies\n              // are collapsible. Without this, `tmp[1-3]` in week 3 and `tmp[4-5]` in week 4 let\n              // week 1's copy swallow week 3's line, taking the progress block written on it.\n              if (declaringWeekIndexes[`${oldKey}_${dayIndex}`]?.has(repeatWeekIndex)) {\n                return false;\n              }\n              const oldDay = evaluatedWeeks[repeatWeekIndex][dayIndex];\n              const oldExercise = oldDay.success ? oldDay.data.find((ex) => ex.key === oldKey) : undefined;\n              return oldExercise?.repeating?.includes(weekIndex + 1);\n            });\n            for (const e of repeatedExercises) {\n              e.used = true;\n            }\n            return repeatedExercises.length > 0;\n          };\n          let firstWeek = weekIndex + 1;\n          let lastWeek = weekIndex + 1;\n          for (let repeatWeekIndex = weekIndex + 1; repeatWeekIndex < mapping.length; repeatWeekIndex += 1) {\n            if (!claimWeek(repeatWeekIndex)) {\n              break;\n            }\n            lastWeek = repeatWeekIndex + 1;\n          }\n          if (declaringPass) {\n            for (let repeatWeekIndex = weekIndex - 1; repeatWeekIndex >= 0; repeatWeekIndex -= 1) {\n              if (!claimWeek(repeatWeekIndex)) {\n                break;\n              }\n              firstWeek = repeatWeekIndex + 1;\n            }\n          }\n          line.repeatRanges = firstWeek === lastWeek ? [] : [`${firstWeek}-${lastWeek}`];\n        }\n      }\n    }\n  }\n\n  for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n    const programWeek = plannerProgram.weeks[weekIndex];\n    const week = mapping[weekIndex];\n    for (dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n      const day = week[dayIndex];\n      const programDay = programWeek.days[dayIndex];\n      let str = \"\";\n      let ongoingDescriptions = false;\n      for (const line of day) {\n        if (line.type === \"description\") {\n          ongoingDescriptions = true;\n          //\n        } else if (line.type === \"exercise\") {\n          ongoingDescriptions = false;\n          if (!line.used) {\n            if (line.descriptions && line.descriptions.length > 0) {\n              str += `${line.descriptions.filter((d) => d.trim()).join(\"\\n\\n\")}\\n`;\n            }\n            let repeatStr = \"\";\n            if ((line.order != null && line.order !== 0) || (line.repeatRanges && line.repeatRanges.length > 0)) {\n              const repeatParts = [];\n              if (line.order != null && line.order !== 0) {\n                repeatParts.push(line.order);\n              }\n              if (line.repeatRanges && line.repeatRanges.length > 0) {\n                repeatParts.push(line.repeatRanges.join(\",\"));\n              }\n              repeatStr = `[${repeatParts.join(\",\")}]`;\n            }\n            str += [`${line.fullName}${repeatStr}`, line.sections].filter((r) => r).join(\" / \") + `\\n`;\n          }\n        } else if (line.type === \"empty\") {\n          if (!ongoingDescriptions) {\n            str += line.value + \"\\n\";\n          }\n        } else {\n          str += line.value + \"\\n\";\n        }\n      }\n      programDay.exerciseText = str.trim();\n    }\n  }\n\n  return plannerProgram;\n}\n\nexport function PlannerProgram_groupedTopLines(topLine: IPlannerTopLineItem[][][]): IPlannerTopLineItem[][][][] {\n  const groupedTopLine: IPlannerTopLineItem[][][][] = [];\n  for (let weekIndex = 0; weekIndex < topLine.length; weekIndex += 1) {\n    const topLineWeek = topLine[weekIndex];\n    groupedTopLine.push([]);\n    for (let dayInWeekIndex = 0; dayInWeekIndex < topLineWeek.length; dayInWeekIndex += 1) {\n      const topLineDay = topLineWeek[dayInWeekIndex];\n      const group: IPlannerTopLineItem[][] = [];\n      groupedTopLine[weekIndex].push(group);\n      let reset = true;\n      for (let lineIndex = 0; lineIndex < topLineDay.length; lineIndex += 1) {\n        if (reset) {\n          group.push([]);\n          reset = false;\n        }\n        const line = topLineDay[lineIndex];\n        group[group.length - 1] = group[group.length - 1] || [];\n        group[group.length - 1].push(line);\n        if (line.type === \"exercise\") {\n          reset = true;\n        }\n      }\n    }\n  }\n  for (const week of groupedTopLine) {\n    for (const day of week) {\n      day.sort((group1, group2) => {\n        const ex1 = group1.find((l) => l.type === \"exercise\");\n        const ex2 = group2.find((l) => l.type === \"exercise\");\n        if (ex1 == null || ex2 == null) {\n          return 0;\n        }\n        return PlannerEvaluator_compareExerciseOrder(ex1, ex2);\n      });\n    }\n  }\n  return groupedTopLine;\n}\n\nexport function PlannerProgram_topLineItems(\n  plannerProgram: IPlannerProgram,\n  settings: ISettings\n): IPlannerTopLineItem[][][] {\n  let dayIndex = 0;\n\n  const mapping = plannerProgram.weeks.map((week, weekIndex) => {\n    return week.days.map((day, dayInWeekIndex) => {\n      const tree = plannerExerciseParser.parse(day.exerciseText);\n      const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", {\n        day: dayIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n        week: weekIndex + 1,\n      });\n      dayIndex += 1;\n      const map = evaluator.topLineMap(tree.topNode);\n      return map;\n    });\n  });\n  for (let weekIndex = 0; weekIndex < mapping.length; weekIndex += 1) {\n    const week = mapping[weekIndex];\n    for (dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n      const day = week[dayIndex];\n      for (const exercise of day) {\n        for (const r of exercise.repeat || []) {\n          const reuseDay = mapping[r - 1]?.[dayIndex];\n          if (reuseDay && !reuseDay.some((e) => e.type === \"exercise\" && e.value === exercise.value)) {\n            if (exercise.descriptions) {\n              for (let di = 0; di < exercise.descriptions.length; di += 1) {\n                if (di !== 0) {\n                  reuseDay.push({ type: \"empty\", value: \"\" });\n                }\n                reuseDay.push({ type: \"description\", value: exercise.descriptions[di] });\n              }\n            }\n            reuseDay.push({ ...exercise, repeat: undefined, isRepeat: true });\n          }\n        }\n      }\n    }\n  }\n  return mapping;\n}\n\nexport function PlannerProgram_evaluate(\n  plannerProgram: IPlannerProgram,\n  settings: ISettings\n): { evaluatedWeeks: IPlannerEvalResult[][]; exerciseFullNames: string[] } {\n  return PlannerEvaluator_evaluate(plannerProgram, settings);\n}\n\nexport function PlannerProgram_evaluateFull(\n  fullProgramText: string,\n  settings: ISettings\n): { evaluatedWeeks: IPlannerEvalFullResult; exerciseFullNames: string[] } {\n  return PlannerEvaluator_evaluateFull(fullProgramText, settings);\n}\n\nexport function PlannerProgram_evaluateText(fullProgramText: string): IPlannerProgramWeek[] {\n  const tree = plannerExerciseParser.parse(fullProgramText);\n  return textWeeksToPlanner(new PlannerExerciseEvaluatorText(fullProgramText).evaluate(tree.topNode));\n}\n\nexport function PlannerProgram_parseText(fullProgramText: string): IEither<IPlannerProgramWeek[], PlannerSyntaxError> {\n  const evaluator = new PlannerExerciseEvaluatorText(fullProgramText, { isStrict: true });\n  try {\n    const data = evaluator.evaluate(plannerExerciseParser.parse(fullProgramText).topNode);\n    return { success: true, data: textWeeksToPlanner(data) };\n  } catch (e) {\n    if (e instanceof PlannerSyntaxError) {\n      return { success: false, error: e };\n    }\n    throw e;\n  }\n}\n\nfunction textWeeksToPlanner(data: IPlannerExerciseEvaluatorTextWeek[]): IPlannerProgramWeek[] {\n  const weeks: IPlannerProgramWeek[] = data.map((week) => {\n    return {\n      name: week.name,\n      description: week.description,\n      days: week.days.map((day) => {\n        return {\n          name: day.name,\n          description: day.description,\n          exerciseText: day.exercises.join(\"\").trim(),\n        };\n      }),\n    };\n  });\n  if (weeks.length === 0) {\n    weeks.push({ name: \"Week 1\", days: [{ name: \"Day 1\", exerciseText: \"\" }] });\n  }\n  return weeks;\n}\n\nexport function PlannerProgram_fullToWeekEvalResult(fullResult: IPlannerEvalFullResult): IPlannerEvalResult[][] {\n  return fullResult.success\n    ? fullResult.data.map((week) => week.days.map((d) => ({ success: true, data: d.exercises })))\n    : [[fullResult]];\n}\n\nexport function PlannerProgram_generateFullText(weeks: IPlannerProgramWeek[]): string {\n  let fullText = \"\";\n  for (const week of weeks) {\n    if (week.description != null) {\n      fullText +=\n        week.description\n          .split(\"\\n\")\n          .map((l) => (l ? `// ${l}` : \"//\"))\n          .join(\"\\n\") + \"\\n\";\n    }\n    fullText += `# ${week.name}\\n`;\n    for (const day of week.days) {\n      if (day.description != null) {\n        fullText +=\n          day.description\n            .split(\"\\n\")\n            .map((l) => `// ${l}`)\n            .join(\"\\n\") + \"\\n\";\n      }\n      fullText += `## ${day.name}\\n`;\n      fullText += `${day.exerciseText}\\n\\n`;\n    }\n    fullText += \"\\n\";\n  }\n  return fullText;\n}\n\nexport function PlannerProgram_usedExercises(\n  exercises: IAllCustomExercises,\n  evaluatedWeeks: IPlannerEvalResult[][]\n): IAllCustomExercises {\n  return ObjectUtils_filter(exercises, (_id, ex) => {\n    if (!ex) {\n      return false;\n    }\n\n    return evaluatedWeeks.some((week) => {\n      return week.some((day) => {\n        return day.success && day.data.some((d) => d.name.toLowerCase() === ex.name.toLowerCase());\n      });\n    });\n  });\n}\n\nexport function PlannerProgram_usedEquipment(\n  equipment: IAllEquipment,\n  evaluatedWeeks: IPlannerEvalResult[][]\n): IAllEquipment {\n  return ObjectUtils_filter(equipment, (key, value) => {\n    return evaluatedWeeks.some((week) => {\n      return week.some((day) => {\n        return day.success && day.data.some((d) => d.equipment?.toLowerCase() === key);\n      });\n    });\n  });\n}\n\nexport function PlannerProgram_convertExportedPlannerToProgram(\n  planner: IExportedPlannerProgram,\n  settings: ISettings\n): IExportedProgram {\n  const newProgram = Program_create(planner.program.name, planner.id);\n  const newSettings: ISettings = {\n    ...settings,\n    exercises: { ...settings.exercises, ...planner.settings.exercises },\n  };\n  const program = { ...newProgram, planner: planner.program };\n  return {\n    program: program,\n    settings: {\n      timers: newSettings.timers,\n      planner: newSettings.planner,\n      units: newSettings.units,\n    },\n    customExercises: planner.settings.exercises,\n    version: planner.version,\n  };\n}\n\nexport function PlannerProgram_buildExportedProgram(\n  id: string,\n  program: IPlannerProgram,\n  settings: ISettings,\n  nextDay?: number\n): IExportedProgram {\n  const { evaluatedWeeks } = PlannerProgram_evaluate(program, settings);\n\n  const exportedPlannerProgram: IExportedPlannerProgram = {\n    id,\n    type: \"v2\",\n    version: getLatestMigrationVersion(),\n    program: program,\n    plannerSettings: settings.planner,\n    settings: {\n      exercises: PlannerProgram_usedExercises(settings.exercises, evaluatedWeeks),\n      timer: settings.timers.workout ?? 0,\n    },\n  };\n  return Program_exportedPlannerProgramToExportedProgram(exportedPlannerProgram, nextDay);\n}\n\nexport async function PlannerProgram_getExportedPlannerProgram(\n  program: IExportedPlannerProgram,\n  settings: ISettings\n): Promise<IEither<IExportedPlannerProgram, string[]>> {\n  const storage = Storage_getDefault();\n  storage.version = program.version;\n  storage.programs = [{ ...Program_create(program.program.name), planner: program.program }];\n  storage.settings = { ...storage.settings, planner: program.plannerSettings || storage.settings.planner };\n  storage.settings.exercises = { ...storage.settings.exercises, ...settings.exercises };\n\n  const result = Storage_get(storage);\n  if (result.success) {\n    const newStorage = result.data;\n    return {\n      success: true,\n      data: {\n        id: program.id,\n        type: \"v2\",\n        version: newStorage.version,\n        program: newStorage.programs[0].planner!,\n        plannerSettings: storage.settings.planner,\n        settings: {\n          exercises: storage.settings.exercises || {},\n          timer: storage.settings.timers?.workout || 180,\n        },\n      },\n    };\n  } else {\n    return { success: false, error: result.error };\n  }\n}\n","import {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseEvaluatedSet,\n  IPlannerProgramExerciseEvaluatedSetVariation,\n  IPlannerProgramExerciseGlobals,\n  IPlannerProgramExerciseSet,\n  IPlannerProgramExerciseSetVariation,\n  IPlannerProgramExerciseVariation,\n  IPlannerProgramExerciseWithType,\n  IPlannerProgramExerciseWarmupSet,\n  IProgramExerciseProgress,\n  IProgramExerciseProgressType,\n} from \"./types\";\nimport { IPlannerEvalResult, PlannerExerciseEvaluator } from \"../plannerExerciseEvaluator\";\nimport type { IPlannerErrorDetails } from \"../../../syntaxErrorTypes\";\nimport { ObjectUtils_clone, ObjectUtils_filter, ObjectUtils_values } from \"../../../utils/object\";\nimport {\n  Weight_rpeMultiplier,\n  Weight_build,\n  Weight_buildPct,\n  Weight_display,\n  Weight_zero,\n  Weight_eq,\n  Weight_parsePct,\n  Weight_isPct,\n} from \"../../../models/weight\";\nimport {\n  IDayData,\n  IHistoryEntry,\n  IPercentage,\n  IProgramExerciseWarmupSet,\n  IProgramState,\n  IProgramStateMetadata,\n  ISettings,\n  IWeight,\n} from \"../../../types\";\nimport {\n  equipmentName,\n  IExercise,\n  warmupValues,\n  Exercise_findByName,\n  Exercise_get,\n  Exercise_fullName,\n} from \"../../../models/exercise\";\nimport { ProgramExercise_groupWarmupsSets } from \"../../../models/programExercise\";\nimport { MathUtils_roundTo0005 } from \"../../../utils/math\";\nimport { UidFactory_generateUid } from \"../../../utils/generator\";\nimport { PlannerKey_fromExerciseType } from \"../plannerKey\";\nimport { CollectionUtils_compact, CollectionUtils_groupByExpr } from \"../../../utils/collection\";\nimport { IEither } from \"../../../utils/types\";\nimport { IDisplaySet, Reps_groupDisplaySets } from \"../../../models/set\";\n\nexport type ILinearProgressionType = {\n  type: \"linear\";\n  increase: IWeight | IPercentage;\n  successesRequired?: number;\n  successesCounter?: number;\n  decrease?: IWeight | IPercentage;\n  failuresRequired?: number;\n  failuresCounter?: number;\n};\nexport type IDoubleProgressionType = {\n  type: \"double\";\n  increase: IWeight | IPercentage;\n  minReps: number;\n  maxReps: number;\n};\nexport type ISumRepsProgressionType = {\n  type: \"sumreps\";\n  increase: IWeight | IPercentage;\n  reps: number;\n};\nexport type ICustomProgressionType = {\n  type: \"custom\";\n};\nexport type IProgressionType =\n  | ILinearProgressionType\n  | IDoubleProgressionType\n  | ISumRepsProgressionType\n  | ICustomProgressionType;\n\nexport function PlannerProgramExercise_numberOfSets(exercise: IPlannerProgramExercise): number {\n  return PlannerProgramExercise_sets(exercise).reduce((acc, set) => acc + (set.repRange?.numberOfSets || 0), 0);\n}\n\nexport function PlannerProgramExercise_getExercise(\n  plannerExercise: IPlannerProgramExercise,\n  settings: ISettings\n): IExercise | undefined {\n  const exercise = Exercise_findByName(plannerExercise.name, settings.exercises);\n  if (exercise == null) {\n    return undefined;\n  }\n  exercise.equipment = plannerExercise.equipment || exercise?.equipment || exercise?.defaultEquipment;\n  return exercise;\n}\n\nexport function PlannerProgramExercise_setVariations(\n  exercise: IPlannerProgramExercise\n): IPlannerProgramExerciseSetVariation[] {\n  const originalSetVariations = exercise.setVariations;\n  const reuseSetVariations = exercise.reuse?.exercise?.setVariations;\n  const setVariations = (originalSetVariations?.length > 0 ? originalSetVariations : reuseSetVariations) || [];\n  return setVariations.length === 0\n    ? [{ sets: PlannerProgramExercise_sets(exercise), isCurrent: true }]\n    : setVariations;\n}\n\nexport function PlannerProgramExercise_warmups(\n  exercise: IPlannerProgramExercise\n): IPlannerProgramExerciseWarmupSet[] | undefined {\n  return exercise.warmupSets || exercise.reuse?.exercise?.warmupSets;\n}\n\nexport function PlannerProgramExercise_programWarmups(\n  exercise: IPlannerProgramExercise,\n  settings: ISettings\n): IProgramExerciseWarmupSet[] | undefined {\n  const exerciseWarmups = PlannerProgramExercise_warmups(exercise);\n  if (exerciseWarmups == null) {\n    return undefined;\n  }\n  const sets: IProgramExerciseWarmupSet[] = [];\n  for (const ws of exerciseWarmups) {\n    for (let i = 0; i < ws.numberOfSets; i += 1) {\n      let value: IWeight | number | undefined = ws.percentage ? ws.percentage / 100 : undefined;\n      if (value == null) {\n        value = ws.weight;\n      }\n      if (value == null) {\n        value = MathUtils_roundTo0005(Weight_rpeMultiplier(ws.reps, 4));\n      }\n      sets.push({\n        reps: ws.reps,\n        value,\n        threshold: Weight_build(0, settings.units),\n      });\n    }\n  }\n  return sets;\n}\n\nexport function PlannerProgramExercise_toUsed(\n  exercise?: IPlannerProgramExercise\n): IPlannerProgramExerciseWithType | undefined {\n  if (exercise?.exerciseType != null) {\n    return exercise as IPlannerProgramExerciseWithType;\n  } else {\n    return undefined;\n  }\n}\n\nexport function PlannerProgramExercise_evaluateSetVariations(\n  exercise: IPlannerProgramExercise,\n  setVariations: IPlannerProgramExerciseSetVariation[]\n): IPlannerProgramExerciseEvaluatedSetVariation[] {\n  const evaluatedSetVariations: IPlannerProgramExerciseEvaluatedSetVariation[] = [];\n  for (let i = 0; i < setVariations.length; i++) {\n    const sets = PlannerProgramExercise_sets(exercise, i);\n    const evaluatedSets: IPlannerProgramExerciseEvaluatedSet[] = [];\n    for (const aSet of sets) {\n      if (aSet.repRange == null) {\n        continue;\n      }\n      for (let j = 0; j < aSet.repRange.numberOfSets; j++) {\n        evaluatedSets.push({\n          maxrep: aSet.repRange.maxrep,\n          minrep: aSet.repRange.minrep,\n          weight: aSet.weight ? aSet.weight : aSet.percentage ? Weight_buildPct(aSet.percentage) : undefined,\n          timer: aSet.timer,\n          setTimer: aSet.setTimer,\n          isOverflowSetTimer: aSet.isOverflowSetTimer,\n          auto: aSet.auto,\n          rpe: aSet.rpe,\n          logRpe: !!aSet.logRpe,\n          label: aSet.label,\n          isAmrap: !!aSet.repRange.isAmrap,\n          isQuickAddSet: !!aSet.repRange.isQuickAddSet,\n          askWeight: !!aSet.askWeight,\n        });\n      }\n    }\n    evaluatedSetVariations.push({ sets: evaluatedSets, isCurrent: setVariations[i].isCurrent });\n  }\n  return evaluatedSetVariations;\n}\n\nexport function PlannerProgramExercise_sets(\n  exercise: IPlannerProgramExercise,\n  variationIndex?: number\n): IPlannerProgramExerciseSet[] {\n  const reusedSets = exercise.reuse?.exercise\n    ? exercise.reuse?.exercise?.setVariations[\n        variationIndex ?? PlannerProgramExercise_currentSetVariationIndex(exercise.reuse?.exercise)\n      ]?.sets\n    : undefined;\n  const reusedGlobals = exercise.reuse?.exercise?.globals || {};\n  variationIndex = variationIndex ?? PlannerProgramExercise_currentSetVariationIndex(exercise);\n  const currentSets = exercise.setVariations[variationIndex]?.sets;\n  const currentGlobals = exercise.globals;\n  const sets = currentSets || reusedSets || [];\n  return sets.map((aSet) => {\n    const set: IPlannerProgramExerciseSet = ObjectUtils_clone(aSet);\n    set.rpe = currentGlobals.rpe != null ? currentGlobals.rpe : (set.rpe ?? reusedGlobals.rpe);\n    set.timer = currentGlobals.timer != null ? currentGlobals.timer : (set.timer ?? reusedGlobals.timer);\n    set.setTimer = currentGlobals.setTimer != null ? currentGlobals.setTimer : (set.setTimer ?? reusedGlobals.setTimer);\n    // The overflow `+` modifier is part of the set timer, so a global/override that sets the set timer\n    // also dictates the overflow flag (absent `+` means off) - it must not leak from the reused exercise.\n    set.isOverflowSetTimer =\n      currentGlobals.setTimer != null\n        ? !!currentGlobals.isOverflowSetTimer\n        : (set.isOverflowSetTimer ?? reusedGlobals.isOverflowSetTimer);\n    set.auto = currentGlobals.auto != null ? currentGlobals.auto : (set.auto ?? reusedGlobals.auto);\n    if (currentGlobals.weight != null || currentGlobals.percentage != null) {\n      if (currentGlobals.weight != null) {\n        set.weight = currentGlobals.weight;\n        set.percentage = undefined;\n      } else {\n        set.percentage = currentGlobals.percentage;\n        set.weight = undefined;\n      }\n    } else {\n      set.weight = set.weight ?? reusedGlobals.weight;\n      set.percentage = set.percentage ?? reusedGlobals.percentage;\n    }\n\n    set.logRpe = !!(currentGlobals.rpe != null && currentGlobals.logRpe != null\n      ? currentGlobals.logRpe\n      : (set.logRpe ?? reusedGlobals.logRpe));\n    set.askWeight = !!((currentGlobals.weight != null || currentGlobals.percentage != null) &&\n    currentGlobals.askWeight != null\n      ? currentGlobals.askWeight\n      : (set.askWeight ?? reusedGlobals.askWeight));\n    return set;\n  });\n}\n\nexport function PlannerProgramExercise_defaultWarmups(\n  exercise: IExercise,\n  settings: ISettings\n): IPlannerProgramExerciseWarmupSet[] {\n  const warmupSets = (exercise?.defaultWarmup && warmupValues(settings.units)[exercise.defaultWarmup]) || [];\n  const result: IPlannerProgramExerciseWarmupSet[] = [];\n  if (warmupSets) {\n    const groups = ProgramExercise_groupWarmupsSets(warmupSets);\n    for (const group of groups) {\n      const first = group[0];\n      const length = group[1];\n      result.push({\n        type: \"warmup\",\n        numberOfSets: length,\n        reps: first.reps,\n        percentage: typeof first.value === \"number\" ? first.value * 100 : first.value.value,\n      });\n    }\n  }\n  return result;\n}\n\nexport function PlannerProgramExercise_repeatToRangeStr(plannerExercise: IPlannerProgramExercise): string {\n  const repeat = plannerExercise.repeating;\n  const ranges: [number, number][] = [];\n  for (const rep of repeat) {\n    if (ranges.length === 0) {\n      ranges.push([rep, rep]);\n    }\n    const lastRep = ranges[ranges.length - 1][1];\n    if (rep <= lastRep + 1) {\n      ranges[ranges.length - 1][1] = rep;\n    } else {\n      ranges.push([rep, rep]);\n    }\n  }\n  return ranges.map((r) => `${r[0]}-${r[1]}`).join(\", \");\n}\n\nexport function PlannerProgramExercise_warmupSetsToDisplaySets(\n  sets: IPlannerProgramExerciseWarmupSet[]\n): IDisplaySet[][] {\n  const displaySets: IDisplaySet[] = [];\n  for (const set of sets) {\n    for (let setIndex = 0; setIndex < (set.numberOfSets || 0); setIndex++) {\n      const weight =\n        set.percentage != null\n          ? `${set.percentage}%`\n          : set.weight?.value != null\n            ? set.weight.value.toString()\n            : `${Math.round(Weight_rpeMultiplier(set.reps, 10) * 100)}%`;\n      displaySets.push({\n        reps: `${set.reps}`,\n        weight: weight,\n      });\n    }\n  }\n\n  return Reps_groupDisplaySets(displaySets);\n}\n\nexport function PlannerProgramExercise_uniqueKey(exercise: IPlannerProgramExercise): string {\n  return `${exercise.key}-${exercise.dayData.week}-${exercise.dayData.dayInWeek}`;\n}\n\nexport function PlannerProgramExercise_uniqueSetKey(set: IPlannerProgramExerciseEvaluatedSet): string {\n  return `${set.minrep}-${set.maxrep}-${set.isAmrap}-${set.weight?.value}${set.weight?.unit}${set.askWeight}-${set.rpe}${set.logRpe}-${set.timer}-${set.setTimer}${set.isOverflowSetTimer}${set.auto}`;\n}\n\nexport function PlannerProgramExercise_evaluatedSetsToDisplaySets(\n  sets: IPlannerProgramExerciseEvaluatedSet[],\n  settings: ISettings\n): IDisplaySet[][] {\n  const displaySets: IDisplaySet[] = [];\n  for (const set of sets) {\n    const weight = set.weight ? Weight_display(set.weight, false) : undefined;\n    const unit = set.weight?.unit || settings.units;\n    displaySets.push({\n      dimReps: false,\n      dimRpe: !set.logRpe,\n      dimWeight: !set.weight,\n      dimTimer: set.timer == null,\n      reps: `${set.minrep != null ? `${set.minrep}-${set.maxrep}` : `${set.maxrep}`}${set.isAmrap ? \"+\" : \"\"}`,\n      rpe: set.rpe?.toString(),\n      weight,\n      unit,\n      askWeight: set.askWeight,\n      timer: set.timer,\n      setTimer: set.setTimer,\n      isOverflowSetTimer: set.isOverflowSetTimer,\n      auto: set.auto,\n    });\n  }\n  return Reps_groupDisplaySets(displaySets);\n}\n\nexport function PlannerProgramExercise_setsToDisplaySets(\n  sets: IPlannerProgramExerciseSet[],\n  hasCurrentSets: boolean,\n  globals: IPlannerProgramExerciseGlobals,\n  settings: ISettings\n): IDisplaySet[][] {\n  const displaySets: IDisplaySet[] = [];\n  for (const set of sets) {\n    for (let setIndex = 0; setIndex < (set.repRange?.numberOfSets || 0); setIndex++) {\n      const minReps = set.repRange?.minrep;\n      const maxReps = set.repRange?.maxrep || 0;\n      const weight =\n        set.percentage != null\n          ? `${set.percentage}%`\n          : set.weight?.value != null\n            ? set.weight.value.toString()\n            : undefined;\n      const unit = set.percentage == null ? set.weight?.unit || settings.units : undefined;\n      displaySets.push({\n        dimReps: !hasCurrentSets,\n        dimRpe: !hasCurrentSets && globals.rpe == null,\n        dimWeight: !hasCurrentSets && globals.weight == null && globals.percentage == null,\n        dimTimer: !hasCurrentSets && globals.timer == null,\n        reps: `${minReps != null ? `${minReps}-` : \"\"}${maxReps}${set.repRange?.isAmrap ? \"+\" : \"\"}`,\n        rpe: set.rpe?.toString(),\n        weight: weight,\n        unit,\n        askWeight: set.askWeight,\n        timer: set.timer,\n        setTimer: set.setTimer,\n        isOverflowSetTimer: set.isOverflowSetTimer,\n        auto: set.auto,\n      });\n    }\n  }\n\n  return Reps_groupDisplaySets(displaySets);\n}\n\nexport function PlannerProgramExercise_degroupWarmupSets(\n  warmupSets: IPlannerProgramExerciseWarmupSet[]\n): IPlannerProgramExerciseWarmupSet[] {\n  return warmupSets.reduce<IPlannerProgramExerciseWarmupSet[]>((acc, set) => {\n    for (let i = 0; i < set.numberOfSets; i++) {\n      acc.push({ ...set, numberOfSets: 1 });\n    }\n    return acc;\n  }, []);\n}\n\nexport function PlannerProgramExercise_currentSetVariationIndex(exercise: IPlannerProgramExercise): number {\n  const index = exercise.setVariations.findIndex((sv) => sv.isCurrent);\n  return index === -1 ? 0 : index;\n}\n\nexport function PlannerProgramExercise_currentEvaluatedSetVariationIndex(exercise: IPlannerProgramExercise): number {\n  const index = exercise.evaluatedSetVariations.findIndex((sv) => sv.isCurrent);\n  return index === -1 ? 0 : index;\n}\n\nexport function PlannerProgramExercise_currentEvaluatedSetVariation(\n  exercise: IPlannerProgramExercise\n): IPlannerProgramExerciseEvaluatedSetVariation {\n  const index = PlannerProgramExercise_currentEvaluatedSetVariationIndex(exercise);\n  return exercise.evaluatedSetVariations[index];\n}\n\nexport function PlannerProgramExercise_currentExerciseVariationIndex(exercise: IPlannerProgramExercise): number {\n  const index = (exercise.exerciseVariations ?? []).findIndex((v) => v.isCurrent);\n  return index === -1 ? 0 : index;\n}\n\nexport function PlannerProgramExercise_currentExerciseVariation(\n  exercise: IPlannerProgramExercise\n): IPlannerProgramExerciseVariation | undefined {\n  const index = PlannerProgramExercise_currentExerciseVariationIndex(exercise);\n  return exercise.exerciseVariations?.[index];\n}\n\nexport function PlannerProgramExercise_currentDescription(exercise: IPlannerProgramExercise): string | undefined {\n  const index = PlannerProgramExercise_currentDescriptionIndex(exercise);\n  return exercise.descriptions.values[index]?.value;\n}\n\nexport function PlannerProgramExercise_addSet(\n  ex: IPlannerProgramExercise,\n  setVariationIndex: number,\n  settings: ISettings\n): IPlannerProgramExercise {\n  const evaluatedSetVariation = ex.evaluatedSetVariations[setVariationIndex];\n  let lastEvaluatedSet = evaluatedSetVariation.sets[evaluatedSetVariation.sets.length - 1];\n  if (lastEvaluatedSet) {\n    evaluatedSetVariation.sets = [...evaluatedSetVariation.sets, ObjectUtils_clone(lastEvaluatedSet)];\n  } else {\n    const originalSets = PlannerProgramExercise_sets(ex, setVariationIndex);\n    const lastSet = originalSets[originalSets.length - 1];\n    if (lastSet) {\n      lastEvaluatedSet = {\n        maxrep: lastSet.repRange?.maxrep || 1,\n        minrep: lastSet.repRange?.minrep,\n        weight: lastSet.weight || Weight_zero,\n        logRpe: lastSet.logRpe || false,\n        isAmrap: lastSet.repRange?.isAmrap || false,\n        isQuickAddSet: lastSet.repRange?.isQuickAddSet || false,\n        askWeight: lastSet.askWeight || false,\n        rpe: lastSet.rpe,\n        timer: lastSet.timer,\n        setTimer: lastSet.setTimer,\n        isOverflowSetTimer: lastSet.isOverflowSetTimer,\n        auto: lastSet.auto,\n        label: lastSet.label,\n      };\n      evaluatedSetVariation.sets = [...evaluatedSetVariation.sets, ObjectUtils_clone(lastEvaluatedSet)];\n    } else {\n      evaluatedSetVariation.sets = [\n        ...evaluatedSetVariation.sets,\n        {\n          maxrep: 5,\n          weight: Weight_build(100, settings.units),\n          isAmrap: false,\n          logRpe: false,\n          askWeight: false,\n          isQuickAddSet: false,\n        },\n      ];\n    }\n  }\n  return ex;\n}\n\nexport function PlannerProgramExercise_currentDescriptionIndex(exercise: IPlannerProgramExercise): number {\n  const index = exercise.descriptions.values.findIndex((d) => d.isCurrent);\n  return index === -1 ? 0 : index;\n}\n\nexport function PlannerProgramExercise_numberOfSetsThisWeek(exerciseName: string, week: IPlannerEvalResult[]): number {\n  return week.reduce((acc, days) => {\n    if (days.success) {\n      const numberOfSetsThisDay = days.data\n        .filter((e) => e.name === exerciseName)\n        .reduce((acc2, e) => acc2 + PlannerProgramExercise_numberOfSets(e), 0);\n      return acc + numberOfSetsThisDay;\n    } else {\n      return acc;\n    }\n  }, 0);\n}\n\nexport function PlannerProgramExercise_getProgressScript(exercise: IPlannerProgramExercise): string | undefined {\n  return (\n    exercise.progress?.script ??\n    exercise.progress?.reuse?.exercise?.progress?.script ??\n    exercise.progress?.reuse?.exercise?.progress?.reuse?.exercise?.progress?.script ??\n    exercise.reuse?.exercise?.progress?.script ??\n    exercise.reuse?.exercise?.progress?.reuse?.exercise?.progress?.script\n  );\n}\n\nexport function PlannerProgramExercise_isReusingSetsProgress(exercise: IPlannerProgramExercise): boolean {\n  const reuseExercise = exercise.reuse?.exercise;\n  return (\n    reuseExercise?.progress != null &&\n    exercise.progress != null &&\n    exercise.progress.type === reuseExercise.progress?.type &&\n    (exercise.progress.reuse?.fullName === reuseExercise.fullName ||\n      exercise.progress.script === reuseExercise.progress.script) &&\n    Object.keys(PlannerProgramExercise_getOnlyChangedState(exercise)).length === 0\n  );\n}\n\n// `visited` only matters while a program is being evaluated: PlannerEvaluator_checkReuseLoops\n// rejects reuse loops, but it can't run until every reuse is wired, and the evaluator calls this\n// before then. Without the guard a loop is an unbounded recursion that kills the whole process\n// instead of failing that one program.\nexport function PlannerProgramExercise_getState(\n  exercise: IPlannerProgramExercise,\n  visited?: Set<IPlannerProgramExercise>\n): IProgramState {\n  if (exercise.progress?.state && !exercise.progress.reuse) {\n    return exercise.progress.state;\n  } else {\n    const seen = visited ?? new Set<IPlannerProgramExercise>();\n    if (seen.has(exercise)) {\n      return {};\n    }\n    seen.add(exercise);\n    const originalState = exercise.progress?.reuse?.exercise\n      ? PlannerProgramExercise_getState(exercise.progress.reuse.exercise, seen)\n      : exercise.reuse?.exercise\n        ? PlannerProgramExercise_getState(exercise.reuse.exercise, seen)\n        : {};\n\n    return { ...originalState, ...exercise.progress?.state };\n  }\n}\n\nexport function PlannerProgramExercise_getOnlyChangedState(exercise: IPlannerProgramExercise): IProgramState {\n  const originalState = exercise.progress?.reuse?.exercise\n    ? exercise.progress.reuse.exercise.progress?.state || {}\n    : exercise.reuse?.exercise\n      ? exercise.reuse.exercise.progress?.state || {}\n      : {};\n  const originalStateMetadata = exercise.progress?.reuse?.exercise\n    ? exercise.progress.reuse.exercise.progress?.stateMetadata || {}\n    : exercise.reuse?.exercise\n      ? exercise.reuse.exercise.progress?.stateMetadata || {}\n      : {};\n  const state = exercise.progress?.state || {};\n  const stateMetadata = exercise.progress?.stateMetadata || {};\n  return ObjectUtils_filter(\n    state,\n    (key, value) =>\n      originalState[key] == null ||\n      !Weight_eq(originalState[key], value) ||\n      originalStateMetadata[key]?.userPrompted !== stateMetadata[key]?.userPrompted\n  ) as IProgramState;\n}\n\nexport function PlannerProgramExercise_getStateMetadata(\n  exercise: IPlannerProgramExercise,\n  visited?: Set<IPlannerProgramExercise>\n): IProgramStateMetadata {\n  if (exercise.progress?.stateMetadata && !exercise.progress.reuse) {\n    return exercise.progress.stateMetadata;\n  } else {\n    const seen = visited ?? new Set<IPlannerProgramExercise>();\n    if (seen.has(exercise)) {\n      return {};\n    }\n    seen.add(exercise);\n    const originalState = exercise.progress?.reuse?.exercise\n      ? PlannerProgramExercise_getStateMetadata(exercise.progress.reuse.exercise, seen)\n      : exercise.reuse?.exercise\n        ? PlannerProgramExercise_getStateMetadata(exercise.reuse.exercise, seen)\n        : {};\n\n    return { ...originalState, ...exercise.progress?.stateMetadata };\n  }\n}\n\nexport function PlannerProgramExercise_getUpdateScript(exercise: IPlannerProgramExercise): string | undefined {\n  return (\n    exercise.update?.script ??\n    exercise.update?.reuse?.exercise?.update?.script ??\n    exercise.update?.reuse?.exercise?.update?.reuse?.exercise?.update?.script ??\n    exercise.reuse?.exercise?.update?.script ??\n    exercise.reuse?.exercise?.update?.reuse?.exercise?.update?.script\n  );\n}\n\nexport function PlannerProgramExercise_getEnableRpe(exercise: IPlannerProgramExercise): boolean {\n  return exercise.setVariations.some((sv, i) => PlannerProgramExercise_sets(exercise, i).some((s) => s.rpe != null));\n}\n\nexport function PlannerProgramExercise_getEnableRepRanges(exercise: IPlannerProgramExercise): boolean {\n  return exercise.setVariations.some((sv, i) =>\n    PlannerProgramExercise_sets(exercise, i).some((s) => s.repRange != null && s.repRange.minrep === s.repRange.maxrep)\n  );\n}\n\nexport function PlannerProgramExercise_getProgressDefaultArgs(type: IProgramExerciseProgressType): string[] {\n  switch (type) {\n    case \"none\":\n      return [];\n    case \"lp\":\n      return [\"5lb\"];\n    case \"dp\":\n      return [\"5lb\", \"8\", \"12\"];\n    case \"sum\":\n      return [\"30\", \"5lb\"];\n    case \"custom\":\n      return [];\n  }\n}\n\nfunction buildDpScript(): string {\n  return `for (var.i in completedReps) {\n  if (weights[var.i] == 0 && completedWeights[var.i] != 0) {\n    weights[var.i] = completedWeights[var.i]\n  }\n}\nif (completedReps >= reps && completedRPE <= RPE) {\n  if (completedReps >= state.maxReps) {\n    reps = state.minReps\n    for (var.i in completedReps) {\n      var.isInitial = weights[var.i] == 0 && completedWeights[var.i] != 0\n      if (var.isInitial) {\n        weights[var.i] = completedWeights[var.i] + state.increment\n      } else {\n        weights[var.i] += (completedWeights[var.i] - weights[var.i]) + state.increment\n      }\n    }\n  } else {\n    for (var.i in completedReps) {\n      reps[var.i] = completedReps[var.i] + 1 > state.maxReps ?\n        state.maxReps :\n        completedReps[var.i] + 1\n    }\n  }\n}`;\n}\n\nexport function PlannerProgramExercise_buildDpRangeScript(): string {\n  return `for (var.i in completedReps) {\n  if (weights[var.i] == 0 && completedWeights[var.i] != 0) {\n    weights[var.i] = completedWeights[var.i]\n  }\n}\nif (completedReps >= reps && completedRPE <= RPE) {\n  minReps = state.minReps\n  for (var.i in completedReps) {\n    var.isInitial = weights[var.i] == 0 && completedWeights[var.i] != 0\n    if (var.isInitial) {\n      weights[var.i] = completedWeights[var.i] + state.increment\n    } else {\n      weights[var.i] += (completedWeights[var.i] - weights[var.i]) + state.increment\n    }\n  }\n} else {\n  for (var.i in completedReps) {\n    minReps[var.i] = completedReps[var.i] + 1 > reps[var.i] ?\n      reps[var.i] :\n      completedReps[var.i] + 1\n  }\n}`;\n}\n\nexport function PlannerProgramExercise_buildProgress(\n  type: IProgramExerciseProgressType,\n  args: string[],\n  opts: {\n    reuseFullname?: string;\n    script?: string;\n  } = {}\n): IEither<IProgramExerciseProgress, { message: string; details: IPlannerErrorDetails }> {\n  switch (type) {\n    case \"none\": {\n      return {\n        success: true,\n        data: {\n          type: \"none\",\n          state: {},\n          stateMetadata: {},\n        },\n      };\n    }\n    case \"lp\": {\n      const increment = args[0] ? Weight_parsePct(args[0]) : Weight_build(0, \"lb\");\n      const decrement = args[3] ? Weight_parsePct(args[3]) : Weight_build(0, \"lb\");\n      const state: IProgramState = {\n        increment: increment ?? Weight_build(0, \"lb\"),\n        successes: args[1] ? parseInt(args[1], 10) : 1,\n        successCounter: args[2] ? parseInt(args[2], 10) : 0,\n        decrement: decrement ?? Weight_build(0, \"lb\"),\n        failures: args[4] ? parseInt(args[4], 10) : (decrement?.value ?? 0) > 0 ? 1 : 0,\n        failureCounter: args[5] ? parseInt(args[5], 10) : 0,\n      };\n      const script = `for (var.i in completedReps) {\n  if (weights[var.i] == 0 && completedWeights[var.i] != 0) {\n    weights[var.i] = completedWeights[var.i]\n  }\n}\nif (completedReps >= reps && completedRPE <= RPE) {\n  state.successCounter += 1\n  if (state.successCounter >= state.successes) {\n    for (var.i in completedReps) {\n      var.isInitial = weights[var.i] == 0 && completedWeights[var.i] != 0\n      if (var.isInitial) {\n        weights[var.i] = completedWeights[var.i] + state.increment\n      } else {\n        weights[var.i] += (completedWeights[var.i] - weights[var.i]) + state.increment\n      }\n    }\n    state.successCounter = 0\n    state.failureCounter = 0\n  }\n}\nif (state.decrement > 0 && state.failures > 0) {\n  if (!(completedReps >= minReps && completedRPE <= RPE)) {\n    state.failureCounter += 1\n    if (state.failureCounter >= state.failures) {\n      weights -= state.decrement\n      state.failureCounter = 0\n      state.successCounter = 0\n    }\n  }\n}`;\n      return {\n        success: true,\n        data: {\n          type: \"lp\",\n          state,\n          stateMetadata: {},\n          script,\n        },\n      };\n    }\n    case \"dp\": {\n      const increment = args[0] ? Weight_parsePct(args[0]) : Weight_build(0, \"lb\");\n      const state: IProgramState = {\n        increment: increment ?? Weight_build(0, \"lb\"),\n        minReps: args[1] ? parseInt(args[1], 10) : 0,\n        maxReps: args[2] ? parseInt(args[2], 10) : 0,\n      };\n      const script = buildDpScript();\n      return {\n        success: true,\n        data: {\n          type: \"dp\",\n          state,\n          stateMetadata: {},\n          script,\n        },\n      };\n    }\n    case \"sum\": {\n      const increment = args[1] ? Weight_parsePct(args[1]) : Weight_build(0, \"lb\");\n      const state: IProgramState = {\n        reps: args[0] ? parseInt(args[0], 10) : 0,\n        increment: increment ?? Weight_build(0, \"lb\"),\n      };\n      const script = `for (var.i in completedReps) {\nif (weights[var.i] == 0 && completedWeights[var.i] != 0) {\n  weights[var.i] = completedWeights[var.i]\n}\n}\nif (sum(completedReps) >= state.reps) {\nfor (var.i in completedReps) {\n  weights[var.i] = completedWeights[var.i] + state.increment\n}\n}`;\n      return {\n        success: true,\n        data: {\n          type: \"sum\",\n          state,\n          stateMetadata: {},\n          script,\n        },\n      };\n    }\n    case \"custom\": {\n      const script = opts.script;\n      let error: { message: string; details: IPlannerErrorDetails } | undefined;\n      const { state, stateMetadata } = PlannerExerciseEvaluator.fnArgsToStateVars(args, (message, value) => {\n        error = { message, details: { type: \"invalidStateVariable\", data: { value } } };\n      });\n      if (error) {\n        return {\n          success: false,\n          error,\n        };\n      }\n      return {\n        success: true,\n        data: {\n          type: \"custom\",\n          state,\n          stateMetadata,\n          script,\n          reuse: opts.reuseFullname ? { fullName: opts.reuseFullname, source: \"specific\" } : undefined,\n        },\n      };\n    }\n  }\n}\n\nexport function PlannerProgramExercise_progressionType(\n  exercise: IPlannerProgramExercise\n): IProgressionType | undefined {\n  const progress = exercise.progress;\n  if (!progress) {\n    return undefined;\n  }\n  const name = progress.type;\n  const state = PlannerProgramExercise_getState(exercise);\n  if (name === \"lp\") {\n    return {\n      type: \"linear\",\n      increase: state.increment as IWeight,\n      successesRequired: state.successes as number,\n      successesCounter: state.successCounter as number,\n      decrease: state.decrement as IWeight,\n      failuresRequired: state.failures as number,\n      failuresCounter: state.failureCounter as number,\n    };\n  } else if (name === \"dp\") {\n    return {\n      type: \"double\",\n      increase: state.increment as IWeight,\n      minReps: state.minReps as number,\n      maxReps: state.maxReps as number,\n    };\n  } else if (name === \"sum\") {\n    return {\n      type: \"sumreps\",\n      increase: state.increment as IWeight,\n      reps: state.reps as number,\n    };\n  } else if (name === \"custom\") {\n    return { type: \"custom\" };\n  }\n  return undefined;\n}\n\nexport function PlannerProgramExercise_shortNameFromFullName(fullName: string, settings: ISettings): string {\n  const { name, equipment } = PlannerExerciseEvaluator.extractNameParts(fullName, settings.exercises);\n  const shortName = `${name}${equipment ? `, ${equipmentName(equipment)}` : \"\"}`;\n  return shortName;\n}\n\nexport function PlannerProgramExercise_createExerciseFromEntry(\n  entry: IHistoryEntry,\n  dayData: Required<IDayData>,\n  settings: ISettings,\n  index: number\n): IPlannerProgramExercise {\n  const exerciseType = entry.exercise;\n  const exercise = Exercise_get(exerciseType, settings.exercises);\n  const fullName = Exercise_fullName(exercise, settings);\n  const shortName = PlannerProgramExercise_shortNameFromFullName(fullName, settings);\n  const { name, equipment } = PlannerExerciseEvaluator.extractNameParts(fullName, settings.exercises);\n  const setVariations: IPlannerProgramExerciseSetVariation[] = [\n    {\n      isCurrent: false,\n      sets: entry.sets.map((set) => ({\n        repRange: {\n          numberOfSets: 1,\n          maxrep: set.completedReps ?? set.reps,\n          minrep: set.minReps,\n          isAmrap: !!set.isAmrap,\n          isQuickAddSet: false,\n        },\n        timer: set.timer,\n        setTimer: set.setTimer,\n        isOverflowSetTimer: set.isOverflowSetTimer,\n        auto: set.auto,\n        rpe: set.rpe,\n        logRpe: set.logRpe,\n        percentage: Weight_isPct(set.originalWeight) ? set.originalWeight.value : undefined,\n        weight: !Weight_isPct(set.originalWeight) ? (set.completedWeight ?? set.weight) : undefined,\n        askWeight: set.askWeight,\n      })),\n    },\n  ];\n  const groupedWarmupSets = CollectionUtils_compact(\n    ObjectUtils_values(\n      CollectionUtils_groupByExpr(entry.warmupSets, (set) => {\n        return `${set.completedReps ?? set.reps}-${(set.completedWeight ?? set.weight ?? { value: \"\" }).value}`;\n      })\n    )\n  );\n  const plannerExercise: IPlannerProgramExercise = {\n    id: UidFactory_generateUid(8),\n    key: PlannerKey_fromExerciseType(exercise),\n    fullName,\n    shortName,\n    dayData,\n    exerciseType,\n    repeat: [],\n    repeating: [],\n    exerciseIndex: index,\n    order: 0,\n    text: \"\",\n    tags: [],\n    superset: entry.superset != null ? { name: entry.superset } : undefined,\n    equipment,\n    name,\n    line: 1,\n    evaluatedSetVariations: [],\n    setVariations: setVariations,\n    exerciseVariations: [{ exerciseType, name, isCurrent: true }],\n    warmupSets: groupedWarmupSets.map((group) => ({\n      type: \"warmup\",\n      numberOfSets: group.length,\n      reps: group[0]?.completedReps ?? group[0]?.reps ?? 1,\n      weight: group[0]?.completedWeight ?? group[0]?.weight,\n    })),\n    descriptions: { values: [] },\n    globals: {},\n    points: {\n      fullName: { line: 1, offset: 0, from: 0, to: 0 },\n    },\n  };\n  const evaluatedSetVariations = PlannerProgramExercise_evaluateSetVariations(plannerExercise, setVariations);\n  plannerExercise.evaluatedSetVariations = evaluatedSetVariations;\n  return plannerExercise;\n}\n","import type { IGridSelectionTarget } from \"../../../components/editProgram/editProgramGrid/gridSelectionContext\";\nimport { Exercise_find, Exercise_findByName, IExercise } from \"../../../models/exercise\";\nimport { IPlannerProgramExercise, IPlannerSidePanelTab, IPlannerState } from \"./types\";\nimport { IPlannerEvalFullResult, IPlannerEvalResult } from \"../plannerExerciseEvaluator\";\nimport { IProgramGrid, ProgramGrid_dayDataAt, ProgramGrid_hasDay } from \"./programGrid\";\nimport { IEvaluatedProgram, Program_getProgramExerciseForKeyAndShortDayData } from \"../../../models/program\";\nimport { ISettings } from \"../../../types\";\nimport { CollectionUtils_findIndexReverse } from \"../../../utils/collection\";\nimport { PlannerMode_current } from \"./plannerMode\";\n\nexport interface IPlannerCursor {\n  weekIndex?: number;\n  dayIndex?: number;\n  exerciseLine?: number;\n  hasErrors?: boolean;\n}\n\nexport type IPlannerSidePanelEmptyReason = \"noCursor\" | \"hasErrors\" | \"outOfRange\" | \"noExercise\";\n\nexport type IPlannerSidePanelStats =\n  | { kind: \"week\"; weekIndex: number; evaluatedDays: IPlannerEvalResult[] }\n  | { kind: \"day\"; weekIndex: number; dayIndex: number; evaluatedDay: IPlannerEvalResult }\n  | { kind: \"exercise\"; weekIndex: number; dayIndex: number; exerciseLine: number }\n  | { kind: \"empty\"; reason: IPlannerSidePanelEmptyReason };\n\nexport function PlannerSidePanelStats_cursor(\n  state: IPlannerState,\n  fullEvaluation?: IPlannerEvalFullResult\n): IPlannerCursor {\n  const mode = PlannerMode_current(state.ui);\n  if (mode === \"full\") {\n    return cursorInFullText(state.fulltext?.currentLine, fullEvaluation);\n  }\n  const focused = state.ui.focusedExercise;\n  if (mode === \"grid\" || focused == null || focused.weekIndex !== state.ui.weekIndex) {\n    return { weekIndex: state.ui.weekIndex };\n  }\n  return { weekIndex: focused.weekIndex, dayIndex: focused.dayIndex, exerciseLine: focused.exerciseLine };\n}\n\nfunction cursorInFullText(\n  line: number | undefined,\n  fullEvaluation: IPlannerEvalFullResult | undefined\n): IPlannerCursor {\n  if (fullEvaluation != null && !fullEvaluation.success) {\n    return { hasErrors: true };\n  }\n  if (line == null || fullEvaluation == null) {\n    return {};\n  }\n  const weeks = fullEvaluation.data;\n  const weekIndex = CollectionUtils_findIndexReverse(weeks, (w) => w.line <= line);\n  if (weekIndex === -1) {\n    return {};\n  }\n  const days = weeks[weekIndex].days;\n  const dayIndex = CollectionUtils_findIndexReverse(days, (d) => d.line <= line);\n  if (dayIndex === -1) {\n    return { weekIndex };\n  }\n  const exercises = days[dayIndex].exercises;\n  const exerciseIndex = CollectionUtils_findIndexReverse(exercises, (e) => e.line <= line);\n  return { weekIndex, dayIndex, exerciseLine: exerciseIndex === -1 ? undefined : exercises[exerciseIndex].line };\n}\n\nexport function PlannerSidePanelStats_select(\n  tab: IPlannerSidePanelTab,\n  cursor: IPlannerCursor,\n  evaluatedWeeks: IPlannerEvalResult[][],\n  settings: ISettings\n): IPlannerSidePanelStats {\n  if (cursor.hasErrors) {\n    return { kind: \"empty\", reason: \"hasErrors\" };\n  }\n  const { weekIndex, dayIndex, exerciseLine } = cursor;\n  if (weekIndex == null) {\n    return { kind: \"empty\", reason: \"noCursor\" };\n  }\n  const evaluatedDays = evaluatedWeeks[weekIndex];\n  if (evaluatedDays == null) {\n    return { kind: \"empty\", reason: \"outOfRange\" };\n  }\n  if (tab === \"week\") {\n    return { kind: \"week\", weekIndex, evaluatedDays };\n  }\n  if (dayIndex == null) {\n    return { kind: \"empty\", reason: \"noCursor\" };\n  }\n  const evaluatedDay = evaluatedDays[dayIndex];\n  if (evaluatedDay == null) {\n    return { kind: \"empty\", reason: \"outOfRange\" };\n  }\n  if (!evaluatedDay.success) {\n    return { kind: \"empty\", reason: \"hasErrors\" };\n  }\n  if (tab === \"day\") {\n    return { kind: \"day\", weekIndex, dayIndex, evaluatedDay };\n  }\n  if (exerciseLine == null) {\n    return { kind: \"empty\", reason: \"noExercise\" };\n  }\n  if (PlannerSidePanelStats_findExercise(weekIndex, dayIndex, exerciseLine, evaluatedWeeks, settings) == null) {\n    return { kind: \"empty\", reason: \"noExercise\" };\n  }\n  return { kind: \"exercise\", weekIndex, dayIndex, exerciseLine };\n}\n\nexport function PlannerSidePanelStats_emptyMessage(\n  reason: IPlannerSidePanelEmptyReason,\n  tab: IPlannerSidePanelTab,\n  isReorder: boolean\n): string {\n  if (reason === \"hasErrors\") {\n    return \"Fix the errors to see the stats.\";\n  }\n  if (tab === \"exercise\" || reason === \"noExercise\") {\n    return isReorder ? \"Select one exercise to see its stats.\" : \"Put the cursor on an exercise to see its stats.\";\n  }\n  if (tab === \"day\") {\n    return isReorder ? \"Select one day to see its stats.\" : \"Put the cursor in a day to see its stats.\";\n  }\n  return \"Select a week to see its stats.\";\n}\n\nexport function PlannerSidePanelStats_findExercise(\n  weekIndex: number,\n  dayIndex: number,\n  exerciseLine: number,\n  evaluatedWeeks: IPlannerEvalResult[][],\n  settings: ISettings\n): { exercise: IExercise; evaluatedExercise: IPlannerProgramExercise } | undefined {\n  const evaluatedDay = evaluatedWeeks[weekIndex]?.[dayIndex];\n  if (evaluatedDay == null || !evaluatedDay.success) {\n    return undefined;\n  }\n  const evaluatedExercise = evaluatedDay.data.find((e) => e.line === exerciseLine);\n  if (!evaluatedExercise) {\n    return undefined;\n  }\n  const byName = Exercise_findByName(evaluatedExercise.name, settings.exercises);\n  if (!byName) {\n    return undefined;\n  }\n  const exercise = Exercise_find({ id: byName.id, equipment: evaluatedExercise.equipment }, settings.exercises);\n  return exercise ? { exercise, evaluatedExercise } : undefined;\n}\n\nexport function PlannerSidePanelStats_cursorFor(args: {\n  state: IPlannerState;\n  target?: IGridSelectionTarget;\n  grid?: IProgramGrid;\n  evaluatedProgram?: IEvaluatedProgram;\n  fullEvaluation?: IPlannerEvalFullResult;\n}): IPlannerCursor {\n  const { state, target, grid, evaluatedProgram } = args;\n  if (PlannerMode_current(state.ui) === \"grid\" && target != null && grid != null && evaluatedProgram != null) {\n    return PlannerSidePanelStats_cursorFromSelection(target, grid, evaluatedProgram);\n  }\n  return PlannerSidePanelStats_cursor(state, args.fullEvaluation);\n}\n\nexport function PlannerSidePanelStats_selectionKey(target: IGridSelectionTarget | undefined): string | undefined {\n  if (target == null) {\n    return undefined;\n  }\n  switch (target.kind) {\n    case \"week\":\n      return `week:${target.weekIndex}`;\n    case \"day\":\n      return `day:${target.rowIndexes.join(\",\")}`;\n    case \"exercises\":\n      return `exercises:${target.placements.map((p) => p.id).join(\",\")}`;\n  }\n}\n\nexport function PlannerSidePanelStats_forSelection(target: IGridSelectionTarget): IPlannerSidePanelTab | undefined {\n  switch (target.kind) {\n    case \"week\":\n      return \"week\";\n    case \"day\":\n      return target.rowIndexes.length === 1 ? \"day\" : undefined;\n    case \"exercises\":\n      return target.placements.length === 1 ? \"exercise\" : undefined;\n  }\n}\n\nexport function PlannerSidePanelStats_cursorFromSelection(\n  target: IGridSelectionTarget,\n  grid: IProgramGrid,\n  evaluatedProgram: IEvaluatedProgram\n): IPlannerCursor {\n  switch (target.kind) {\n    case \"week\":\n      return { weekIndex: target.weekIndex };\n    case \"day\": {\n      if (target.rowIndexes.length !== 1) {\n        return {};\n      }\n      const dayIndex = target.rowIndexes[0];\n      const row = grid.rows[dayIndex];\n      const weekIndex = grid.columns.findIndex((column) => row != null && ProgramGrid_hasDay(row, column.weekIndex));\n      return weekIndex === -1 ? {} : { weekIndex, dayIndex };\n    }\n    case \"exercises\": {\n      if (target.placements.length !== 1) {\n        return {};\n      }\n      const placement = target.placements[0];\n      const dayData = ProgramGrid_dayDataAt(grid, placement.rowIndex, placement.colStart);\n      const exercise = Program_getProgramExerciseForKeyAndShortDayData(evaluatedProgram, dayData, placement.key);\n      return { weekIndex: placement.colStart, dayIndex: placement.rowIndex, exerciseLine: exercise?.line };\n    }\n  }\n}\n","import type { IProgramState, IProgramStateMetadata } from \"../../../types\";\nimport { Weight_parse, Weight_buildPct } from \"../../../models/weight\";\nimport { MathUtils_roundFloat } from \"../../../utils/math\";\n\nexport function PlannerStateVars_fromArgs(\n  fnArgs: string[],\n  onError?: (message: string, value: string) => void\n): { state: IProgramState; stateMetadata: IProgramStateMetadata } {\n  const state: IProgramState = {};\n  const stateMetadata: IProgramStateMetadata = {};\n  for (const value of fnArgs) {\n    // eslint-disable-next-line prefer-const\n    let [fnArgKey, fnArgValStr] = value.split(\":\").map((v) => v.trim());\n    if (onError && (!fnArgKey || !fnArgValStr)) {\n      onError(`Invalid argument ${value}`, value);\n    }\n    if (fnArgKey.endsWith(\"+\")) {\n      fnArgKey = fnArgKey.replace(\"+\", \"\");\n      stateMetadata[fnArgKey] = { userPrompted: true };\n    } else {\n      stateMetadata[fnArgKey] = { userPrompted: false };\n    }\n    try {\n      const fnArgVal = fnArgValStr.match(/(lb|kg)/)\n        ? Weight_parse(fnArgValStr)\n        : fnArgValStr.match(/%/)\n          ? Weight_buildPct(parseFloat(fnArgValStr))\n          : MathUtils_roundFloat(parseFloat(fnArgValStr), 2);\n      state[fnArgKey] = fnArgVal ?? 0;\n    } catch (e) {\n      if (onError) {\n        onError(`Invalid argument ${value}`, value);\n      } else {\n        throw e;\n      }\n    }\n  }\n  return { state, stateMetadata };\n}\n","import {\n  IExercise,\n  Exercise_findByNameAndEquipment,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroupMultipliers,\n  Exercise_synergistMusclesGroups,\n  Exercise_getIsUnilateral,\n} from \"../../../models/exercise\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseRepRange, ISetResults, ISetSplit } from \"./types\";\nimport { IPlannerEvalResult } from \"../plannerExerciseEvaluator\";\nimport { IScreenMuscle, ISettings } from \"../../../types\";\nimport { PlannerProgramExercise_sets } from \"./plannerProgramExercise\";\nimport { Weight_build } from \"../../../models/weight\";\nimport { Muscle_getAvailableMuscleGroups } from \"../../../models/muscle\";\nimport { IWorkoutTimeEstimateSet, WorkoutTimeEstimate_dayMs } from \"../../../models/workoutTimeEstimate\";\n\ntype IResultsSetSplit = Omit<ISetResults, \"total\" | \"strength\" | \"hypertrophy\" | \"muscleGroup\" | \"volume\">;\n\nexport function PlannerStatsUtils_dayApproxTimeMs(\n  exercises: IPlannerProgramExercise[],\n  restTimer: number,\n  settings: ISettings\n): number {\n  const estimateExercises = exercises\n    .filter((e) => !e.notused)\n    .map((e) => ({\n      superset: e.superset?.name,\n      isUnilateral: e.exerciseType != null && Exercise_getIsUnilateral(e.exerciseType, settings),\n      sets: PlannerProgramExercise_sets(e).flatMap((set) => {\n        const { repRange, timer, setTimer, auto } = set;\n        return repRange\n          ? Array<IWorkoutTimeEstimateSet>(repRange.numberOfSets).fill({ reps: repRange.maxrep, timer, setTimer, auto })\n          : [];\n      }),\n    }));\n  return WorkoutTimeEstimate_dayMs(estimateExercises, {\n    rest: restTimer,\n    superset: settings.timers.superset ?? undefined,\n  });\n}\n\nexport interface IPlannerDaysSummary {\n  days: number;\n  exercisesPerDay: number;\n  approxTimeMs: number;\n}\n\nexport function PlannerStatsUtils_summary(\n  evaluatedDays: IPlannerEvalResult[],\n  settings: ISettings\n): IPlannerDaysSummary {\n  const validDays = evaluatedDays.flatMap((day) => (day.success ? [day.data] : []));\n  if (validDays.length === 0) {\n    return { days: evaluatedDays.length, exercisesPerDay: 0, approxTimeMs: 0 };\n  }\n  const restTimer = settings.timers.workout ?? 180;\n  let exercises = 0;\n  let timeMs = 0;\n  for (const day of validDays) {\n    exercises += day.filter((e) => !e.notused).length;\n    timeMs += PlannerStatsUtils_dayApproxTimeMs(day, restTimer, settings);\n  }\n  return {\n    days: evaluatedDays.length,\n    exercisesPerDay: Math.round(exercises / validDays.length),\n    approxTimeMs: timeMs / validDays.length,\n  };\n}\n\nexport function PlannerStatsUtils_programSummary(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  settings: ISettings\n): IPlannerDaysSummary & { daysPerWeek: number } {\n  const allDays = evaluatedWeeks.flat();\n  const daysPerWeek = evaluatedWeeks.reduce((max, week) => Math.max(max, week.length), 0);\n  return { ...PlannerStatsUtils_summary(allDays, settings), daysPerWeek };\n}\n\nexport function PlannerStatsUtils_formatDuration(ms: number): string {\n  const totalMinutes = Math.round(ms / 60000);\n  const hours = Math.floor(totalMinutes / 60);\n  const minutes = totalMinutes % 60;\n  if (hours === 0) {\n    return `${minutes}m`;\n  }\n  return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}m`;\n}\n\nexport function PlannerStatsUtils_calculateSetResults(\n  evaluatedDays: IPlannerEvalResult[],\n  settings: ISettings\n): ISetResults {\n  const results: ISetResults = {\n    volume: Weight_build(0, settings.units),\n    total: 0,\n    strength: 0,\n    hypertrophy: 0,\n    upper: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    lower: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    core: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    push: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    pull: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    legs: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    muscleGroup: {},\n  };\n\n  for (const muscleGroup of Muscle_getAvailableMuscleGroups(settings)) {\n    results.muscleGroup[muscleGroup] = results.muscleGroup[muscleGroup] || {\n      strength: 0,\n      hypertrophy: 0,\n      frequency: {},\n      exercises: [],\n    };\n  }\n\n  for (let dayIndex = 0; dayIndex < evaluatedDays.length; dayIndex += 1) {\n    const day = evaluatedDays[dayIndex];\n    if (!day.success) {\n      continue;\n    }\n    for (const plannerExercise of day.data) {\n      if (plannerExercise.notused) {\n        continue;\n      }\n      const exercise = Exercise_findByNameAndEquipment(plannerExercise.shortName, settings.exercises);\n      if (exercise == null) {\n        continue;\n      }\n      for (const set of PlannerProgramExercise_sets(plannerExercise)) {\n        const repRange = set.repRange;\n        if (repRange != null) {\n          results.total += repRange.numberOfSets;\n          if ((repRange.maxrep ?? 0) < 8) {\n            results.strength += repRange.numberOfSets;\n          } else {\n            results.hypertrophy += repRange.numberOfSets;\n          }\n          if (exercise.types.indexOf(\"core\") !== -1) {\n            add(results, \"core\", repRange, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"push\") !== -1) {\n            add(results, \"push\", repRange, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"pull\") !== -1) {\n            add(results, \"pull\", repRange, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"legs\") !== -1) {\n            add(results, \"legs\", repRange, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"upper\") !== -1) {\n            add(results, \"upper\", repRange, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"lower\") !== -1) {\n            add(results, \"lower\", repRange, dayIndex, exercise);\n          }\n          const targetMuscleGroups = Exercise_targetMusclesGroups(exercise, settings);\n          const synergistMusclesGroupMultipliers = Exercise_synergistMusclesGroupMultipliers(exercise, settings);\n          for (const muscle of targetMuscleGroups) {\n            const synergistMultiplier =\n              synergistMusclesGroupMultipliers[muscle] ?? settings.planner.synergistMultiplier;\n            addMuscleGroup(results.muscleGroup, muscle, repRange, dayIndex, true, synergistMultiplier, exercise);\n          }\n          for (const muscle of Exercise_synergistMusclesGroups(exercise, settings)) {\n            if (targetMuscleGroups.indexOf(muscle) === -1) {\n              const synergistMultiplier =\n                synergistMusclesGroupMultipliers[muscle] ?? settings.planner.synergistMultiplier;\n              addMuscleGroup(results.muscleGroup, muscle, repRange, dayIndex, false, synergistMultiplier, exercise);\n            }\n          }\n        }\n      }\n    }\n  }\n  return results;\n}\n\nexport function PlannerStatsUtils_setResultsToString(results: ISetResults): string {\n  const lines: string[] = [];\n\n  lines.push(`Total Weekly Volume: ${results.total} sets`);\n  lines.push(`- Strength Sets (<8 reps): ${results.strength} sets`);\n  lines.push(`- Hypertrophy Sets (≥8 reps): ${results.hypertrophy} sets`);\n  lines.push(\"\");\n\n  lines.push(\"Movement Patterns:\");\n  if (results.upper.strength > 0 || results.upper.hypertrophy > 0) {\n    lines.push(\n      `- Upper Body: ${results.upper.strength + results.upper.hypertrophy} sets (${results.upper.strength} strength, ${results.upper.hypertrophy} hypertrophy)`\n    );\n  }\n  if (results.lower.strength > 0 || results.lower.hypertrophy > 0) {\n    lines.push(\n      `- Lower Body: ${results.lower.strength + results.lower.hypertrophy} sets (${results.lower.strength} strength, ${results.lower.hypertrophy} hypertrophy)`\n    );\n  }\n  if (results.push.strength > 0 || results.push.hypertrophy > 0) {\n    lines.push(\n      `- Push: ${results.push.strength + results.push.hypertrophy} sets (${results.push.strength} strength, ${results.push.hypertrophy} hypertrophy)`\n    );\n  }\n  if (results.pull.strength > 0 || results.pull.hypertrophy > 0) {\n    lines.push(\n      `- Pull: ${results.pull.strength + results.pull.hypertrophy} sets (${results.pull.strength} strength, ${results.pull.hypertrophy} hypertrophy)`\n    );\n  }\n  if (results.legs.strength > 0 || results.legs.hypertrophy > 0) {\n    lines.push(\n      `- Legs: ${results.legs.strength + results.legs.hypertrophy} sets (${results.legs.strength} strength, ${results.legs.hypertrophy} hypertrophy)`\n    );\n  }\n  if (results.core.strength > 0 || results.core.hypertrophy > 0) {\n    lines.push(\n      `- Core: ${results.core.strength + results.core.hypertrophy} sets (${results.core.strength} strength, ${results.core.hypertrophy} hypertrophy)`\n    );\n  }\n  lines.push(\"\");\n\n  lines.push(\"Muscle Groups (Weekly Sets):\");\n  const muscleGroups = Object.entries(results.muscleGroup)\n    .filter(([_, stats]) => stats.strength > 0 || stats.hypertrophy > 0)\n    .sort((a, b) => {\n      const totalA = a[1].strength + a[1].hypertrophy;\n      const totalB = b[1].strength + b[1].hypertrophy;\n      return totalB - totalA;\n    });\n\n  for (const [muscle, stats] of muscleGroups) {\n    const total = stats.strength + stats.hypertrophy;\n    const capitalizedMuscle = muscle.charAt(0).toUpperCase() + muscle.slice(1);\n    const frequencyDays = Object.keys(stats.frequency).length;\n\n    lines.push(\n      `- ${capitalizedMuscle}: ${total.toFixed(1)} sets (${stats.strength.toFixed(1)} strength, ${stats.hypertrophy.toFixed(1)} hypertrophy) - ${frequencyDays}x/week`\n    );\n\n    const exercises = stats.exercises\n      .filter((ex) => ex.strengthSets > 0 || ex.hypertrophySets > 0)\n      .sort((a, b) => {\n        const totalA = a.strengthSets + a.hypertrophySets;\n        const totalB = b.strengthSets + b.hypertrophySets;\n        return totalB - totalA;\n      });\n\n    if (exercises.length > 0) {\n      for (const ex of exercises) {\n        const totalSets = ex.strengthSets + ex.hypertrophySets;\n        const synergistNote = ex.isSynergist ? \" (synergist)\" : \"\";\n        lines.push(`  • ${ex.exerciseName}: ${totalSets.toFixed(1)} sets${synergistNote}`);\n      }\n    }\n  }\n\n  return lines.join(\"\\n\");\n}\n\nfunction add(\n  results: IResultsSetSplit,\n  key: keyof IResultsSetSplit,\n  repRange: IPlannerProgramExerciseRepRange,\n  dayIndex: number,\n  exercise: IExercise\n): void {\n  let isStrength = false;\n  if ((repRange.maxrep ?? 0) < 8) {\n    isStrength = true;\n    results[key].strength += repRange.numberOfSets;\n  } else {\n    results[key].hypertrophy += repRange.numberOfSets;\n  }\n  results[key].frequency[dayIndex] = true;\n  if (results[key].exercises.every((e) => e.exerciseName !== exercise.name)) {\n    results[key].exercises.push({\n      exerciseName: exercise.name,\n      dayIndex: dayIndex,\n      isSynergist: false,\n      strengthSets: 0,\n      hypertrophySets: 0,\n    });\n  }\n  const ex = results[key].exercises.find((e) => e.exerciseName === exercise.name);\n  if (ex) {\n    if (isStrength) {\n      ex.strengthSets += repRange.numberOfSets;\n    } else {\n      ex.hypertrophySets += repRange.numberOfSets;\n    }\n  }\n}\n\nfunction addMuscleGroup(\n  results: { [k in IScreenMuscle]: ISetSplit },\n  key: IScreenMuscle,\n  repRange: IPlannerProgramExerciseRepRange,\n  dayIndex: number,\n  isTarget: boolean,\n  synergistMultiplier: number,\n  exercise: IExercise\n): void {\n  synergistMultiplier = synergistMultiplier ?? 0.5;\n  let isStrength = false;\n  results[key] = results[key] || { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] };\n  if ((repRange.maxrep ?? 0) < 8) {\n    isStrength = true;\n    results[key].strength += isTarget ? repRange.numberOfSets : repRange.numberOfSets * synergistMultiplier;\n  } else {\n    results[key].hypertrophy += isTarget ? repRange.numberOfSets : repRange.numberOfSets * synergistMultiplier;\n  }\n  results[key].frequency[dayIndex] = true;\n  if (results[key].exercises.every((e) => e.exerciseName !== exercise.name)) {\n    results[key].exercises.push({\n      exerciseName: exercise.name,\n      dayIndex: dayIndex,\n      isSynergist: !isTarget,\n      strengthSets: 0,\n      hypertrophySets: 0,\n    });\n  }\n  const ex = results[key].exercises.find((e) => e.exerciseName === exercise.name);\n  if (ex) {\n    if (isStrength) {\n      ex.strengthSets += isTarget ? repRange.numberOfSets : repRange.numberOfSets * synergistMultiplier;\n    } else {\n      ex.hypertrophySets += isTarget ? repRange.numberOfSets : repRange.numberOfSets * synergistMultiplier;\n    }\n  }\n}\n","import { SyntaxNode } from \"@lezer/common\";\nimport { IDayData, IPlannerProgram, ISettings } from \"../../../types\";\nimport { ObjectUtils_clone } from \"../../../utils/object\";\nimport { CollectionUtils_sortBy } from \"../../../utils/collection\";\nimport { IEither } from \"../../../utils/types\";\nimport { StringUtils_nextName } from \"../../../utils/string\";\nimport { parser as plannerExerciseParser } from \"../plannerExerciseParser\";\nimport { PlannerNodeName } from \"../plannerExerciseStyles\";\nimport { PlannerProgram_evaluate } from \"./plannerProgram\";\nimport type { PlannerSyntaxError } from \"../plannerExerciseEvaluator\";\nimport { PlannerKey_fromFullName } from \"../plannerKey\";\nimport { PlannerDocument_blockSpans } from \"./plannerDocument\";\nimport {\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_getUpdateScript,\n} from \"./plannerProgramExercise\";\nimport { IPlannerProgramExercise } from \"./types\";\nimport { StringUtils_unindent } from \"../../../utils/string\";\n\n// Every edit that changes *where things are* in a program: which weeks exist and in what order,\n// which day slots exist, and which exercises sit in which day. Not what an exercise says — that is\n// the per-exercise editors' half of the split, and this module never touches a set, a weight or a\n// progression.\n//\n// It is named for the job rather than for the grid, because the job outlives the feature. The grid\n// is the surface that offers these operations today (plans/20260722-liftoscript-first-editor.md\n// deliberately keeps cross-week structure there, and puts per-exercise content in the text editor),\n// but the rules here are the language's, not the grid's: a repeat covers one contiguous run of\n// weeks, a day slot means the same thing in every week, `[2]` means \"day 2 of my week\" while\n// `[1:2]` means \"day 2 of week 1\". Anything that ever rearranges a program has to obey them.\n//\n// Every edit takes a planner and returns either a new one or a sentence saying why not. None of\n// them evaluates its way to an answer and prints the program back out — they splice the text the\n// author wrote, so everything they did not edit stays exactly as it was.\n\nfunction children(node: SyntaxNode): SyntaxNode[] {\n  const cursor = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cursor.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cursor.node);\n  } while (cursor.nextSibling());\n  return result;\n}\n\n// The forced order shares the repeat's bracket (`Squat[3,1-4]` is order 3 repeating weeks 1-4), so\n// rewriting the range has to carry any order along with it.\nfunction orderOf(repeatNode: SyntaxNode, text: string): number | undefined {\n  for (const child of children(repeatNode)) {\n    if (child.type.name === PlannerNodeName.Rep) {\n      return parseInt(text.slice(child.from, child.to), 10);\n    }\n  }\n  return undefined;\n}\n\ninterface IExerciseLine {\n  variationsEnd: number;\n  repeatNode?: SyntaxNode;\n}\n\nfunction findExerciseLine(text: string, fullName: string): IExerciseLine | undefined {\n  const tree = plannerExerciseParser.parse(text);\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.ExerciseExpression) {\n      continue;\n    }\n    const variations = node.getChild(PlannerNodeName.ExerciseVariations);\n    if (variations == null || text.slice(variations.from, variations.to).trim() !== fullName) {\n      continue;\n    }\n    return {\n      variationsEnd: variations.to,\n      repeatNode: node.getChild(PlannerNodeName.Repeat) ?? undefined,\n    };\n  }\n  return undefined;\n}\n\n// The failure side carries a sentence, not a code: the UI shows it verbatim, so a refusal can say\n// which exercise stands in the way rather than just refusing.\n//\n// `warnings` is the other half of that: an edit that went through but had to change something the\n// user didn't ask it to change says so, rather than leaving them to notice later. A refusal has\n// none — it changed nothing.\nexport type IPlannerStructureResult = IEither<IPlannerProgram, string> & { warnings?: string[] };\n\nfunction withWarnings(result: IPlannerStructureResult, warnings: string[]): IPlannerStructureResult {\n  return result.success && warnings.length > 0 ? { ...result, warnings } : result;\n}\n\n// Only `from`/`to` are ever read, so a parser node and a span found by hand in a comment both fit.\ninterface ITextSpan {\n  from: number;\n  to: number;\n}\n\ninterface IDayReference {\n  node: ITextSpan;\n  day: number;\n  hasWeek: boolean;\n  // Which week's day numbering this points into. Absent means \"the week I am written in\" — and the\n  // difference matters, because a week that lacks a row is not renumbered the same as one that has\n  // it, so a day number only means something relative to a particular week.\n  week?: number;\n  // What it reuses, and where that name is written. A renumbering only needs the day, but an edit\n  // that moves one *exercise* has to tell references to it apart from references to its neighbours\n  // in the same day — and relabelling it has to rewrite the name here too, or the reuse keeps\n  // naming an exercise that no longer goes by that.\n  fullName: string;\n  nameNode: ITextSpan;\n}\n\n// `...main[2]` reuses day 2 of this week; `...main[1:2]` reuses week 1 day 2. Both address a day by\n// its slot, so both move when a day row is removed.\nfunction dayReferences(text: string): IDayReference[] {\n  const tree = plannerExerciseParser.parse(text);\n  const result: IDayReference[] = [];\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.ExerciseExpression) {\n      continue;\n    }\n    for (const section of node.getChildren(PlannerNodeName.ExerciseSection)) {\n      const reuse = section.getChild(PlannerNodeName.ReuseSectionWithWeekDay);\n      const weekDay = reuse?.getChild(PlannerNodeName.WeekDay);\n      const nameNode = reuse?.getChild(PlannerNodeName.ReuseSection)?.getChild(PlannerNodeName.ExerciseName);\n      if (weekDay == null || nameNode == null) {\n        continue;\n      }\n      const parts = weekDay.getChildren(PlannerNodeName.WeekOrDay);\n      const dayNode = parts[parts.length - 1];\n      if (dayNode == null) {\n        continue;\n      }\n      const day = parseInt(text.slice(dayNode.from, dayNode.to), 10);\n      const week = parts.length > 1 ? parseInt(text.slice(parts[0].from, parts[0].to), 10) : undefined;\n      if (!isNaN(day)) {\n        result.push({\n          node: dayNode,\n          day,\n          hasWeek: parts.length > 1,\n          week: week != null && !isNaN(week) ? week : undefined,\n          fullName: text.slice(nameNode.from, nameNode.to).trim(),\n          nameNode,\n        });\n      }\n    }\n  }\n  return [...result, ...commentReferences(text).days];\n}\n\n// `// ...Squat[1:2]` reuses another exercise's *description* (llms/liftoscript.md). It lives in a\n// comment, so the parser hands it back as one opaque LineComment and the coordinates inside have no\n// structure — they have to be found by hand. Miss them and a day or week move renumbers every\n// exercise reuse while silently leaving these pointing at whatever now occupies the old slot, with\n// no evaluation error for refuseIfWorse to catch.\nfunction commentReferences(text: string): { days: IDayReference[]; weeks: IWeekReference[] } {\n  const tree = plannerExerciseParser.parse(text);\n  const days: IDayReference[] = [];\n  const weeks: IWeekReference[] = [];\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.LineComment) {\n      continue;\n    }\n    const comment = text.slice(node.from, node.to);\n    // Lezer hands us the comment's extent and nothing inside it — the grammar is\n    // `LineComment { \"//\" ![\\n]* linebreakOrEof }`, one opaque token — so whether this is a reuse\n    // directive can only be decided by doing to it exactly what the evaluator does, in the same\n    // order, with the same helper: strip the `//`, strip a leading `!` (the current-description\n    // marker), unindent, and ask whether what is left starts with `...`. A pattern of our own here\n    // is a second definition of the same thing, and the two drift — an earlier version required the\n    // `...` immediately after the `//` and silently stopped renumbering every `// !...` directive.\n    const value = StringUtils_unindent(comment.replace(/^\\/\\//, \"\").replace(/^\\s*!/, \"\"));\n    if (!value.startsWith(\"...\")) {\n      continue;\n    }\n    // Which bracket is the qualifier is decided with the evaluator's own pattern — greedy, so it\n    // runs to the *last* `]` — rather than by scanning for the nearest one. Same reason as above: a\n    // second rule for reading the same directive is a rule that drifts, and this one drifting means\n    // renumbering one bracket while the evaluator resolves another.\n    //\n    // Known and accepted: a directive with a *second* bracket after the qualifier — `// ...Squat[1:2]\n    // [cue]` — is read wrong, because the greedy match swallows both and the day span computed from\n    // it covers the trailing prose. Renumbering that comment then deletes the prose, or (if the\n    // second bracket holds a colon) parses the day as NaN and skips the reference, leaving it stale.\n    // Deliberate: matching the evaluator matters more than a shape nobody writes, and diverging here\n    // to fix it is how the two rules drift apart again. Bound the span, don't re-scan, if it ever\n    // does need fixing.\n    const dots = comment.indexOf(\"...\");\n    const directive = comment.slice(dots + 3);\n    const bracket = /\\[([^]+)\\]/.exec(directive);\n    if (bracket == null) {\n      continue;\n    }\n    // The name is whatever precedes the qualifier — an exercise name can't hold a bracket, since\n    // `NonSeparator` excludes both. Measured rather than trimmed out of the string, because a\n    // relabel splices back into these coordinates.\n    const rawName = directive.slice(0, bracket.index);\n    const nameFrom = node.from + dots + 3 + (rawName.length - rawName.trimStart().length);\n    const fullName = rawName.trim();\n    const nameNode = { from: nameFrom, to: nameFrom + fullName.length };\n    {\n      const inner = bracket[1];\n      const innerStart = node.from + dots + 3 + bracket.index + 1;\n      let offset = 0;\n      const spans = inner.split(\":\").map((part) => {\n        const span = { from: innerStart + offset, to: innerStart + offset + part.length, value: part };\n        offset += part.length + 1;\n        return span;\n      });\n      const daySpan = spans[spans.length - 1];\n      const day = parseInt(daySpan.value, 10);\n      if (!isNaN(day)) {\n        const commentWeek = spans.length > 1 ? parseInt(spans[0].value, 10) : undefined;\n        days.push({\n          node: daySpan,\n          day,\n          hasWeek: spans.length > 1,\n          week: commentWeek != null && !isNaN(commentWeek) ? commentWeek : undefined,\n          fullName,\n          nameNode,\n        });\n      }\n      if (spans.length > 1) {\n        const week = parseInt(spans[0].value, 10);\n        if (!isNaN(week)) {\n          weeks.push({ node: spans[0], week, fullName });\n        }\n      }\n    }\n  }\n  return { days, weeks };\n}\n\ninterface IWeekReference {\n  node: ITextSpan;\n  week: number;\n  fullName: string;\n}\n\n// Only the qualifiers that name a week: `...main[1:2]` does, `...main[2]` doesn't — the latter\n// means \"day 2 of whatever week I'm in\", which survives any renumbering of the weeks.\nfunction weekReferences(text: string): IWeekReference[] {\n  const tree = plannerExerciseParser.parse(text);\n  const result: IWeekReference[] = [];\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.ExerciseExpression) {\n      continue;\n    }\n    for (const section of node.getChildren(PlannerNodeName.ExerciseSection)) {\n      const reuse = section.getChild(PlannerNodeName.ReuseSectionWithWeekDay);\n      const weekDay = reuse?.getChild(PlannerNodeName.WeekDay);\n      const nameNode = reuse?.getChild(PlannerNodeName.ReuseSection)?.getChild(PlannerNodeName.ExerciseName);\n      const parts = weekDay?.getChildren(PlannerNodeName.WeekOrDay) ?? [];\n      if (parts.length < 2 || nameNode == null) {\n        continue;\n      }\n      const week = parseInt(text.slice(parts[0].from, parts[0].to), 10);\n      if (!isNaN(week)) {\n        result.push({ node: parts[0], week, fullName: text.slice(nameNode.from, nameNode.to).trim() });\n      }\n    }\n  }\n  return [...result, ...commentReferences(text).weeks];\n}\n\ninterface IRepeatToken {\n  fullName: string;\n  node: SyntaxNode;\n  order?: number;\n  // 1-based and inclusive, straight off the `[from-to]` in the text.\n  range?: [number, number];\n}\n\nfunction exerciseRepeats(text: string): IRepeatToken[] {\n  const tree = plannerExerciseParser.parse(text);\n  const result: IRepeatToken[] = [];\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.ExerciseExpression) {\n      continue;\n    }\n    const variations = node.getChild(PlannerNodeName.ExerciseVariations);\n    const repeat = node.getChild(PlannerNodeName.Repeat);\n    if (variations == null || repeat == null) {\n      continue;\n    }\n    const rangeNode = repeat.getChild(PlannerNodeName.RepRange);\n    const reps = rangeNode != null ? children(rangeNode).filter((c) => c.type.name === PlannerNodeName.Rep) : [];\n    result.push({\n      fullName: text.slice(variations.from, variations.to).trim(),\n      node: repeat,\n      order: orderOf(repeat, text),\n      range:\n        reps.length === 2\n          ? [parseInt(text.slice(reps[0].from, reps[0].to), 10), parseInt(text.slice(reps[1].from, reps[1].to), 10)]\n          : undefined,\n    });\n  }\n  return result;\n}\n\n// Where a line's forced order lives, for every line in a day — including the ones that carry no\n// bracket at all, since a number may need writing there. That is what separates this from\n// exerciseRepeats: that one answers \"what does this line repeat\", and skips a line with no `[...]`\n// because there is nothing to answer; this one answers \"where would this line's number go\", and\n// every line has an answer.\ninterface IOrderSlot {\n  fullName: string;\n  // The bracket where there is one, and the empty span just past the exercise name where there\n  // isn't — so writing a token is the same splice either way.\n  span: ITextSpan;\n  order?: number;\n  // 1-based and inclusive, straight off the `[from-to]`, and carried through any rewrite verbatim.\n  range?: [number, number];\n}\n\nfunction exerciseOrderSlots(text: string): IOrderSlot[] {\n  const tree = plannerExerciseParser.parse(text);\n  const result: IOrderSlot[] = [];\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.ExerciseExpression) {\n      continue;\n    }\n    const variations = node.getChild(PlannerNodeName.ExerciseVariations);\n    if (variations == null) {\n      continue;\n    }\n    const repeat = node.getChild(PlannerNodeName.Repeat);\n    const rangeNode = repeat?.getChild(PlannerNodeName.RepRange);\n    const reps = rangeNode != null ? children(rangeNode).filter((c) => c.type.name === PlannerNodeName.Rep) : [];\n    const order = repeat != null ? orderOf(repeat, text) : undefined;\n    result.push({\n      fullName: text.slice(variations.from, variations.to).trim(),\n      span: repeat != null ? { from: repeat.from, to: repeat.to } : { from: variations.to, to: variations.to },\n      order: order === 0 ? undefined : order,\n      range:\n        reps.length === 2\n          ? [parseInt(text.slice(reps[0].from, reps[0].to), 10), parseInt(text.slice(reps[1].from, reps[1].to), 10)]\n          : undefined,\n    });\n  }\n  return result;\n}\n\nfunction repeatToken(\n  order: number | undefined,\n  range: [number, number] | undefined,\n  keepSingleWeek: boolean = false\n): string {\n  const parts: string[] = [];\n  if (order != null && order !== 0) {\n    parts.push(`${order}`);\n  }\n  if (range != null && (range[1] > range[0] || keepSingleWeek)) {\n    parts.push(`${range[0]}-${range[1]}`);\n  }\n  return parts.length > 0 ? `[${parts.join(\",\")}]` : \"\";\n}\n\n// Rewrites every week number in one day's text to where that week is going. `newForOld` maps a\n// 0-based week index to its new one, or to undefined for a week being removed.\n//\n// A repeat is the hard part: it names one *contiguous* range of weeks and the grammar has no way to\n// say anything else (`getRepeat` stops at the first range, and the printer breaks a run at its first\n// gap). So a permutation that scatters the weeks an exercise repeats over cannot be written down at\n// all, and this refuses rather than writing a range that means something else.\n// `newWeekOfText` is the week this text will live in once the reorder lands. A repeat that shrinks\n// to a single week can only drop its range when that week is this one: a definition prescribes its\n// own week as well as its range, so `Squat[1-1]` written in week 3 means weeks 1 *and* 3, and\n// rewriting it to plain `Squat` would quietly move it to week 3 alone.\nfunction rewriteWeekNumbersInDay(\n  text: string,\n  newForOld: Map<number, number | undefined>,\n  newWeekOfText: number,\n  // Where this text lives, for the refusals below. They are the only messages in this module that\n  // can't name a place from the program they were handed, because all this one has is the text.\n  where: string\n): IDayRewrite {\n  const edits: { from: number; to: number; text: string }[] = [];\n  for (const repeat of exerciseRepeats(text)) {\n    if (repeat.range == null) {\n      continue;\n    }\n    const moved: number[] = [];\n    for (let week = repeat.range[0]; week <= repeat.range[1]; week += 1) {\n      const next = newForOld.get(week - 1);\n      if (next != null) {\n        moved.push(next);\n      }\n    }\n    moved.sort((a, b) => a - b);\n    if (moved.length === 0) {\n      // Every week it claimed is gone. Leaving the range alone would leave it claiming whichever\n      // weeks now hold those numbers — weeks that never had this exercise. What survives is the\n      // line itself, which prescribes the week it is written in, so drop the range.\n      edits.push({ from: repeat.node.from, to: repeat.node.to, text: repeatToken(repeat.order, undefined) });\n      continue;\n    }\n    if (moved[moved.length - 1] - moved[0] !== moved.length - 1) {\n      return {\n        success: false,\n        error: `${repeat.fullName} in ${where} repeats over weeks that would no longer be next to each other. A repeat can only cover a run of weeks in a row.`,\n      };\n    }\n    const first = moved[0];\n    const last = moved[moved.length - 1];\n    edits.push({\n      from: repeat.node.from,\n      to: repeat.node.to,\n      text: repeatToken(repeat.order, [first + 1, last + 1], first === last && first !== newWeekOfText),\n    });\n  }\n  for (const reference of weekReferences(text)) {\n    const next = newForOld.get(reference.week - 1);\n    if (next == null) {\n      return {\n        success: false,\n        error: `${where} reuses ${reference.fullName} from week ${reference.week}, which is being removed. Point it at another week first.`,\n      };\n    }\n    edits.push({ from: reference.node.from, to: reference.node.to, text: `${next + 1}` });\n  }\n  // Back to front so earlier edits don't move later offsets.\n  let result = text;\n  for (const edit of edits.sort((a, b) => b.from - a.from)) {\n    result = `${result.slice(0, edit.from)}${edit.text}${result.slice(edit.to)}`;\n  }\n  return { success: true, data: result };\n}\n\ntype IDayRewrite = IEither<string, string>;\n\n// Permutes the weeks and rewrites everything that addressed them by number. `oldOrder[newIndex]` is\n// the week that ends up there; a week left out of it is being deleted.\nfunction reorderWeeks(planner: IPlannerProgram, oldOrder: number[], settings: ISettings): IPlannerStructureResult {\n  const newForOld = new Map<number, number | undefined>();\n  planner.weeks.forEach((_week, oldIndex) => newForOld.set(oldIndex, undefined));\n  oldOrder.forEach((oldIndex, newIndex) => newForOld.set(oldIndex, newIndex));\n\n  const result = ObjectUtils_clone(planner);\n  for (const oldIndex of oldOrder) {\n    const newIndex = newForOld.get(oldIndex);\n    const week = result.weeks[oldIndex];\n    for (const day of week?.days ?? []) {\n      const rewritten = rewriteWeekNumbersInDay(\n        day.exerciseText,\n        newForOld,\n        newIndex ?? -1,\n        `${week.name}, ${day.name}`\n      );\n      if (!rewritten.success) {\n        return { success: false, error: rewritten.error };\n      }\n      day.exerciseText = rewritten.data;\n    }\n  }\n  // A name belongs to its week and travels with it, even when that leaves them out of order. The\n  // name is what tells you the week moved at all — renumbering them back to 1, 2, 3 makes a\n  // successful reorder look like nothing happened, since only the contents appear to shift.\n  result.weeks = oldOrder.map((oldIndex) => result.weeks[oldIndex]).filter((week) => week != null);\n  return refuseIfWorse(planner, result, settings);\n}\n\n// Moves a week. Unlike a day row, this is not a renumbering that always works: every repeat is a\n// range of week numbers, so moving a week can scatter the weeks an exercise repeats over into\n// something the language cannot express, and then this refuses.\nexport function PlannerStructure_moveWeek(\n  planner: IPlannerProgram,\n  fromIndex: number,\n  toIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const count = planner.weeks.length;\n  if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= count || toIndex >= count) {\n    return { success: true, data: planner };\n  }\n  const oldOrder = Array.from({ length: count }, (_, i) => i);\n  oldOrder.splice(toIndex, 0, ...oldOrder.splice(fromIndex, 1));\n  return reorderWeeks(planner, oldOrder, settings);\n}\n\n// Deletes a week. An exercise whose definition lives in this week but whose run carries on past it\n// would take the rest of the run with it, so its line moves to the first week of the run that\n// survives — the range says where an exercise appears, not the week its text happens to sit in, so\n// relocating the line changes nothing about the program.\nexport function PlannerStructure_deleteWeek(\n  planner: IPlannerProgram,\n  weekIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  if (planner.weeks.length <= 1) {\n    return { success: false, error: \"A program needs at least one week.\" };\n  }\n  const relocated = ObjectUtils_clone(planner);\n  const doomed = relocated.weeks[weekIndex];\n  if (doomed == null) {\n    return { success: true, data: planner };\n  }\n  doomed.days.forEach((day, dayIndex) => {\n    const { blocks } = exerciseBlocks(day.exerciseText);\n    const repeats = exerciseRepeats(day.exerciseText);\n    for (const block of blocks) {\n      const repeat = repeats.find((r) => sameExercise(r.fullName, block.fullName, settings));\n      const range = repeat?.range;\n      // A week that already says something about this exercise has its own definition — an\n      // override — and that one stays. Keep looking rather than giving up: a later week in the\n      // range may still be inheriting, and abandoning here drops the exercise from every week\n      // after the override.\n      const nextWeek =\n        range != null\n          ? Array.from({ length: range[1] - range[0] + 1 }, (_, i) => range[0] - 1 + i).find((week) => {\n              const candidate = week !== weekIndex ? relocated.weeks[week]?.days[dayIndex] : undefined;\n              return (\n                candidate != null &&\n                !exerciseBlocks(candidate.exerciseText).blocks.some((b) =>\n                  sameExercise(b.fullName, block.fullName, settings)\n                )\n              );\n            })\n          : undefined;\n      if (nextWeek == null) {\n        continue;\n      }\n      const target = relocated.weeks[nextWeek].days[dayIndex];\n      const to = exerciseBlocks(target.exerciseText);\n      target.exerciseText = joinBlocks(withBlockAt(to, to.blocks.length, block), target.exerciseText);\n    }\n    // Emptied rather than left to be dropped with the week, so that the intermediate program the\n    // checks below evaluate never holds the same exercise twice.\n    day.exerciseText = \"\";\n  });\n\n  const oldOrder = planner.weeks.map((_week, i) => i).filter((i) => i !== weekIndex);\n  const reordered = reorderWeeks(relocated, oldOrder, settings);\n  if (!reordered.success) {\n    return reordered;\n  }\n  // Compared against the program as it was, not against the relocation step, so a move that broke\n  // something is still caught.\n  return refuseIfWorse(planner, reordered.data, settings);\n}\n\n// Appends a copy of a week. Appending is what keeps it safe: no existing week moves, so no repeat\n// range and no `[week:day]` has to be rewritten.\n//\n// Only a week that says everything it does can be copied. Most of a repeating program's weeks hold\n// no text at all — their content is materialized from a repeat authored earlier — and copying their\n// text would produce an empty week that looks like the one you asked for. Writing out what the\n// evaluator resolved instead is the materialize operation, which the grid doesn't have yet, so this\n// says so rather than silently making an empty week.\nexport function PlannerStructure_duplicateWeek(\n  planner: IPlannerProgram,\n  weekIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const week = planner.weeks[weekIndex];\n  if (week == null) {\n    return { success: true, data: planner };\n  }\n  const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n  const evaluated = evaluatedWeeks[weekIndex] ?? [];\n  const inherited = new Set<string>();\n  evaluated.forEach((day, dayIndex) => {\n    if (!day.success) {\n      return;\n    }\n    const authored = exerciseBlocks(week.days[dayIndex]?.exerciseText ?? \"\").blocks.map((b) => b.fullName);\n    for (const exercise of day.data) {\n      if (authored.indexOf(exercise.fullName) === -1) {\n        inherited.add(exercise.fullName);\n      }\n    }\n  });\n  if (inherited.size > 0) {\n    return {\n      success: false,\n      error: `${Array.from(inherited).slice(0, 3).join(\", \")} appear${inherited.size === 1 ? \"s\" : \"\"} in this week by repeating from an earlier one, so there is no text here to copy. Duplicate the week that defines them instead.`,\n    };\n  }\n\n  const result = ObjectUtils_clone(planner);\n  result.weeks.push({\n    name: uniqueWeekName(planner, `Week ${result.weeks.length + 1}`),\n    // The copy stands on its own: a repeat carried over would claim the weeks the original already\n    // covers and say nothing about the new one.\n    days: week.days.map((day) => ({ name: day.name, exerciseText: stripRepeats(day.exerciseText) })),\n  });\n  return refuseIfWorse(planner, result, settings);\n}\n\nexport interface IPlannerWeekDetails {\n  name: string;\n  description?: string;\n}\n\n// What a week is called and what it says about itself. Nothing in the language addresses a week by\n// name — a repeat and a `[week:day]` both count weeks — so neither field can break an exercise, and\n// the checks are about surviving the round trip through the full text, where a week is the one line\n// `# name` above its `//` description.\nexport function PlannerStructure_setWeekDetails(\n  planner: IPlannerProgram,\n  weekIndex: number,\n  details: IPlannerWeekDetails\n): IPlannerStructureResult {\n  const week = planner.weeks[weekIndex];\n  if (week == null) {\n    return { success: true, data: planner };\n  }\n  const name = details.name.trim();\n  if (name.length === 0) {\n    return { success: false, error: \"A week needs a name.\" };\n  }\n  if (name.indexOf(\"\\n\") !== -1) {\n    return { success: false, error: \"A week name has to fit on one line.\" };\n  }\n  const description = details.description?.trim();\n  const newDescription = description != null && description.length > 0 ? description : undefined;\n  if (name === week.name && newDescription === week.description) {\n    return { success: true, data: planner };\n  }\n  const result = ObjectUtils_clone(planner);\n  result.weeks[weekIndex].name = name;\n  result.weeks[weekIndex].description = newDescription;\n  return { success: true, data: result };\n}\n\n// A field left out is left alone, in every week. A day row is one slot across the whole program, but\n// each week writes its own `## name` and its own description, and the two can disagree — so an edit\n// that only touched the description must not carry the name it was *shown* into weeks that call the\n// day something else. An empty description is a field the user cleared, not one they left alone.\nexport interface IPlannerDayDetails {\n  name?: string;\n  description?: string;\n}\n\n// What a day is called and what it says about itself, in every week at once — the same reason\n// deleting or duplicating a day row applies to all of them: a day number means the same slot in\n// every week, so letting one week disagree about which slot is which is the corruption this editor\n// exists to prevent. Names, though, are not addressable from anywhere in the language, so this can't\n// break an exercise; the checks are about surviving the round trip through the full text, where a\n// day is the one line `## name` under its `//` description.\nexport function PlannerStructure_setDayDetails(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  details: IPlannerDayDetails\n): IPlannerStructureResult {\n  const name = details.name?.trim();\n  if (name != null) {\n    if (name.length === 0) {\n      return { success: false, error: \"A day needs a name.\" };\n    }\n    if (name.indexOf(\"\\n\") !== -1) {\n      return { success: false, error: \"A day name has to fit on one line.\" };\n    }\n  }\n  const trimmedDescription = details.description?.trim();\n  const description = trimmedDescription != null && trimmedDescription.length > 0 ? trimmedDescription : undefined;\n  const result = ObjectUtils_clone(planner);\n  let changed = false;\n  for (const week of result.weeks) {\n    const day = week.days[rowIndex];\n    if (day == null) {\n      continue;\n    }\n    if (name != null && day.name !== name) {\n      day.name = name;\n      changed = true;\n    }\n    if (details.description != null && day.description !== description) {\n      day.description = description;\n      changed = true;\n    }\n  }\n  return { success: true, data: changed ? result : planner };\n}\n\nfunction uniqueWeekName(planner: IPlannerProgram, preferred: string): string {\n  const taken = new Set(planner.weeks.map((week) => week.name));\n  let name = preferred;\n  while (taken.has(name)) {\n    name = StringUtils_nextName(name);\n  }\n  return name;\n}\n\nfunction stripRepeats(text: string): string {\n  let result = text;\n  for (const repeat of exerciseRepeats(text).slice().reverse()) {\n    result = `${result.slice(0, repeat.node.from)}${repeatToken(repeat.order, undefined)}${result.slice(repeat.node.to)}`;\n  }\n  return result;\n}\n\nfunction renumberDayReferences(text: string, deletedDay: number): string {\n  const references = dayReferences(text).filter((r) => r.day > deletedDay);\n  let result = text;\n  // Back to front so earlier splices don't move later offsets — sorted rather than reversed,\n  // because comment references are collected after the exercise ones, not in document order.\n  for (const reference of references.slice().sort((a, b) => b.node.from - a.node.from)) {\n    result = `${result.slice(0, reference.node.from)}${reference.day - 1}${result.slice(reference.node.to)}`;\n  }\n  return result;\n}\n\n// Removes a day from EVERY week at once. Doing it in one week only would shift that week's slots\n// and leave the others alone, so a repeat or a `...main[2]` would then mean a different day\n// depending on which week you read it from — the corruption this editor exists to prevent. Removing\n// the whole row is a uniform renumber instead: every week loses the same slot, and every day\n// qualifier after it shifts by one.\nexport function PlannerStructure_deleteDayRow(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const deletedDay = rowIndex + 1;\n  // Grouped by the day that does the reusing rather than listed flat, so several reuses from one\n  // day read as one clause instead of repeating the day's name for each.\n  const blockers = new Map<string, Set<string>>();\n  for (const week of planner.weeks) {\n    week.days.forEach((day, dayIndex) => {\n      if (dayIndex === rowIndex) {\n        return;\n      }\n      for (const reference of dayReferences(day.exerciseText)) {\n        if (reference.day === deletedDay) {\n          blockers.set(day.name, (blockers.get(day.name) ?? new Set()).add(reference.fullName));\n        }\n      }\n    });\n  }\n  if (blockers.size > 0) {\n    const clauses = Array.from(blockers).map(\n      ([dayName, names]) => `${dayName} reuses ${Array.from(names).join(\" and \")}`\n    );\n    return {\n      success: false,\n      error: `${clauses.join(\"; \")} from this day. Change those to reuse another day first.`,\n    };\n  }\n\n  const result = ObjectUtils_clone(planner);\n  for (const week of result.weeks) {\n    if (week.days[rowIndex] != null) {\n      week.days.splice(rowIndex, 1);\n    }\n    for (const day of week.days) {\n      day.exerciseText = renumberDayReferences(day.exerciseText, deletedDay);\n    }\n  }\n  return refuseIfWorse(planner, result, settings);\n}\n\n// The couplings a day can carry are open-ended — a `used: none` template declared in one day and\n// redefined in the others, a reuse by name across days, something not yet thought of — so rather\n// than trying to enumerate them, check the answer: if the edit breaks something that evaluated\n// cleanly before, refuse and say what broke. Enumerating is how silent corruption gets shipped.\nfunction refuseIfWorse(before: IPlannerProgram, after: IPlannerProgram, settings: ISettings): IPlannerStructureResult {\n  // Ask it of each day individually: was this day fine before, and is it broken now?\n  //\n  // Days are matched by id rather than by position, because a structural edit moves them, and not\n  // by message, because a message embeds the week it happened in — \"no such exercise Missing at\n  // week: 1\" becomes \"... at week: 2\" when the week moves, which once made a legitimate move look\n  // like a new error and refused it. A day the edit removed is not compared at all: it was meant to\n  // go.\n  const beforeDays = dayOutcomes(before, settings);\n  const afterDays = dayOutcomes(after, settings);\n  const identified = [...beforeDays, ...afterDays].every((day) => day.id != null);\n  if (identified) {\n    const wasFine = new Set(beforeDays.filter((day) => day.failure == null).map((day) => day.id));\n    const broken = afterDays.find((day) => day.failure != null && wasFine.has(day.id));\n    if (broken != null) {\n      return { success: false, error: describeBreak(after, broken, settings) };\n    }\n    return { success: true, data: after };\n  }\n\n  // Without ids there is nothing to match days by, so fall back to counting failures. That misses a\n  // *substitution* — one day going green while another goes red keeps the count the same — which\n  // matters because deleting a week or a day removes whatever was failing inside it, so exactly the\n  // destructive edits this guards can hide a new break behind a removed one.\n  //\n  // This is the path a planner parsed straight from text takes, which is every test in this\n  // module; the app itself always has ids, from the storage migration and the backfill in\n  // screenProgram. Worth knowing when reading a test that says an edit is refused: it proves less\n  // than the same edit does in the app.\n  const brokenBefore = beforeDays.filter((day) => day.failure != null);\n  const brokenAfter = afterDays.filter((day) => day.failure != null);\n  if (brokenAfter.length > brokenBefore.length) {\n    const messages = brokenBefore.map((day) => day.failure?.message);\n    const introduced = brokenAfter.find((day) => messages.indexOf(day.failure?.message) === -1) ?? brokenAfter[0];\n    return { success: false, error: describeBreak(after, introduced, settings) };\n  }\n  return { success: true, data: after };\n}\n\n// One outcome per day. The count is what the check is made of; the rest is what the refusal is\n// written from, which is why the whole error is kept rather than its message — the message is\n// written for someone reading the text, and a refusal has to be readable by someone looking at a\n// grid.\ninterface IDayOutcome {\n  // Days carry a stable id once a program has been through the store, but a planner parsed straight\n  // from text has none — see refuseIfWorse for what that costs.\n  id: string | undefined;\n  failure: PlannerSyntaxError | undefined;\n  weekName: string;\n  dayName: string;\n  text: string;\n}\n\nfunction dayOutcomes(planner: IPlannerProgram, settings: ISettings): IDayOutcome[] {\n  const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n  return planner.weeks.reduce<IDayOutcome[]>(\n    (acc, week, weekIndex) => [\n      ...acc,\n      ...week.days.map((day, dayIndex) => {\n        const evaluated = evaluatedWeeks[weekIndex]?.[dayIndex];\n        return {\n          id: day.id,\n          failure: evaluated != null && !evaluated.success ? evaluated.error : undefined,\n          weekName: week.name,\n          dayName: day.name,\n          text: day.exerciseText,\n        };\n      }),\n    ],\n    []\n  );\n}\n\n// How a week and day are named to the user. The grid draws names, not numbers, so a refusal that\n// says \"week: 2, day: 1\" sends them counting — and counting the wrong thing, since the numbers in\n// an evaluator message are of the *intermediate* program the check built, not the one on screen.\nfunction placeName(planner: IPlannerProgram, week: number, dayInWeek: number): string {\n  const weekName = planner.weeks[week - 1]?.name ?? `Week ${week}`;\n  const dayName = planner.weeks[week - 1]?.days[dayInWeek - 1]?.name ?? `Day ${dayInWeek}`;\n  return `${weekName}, ${dayName}`;\n}\n\nfunction placeOf(planner: IPlannerProgram, dayData: IDayData): string | undefined {\n  return dayData.week != null && dayData.dayInWeek != null\n    ? placeName(planner, dayData.week, dayData.dayInWeek)\n    : undefined;\n}\n\n// A refusal, written from the error's details rather than its message. Only the kinds a structural\n// edit can actually cause are spelled out; anything else falls back to the evaluator's own words\n// with its line and column stripped, since those address a day's text and the grid shows no text.\nfunction describeBreak(planner: IPlannerProgram, outcome: IDayOutcome, settings: ISettings): string {\n  const error = outcome.failure;\n  if (error == null) {\n    return \"That would break the program.\";\n  }\n  const where = `${outcome.weekName}, ${outcome.dayName}`;\n  const details = error.details;\n  switch (details.type) {\n    case \"reuseTargetNotFound\": {\n      // A reuse without a day means \"wherever in that week it is\", so naming a day here would put\n      // a place in front of the user that the reuse never claimed.\n      const { week, day } = details.data;\n      const at =\n        week == null\n          ? \"\"\n          : day == null\n            ? ` from ${planner.weeks[week - 1]?.name ?? `week ${week}`}`\n            : ` from ${placeName(planner, week, day)}`;\n      return `${details.subject ?? \"Something\"} in ${where} reuses ${details.data.fullName}${at}, which wouldn't be there any more.`;\n    }\n    case \"duplicateExerciseInDay\": {\n      const name = exerciseBlocks(outcome.text).blocks.find(\n        (block) => exerciseKey(block.fullName, settings) === details.data.key\n      )?.fullName;\n      return `${where} would end up with two of ${name ?? \"the same exercise\"}. Give one of them a label to tell them apart.`;\n    }\n    case \"conflictingProperty\": {\n      // Both are the 1-based `dayData` the evaluator was handed. Its own message adds one to the\n      // first of them, which reads a week late; the details are the numbers themselves, so this\n      // doesn't inherit that.\n      const first = placeOf(planner, details.data.a);\n      const second = placeOf(planner, details.data.b);\n      const between = first != null && second != null ? ` — one in ${first}, another in ${second}` : \"\";\n      return `${details.data.exercise} would say two different things about ${details.data.property}${between}. It has to say the same thing everywhere.`;\n    }\n    case \"reuseAmbiguous\":\n      return `A reuse in ${where} would match several exercises. It needs a [week:day] to say which one it means.`;\n    case \"unknownExercise\":\n      return `${where} has no exercise called ${details.data.name}.`;\n    default:\n      return `That would break the program: ${error.message.replace(/\\s*\\(\\d+:\\d+\\)$/, \"\")} (in ${where}).`;\n  }\n}\n\n// Appends a copy of the day to every week. Appending is what keeps this safe: no existing slot\n// moves, so nothing that points at one has to be rewritten.\nexport function PlannerStructure_duplicateDayRow(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const result = ObjectUtils_clone(planner);\n  const copies = result.weeks.map((week) => {\n    const day = week.days[rowIndex];\n    if (day == null) {\n      return -1;\n    }\n    week.days.push({ name: `Day ${week.days.length + 1}`, exerciseText: day.exerciseText });\n    return week.days.length - 1;\n  });\n  // A copied day can redeclare an exercise the original owned, so this gets the same check.\n  const checked = refuseIfWorse(planner, result, settings);\n  if (!checked.success) {\n    return checked;\n  }\n  // And then the check this operation needs on top: does the copy actually say what the original\n  // said, in every week?\n  //\n  // Appending puts the copy at a different row index in a week with fewer days, so a repeat that\n  // fills \"day 3\" has no day 3 to fill in the short week and the copy evaluates empty. Inserting\n  // beside the original instead of appending would fix it properly, but that moves every slot\n  // below and means renumbering every reference to them — so for now this refuses rather than\n  // handing back a duplicate that is silently blank in some weeks.\n  const { evaluatedWeeks } = PlannerProgram_evaluate(checked.data, settings);\n  for (let weekIndex = 0; weekIndex < copies.length; weekIndex += 1) {\n    if (copies[weekIndex] === -1) {\n      continue;\n    }\n    const source = evaluatedWeeks[weekIndex]?.[rowIndex];\n    const copy = evaluatedWeeks[weekIndex]?.[copies[weekIndex]];\n    if (!source?.success || !copy?.success) {\n      continue;\n    }\n    if (copy.data.length !== source.data.length) {\n      return {\n        success: false,\n        error: `${result.weeks[weekIndex].name} inherits this day from a repeat elsewhere, so the copy would come out empty. Write the day out in that week first.`,\n      };\n    }\n  }\n  return checked;\n}\n\n// A comment or description line belongs to the exercise it precedes, so reordering moves the block\n// rather than the bare line — otherwise an exercise's notes stay behind with whatever takes its\n// place.\ninterface IExerciseBlock {\n  fullName: string;\n  text: string;\n}\n\n// Split on the parser's node ranges, not on lines: an exercise's `{~ ... ~}` script spans several\n// lines, and cutting between them turns a progress block into loose statements the next exercise\n// inherits.\n// The same exercise can be spelled differently from week to week — `!Squat | Front Squat` and\n// `Squat | !Front Squat` differ only in which variation is active — so matching on raw text finds\n// it in the week a drag started in and silently misses it everywhere else, leaving half a move\n// behind.\n//\n// The key is the identity the *evaluator* uses, so using anything else here means the two disagree\n// about what one exercise is. These functions work on text and never build an\n// `IPlannerProgramExercise`, so the key is derived from the name — which needs the custom exercises\n// out of settings to resolve a name and equipment to a canonical exercise. Verified against every\n// builtin: 5393 evaluated exercises, and the derived key matched the stored one every time.\nfunction exerciseKey(fullName: string, settings: ISettings): string {\n  return PlannerKey_fromFullName(fullName, settings.exercises);\n}\n\nfunction sameExercise(a: string, b: string, settings: ISettings): boolean {\n  return exerciseKey(a, settings) === exerciseKey(b, settings);\n}\n\n// A day's text as movable blocks separated by spans that stay where they are. `fixed` is one\n// longer than `blocks`: fixed[0], blocks[0], fixed[1], blocks[1] ... fixed[n]. The fixed spans hold\n// `///` comments and the blank lines that space a day out — content that belongs to the position\n// rather than to any exercise, and that must not travel when an exercise is moved or deleted.\ninterface IDayDocument {\n  blocks: IExerciseBlock[];\n  fixed: string[];\n}\n\nfunction exerciseBlocks(text: string): IDayDocument {\n  const spans = PlannerDocument_blockSpans(text);\n  const blocks: IExerciseBlock[] = [];\n  const fixed: string[] = [];\n  let cursor = 0;\n  for (const span of spans) {\n    fixed.push(text.slice(cursor, span.from));\n    const body = text.slice(span.from, span.exerciseTo);\n    // An exercise expression usually ends past its own line break, but the last one in a day does\n    // not. Normalize so a block moved anywhere else does not run into the line after it — and only\n    // step over a line break the body did not already take, or the blank line that spaces the next\n    // one out gets eaten.\n    const complete = body.endsWith(\"\\n\");\n    blocks.push({ fullName: span.fullName, text: complete ? body : `${body}\\n` });\n    cursor = span.exerciseTo;\n    if (!complete && text[cursor] === \"\\n\") {\n      cursor += 1;\n    }\n  }\n  fixed.push(text.slice(cursor));\n  return { blocks, fixed };\n}\n\nfunction joinBlocks(document: IDayDocument, originalText: string): string {\n  const joined = document.fixed.reduce(\n    (acc, span, i) => `${acc}${span}${i < document.blocks.length ? document.blocks[i].text : \"\"}`,\n    \"\"\n  );\n  return originalText.endsWith(\"\\n\") || joined === \"\" ? joined : joined.replace(/\\n$/, \"\");\n}\n\n// Dropping a block closes the gap it left: the spans on either side of it become one, so the\n// `///` comment that sat above it and the blank line below do not end up doubled.\nfunction withoutBlock(document: IDayDocument, index: number): IDayDocument {\n  const fixed = document.fixed.slice();\n  fixed.splice(index, 2, `${fixed[index]}${fixed[index + 1]}`);\n  return { blocks: document.blocks.filter((_, i) => i !== index), fixed };\n}\n\nfunction withBlockAt(document: IDayDocument, index: number, block: IExerciseBlock): IDayDocument {\n  const blocks = document.blocks.slice();\n  blocks.splice(index, 0, block);\n  const fixed = document.fixed.slice();\n  fixed.splice(index + 1, 0, \"\");\n  return { blocks, fixed };\n}\n\nfunction reorderDayText(text: string, order: string[], settings: ISettings): string {\n  const document = exerciseBlocks(text);\n  // By key, like every other match in this module: the order comes from one week, and another week\n  // may spell the same exercise differently.\n  const orderKeys = order.map((name) => exerciseKey(name, settings));\n  const rank = (block: IExerciseBlock): number => orderKeys.indexOf(exerciseKey(block.fullName, settings));\n  // Only the blocks named in `order` move, and they move within the slots they already occupy, so\n  // anything the grid doesn't know about stays exactly where the author put it — including the\n  // fixed spans between them, which never move at all.\n  const movableSlots = document.blocks.reduce<number[]>(\n    (acc, block, index) => (rank(block) !== -1 ? [...acc, index] : acc),\n    []\n  );\n  const reordered = movableSlots.map((slot) => document.blocks[slot]).sort((a, b) => rank(a) - rank(b));\n  const blocks = document.blocks.slice();\n  movableSlots.forEach((slot, i) => {\n    blocks[slot] = reordered[i];\n  });\n  return joinBlocks({ blocks, fixed: document.fixed }, text);\n}\n\n// `Squat[3]` is not a position, it is an absolute sort key: Program_buildWeeks sorts every day by\n// it with an absent one counting as 0, and document position only breaks ties between exercises\n// sharing a number. So a day carrying numbers overrules anything that moves a line, and the two\n// disagree until something makes them agree again — which is why a drag on such a day used to\n// rewrite the text and then appear to do nothing at all.\n//\n// Everything below is that reconciliation, run after a transform has put the lines where they\n// belong. It prefers to reconcile on *no* numbers: with every order 0 the sort is stable and\n// document order wins outright, which is both what the author is looking at and one less thing in\n// the text.\n//\n// A row's exercises in the order its text puts them, which after such a transform is the order that\n// was asked for. Weeks in order, each week's blocks in order, first sighting wins — the same rule\n// the grid builds its lanes by, so the two cannot drift. Every exercise on a row is authored by\n// exactly one line on that row (a repeat covers the same day row in later weeks), so this sees all\n// of them.\nfunction rowOrderFromText(planner: IPlannerProgram, rowIndex: number, settings: ISettings): string[] {\n  const seen = new Set<string>();\n  return planner.weeks.reduce<string[]>((acc, week) => {\n    for (const slot of exerciseOrderSlots(week.days[rowIndex]?.exerciseText ?? \"\")) {\n      const key = exerciseKey(slot.fullName, settings);\n      if (!seen.has(key)) {\n        seen.add(key);\n        acc.push(slot.fullName);\n      }\n    }\n    return acc;\n  }, []);\n}\n\nfunction withRowOrders(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  orderFor: (slot: IOrderSlot) => number | undefined\n): IPlannerProgram {\n  const result = ObjectUtils_clone(planner);\n  for (const week of result.weeks) {\n    const day = week.days[rowIndex];\n    if (day == null) {\n      continue;\n    }\n    // Back to front, so rewriting one bracket does not shift the offsets of the ones after it.\n    day.exerciseText = exerciseOrderSlots(day.exerciseText).reduceRight((text, slot) => {\n      // keepSingleWeek, because a range that survives a rewrite has to survive it verbatim:\n      // `Squat[1-1]` written in week 3 means weeks 1 *and* 3, and dropping it would move it.\n      const token = repeatToken(orderFor(slot), slot.range, slot.range != null);\n      return `${text.slice(0, slot.span.from)}${token}${text.slice(slot.span.to)}`;\n    }, day.exerciseText);\n  }\n  return result;\n}\n\n// Whether every week draws the row the way its text reads. The evaluator does not sort — that is\n// Program_buildWeeks' job, and the grid reads its output — so the same key is applied here.\nfunction rowReadsInTextOrder(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  wanted: string[],\n  settings: ISettings\n): boolean {\n  const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n  const wantedKeys = wanted.map((fullName) => exerciseKey(fullName, settings));\n  return planner.weeks.every((_week, weekIndex) => {\n    const day = evaluatedWeeks[weekIndex]?.[rowIndex];\n    if (day == null || !day.success) {\n      return true;\n    }\n    const shown = CollectionUtils_sortBy(day.data, \"order\")\n      .map((exercise) => exercise.key)\n      .filter((key) => wantedKeys.indexOf(key) !== -1);\n    // What this week ought to show is the row's order restricted to what this week actually has.\n    // Drawn from a dwindling copy rather than by `includes`, so a day holding two of one exercise\n    // has to match twice.\n    const remaining = shown.slice();\n    const expected = wantedKeys.filter((key) => {\n      const at = remaining.indexOf(key);\n      if (at !== -1) {\n        remaining.splice(at, 1);\n      }\n      return at !== -1;\n    });\n    return shown.length === expected.length && shown.every((key, i) => key === expected[i]);\n  });\n}\n\n// Makes a row's numbers agree with its positions, using as few numbers as it can.\n//\n// When they can be dropped altogether is not readable from the day's own text: an exercise that\n// repeats into a later week has no line there, so its position in that week comes from its number\n// and nothing else. Rather than model that, the stripped program is evaluated and checked, and only\n// a row that fails gets numbered — every exercise on it, because a number can only be outranked by\n// a smaller one, so pinning some of them cannot place the rest.\nexport function PlannerStructure_normalizeOrdersInDay(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  settings: ISettings\n): IPlannerProgram {\n  const slots = planner.weeks.flatMap((week) => exerciseOrderSlots(week.days[rowIndex]?.exerciseText ?? \"\"));\n  if (!slots.some((slot) => slot.order != null)) {\n    return planner;\n  }\n  const wanted = rowOrderFromText(planner, rowIndex, settings);\n  const stripped = withRowOrders(planner, rowIndex, () => undefined);\n  if (rowReadsInTextOrder(stripped, rowIndex, wanted, settings)) {\n    return stripped;\n  }\n  const numbers = wanted.reduce<Record<string, number>>(\n    (acc, fullName, index) => ({ ...acc, [exerciseKey(fullName, settings)]: index + 1 }),\n    {}\n  );\n  return withRowOrders(planner, rowIndex, (slot) => numbers[exerciseKey(slot.fullName, settings)] ?? slot.order);\n}\n\n// Reorders exercises within a day. This is content order — no slot identity moves — so it is safe\n// in a way none of the other structural edits are. Applied to every week's copy of the day so the\n// grid's lanes, which are shared across weeks, keep meaning one thing.\nexport function PlannerStructure_reorderExercisesInDay(\n  planner: IPlannerProgram,\n  rowIndex: number,\n  order: string[],\n  settings: ISettings\n): IPlannerStructureResult {\n  const result = ObjectUtils_clone(planner);\n  for (const week of result.weeks) {\n    const day = week.days[rowIndex];\n    if (day != null) {\n      day.exerciseText = reorderDayText(day.exerciseText, order, settings);\n    }\n  }\n  return refuseIfWorse(planner, PlannerStructure_normalizeOrdersInDay(result, rowIndex, settings), settings);\n}\n\n// Moves one exercise from one day row to another, in every week that authors it there. A repeated\n// exercise is authored once — the later weeks hold no text for it — so moving that one line carries\n// the whole run with it, and it now repeats on the new day. A week that overrides the exercise with\n// its own definition moves that copy too, which is what keeps the lane whole.\n//\n// `beforeFullName` anchors the insert by name rather than by index: the target day can hold a\n// different number of exercises in each week (a ragged week, an override), and an index would land\n// in a different place in each of them.\nexport function PlannerStructure_moveExerciseToDay(\n  planner: IPlannerProgram,\n  fromRowIndex: number,\n  fullName: string,\n  toRowIndex: number,\n  beforeFullName: string | undefined,\n  settings: ISettings\n): IPlannerStructureResult {\n  return PlannerStructure_moveExercisesToDay(\n    planner,\n    [{ fromRowIndex, fullName }],\n    toRowIndex,\n    beforeFullName,\n    settings\n  );\n}\n\nexport interface IPlannerStructureExerciseMove {\n  fromRowIndex: number;\n  fullName: string;\n}\n\n// Where an exercise's name is written on its own line, found by key rather than by matching the\n// text: two weeks can spell the same exercise differently — `!Squat | Front Squat` against\n// `Squat | !Front Squat` — and a relabel has to land in both.\nfunction variationsSpan(text: string, fullName: string, settings: ISettings): ITextSpan | undefined {\n  const tree = plannerExerciseParser.parse(text);\n  for (const node of children(tree.topNode)) {\n    if (node.type.name !== PlannerNodeName.ExerciseExpression) {\n      continue;\n    }\n    const variations = node.getChild(PlannerNodeName.ExerciseVariations);\n    if (variations == null) {\n      continue;\n    }\n    if (sameExercise(text.slice(variations.from, variations.to).trim(), fullName, settings)) {\n      return { from: variations.from, to: variations.to };\n    }\n  }\n  return undefined;\n}\n\n// The same name under a different label. A label is whatever precedes the first colon — the same\n// rule `extractNameParts` applies, so a name that happens to contain one is already being read as\n// labelled and this agrees with the evaluator rather than inventing a second rule. The `!` marking\n// the current variation sits outside the label, and only the first of several `|` variations\n// carries one.\nfunction withLabel(fullName: string, label: string): string {\n  const segments = fullName.split(\"|\");\n  const marker = segments[0].trimStart().startsWith(\"!\") ? \"!\" : \"\";\n  const body = segments[0].trim().replace(/^!\\s*/, \"\");\n  const colon = body.indexOf(\":\");\n  const unlabeled = colon === -1 ? body : body.slice(colon + 1).trim();\n  return [`${marker}${label}: ${unlabeled}`, ...segments.slice(1)].join(\"|\");\n}\n\n// Rewrites the reuses that address one exercise on one day row — matched on the name *and* the row\n// together, because a day holds several exercises and only the one being moved should have its\n// address rewritten. Both halves are optional: a move changes the day, a relabel changes the name,\n// and a move into an occupied day does both at once.\nfunction retargetDayReferences(\n  planner: IPlannerProgram,\n  match: { fullName: string; day: number },\n  next: { fullName?: string; day?: number },\n  settings: ISettings\n): void {\n  for (const week of planner.weeks) {\n    for (const day of week.days) {\n      const edits: { from: number; to: number; text: string }[] = [];\n      for (const reference of dayReferences(day.exerciseText)) {\n        if (reference.day !== match.day || !sameExercise(reference.fullName, match.fullName, settings)) {\n          continue;\n        }\n        if (next.day != null && next.day !== reference.day) {\n          edits.push({ from: reference.node.from, to: reference.node.to, text: `${next.day}` });\n        }\n        if (next.fullName != null) {\n          edits.push({ from: reference.nameNode.from, to: reference.nameNode.to, text: next.fullName });\n        }\n      }\n      // Back to front so earlier splices don't move later offsets.\n      day.exerciseText = edits\n        .sort((a, b) => b.from - a.from)\n        .reduce((text, edit) => `${text.slice(0, edit.from)}${edit.text}${text.slice(edit.to)}`, day.exerciseText);\n    }\n  }\n}\n\n// Which exercises one week's copy of a day prescribes. Every question of the form \"is this exercise\n// there\" goes through here, so that they cannot answer it differently.\n//\n// The evaluator is the authority, because only it sees a repeat backfilling into a week that holds\n// no text of its own. But a day that fails to evaluate hands back *nothing at all*, and reading\n// that as \"the day is empty\" is how a move deletes the last copy of something or drops a second one\n// on top of it — a broken program is exactly when those must not happen. So a day that doesn't\n// evaluate is answered from the text instead, which is weaker but honest: what this week writes\n// down, plus what another week's repeat claims for it.\nfunction keysPresentInDay(\n  planner: IPlannerProgram,\n  weekIndex: number,\n  rowIndex: number,\n  settings: ISettings\n): Set<string> {\n  const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n  const evaluated = evaluatedWeeks[weekIndex]?.[rowIndex];\n  if (evaluated?.success) {\n    return new Set(evaluated.data.map((exercise) => exercise.key));\n  }\n  const result = new Set<string>();\n  for (const block of exerciseBlocks(planner.weeks[weekIndex]?.days[rowIndex]?.exerciseText ?? \"\").blocks) {\n    result.add(exerciseKey(block.fullName, settings));\n  }\n  // The repeats other weeks author on this row. Reading only this week's own text is what still\n  // lost an exercise that lives here purely by inheritance — `Squat[1-2]` written in week 1 is in\n  // week 2 as well, and week 2's text says nothing about it.\n  planner.weeks.forEach((week, otherIndex) => {\n    if (otherIndex === weekIndex) {\n      return;\n    }\n    for (const repeat of exerciseRepeats(week.days[rowIndex]?.exerciseText ?? \"\")) {\n      const range = repeat.range;\n      if (range != null && weekIndex + 1 >= range[0] && weekIndex + 1 <= range[1]) {\n        result.add(exerciseKey(repeat.fullName, settings));\n      }\n    }\n  });\n  return result;\n}\n\n// Every exercise the day shows in any week — what a move has to look at to know whether it is\n// landing on top of something.\nfunction keysShownInDay(planner: IPlannerProgram, rowIndex: number, settings: ISettings): Set<string> {\n  return planner.weeks.reduce<Set<string>>((acc, _week, weekIndex) => {\n    for (const key of keysPresentInDay(planner, weekIndex, rowIndex, settings)) {\n      acc.add(key);\n    }\n    return acc;\n  }, new Set());\n}\n\n// A day can hold the same exercise twice as long as labels tell them apart, so a move into a day\n// that already has this one renames rather than refuses — and says so, because a name the user\n// didn't choose is not something to discover later. Renaming means rewriting the line in every week\n// that writes it, and every reuse that named it: a reuse that still says `Squat` would now resolve\n// to the exercise that was already there, which is a different exercise wearing the right name.\n// The first label of a fixed sequence that this day doesn't already use. Walking a sequence rather\n// than rolling a random id is what keeps the transform pure: the grid runs it twice — once as the\n// pre-flight that decides whether to dispatch at all, once for real — and a random label differs\n// between the two, so the warning would name something the program never got.\n//\n// A word, not a letter. `superset: a` is how a superset group is written, and single-letter labels\n// are what real programs use for those, so `a: Squat` would read as the wrong kind of thing\n// entirely. Labels cap at 8 characters, which `alt` plus two digits stays well inside.\nfunction freeLabel(taken: Set<string>, fullName: string, settings: ISettings): string | undefined {\n  for (let attempt = 1; attempt <= 99; attempt += 1) {\n    const label = attempt === 1 ? \"alt\" : `alt${attempt}`;\n    if (!taken.has(exerciseKey(withLabel(fullName, label), settings))) {\n      return label;\n    }\n  }\n  return undefined;\n}\n\nfunction labelApart(\n  planner: IPlannerProgram,\n  move: IPlannerStructureExerciseMove,\n  toRowIndex: number,\n  taken: Set<string>,\n  settings: ISettings\n): { fullName: string; warning: string } | undefined {\n  const label = freeLabel(taken, move.fullName, settings);\n  if (label == null) {\n    return undefined;\n  }\n  const fullName = withLabel(move.fullName, label);\n  for (const week of planner.weeks) {\n    const day = week.days[move.fromRowIndex];\n    const span = day != null ? variationsSpan(day.exerciseText, move.fullName, settings) : undefined;\n    if (day != null && span != null) {\n      day.exerciseText = `${day.exerciseText.slice(0, span.from)}${fullName}${day.exerciseText.slice(span.to)}`;\n    }\n  }\n  const dayName = planner.weeks.find((week) => week.days[toRowIndex] != null)?.days[toRowIndex]?.name;\n  return {\n    fullName,\n    warning: `${dayName ?? `Day ${toRowIndex + 1}`} already had ${move.fullName}, so the one you moved now has label: ${fullName}.`,\n  };\n}\n\n// What an exercise prescribes over and above its own sets. The evaluator hoists these across every\n// line sharing a key, so they survive being written on one line only — which is exactly what makes\n// them fragile when a key is split in two.\ninterface IHoistedSummary {\n  progress: string;\n  update: string;\n  warmup: string;\n  used: string;\n}\n\nfunction hoistedSummary(exercise: IPlannerProgramExercise): IHoistedSummary {\n  return {\n    progress: `${exercise.progress?.type ?? \"-\"}/${PlannerProgramExercise_getProgressScript(exercise) ?? \"-\"}`,\n    update: `${exercise.update?.type ?? \"-\"}/${PlannerProgramExercise_getUpdateScript(exercise) ?? \"-\"}`,\n    warmup: JSON.stringify(exercise.warmupSets ?? null),\n    used: exercise.notused ? \"none\" : \"-\",\n  };\n}\n\nfunction summaryForKey(planner: IPlannerProgram, key: string, settings: ISettings): IHoistedSummary | undefined {\n  const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n  for (const week of evaluatedWeeks) {\n    for (const day of week) {\n      if (!day.success) {\n        continue;\n      }\n      const exercise = day.data.find((e) => e.key === key);\n      if (exercise != null) {\n        return hoistedSummary(exercise);\n      }\n    }\n  }\n  return undefined;\n}\n\n// Labelling two same-named exercises apart makes them two keys, and a property written on only one\n// of their lines then belongs to only one of them. The exercise that loses it keeps evaluating\n// cleanly — it simply stops progressing — so nothing downstream catches it and the user finds out\n// weeks later.\n//\n// Rather than trying to move the declaration to where it would be needed, this refuses. Reusing is\n// what the language has for \"same as that one\", and a labelled copy could say `...Squat[1:2]` and\n// inherit the lot — but a reuse target may not itself be reusing, which is exactly the case in the\n// template-driven programs where this matters. Lifting that restriction is its own piece of work;\n// until then a refusal the user can act on beats a silent loss they can't see.\nfunction strandedByLabelling(\n  before: IPlannerProgram,\n  after: IPlannerProgram,\n  relabels: { oldFullName: string; newFullName: string }[],\n  settings: ISettings\n): string | undefined {\n  const properties: (keyof IHoistedSummary)[] = [\"progress\", \"update\", \"warmup\", \"used\"];\n  for (const relabel of relabels) {\n    const wanted = summaryForKey(before, exerciseKey(relabel.oldFullName, settings), settings);\n    if (wanted == null) {\n      continue;\n    }\n    for (const fullName of [relabel.newFullName, relabel.oldFullName]) {\n      const got = summaryForKey(after, exerciseKey(fullName, settings), settings);\n      const lost = got == null ? undefined : properties.find((property) => got[property] !== wanted[property]);\n      if (lost != null) {\n        return (\n          `Both copies of ${relabel.oldFullName} share one ${lost}, and it is written on only one of their lines. ` +\n          `Telling them apart by label would leave the other one without it. ` +\n          `Give this one its own ${lost} first, or move it to a day that doesn't already have ${relabel.oldFullName}.`\n        );\n      }\n    }\n  }\n  return undefined;\n}\n\n// Several exercises into the same day at once — what dragging a multi-selection does. They land\n// together, in the order given, above the same anchor.\n//\n// Ones that are already in the destination day are left alone rather than repositioned: they are a\n// reorder, not a move, and reordering is a different transform that keeps the day's fixed spans in\n// place. The grid uses that one when the whole selection lives in the target day.\nexport function PlannerStructure_moveExercisesToDay(\n  planner: IPlannerProgram,\n  moves: IPlannerStructureExerciseMove[],\n  toRowIndex: number,\n  beforeFullName: string | undefined,\n  settings: ISettings\n): IPlannerStructureResult {\n  const crossing = moves.filter((move) => move.fromRowIndex !== toRowIndex);\n  if (crossing.length === 0) {\n    return { success: true, data: planner };\n  }\n  // A ragged program can have the day in one week and not the other. Moving then would delete the\n  // exercise from the week that has no destination for it, so refuse the whole thing rather than\n  // silently losing a week's worth of work.\n  // Which weeks actually *show* the exercise on this day — asked of the evaluator, not of the text.\n  // A repeat backfills: `Squat[1-2]` authored in week 2 is visible in week 1, which holds no text\n  // for it. Checking authored blocks alone missed exactly those weeks, and moving into a day they\n  // don't have deleted the only copy without any evaluation error to catch it.\n  const missing = new Set<number>();\n  const homeless = new Set<string>();\n  for (const move of crossing) {\n    for (const weekIndex of weeksShowing(planner, move.fromRowIndex, move.fullName, settings)) {\n      if (planner.weeks[weekIndex]?.days[toRowIndex] == null) {\n        missing.add(weekIndex);\n        homeless.add(move.fullName);\n      }\n    }\n  }\n  if (missing.size > 0) {\n    const weeks = Array.from(missing).map((weekIndex) => planner.weeks[weekIndex].name);\n    return {\n      success: false,\n      error: `${weeks.join(\", \")} has no day to move ${Array.from(homeless).join(\", \")} into.`,\n    };\n  }\n\n  const result = ObjectUtils_clone(planner);\n  // Everything that pointed at these exercises is rewritten before a single block moves, while the\n  // exercise is still the only one of its name on the row it is leaving. Doing it afterwards can't\n  // work: once it has landed next to an exercise of the same name, `Squat on day 2` names two\n  // things and there is no way to tell which one a reuse meant.\n  const warnings: string[] = [];\n  const relabels: { oldFullName: string; newFullName: string }[] = [];\n  const taken = keysShownInDay(planner, toRowIndex, settings);\n  const landing = crossing.map((move) => {\n    const relabeled = taken.has(exerciseKey(move.fullName, settings))\n      ? labelApart(result, move, toRowIndex, taken, settings)\n      : undefined;\n    const fullName = relabeled?.fullName ?? move.fullName;\n    if (relabeled != null) {\n      warnings.push(relabeled.warning);\n      relabels.push({ oldFullName: move.fullName, newFullName: relabeled.fullName });\n    }\n    taken.add(exerciseKey(fullName, settings));\n    retargetDayReferences(\n      result,\n      { fullName: move.fullName, day: move.fromRowIndex + 1 },\n      { fullName: relabeled?.fullName, day: toRowIndex + 1 },\n      settings\n    );\n    return { ...move, fullName };\n  });\n\n  let moved = false;\n  for (const week of result.weeks) {\n    const toDay = week.days[toRowIndex];\n    if (toDay == null) {\n      continue;\n    }\n    const blocks: IExerciseBlock[] = [];\n    for (const move of landing) {\n      const fromDay = week.days[move.fromRowIndex];\n      if (fromDay == null) {\n        continue;\n      }\n      const from = exerciseBlocks(fromDay.exerciseText);\n      const block = from.blocks.find((b) => sameExercise(b.fullName, move.fullName, settings));\n      if (block == null) {\n        continue;\n      }\n      fromDay.exerciseText = joinBlocks(withoutBlock(from, from.blocks.indexOf(block)), fromDay.exerciseText);\n      blocks.push(block);\n      moved = true;\n    }\n    if (blocks.length === 0) {\n      continue;\n    }\n    // The anchor is resolved after the removals, since one of them may have been above it.\n    let to = exerciseBlocks(toDay.exerciseText);\n    const anchor =\n      beforeFullName != null ? to.blocks.findIndex((b) => sameExercise(b.fullName, beforeFullName, settings)) : -1;\n    let at = anchor === -1 ? to.blocks.length : anchor;\n    for (const block of blocks) {\n      to = withBlockAt(to, at, block);\n      at += 1;\n    }\n    toDay.exerciseText = joinBlocks(to, toDay.exerciseText);\n  }\n  if (!moved) {\n    return { success: false, error: `Couldn't find ${crossing.map((m) => m.fullName).join(\", \")} in that day.` };\n  }\n  // A forced order was written for the day the exercise is leaving and means something else in the\n  // one it lands in — `Squat[1]` dropped at the top of an unnumbered day sorts to the bottom of it,\n  // since an absent number counts as 0. Both ends are reconciled: the row it left can be holding\n  // numbers that no longer say anything now that one of them has gone.\n  const normalized = Array.from(new Set([toRowIndex, ...crossing.map((move) => move.fromRowIndex)])).reduce(\n    (acc, row) => PlannerStructure_normalizeOrdersInDay(acc, row, settings),\n    result\n  );\n  // The addresses were rewritten above and a same-named neighbour was labelled apart, so what is\n  // left for this to catch is what neither could anticipate — a `used: none` template redeclared,\n  // a property the two copies now disagree about.\n  const checked = refuseIfWorse(planner, normalized, settings);\n  if (!checked.success) {\n    return checked;\n  }\n  // And then the loss that evaluates perfectly well, so nothing above can see it.\n  const stranded = strandedByLabelling(planner, normalized, relabels, settings);\n  if (stranded != null) {\n    return { success: false, error: stranded };\n  }\n  return withWarnings(checked, warnings);\n}\n\nexport interface IPlannerStructureExerciseTarget {\n  week: number;\n  dayInWeek: number;\n  fullName: string;\n}\n\n// Deletes exercises, by splicing their lines out of the text like every other transform here.\nexport function PlannerStructure_deleteExercises(\n  planner: IPlannerProgram,\n  targets: IPlannerStructureExerciseTarget[],\n  settings: ISettings\n): IPlannerStructureResult {\n  // Deleting an exercise that others reuse orphans them, and materializing the reusers is separate\n  // work, so this refuses rather than quietly breaking the program.\n  const sources = reusedNames(planner, settings);\n  const blocked = targets.filter((t) => sources.has(t.fullName)).map((t) => t.fullName);\n  if (blocked.length > 0) {\n    const names = Array.from(new Set(blocked));\n    return {\n      success: false,\n      error: `${names.join(\", \")} ${names.length === 1 ? \"is\" : \"are\"} reused by other exercises. Change those to stop reusing it first.`,\n    };\n  }\n\n  // Splice the line out of the day it is written in. That is the whole operation: a repeat has no\n  // text of its own, so removing the line removes every week it repeated into, and a week that\n  // writes its own line — an override, or an independently written week — is a different line and\n  // is left alone.\n  //\n  // This used to delete from the *evaluated* program and print the result back through\n  // ProgramToPlanner, which rewrote the entire program: a delete of an exercise that wasn't even\n  // there still reformatted every day. Editing the text the author wrote is the only way to leave\n  // the rest of it as they wrote it.\n  const result = ObjectUtils_clone(planner);\n  for (const target of targets) {\n    const day = result.weeks[target.week - 1]?.days[target.dayInWeek - 1];\n    if (day == null) {\n      continue;\n    }\n    const document = exerciseBlocks(day.exerciseText);\n    const index = document.blocks.findIndex((b) => sameExercise(b.fullName, target.fullName, settings));\n    if (index === -1) {\n      continue;\n    }\n    day.exerciseText = joinBlocks(withoutBlock(document, index), day.exerciseText);\n  }\n  return refuseIfWorse(planner, result, settings);\n}\n\n// Every exercise name that something else reuses, anywhere in the program.\nfunction reusedNames(planner: IPlannerProgram, settings: ISettings): Set<string> {\n  const { evaluatedWeeks } = PlannerProgram_evaluate(planner, settings);\n  const result = new Set<string>();\n  for (const week of evaluatedWeeks) {\n    for (const day of week) {\n      if (!day.success) {\n        continue;\n      }\n      for (const exercise of day.data) {\n        if (exercise.reuse?.fullName != null) {\n          result.add(exercise.reuse.fullName);\n        }\n        // A description can reuse another exercise's description (`// ...Squat`) just as sets can\n        // reuse its sets. Deleting the source leaves the dependent description as the literal text\n        // `...Squat`, which the evaluator no longer resolves and no longer complains about — so\n        // nothing downstream catches it and the author's note is simply gone.\n        if (exercise.descriptions?.reuse?.fullName != null) {\n          result.add(exercise.descriptions.reuse.fullName);\n        }\n      }\n    }\n  }\n  return result;\n}\n\n// Appends a day to one week. The grid offers this per column, so a program can deliberately have\n// weeks of different lengths; appending moves no existing slot, so nothing that points at one has\n// to be rewritten.\nexport function PlannerStructure_addDay(\n  planner: IPlannerProgram,\n  weekIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const result = ObjectUtils_clone(planner);\n  const week = result.weeks[weekIndex];\n  if (week == null) {\n    return { success: false, error: \"That week is gone.\" };\n  }\n  week.days.push({ name: `Day ${week.days.length + 1}`, exerciseText: \"\" });\n  return refuseIfWorse(planner, result, settings);\n}\n\n// Appends an empty week, named so it collides with nothing.\nexport function PlannerStructure_addWeekWithDay(\n  planner: IPlannerProgram,\n  settings: ISettings\n): IPlannerStructureResult {\n  const withWeek = PlannerStructure_addWeek(planner, settings);\n  return withWeek.success ? PlannerStructure_addDay(withWeek.data, withWeek.data.weeks.length - 1, settings) : withWeek;\n}\n\nexport function PlannerStructure_addWeek(planner: IPlannerProgram, settings: ISettings): IPlannerStructureResult {\n  const result = ObjectUtils_clone(planner);\n  result.weeks.push({ name: uniqueWeekName(planner, `Week ${result.weeks.length + 1}`), days: [] });\n  return refuseIfWorse(planner, result, settings);\n}\n\n// The weeks whose copy of this day prescribes the exercise, whether it is written there or arrives\n// by a repeat — \"where does this appear\", which is a different question from where it is authored.\nfunction weeksShowing(planner: IPlannerProgram, rowIndex: number, fullName: string, settings: ISettings): number[] {\n  const key = exerciseKey(fullName, settings);\n  return planner.weeks.reduce<number[]>(\n    (acc, _week, weekIndex) =>\n      keysPresentInDay(planner, weekIndex, rowIndex, settings).has(key) ? [...acc, weekIndex] : acc,\n    []\n  );\n}\n\n// Moves a whole day row. Every week is permuted identically, which is what keeps this a renumber\n// rather than a desync: after it, day slot N means the same thing in every week, and the qualifiers\n// that named the old positions are rewritten to the new ones.\nexport function PlannerStructure_moveDayRow(\n  planner: IPlannerProgram,\n  fromIndex: number,\n  toIndex: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  return PlannerStructure_moveDayRows(planner, [fromIndex], toIndex, settings);\n}\n\n// The same for several rows at once, which is what dragging a multi-row selection does. `insertAt`\n// counts the rows that stay, not the rows there are now — the block is lifted out before it lands,\n// so an index into the original list would mean something different depending on how many of the\n// dragged rows were above it.\nexport function PlannerStructure_moveDayRows(\n  planner: IPlannerProgram,\n  fromIndexes: number[],\n  insertAt: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const rows = planner.weeks.reduce((max, week) => Math.max(max, week.days.length), 0);\n  // Sorted, so the block keeps the order it is drawn in whichever of its rows the drag started from.\n  const moved = Array.from(new Set(fromIndexes))\n    .filter((index) => index >= 0 && index < rows)\n    .sort((a, b) => a - b);\n  const remaining = Array.from({ length: rows }, (_, i) => i).filter((index) => moved.indexOf(index) === -1);\n  const at = Math.max(0, Math.min(remaining.length, insertAt));\n  const oldOrder = [...remaining.slice(0, at), ...moved, ...remaining.slice(at)];\n  if (moved.length === 0 || oldOrder.every((oldIndex, index) => oldIndex === index)) {\n    return { success: true, data: planner };\n  }\n  const result = ObjectUtils_clone(planner);\n  // A week that lacks one of the rows keeps the days it has, compacted — so the permutation lands\n  // differently there, and a short week may not move at all. Renumbering every week's references\n  // with one global map is what silently repointed a reuse at a different day.\n  const survivorsPerWeek = result.weeks.map((week) => oldOrder.filter((oldIndex) => week.days[oldIndex] != null));\n  const mapPerWeek = survivorsPerWeek.map((survivors) => {\n    const map = new Map<number, number>();\n    survivors.forEach((oldIndex, newIndex) => map.set(oldIndex + 1, newIndex + 1));\n    return map;\n  });\n  const newDayForOldInWeek = (week: number): Map<number, number> => mapPerWeek[week - 1] ?? new Map();\n  result.weeks.forEach((week, weekIndex) => {\n    const original = week.days;\n    week.days = survivorsPerWeek[weekIndex].map((oldIndex) => original[oldIndex]);\n    for (const day of week.days) {\n      day.exerciseText = remapDayReferences(day.exerciseText, weekIndex + 1, newDayForOldInWeek);\n    }\n  });\n  return refuseIfWorse(planner, result, settings);\n}\n\nfunction remapDayReferences(\n  text: string,\n  containingWeek: number,\n  newDayForOldInWeek: (week: number) => Map<number, number>\n): string {\n  const references = dayReferences(text);\n  let result = text;\n  for (const reference of references.slice().sort((a, b) => b.node.from - a.node.from)) {\n    // `[2]` means day 2 of the week it is written in; `[1:2]` means day 2 of week 1. They renumber\n    // by different maps whenever the two weeks hold different rows.\n    const next = newDayForOldInWeek(reference.week ?? containingWeek).get(reference.day);\n    if (next != null && next !== reference.day) {\n      result = `${result.slice(0, reference.node.from)}${next}${result.slice(reference.node.to)}`;\n    }\n  }\n  return result;\n}\n\n// Which week's copy of this day actually declares the exercise: the run's own week when it holds\n// the text, otherwise the week whose repeat claims that week. Returns a 0-based index.\nfunction findAuthoringWeek(\n  planner: IPlannerProgram,\n  runStart: { week: number; dayInWeek: number },\n  fullName: string,\n  settings: ISettings\n): number | undefined {\n  const dayIndex = runStart.dayInWeek - 1;\n  const declares = (weekIndex: number): boolean => {\n    const text = planner.weeks[weekIndex]?.days[dayIndex]?.exerciseText;\n    return text != null && findExerciseLine(text, fullName) != null;\n  };\n  if (declares(runStart.week - 1)) {\n    return runStart.week - 1;\n  }\n  return planner.weeks.reduce<number | undefined>((found, _week, weekIndex) => {\n    if (found != null || !declares(weekIndex)) {\n      return found;\n    }\n    const repeat = exerciseRepeats(planner.weeks[weekIndex].days[dayIndex].exerciseText).find((r) =>\n      sameExercise(r.fullName, fullName, settings)\n    );\n    const range = repeat?.range;\n    return range != null && runStart.week >= range[0] && runStart.week <= range[1] ? weekIndex : found;\n  }, undefined);\n}\n\n// Changes how many weeks an exercise repeats for, by rewriting the `[from-to]` token on the line\n// that declares it and nothing else. The later weeks hold no text for a repeated exercise — the\n// evaluator synthesizes them from the range — so this is the whole edit: no other line moves, and a\n// week that has its own definition inside the new range stays put and reads as an override.\n//\n// What a week says about this exercise, with the repeat token taken off — two weeks that draw as\n// one strip say the same thing and differ only in the range they claim.\nfunction declaredText(text: string, fullName: string, settings: ISettings): string | undefined {\n  const block = exerciseBlocks(text).blocks.find((b) => sameExercise(b.fullName, fullName, settings));\n  return block == null ? undefined : stripRepeats(block.text).trim();\n}\n\n// Which weeks write this exercise out themselves, as opposed to inheriting it from a repeat.\nfunction weeksDeclaring(planner: IPlannerProgram, dayIndex: number, fullName: string, settings: ISettings): number[] {\n  return planner.weeks.reduce<number[]>((acc, week, weekIndex) => {\n    const text = week.days[dayIndex]?.exerciseText ?? \"\";\n    const declares = exerciseBlocks(text).blocks.some((b) => sameExercise(b.fullName, fullName, settings));\n    return declares ? [...acc, weekIndex] : acc;\n  }, []);\n}\n\n// `toWeek` equal to `runStart.week` drops the repeat entirely, leaving the exercise in its own week.\n//\n// `runStart` is where the *run* begins, which is where the grid draws the strip — not necessarily\n// where the line is written. A repeat can back-fill: `Squat[1-3]` authored in week 2 shows from\n// week 1, and week 1 holds no text for it. So the line is searched for rather than assumed, or\n// dragging that strip's edge silently does nothing.\nexport function PlannerStructure_setRepeatRange(\n  planner: IPlannerProgram,\n  runStart: { week: number; dayInWeek: number },\n  runEnd: number,\n  fullName: string,\n  toWeek: number,\n  settings: ISettings\n): IPlannerStructureResult {\n  const result = ObjectUtils_clone(planner);\n  const authored = findAuthoringWeek(result, runStart, fullName, settings);\n  const day = authored != null ? result.weeks[authored]?.days[runStart.dayInWeek - 1] : undefined;\n  if (authored == null || day == null) {\n    return { success: false, error: `Couldn't find where ${fullName} is defined.` };\n  }\n  // Identical weeks draw as one strip even when each is written out separately, and *shrinking*\n  // such a strip cannot be done by editing one line: the weeks being dragged off still write the\n  // exercise out themselves, so the strip comes back unchanged and the drag reads as having done\n  // nothing. Extending is fine — the weeks it grows over keep their own lines, which simply become\n  // overrides of the wider range.\n  //\n  // Only lines identical to the one being resized count. A week saying something different is an\n  // override, and resizing around one is exactly what this is expected to handle. The line being\n  // resized is excluded too: when it sits outside the new range it gets relocated below, which is\n  // the back-filled case rather than a second line.\n  const resized = declaredText(day.exerciseText, fullName, settings);\n  const stranded = weeksDeclaring(result, runStart.dayInWeek - 1, fullName, settings).filter((weekIndex) => {\n    const week = weekIndex + 1;\n    const droppedByShrink = week > toWeek && week <= runEnd;\n    const text = result.weeks[weekIndex].days[runStart.dayInWeek - 1]?.exerciseText ?? \"\";\n    return weekIndex !== authored && droppedByShrink && declaredText(text, fullName, settings) === resized;\n  });\n  if (stranded.length > 0) {\n    const writtenIn = [authored, ...stranded].sort((a, b) => a - b);\n    const names = writtenIn.map((weekIndex) => result.weeks[weekIndex].name).join(\", \");\n    return {\n      success: false,\n      error: `${fullName} is written out separately in ${names}, so this run can't be resized as one. Edit those weeks individually.`,\n    };\n  }\n  const text = day.exerciseText;\n  const line = findExerciseLine(text, fullName);\n  if (line == null) {\n    return { success: false, error: `Couldn't find where ${fullName} is defined.` };\n  }\n  const order = line.repeatNode != null ? orderOf(line.repeatNode, text) : undefined;\n  const parts: string[] = [];\n  if (order != null && order !== 0) {\n    parts.push(`${order}`);\n  }\n  if (toWeek > runStart.week) {\n    parts.push(`${runStart.week}-${toWeek}`);\n  }\n  const token = parts.length > 0 ? `[${parts.join(\",\")}]` : \"\";\n  const from = line.repeatNode?.from ?? line.variationsEnd;\n  const to = line.repeatNode?.to ?? line.variationsEnd;\n  day.exerciseText = `${text.slice(0, from)}${token}${text.slice(to)}`;\n\n  // Shrinking a backfilled repeat can pull the range off the week the line is written in —\n  // `Squat[1-3]` authored in week 2, dragged back to end at week 1. Rewriting the token in place\n  // would leave the exercise sitting in week 2, i.e. moving it a week to the right instead of\n  // shortening it. The line follows its own range.\n  const coversAuthored = authored + 1 >= runStart.week && authored + 1 <= Math.max(toWeek, runStart.week);\n  if (!coversAuthored) {\n    const target = result.weeks[runStart.week - 1]?.days[runStart.dayInWeek - 1];\n    const source = exerciseBlocks(day.exerciseText);\n    const index = source.blocks.findIndex((b) => sameExercise(b.fullName, fullName, settings));\n    const destination = target != null ? exerciseBlocks(target.exerciseText) : undefined;\n    // A destination that already declares the exercise is an override that owns that week; leaving\n    // the line where it is beats writing the same exercise into one day twice.\n    if (target == null || index === -1) {\n      return { success: false, error: `Couldn't move ${fullName} back to week ${runStart.week}.` };\n    }\n    if (destination == null || destination.blocks.some((b) => sameExercise(b.fullName, fullName, settings))) {\n      return {\n        success: false,\n        error: `Week ${runStart.week} already has its own ${fullName}, so this run can't shrink onto it.`,\n      };\n    }\n    const block = source.blocks[index];\n    day.exerciseText = joinBlocks(withoutBlock(source, index), day.exerciseText);\n    target.exerciseText = joinBlocks(\n      withBlockAt(destination, Math.min(index, destination.blocks.length), block),\n      target.exerciseText\n    );\n  }\n  // A range may name a week the day doesn't exist in — the text takes it, and nothing appears,\n  // because there is no day there to appear in. Extending onto nothing but those weeks changes the\n  // program without changing anything on screen, which reads as the drag having failed rather than\n  // as the program being ragged. Say so; the range is still worth writing, since the exercise turns\n  // up on its own once the day does.\n  const gained: number[] = [];\n  for (let week = runEnd + 1; week <= toWeek; week += 1) {\n    gained.push(week);\n  }\n  const dayless = gained.filter((week) => result.weeks[week - 1]?.days[runStart.dayInWeek - 1] == null);\n  const warnings =\n    gained.length > 0 && dayless.length === gained.length\n      ? [\n          `No ${day.name} in ${dayless.map((week) => result.weeks[week - 1].name).join(\", \")}, so ${fullName} won't show up there yet. The repeat runs through ${result.weeks[toWeek - 1]?.name ?? `week ${toWeek}`} - add that day and it will.`,\n        ]\n      : [];\n  return withWarnings({ success: true, data: result }, warnings);\n}\n","import { IEvaluatedProgram } from \"../../../models/program\";\nimport { IDayData, IPercentage, ISettings, IWeight } from \"../../../types\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseGlobals } from \"./types\";\nimport {\n  PlannerProgramExercise_currentDescription,\n  PlannerProgramExercise_currentEvaluatedSetVariationIndex,\n  PlannerProgramExercise_currentExerciseVariationIndex,\n  PlannerProgramExercise_currentSetVariationIndex,\n  PlannerProgramExercise_evaluatedSetsToDisplaySets,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_setsToDisplaySets,\n} from \"./plannerProgramExercise\";\nimport { IDisplaySet } from \"../../../models/set\";\nimport { Weight_print } from \"../../../models/weight\";\nimport { Progress_supersetColors } from \"../../../models/progress\";\nimport { PlannerStatsUtils_dayApproxTimeMs } from \"./plannerStatsUtils\";\n\n// Mirrors the editor's node→style mapping (liftoEditorBrain.ts:102) so a strip reads like the\n// Liftoscript it stands for, in the same colors. The view owns the mapping to actual palette\n// entries; this only says which kind of token each run of text is.\nexport type IProgramGridTokenKind = \"setPart\" | \"weight\" | \"rpe\" | \"timer\" | \"auto\" | \"reuse\" | \"separator\";\n\nexport interface IProgramGridSchemeToken {\n  text: string;\n  kind: IProgramGridTokenKind;\n  // Liftoscript marks the current set variation with a `!`; a strip has no room to spend on\n  // punctuation, so the view spells it as weight instead.\n  isCurrent?: boolean;\n}\n\n// One rung of an exercise-variation ladder, marked the same way and for the same reason.\nexport interface IProgramGridNamePart {\n  text: string;\n  isCurrent: boolean;\n}\n\n// What a run of weeks inside one strip actually runs, once a reuse has been read through to its\n// source. A reusing line's own text is week-invariant — that's why the run collapsed in the first\n// place — but the numbers behind it need not be, so this is a second run-length encoding *inside*\n// the strip: consecutive weeks that resolve alike share a section, and the common case (a reuse that\n// resolves the same every week) is one section spanning the whole strip.\nexport interface IProgramGridResolvedSection {\n  colStart: number;\n  colEnd: number;\n  tokens: IProgramGridSchemeToken[];\n}\n\nexport interface IProgramGridColumn {\n  weekIndex: number;\n  name: string;\n  description?: string;\n}\n\nexport interface IProgramGridRow {\n  rowIndex: number;\n  // Undefined where the week has no day in this row — a ragged program. `ProgramGrid_hasDay` is the\n  // question every caller actually asks.\n  namePerWeek: (string | undefined)[];\n  // Per week for the same reason the name is: a row is one slot in every week, and each week writes\n  // its own day, so the two can disagree.\n  descriptionPerWeek: (string | undefined)[];\n  // How long the day takes, by the same estimate the per-day editor prints. Per week because a\n  // repeat is not the only thing a week can hold — an override changes the sets, and so the time.\n  durationMsPerWeek: (number | undefined)[];\n}\n\nexport interface IProgramGridPlacement {\n  id: string;\n  key: string;\n  fullName: string;\n  // `fullName` with the variation ladder taken apart, which is what the strip prints. The raw name\n  // carries the `!` that marks the current rung, and printing that verbatim spends a character on\n  // something the strip can say by weight instead.\n  nameParts: IProgramGridNamePart[];\n  rowIndex: number;\n  laneIndex: number;\n  colStart: number;\n  colEnd: number;\n  // The weeks a `[from-to]` claims, which is not the same as the weeks this run covers: a run stops\n  // where the text changes, a claim doesn't. Used to tell an override from independent authoring.\n  repeatSpan?: [number, number];\n  // Which weeks hold the line or lines that produce this run — its provenance.\n  //\n  // A strip is not an editable unit: one line can draw several strips (a repeat interrupted by an\n  // override), and several identical lines can collapse into one strip. Every edit needs to know\n  // which lines the strip in front of the user actually came from, and the answer is free here,\n  // while the runs are being collapsed, but expensive and error-prone to reconstruct afterwards\n  // from week numbers alone. Reconstructing it is what every data-loss bug in this feature has had\n  // in common.\n  sourceWeeks: number[];\n  // Both are `used: none`; what separates them is whether the name resolves to a real exercise. A\n  // made-up name that exists only to be reused is a template, a real exercise switched off is\n  // unused, and `isTemplate` implies `notused`. Everything visual keys off `notused` — neither one\n  // runs — and only the word the user is shown differs.\n  notused: boolean;\n  isTemplate: boolean;\n  isReuseSource: boolean;\n  reuseOf?: string;\n  isOverride: boolean;\n  // The bare number in the `[...]` bracket, which pins this exercise's position in the day.\n  // Undefined rather than 0 — 0 is the evaluator's way of saying there was no such number.\n  order?: number;\n  // `id: tags(3, 5)`, which is how a program says \"this exercise belongs to that group\".\n  tags: number[];\n  progression?: string;\n  // The description the exercise is currently on, the way a day or a week carries its own — the\n  // strip has no room for it, so the dock is where it gets read.\n  description?: string;\n  // The color of the superset this exercise is part of, absent when it is in none — or in one whose\n  // only member it is.\n  supersetColor?: string;\n  scheme: IProgramGridSchemeToken[];\n  // What the scheme comes out as, for a line whose scheme is a `...reference` rather than numbers.\n  // Empty for everything else: an ordinary strip's scheme is already the resolved one, and printing\n  // it twice says nothing.\n  resolved: IProgramGridResolvedSection[];\n}\n\nexport interface IProgramGridError {\n  rowIndex: number;\n  weekIndex: number;\n  message: string;\n}\n\nexport interface IProgramGrid {\n  columns: IProgramGridColumn[];\n  rows: IProgramGridRow[];\n  placements: IProgramGridPlacement[];\n  errors: IProgramGridError[];\n}\n\ninterface IOpenRun {\n  placement: IProgramGridPlacement;\n  definingText: string;\n}\n\nfunction laneId(exercise: IPlannerProgramExercise, ordinal: number): string {\n  return `${exercise.key}#${ordinal}`;\n}\n\ninterface IProgramGridSetGroupPart {\n  text: string;\n  kind: IProgramGridTokenKind;\n}\n\ninterface IProgramGridSetGroup {\n  reps: string;\n  parts: IProgramGridSetGroupPart[];\n}\n\n// The order Liftoscript writes them in, which is the order they read best in whether they end up\n// next to their sets or after all of them.\nconst PART_KINDS: IProgramGridTokenKind[] = [\"weight\", \"rpe\", \"timer\", \"auto\"];\n\nfunction displaySetsToGroups(groups: IDisplaySet[][]): IProgramGridSetGroup[] {\n  return groups.reduce<IProgramGridSetGroup[]>((acc, group) => {\n    const first = group[0];\n    if (first == null) {\n      return acc;\n    }\n    const parts: IProgramGridSetGroupPart[] = [];\n    if (!first.dimWeight && first.weight != null) {\n      parts.push({ text: `${first.weight}${first.unit ?? \"\"}`, kind: \"weight\" });\n    }\n    if (first.rpe != null) {\n      parts.push({ text: `@${first.rpe}`, kind: \"rpe\" });\n    }\n    const timer = first.setTimer ?? first.timer;\n    if (timer != null) {\n      parts.push({ text: `${timer}s`, kind: \"timer\" });\n    }\n    if (first.auto) {\n      parts.push({ text: \"auto\", kind: \"auto\" });\n    }\n    return [...acc, { reps: `${group.length}x${first.reps}`, parts }];\n  }, []);\n}\n\n// A weight or a timer every group of every variation repeats is a property of the exercise rather\n// than of any one group, and that's how the program says it — `3x3 86%, 1x3+ 86% / 190s`, written\n// once after the sets. Repeating it costs the strip the width it has least of, and the repetition\n// is what buries the number that does differ. A lone group has nothing to factor out of: pulling\n// its own values behind a separator would only make it longer.\nfunction commonParts(variations: IProgramGridSetGroup[][], taken: IProgramGridTokenKind[]): IProgramGridSetGroupPart[] {\n  const groups = variations.reduce<IProgramGridSetGroup[]>((acc, v) => [...acc, ...v], []);\n  const first = groups[0];\n  if (groups.length < 2 || first == null) {\n    return [];\n  }\n  return first.parts.filter(\n    (part) =>\n      taken.indexOf(part.kind) === -1 &&\n      groups.every((group) => group.parts.some((p) => p.kind === part.kind && p.text === part.text))\n  );\n}\n\nfunction groupToTokens(group: IProgramGridSetGroup, common: IProgramGridSetGroupPart[]): IProgramGridSchemeToken[] {\n  const tokens: IProgramGridSchemeToken[] = [{ text: group.reps, kind: \"setPart\" }];\n  for (const part of group.parts) {\n    if (common.some((c) => c.kind === part.kind)) {\n      continue;\n    }\n    tokens.push({ text: \" \", kind: \"separator\" });\n    tokens.push({ text: part.text, kind: part.kind });\n  }\n  return tokens;\n}\n\n// Marked like the sets are: a global applies to whichever variation is running, so it belongs to\n// the current prescription as much as the sets it was pulled out of.\nfunction withTrailing(\n  tokens: IProgramGridSchemeToken[],\n  trailing: IProgramGridSchemeToken[]\n): IProgramGridSchemeToken[] {\n  const result = [...tokens];\n  const sorted = [...trailing].sort((a, b) => PART_KINDS.indexOf(a.kind) - PART_KINDS.indexOf(b.kind));\n  for (let i = 0; i < sorted.length; i += 1) {\n    if (result.length > 0) {\n      result.push({ text: i === 0 ? \" / \" : \" \", kind: \"separator\", isCurrent: true });\n    }\n    result.push({ ...sorted[i], isCurrent: true });\n  }\n  return result;\n}\n\nfunction variationsToTokens(\n  variations: IProgramGridSetGroup[][],\n  currentIndex: number,\n  globals: IProgramGridSchemeToken[]\n): IProgramGridSchemeToken[] {\n  const common = commonParts(\n    variations,\n    globals.map((g) => g.kind)\n  );\n  const tokens = joinVariations(\n    variations.map((groups) => joinGroups(groups.map((group) => groupToTokens(group, common)))),\n    currentIndex\n  );\n  return withTrailing(tokens, [...common, ...globals]);\n}\n\nfunction joinGroups(groups: IProgramGridSchemeToken[][]): IProgramGridSchemeToken[] {\n  const separator: IProgramGridSchemeToken = { text: \", \", kind: \"separator\" };\n  return groups.reduce<IProgramGridSchemeToken[]>(\n    (acc, group, i) => (i === 0 ? group : [...acc, separator, ...group]),\n    []\n  );\n}\n\n// Every set variation, spelled the way the program spells them — `/` between, current one marked.\n// Showing only the current one made a `5x3 / !6x2 / 10x1` exercise indistinguishable from a plain\n// `6x2` one, which is the difference between an exercise that has somewhere to go and one that\n// doesn't. The lone variation of an ordinary exercise is marked too: current is how a strip is\n// drawn, and an exercise with nothing to switch to is not a reason to draw it some other way.\nfunction joinVariations(variations: IProgramGridSchemeToken[][], currentIndex: number): IProgramGridSchemeToken[] {\n  const present = variations\n    .map((tokens, index) => ({ tokens, isCurrent: index === currentIndex }))\n    .filter((variation) => variation.tokens.length > 0);\n  const tokens: IProgramGridSchemeToken[] = [];\n  for (const variation of present) {\n    if (tokens.length > 0) {\n      tokens.push({ text: \" / \", kind: \"separator\" });\n    }\n    tokens.push(...(variation.isCurrent ? variation.tokens.map((t) => ({ ...t, isCurrent: true })) : variation.tokens));\n  }\n  return tokens;\n}\n\n// What a reusing line writes on top of what it reuses. `PlannerProgramExercise_sets` resolves a\n// reuse by letting this line's own sets and globals win over the reused ones, so those two fields\n// hold exactly the overrides — everything else came from the source and belongs in the source's\n// cells, not here.\nfunction overrideTokens(exercise: IPlannerProgramExercise, settings: ISettings): IProgramGridSchemeToken[] {\n  return variationsToTokens(\n    exercise.setVariations.map((variation) =>\n      displaySetsToGroups(PlannerProgramExercise_setsToDisplaySets(variation.sets, true, exercise.globals, settings))\n    ),\n    PlannerProgramExercise_currentSetVariationIndex(exercise),\n    globalsToTokens(exercise.globals)\n  );\n}\n\nfunction globalsToTokens(globals: IPlannerProgramExerciseGlobals): IProgramGridSchemeToken[] {\n  const tokens: IProgramGridSchemeToken[] = [];\n  if (globals.weight != null) {\n    tokens.push({ text: `${Weight_print(globals.weight)}${globals.askWeight ? \"+\" : \"\"}`, kind: \"weight\" });\n  } else if (globals.percentage != null) {\n    tokens.push({ text: `${globals.percentage}%${globals.askWeight ? \"+\" : \"\"}`, kind: \"weight\" });\n  }\n  if (globals.rpe != null) {\n    tokens.push({ text: `@${globals.rpe}${globals.logRpe ? \"+\" : \"\"}`, kind: \"rpe\" });\n  }\n  const timer = globals.setTimer ?? globals.timer;\n  if (timer != null) {\n    tokens.push({\n      text: `${timer}s${globals.setTimer != null && globals.isOverflowSetTimer ? \"+\" : \"\"}`,\n      kind: \"timer\",\n    });\n  }\n  if (globals.auto) {\n    tokens.push({ text: \"auto\", kind: \"auto\" });\n  }\n  return tokens;\n}\n\n// Evaluated sets carry the globals folded into every one of them, so there is nothing left that\n// says which values were written once — `commonParts` reads that back off the sets themselves. A\n// reuse is already resolved by this point, which is what lets a reuser print its numbers too.\nfunction evaluatedTokens(exercise: IPlannerProgramExercise, settings: ISettings): IProgramGridSchemeToken[] {\n  return variationsToTokens(\n    exercise.evaluatedSetVariations.map((variation) =>\n      displaySetsToGroups(PlannerProgramExercise_evaluatedSetsToDisplaySets(variation.sets, settings))\n    ),\n    PlannerProgramExercise_currentEvaluatedSetVariationIndex(exercise),\n    []\n  );\n}\n\nfunction schemeTokens(exercise: IPlannerProgramExercise, settings: ISettings): IProgramGridSchemeToken[] {\n  const reuse = exercise.reuse;\n  if (reuse == null) {\n    return evaluatedTokens(exercise, settings);\n  }\n  // The scheme line says what the *line* says: the reference, plus whatever this line writes over\n  // it — hiding the overrides made a line that rewrites the sets and the weight look identical to\n  // one that reuses wholesale. What it all comes out as goes on `resolved`, a line below.\n  const weekDay = reuse.week != null ? `[${reuse.week}${reuse.day != null ? `:${reuse.day}` : \"\"}]` : \"\";\n  const tokens: IProgramGridSchemeToken[] = [{ text: `...${reuse.fullName}${weekDay}`, kind: \"reuse\" }];\n  const overrides = overrideTokens(exercise, settings);\n  if (overrides.length > 0) {\n    tokens.push({ text: \" / \", kind: \"separator\" }, ...overrides);\n  }\n  return tokens;\n}\n\nfunction tokensKey(tokens: IProgramGridSchemeToken[]): string {\n  return tokens.map((token) => `${token.kind}:${token.isCurrent ? 1 : 0}:${token.text}`).join(\"|\");\n}\n\n// Adds one week of a run to the strip's resolved line, extending the last section when the numbers\n// haven't moved. A week that resolves to nothing still gets a section: the sections are laid out\n// against the week columns they cover, and a hole with no width would slide the ones after it into\n// the wrong columns.\nfunction addResolvedWeek(\n  placement: IProgramGridPlacement,\n  weekIndex: number,\n  exercise: IPlannerProgramExercise,\n  settings: ISettings\n): void {\n  if (exercise.reuse == null) {\n    return;\n  }\n  const tokens = evaluatedTokens(exercise, settings);\n  const last = placement.resolved[placement.resolved.length - 1];\n  if (last != null && tokensKey(last.tokens) === tokensKey(tokens)) {\n    last.colEnd = weekIndex;\n    return;\n  }\n  placement.resolved.push({ colStart: weekIndex, colEnd: weekIndex, tokens });\n}\n\n// Split on the `|` the grammar reserves for the ladder rather than rebuilt from `exerciseVariations`,\n// whose names are stripped of the label and equipment that `fullName` spells out — the strip should\n// print what the line says, minus the `!` that `isCurrent` already knows.\nfunction nameParts(exercise: IPlannerProgramExercise): IProgramGridNamePart[] {\n  const segments = exercise.fullName.split(\"|\");\n  if (segments.length < 2) {\n    return [{ text: exercise.fullName, isCurrent: true }];\n  }\n  const currentIndex = PlannerProgramExercise_currentExerciseVariationIndex(exercise);\n  return segments.map((segment, index) => ({\n    text: segment.replace(/^\\s*!\\s*/, \"\").trim(),\n    isCurrent: index === currentIndex,\n  }));\n}\n\n// Short enough for one line of the dock, and spelled the way the program spells it — property name\n// included, because on its own a word like \"custom\" doesn't say what it is talking about.\nfunction progressionText(exercise: IPlannerProgramExercise): string | undefined {\n  const progress = exercise.progress;\n  if (progress == null) {\n    return undefined;\n  }\n  const body = (): string => {\n    if (progress.type === \"none\") {\n      return \"none\";\n    }\n    const state = PlannerProgramExercise_getState(exercise);\n    const print = (value: unknown): string => Weight_print(value as IWeight | IPercentage);\n    if (progress.type === \"lp\") {\n      const successes = state.successes as number;\n      return `lp(${print(state.increment)}${successes > 1 ? `, ${successes}` : \"\"})`;\n    }\n    if (progress.type === \"dp\") {\n      return `dp(${print(state.increment)}, ${state.minReps}, ${state.maxReps})`;\n    }\n    if (progress.type === \"sum\") {\n      return `sum(${state.reps}, ${print(state.increment)})`;\n    }\n    const reuse = progress.reuse;\n    return reuse != null ? `custom { ...${reuse.exercise?.fullName ?? reuse.fullName} }` : \"custom\";\n  };\n  return `progress: ${body()}`;\n}\n\n// Which lanes of one day row are supersetted together, and in what color — the workout screen's\n// palette, in the workout screen's order, so a superset looks the same being read as being performed\n// (`Progress_getSupersetToColor`).\n//\n// Scoped to the row rather than the week, because a superset is a fact about a day and a lane is\n// that day's slot in every week: coloring per week would give one group a different color in each\n// column of the same row. A lane's group is read from the first week that has it, the same way the\n// row's name and description are.\n//\n// A group of one gets no color, since a line pairing an exercise with nothing says nothing — but the\n// index still advances past it, which is what keeps this in step with the workout screen.\nfunction supersetColors(\n  lanes: string[],\n  byWeek: Record<string, IPlannerProgramExercise>[]\n): Record<string, string | undefined> {\n  const groupByLane: Record<string, string> = {};\n  const order: string[] = [];\n  const laneCount: Record<string, number> = {};\n  for (const lane of lanes) {\n    const group = byWeek.map((week) => week[lane]).find((exercise) => exercise != null)?.superset?.name;\n    if (group == null) {\n      continue;\n    }\n    groupByLane[lane] = group;\n    if (order.indexOf(group) === -1) {\n      order.push(group);\n    }\n    laneCount[group] = (laneCount[group] ?? 0) + 1;\n  }\n  return lanes.reduce<Record<string, string | undefined>>((acc, lane) => {\n    const group = groupByLane[lane];\n    if (group != null && laneCount[group] > 1) {\n      acc[lane] = Progress_supersetColors[order.indexOf(group) % Progress_supersetColors.length];\n    }\n    return acc;\n  }, {});\n}\n\nfunction buildLanes(program: IEvaluatedProgram, rowIndex: number): string[] {\n  const lanes: string[] = [];\n  for (const week of program.weeks) {\n    const day = week.days[rowIndex];\n    if (day == null) {\n      continue;\n    }\n    const seenInDay: Record<string, number> = {};\n    for (const exercise of day.exercises) {\n      const ordinal = seenInDay[exercise.key] ?? 0;\n      seenInDay[exercise.key] = ordinal + 1;\n      const id = laneId(exercise, ordinal);\n      if (lanes.indexOf(id) === -1) {\n        lanes.push(id);\n      }\n    }\n  }\n  return lanes;\n}\n\nfunction exercisesByLane(\n  program: IEvaluatedProgram,\n  rowIndex: number,\n  weekIndex: number\n): Record<string, IPlannerProgramExercise> {\n  const day = program.weeks[weekIndex]?.days[rowIndex];\n  const result: Record<string, IPlannerProgramExercise> = {};\n  if (day == null) {\n    return result;\n  }\n  const seenInDay: Record<string, number> = {};\n  for (const exercise of day.exercises) {\n    const ordinal = seenInDay[exercise.key] ?? 0;\n    seenInDay[exercise.key] = ordinal + 1;\n    result[laneId(exercise, ordinal)] = exercise;\n  }\n  return result;\n}\n\nfunction collectReuseSources(program: IEvaluatedProgram): Set<string> {\n  const sources = new Set<string>();\n  for (const week of program.weeks) {\n    for (const day of week.days) {\n      for (const exercise of day.exercises) {\n        if (exercise.reuse?.fullName != null) {\n          sources.add(exercise.reuse.fullName);\n        }\n      }\n    }\n  }\n  return sources;\n}\n\nexport function ProgramGrid_build(program: IEvaluatedProgram, settings: ISettings): IProgramGrid {\n  const columns: IProgramGridColumn[] = program.weeks.map((week, weekIndex) => ({\n    weekIndex,\n    name: week.name,\n    description: week.description,\n  }));\n  const numberOfRows = program.weeks.reduce((max, week) => Math.max(max, week.days.length), 0);\n  const rows: IProgramGridRow[] = [];\n  for (let rowIndex = 0; rowIndex < numberOfRows; rowIndex += 1) {\n    rows.push({\n      rowIndex,\n      namePerWeek: program.weeks.map((week) => week.days[rowIndex]?.name),\n      descriptionPerWeek: program.weeks.map((week) => week.days[rowIndex]?.description),\n      durationMsPerWeek: program.weeks.map((week) => {\n        const day = week.days[rowIndex];\n        return day == null\n          ? undefined\n          : PlannerStatsUtils_dayApproxTimeMs(day.exercises, settings.timers.workout || 0, settings);\n      }),\n    });\n  }\n\n  const reuseSources = collectReuseSources(program);\n  const placements: IProgramGridPlacement[] = [];\n\n  for (let rowIndex = 0; rowIndex < numberOfRows; rowIndex += 1) {\n    const lanes = buildLanes(program, rowIndex);\n    const byWeek = program.weeks.map((_, weekIndex) => exercisesByLane(program, rowIndex, weekIndex));\n    const supersetColorByLane = supersetColors(lanes, byWeek);\n    lanes.forEach((lane, laneIndex) => {\n      const lanePlacements: IProgramGridPlacement[] = [];\n      let open: IOpenRun | undefined;\n      for (let weekIndex = 0; weekIndex < program.weeks.length; weekIndex += 1) {\n        const exercise = byWeek[weekIndex][lane];\n        if (exercise == null) {\n          open = undefined;\n          continue;\n        }\n        if (open != null && exercise.text === open.definingText) {\n          open.placement.colEnd = weekIndex;\n          addSourceWeek(open.placement, byWeek, lane, weekIndex, exercise);\n          addResolvedWeek(open.placement, weekIndex, exercise, settings);\n          continue;\n        }\n        const placement: IProgramGridPlacement = {\n          id: `${rowIndex}:${lane}:${weekIndex}`,\n          sourceWeeks: [],\n          key: exercise.key,\n          fullName: exercise.fullName,\n          nameParts: nameParts(exercise),\n          rowIndex,\n          laneIndex,\n          colStart: weekIndex,\n          colEnd: weekIndex,\n          repeatSpan:\n            exercise.repeating.length > 1\n              ? [Math.min(...exercise.repeating) - 1, Math.max(...exercise.repeating) - 1]\n              : undefined,\n          notused: !!exercise.notused,\n          isTemplate: !!exercise.notused && exercise.exerciseType == null,\n          isReuseSource: reuseSources.has(exercise.fullName),\n          reuseOf: exercise.reuse?.fullName,\n          isOverride: false,\n          order: exercise.order > 0 ? exercise.order : undefined,\n          tags: exercise.tags,\n          progression: progressionText(exercise),\n          description: PlannerProgramExercise_currentDescription(exercise),\n          supersetColor: supersetColorByLane[lane],\n          scheme: schemeTokens(exercise, settings),\n          resolved: [],\n        };\n        addSourceWeek(placement, byWeek, lane, weekIndex, exercise);\n        addResolvedWeek(placement, weekIndex, exercise, settings);\n        lanePlacements.push(placement);\n        open = { placement, definingText: exercise.text };\n      }\n      // An override is a run that punches into the span some repeat claims. Independently authored\n      // weeks (undulation) sit outside any claimed span and are not overrides.\n      const claimedSpans = lanePlacements.map((p) => p.repeatSpan).filter((s): s is [number, number] => s != null);\n      for (const placement of lanePlacements) {\n        placement.isOverride =\n          placement.repeatSpan == null &&\n          claimedSpans.some(([from, to]) => placement.colStart >= from && placement.colStart <= to);\n        placements.push(placement);\n      }\n    });\n  }\n\n  const errors: IProgramGridError[] = program.errors.map((error) => ({\n    rowIndex: error.dayData.dayInWeek - 1,\n    weekIndex: error.dayData.week - 1,\n    message: error.error.message,\n  }));\n\n  return { columns, rows, placements, errors };\n}\n\n// Everything below is derived from the grid rather than stored on it: a second copy of a fact is a\n// chance for the two to disagree after an edit.\n\n// Where the line behind one week of a run lives. An instance that is not a repeat holds its own\n// line; a repeat holds a copy of an earlier week's, and the one it copies is the nearest preceding\n// week with the same text that authored it — \"same text\" being what separates the line it repeats\n// from an override sitting in between.\nfunction addSourceWeek(\n  placement: IProgramGridPlacement,\n  byWeek: Record<string, IPlannerProgramExercise>[],\n  lane: string,\n  weekIndex: number,\n  exercise: IPlannerProgramExercise\n): void {\n  let source = weekIndex;\n  if (exercise.isRepeat) {\n    // Both directions: `Squat[1-2]` can be written in week 4 and fill weeks 1 and 2, so the line\n    // behind an instance is not always above it. Searching backwards only left a back-filled strip\n    // with no provenance at all, and an edit with nothing to act on reports success having done\n    // nothing.\n    source = -1;\n    for (let other = 0; other < byWeek.length; other += 1) {\n      const candidate = byWeek[other][lane];\n      if (other !== weekIndex && candidate != null && !candidate.isRepeat && candidate.text === exercise.text) {\n        source = other;\n        break;\n      }\n    }\n  }\n  if (source !== -1 && placement.sourceWeeks.indexOf(source) === -1) {\n    placement.sourceWeeks.push(source);\n  }\n}\n\n// Whether a strip has anything to print on its resolved line. A reuse can resolve to nothing — a\n// template with no prescription of its own — and that still leaves a section per week, because the\n// sections are laid against the week columns they cover and a hole with no width would slide the\n// ones after it into the wrong columns.\n//\n// The geometry asks this to decide the lane is a line taller, and the cell asks it to decide whether\n// to draw one. They must agree, so they ask the same function rather than each spelling out the\n// test: they disagreed once, and the result was a blank line in a lane with no room for it.\nexport function ProgramGrid_hasResolvedLine(placement: IProgramGridPlacement): boolean {\n  return placement.resolved.some((section) => section.tokens.length > 0);\n}\n\n// Which lanes of a day row have a resolved line to print, which is what decides how tall each one\n// is. Per lane rather than per grid: a lane is one exercise's slot in every week, and it is the\n// smallest band that can afford a third line without every other lane paying for it too. Any one\n// week claiming the line is enough, since a lane is one height across all of them.\nexport function ProgramGrid_laneResolved(grid: IProgramGrid, rowIndex: number): boolean[] {\n  const resolved: boolean[] = [];\n  for (const placement of grid.placements) {\n    if (placement.rowIndex === rowIndex) {\n      resolved[placement.laneIndex] =\n        (resolved[placement.laneIndex] ?? false) || ProgramGrid_hasResolvedLine(placement);\n    }\n  }\n  return Array.from({ length: resolved.length }, (_, i) => resolved[i] ?? false);\n}\n\nexport function ProgramGrid_hasDay(row: IProgramGridRow, weekIndex: number): boolean {\n  return row.namePerWeek[weekIndex] !== undefined;\n}\n\n// The number pinning an exercise's position, spelled the way the language writes it, to be read as\n// part of the name it follows: `Squat[1]`. Empty when there is no forced order.\n//\n// Part of the name rather than a badge beside it, because a forced order decides where the exercise\n// happens — and it is the one property that reads as nonsense on its own: \"order 3\" on the second\n// strip down is a puzzle, `Squat[3]` sitting above `Bench Press[1]` is a fact you can act on.\n//\n// Display only, and never spliced into `fullName` — that is the identity every edit matches by, and\n// it stays the name alone.\nexport function ProgramGrid_orderSuffix(placement: IProgramGridPlacement): string {\n  return placement.order == null ? \"\" : `[${placement.order}]`;\n}\n\n// Which exercise sits in each lane of a day row, by lane index. This is *identity*: it answers\n// \"what am I dragging\", so it comes from the placements rather than from the layout — geometry\n// happens to carry the same names for drawing ghosts, and a drag must not depend on that.\nexport function ProgramGrid_laneNames(grid: IProgramGrid, rowIndex: number): string[] {\n  const names: string[] = [];\n  for (const placement of grid.placements) {\n    if (placement.rowIndex === rowIndex) {\n      names[placement.laneIndex] = placement.fullName;\n    }\n  }\n  return Array.from({ length: names.length }, (_, i) => names[i] ?? \"\");\n}\n\nexport function ProgramGrid_weekDayCount(grid: IProgramGrid, weekIndex: number): number {\n  return grid.rows.filter((row) => ProgramGrid_hasDay(row, weekIndex)).length;\n}\n\n// Where this run starts, as a day coordinate. NOT necessarily where the exercise is authored: a\n// repeat that back-fills (`Squat[1-3]` written in week 2) starts in week 1, which holds no text for\n// it. Anything that needs to *edit* the line has to find the authoring day itself.\n//\n// `day` is the program-wide day counter the rest of the app uses, so it has to count the days of\n// every preceding week — including the short ones in a ragged program.\n// The week is explicit because the caller has to say which one it means: the week a strip is drawn\n// in is not always the week its line lives in.\nexport function ProgramGrid_dayDataAt(grid: IProgramGrid, rowIndex: number, weekIndex: number): Required<IDayData> {\n  let day = rowIndex + 1;\n  for (let earlier = 0; earlier < weekIndex; earlier += 1) {\n    day += ProgramGrid_weekDayCount(grid, earlier);\n  }\n  return { week: weekIndex + 1, dayInWeek: rowIndex + 1, day };\n}\n\nexport function ProgramGrid_errorAt(\n  grid: IProgramGrid,\n  rowIndex: number,\n  weekIndex: number\n): IProgramGridError | undefined {\n  return grid.errors.find((e) => e.rowIndex === rowIndex && e.weekIndex === weekIndex);\n}\n\nexport interface IProgramGridSelection {\n  selectedIds: Set<string>;\n  placements: IProgramGridPlacement[];\n  // Other runs of the same exercise — the per-week cells of an undulating definition, or the far\n  // side of a run that an override split in two.\n  sameExerciseIds: Set<string>;\n  // Reuse partners in both directions: selecting a reuser lights its source, selecting a source (or\n  // template) lights every exercise that reuses it.\n  linkedIds: Set<string>;\n}\n\nexport function ProgramGrid_select(grid: IProgramGrid, placementIds: string[]): IProgramGridSelection | undefined {\n  const selectedIds = new Set(placementIds);\n  const placements = grid.placements.filter((p) => selectedIds.has(p.id));\n  if (placements.length === 0) {\n    return undefined;\n  }\n  const sameExerciseIds = new Set<string>();\n  const linkedIds = new Set<string>();\n  for (const placement of grid.placements) {\n    if (selectedIds.has(placement.id)) {\n      continue;\n    }\n    // By key, not by name. A multi-variation exercise is spelled differently in the weeks where a\n    // different variation is active — `!Squat | Front Squat` and `Squat | !Front Squat` are one\n    // exercise with one key, and comparing names left the second one dimmed as unrelated to the\n    // first. Everything that decides identity uses the key; this was the last place that didn't.\n    if (placements.some((s) => s.key === placement.key)) {\n      sameExerciseIds.add(placement.id);\n    } else if (placements.some((s) => s.reuseOf === placement.fullName || s.fullName === placement.reuseOf)) {\n      linkedIds.add(placement.id);\n    }\n  }\n  return { selectedIds, placements, sameExerciseIds, linkedIds };\n}\n","import { IProgramGrid, IProgramGridPlacement, ProgramGrid_laneNames, ProgramGrid_laneResolved } from \"./programGrid\";\n\n// Where the grid's boxes sit, and what a pointer position means. Everything here is pure arithmetic\n// over the layout model, deliberately outside the components: every bug this file has had so far\n// (an off-by-one indicator, a gap confused for an index) lived in the few lines that decide where a\n// drag lands, and those are worth checking one gap at a time rather than only through the gesture\n// that reaches them.\n//\n// Sizes are in rem multiples, resolved against the caller's `rem` — the app's font scale slider\n// moves it, so nothing here may hardcode pixels.\nexport const GRID_BASE_COLUMN_WIDTH = 9.5;\n// Below this a column is too narrow to say anything useful with numbers, so cells shed their scheme\n// and show names only — zoomed all the way out is the whole-program structure view, not a mode.\nexport const GRID_SCHEME_MIN_WIDTH = 7.5;\nexport const GRID_LANE_HEIGHT_WITH_SCHEME = 3.25;\n// Room for a third line, for a lane whose scheme is a `...reference` and the numbers it comes out as\n// go underneath. Only the lanes that have one are this tall — which is why a geometry row carries\n// where each of its lanes starts rather than one height to multiply by.\nexport const GRID_LANE_HEIGHT_WITH_RESOLVED = 4.25;\nexport const GRID_LANE_HEIGHT_NAME_ONLY = 2;\n// Up to this many weeks, columns may divide the available width even when that makes them narrower\n// than the base. Wider programs still stretch to fill a screen with room to spare — they just never\n// shrink to do it.\nexport const GRID_WEEKS_THAT_FIT = 2;\n// A day box is inset from its column by DAY_BOX_INSET (so neighbouring boxes are separated by twice\n// that), and a strip is inset by CELL_INSET — the difference between them is the breathing room\n// *inside* the box, and BOTTOM_GAP keeps the same room under the last strip.\n//\n// BOTTOM_GAP is measured from the row's edge while the box's border sits DAY_BOX_INSET inside it,\n// so matching CELL_INSET_X leaves exactly the same gap below the last strip as beside it. It read\n// as CELL_INSET_X - DAY_BOX_INSET for a while, one pixel, which put \"+ Exercise\" on the border.\nexport const GRID_DAY_BOX_INSET = 0.1875;\nexport const GRID_CELL_INSET_X = 0.4375;\nexport const GRID_CELL_INSET_Y = 0.1875;\nexport const GRID_BOTTOM_GAP = GRID_CELL_INSET_X;\nexport const GRID_ADD_ROW_HEIGHT = 1.5;\nexport const GRID_DAY_LABEL_HEIGHT = 2;\n// The line under the day's name that says how long it takes. A collapsed row is a name and nothing\n// else, and a zoomed-out grid has already given up its numbers — so both keep the bare label.\nexport const GRID_DAY_DURATION_HEIGHT = 0.875;\n\nexport function ProgramGridGeometry_dayLabelHeight(\n  rem: number,\n  args: { isCollapsed: boolean; showScheme: boolean }\n): number {\n  const duration = !args.isCollapsed && args.showScheme ? GRID_DAY_DURATION_HEIGHT : 0;\n  return (GRID_DAY_LABEL_HEIGHT + duration) * rem;\n}\nexport const GRID_RESIZE_HANDLE_WIDTH = 1;\n// The grip is drawn a rem wide; the touch box around it is wider, because a target that narrow at\n// the edge of a strip is one fingers miss — and a miss lands on the strip, whose long press starts\n// dragging the exercise somewhere else entirely. Capped as a share of the column so a zoomed-out\n// grid doesn't hand half of every strip over to its own edge; at the narrowest column the cap is\n// still wider than the grip.\nexport const GRID_RESIZE_HANDLE_HIT_WIDTH = 2.25;\nexport const GRID_RESIZE_HANDLE_MAX_HIT_SHARE = 0.3;\nexport const GRID_MARGIN_BETWEEN_ROWS = 0.25;\n// The \"+ Week\" button is a full-height rail past the last column rather than a column-wide box, so\n// it costs the horizontal scroll almost nothing and reads as \"the grid continues this way\".\nexport const GRID_ADD_WEEK_WIDTH = 3;\n\nexport interface IGridGeometryRow {\n  top: number;\n  height: number;\n  outerHeight: number;\n  // Top of lane 0, i.e. under the day label.\n  contentTop: number;\n  // Where each lane starts, measured from `contentTop`, with one extra entry for the bottom of the\n  // last one. Lanes are not all one height — a lane with a resolved line to print is taller — so\n  // there is no step to multiply by, and this is the only place that knows where a lane sits.\n  laneTops: number[];\n  laneNames: string[];\n  isCollapsed: boolean;\n}\n\nexport function ProgramGridGeometry_laneHeight(row: IGridGeometryRow, laneIndex: number): number {\n  return row.laneTops[laneIndex + 1] - row.laneTops[laneIndex];\n}\n\n// What a lane shows and what that is worth in pixels — one value, because it is one decision. A\n// grid zoomed past the point where numbers fit has given up the resolved line along with them, so\n// both heights collapse to the bare one; splitting these across separate arguments let a caller ask\n// for lanes tall enough for a third line in a grid that prints no numbers at all.\n//\n// Only `ProgramGridGeometry_metrics` produces one.\nexport interface IGridLaneLayout {\n  // Whether a cell has room for its sets and weights, or shows the exercise name alone. It was a\n  // three-level `density` for a while, but only two levels were ever produced and only \"any or\n  // none\" was ever read.\n  showScheme: boolean;\n  plain: number;\n  resolved: number;\n}\n\nexport interface IGridMetrics {\n  columnWidth: number;\n  totalWidth: number;\n  lanes: IGridLaneLayout;\n  // What the pinch gesture should start from, which is the width actually in use rather than the\n  // one that was asked for — a program that fits the screen has no explicit scale yet.\n  scale: number;\n}\n\n// `scale` undefined means \"fit the screen if the program is short enough\", which is what lets a\n// one- or two-week program fill the width without freezing that choice the moment the user zooms.\nexport function ProgramGridGeometry_metrics(args: {\n  weekCount: number;\n  containerWidth: number;\n  scale?: number;\n  rem: number;\n}): IGridMetrics {\n  const { weekCount, containerWidth, rem } = args;\n  const base = GRID_BASE_COLUMN_WIDTH * rem;\n  // Fitting divides what is left *after* the \"+ Week\" rail, not the whole width: filling the screen\n  // edge to edge pushes the rail off it, and a button you have to scroll sideways to discover is one\n  // nobody knows the grid has.\n  //\n  // Before layout has happened there is no width to divide, and dividing zero produces a negative\n  // column for the frame before onLayout arrives.\n  const fitted = weekCount > 0 && containerWidth > 0 ? (containerWidth - GRID_ADD_WEEK_WIDTH * rem) / weekCount : base;\n  // Stretching to fill has no week limit — a wide screen showing three narrow columns against a\n  // field of nothing is the whole desktop case. *Shrinking* below the base width keeps one, because\n  // that is a phone deciding a short program is worth squeezing rather than scrolling; past that\n  // limit a program too wide to fit scrolls instead of dissolving into slivers.\n  const autoColumnWidth = weekCount <= GRID_WEEKS_THAT_FIT ? fitted : Math.max(base, fitted);\n  const columnWidth = args.scale != null ? base * args.scale : autoColumnWidth;\n  const showScheme = columnWidth >= GRID_SCHEME_MIN_WIDTH * rem;\n  return {\n    columnWidth,\n    totalWidth: columnWidth * weekCount,\n    lanes: {\n      showScheme,\n      plain: (showScheme ? GRID_LANE_HEIGHT_WITH_SCHEME : GRID_LANE_HEIGHT_NAME_ONLY) * rem,\n      // Zoomed past the point where numbers fit, the resolved line goes with the scheme it belongs\n      // to — it is more numbers, in a column that has already said it has no room for them.\n      resolved: (showScheme ? GRID_LANE_HEIGHT_WITH_RESOLVED : GRID_LANE_HEIGHT_NAME_ONLY) * rem,\n    },\n    scale: columnWidth / base,\n  };\n}\n\nexport function ProgramGridGeometry_build(\n  grid: IProgramGrid,\n  collapsedRows: number[],\n  lanes: IGridLaneLayout,\n  rem: number\n): IGridGeometryRow[] {\n  const addHeight = GRID_ADD_ROW_HEIGHT * rem;\n  let top = 0;\n  return grid.rows.map((row) => {\n    const isCollapsed = collapsedRows.indexOf(row.rowIndex) !== -1;\n    const labelHeight = ProgramGridGeometry_dayLabelHeight(rem, { isCollapsed, showScheme: lanes.showScheme });\n    // Carried for drawing — the ghosts render these. Anything deciding *which* exercise an edit is\n    // about asks the model instead, via ProgramGrid_laneNames.\n    const laneNames = ProgramGrid_laneNames(grid, row.rowIndex);\n    const resolved = ProgramGrid_laneResolved(grid, row.rowIndex);\n    const laneTops = laneNames.reduce<number[]>(\n      (acc, _, laneIndex) => [...acc, acc[laneIndex] + (resolved[laneIndex] ? lanes.resolved : lanes.plain)],\n      [0]\n    );\n    // The row is taller than its content by the box's own padding, so the last strip clears the\n    // bottom edge by the same gap it keeps from the sides.\n    const height = isCollapsed\n      ? labelHeight + GRID_BOTTOM_GAP * rem\n      : labelHeight + laneTops[laneNames.length] + addHeight + GRID_BOTTOM_GAP * rem;\n    const result: IGridGeometryRow = {\n      top,\n      height,\n      outerHeight: height + GRID_MARGIN_BETWEEN_ROWS * rem,\n      contentTop: top + labelHeight,\n      laneTops,\n      laneNames,\n      isCollapsed,\n    };\n    top += result.outerHeight;\n    return result;\n  });\n}\n\n// The gap a move lands in, counted in the list's *current* positions: gap N sits above item N, and\n// gap `count` sits below the last one. Not the destination index — an item is lifted out before it\n// lands, so moving item 0 to index 1 leaves it after item 1, and the line belongs below item 1.\nexport function ProgramGridGeometry_gapForMove(from: number, to: number): number {\n  return to === from ? -1 : to > from ? to + 1 : to;\n}\n\n// A gap is counted in the list's original positions, because that is what the drop line is drawn\n// against; an insert position is counted in what is left once the dragged items are lifted out,\n// because that is what actually performs the move.\nexport function ProgramGridGeometry_insertAtForGap(moved: number[], gap: number): number {\n  return gap - moved.filter((index) => index < gap).length;\n}\n\n// Dropping several items at once: they leave their old positions together and land together, in the\n// order they had, which is the one thing a multi-selection drag must not scramble.\nexport function ProgramGridGeometry_moveBlock<T>(items: T[], moved: number[], gap: number): T[] {\n  const sorted = moved.slice().sort((a, b) => a - b);\n  const remaining = items.filter((_, index) => sorted.indexOf(index) === -1);\n  const insertAt = Math.max(0, Math.min(remaining.length, ProgramGridGeometry_insertAtForGap(sorted, gap)));\n  return [...remaining.slice(0, insertAt), ...sorted.map((index) => items[index]), ...remaining.slice(insertAt)];\n}\n\n// Whether a drop would put the block back exactly where it was — answered by building the order it\n// would produce and comparing, because for several items at once there is no shorter honest test:\n// a gap anywhere inside a contiguous block changes nothing, and one inside a scattered selection\n// always changes something.\nexport function ProgramGridGeometry_isBlockDropNoop(count: number, moved: number[], gap: number): boolean {\n  const order = ProgramGridGeometry_moveBlock(\n    Array.from({ length: count }, (_, index) => index),\n    moved,\n    gap\n  );\n  return order.every((value, index) => value === index);\n}\n\nexport interface IGridLaneDrop {\n  toRow: number;\n  // Insert position among the target row's lanes, 0..lanes.\n  gap: number;\n}\n\n// An exercise chases the finger by its own centre, so the drop follows what you see rather than\n// where you happened to grab the strip.\nexport function ProgramGridGeometry_laneDropAt(\n  rows: IGridGeometryRow[],\n  fromRow: number,\n  fromLane: number,\n  translationY: number\n): IGridLaneDrop | undefined {\n  const source = rows[fromRow];\n  if (source == null) {\n    return undefined;\n  }\n  const y = source.contentTop + (source.laneTops[fromLane] + source.laneTops[fromLane + 1]) / 2 + translationY;\n  let toRow = 0;\n  for (let i = 0; i < rows.length; i += 1) {\n    if (y >= rows[i].top) {\n      toRow = i;\n    }\n  }\n  const target = rows[toRow];\n  // A collapsed row shows no lanes to aim between, so anything dropped on it goes to the end.\n  if (target.isCollapsed) {\n    return { toRow, gap: target.laneNames.length };\n  }\n  // How many lanes the strip's centre has drawn level with — lanes are not all one height, so, like\n  // the day rows, each is passed at its own centre rather than at a fixed step from the last. Level\n  // counts as passed, which is what keeps a drop that lands exactly on a neighbour's centre a no-op\n  // in both directions.\n  const offset = y - target.contentTop;\n  let gap = 0;\n  for (let laneIndex = 0; laneIndex < target.laneNames.length; laneIndex += 1) {\n    if ((target.laneTops[laneIndex] + target.laneTops[laneIndex + 1]) / 2 <= offset) {\n      gap = laneIndex + 1;\n    }\n  }\n  return { toRow, gap };\n}\n\n// Where a dragged block of rows lands, as a gap in the rows' own indexing: the first row it has not\n// passed the centre of. Rows have different heights, so there is no step to divide by — each\n// neighbour is passed at its own centre.\n//\n// Measured from the block's leading row — its last one going down, its first going up — and against\n// the rows that stay. Measuring from the row the finger grabbed instead would make a block behave\n// differently depending on which of its rows you took hold of, and counting its own members would\n// make it travel its whole height before anything moved.\nexport function ProgramGridGeometry_dayBlockDropAt(\n  rows: IGridGeometryRow[],\n  moved: number[],\n  translationY: number\n): number {\n  const leading = moved.reduce(\n    (acc, index) => (translationY > 0 ? Math.max(acc, index) : Math.min(acc, index)),\n    moved[0] ?? 0\n  );\n  const source = rows[leading];\n  if (source == null) {\n    return 0;\n  }\n  const center = source.top + source.outerHeight / 2 + translationY;\n  for (let i = 0; i < rows.length; i += 1) {\n    if (moved.indexOf(i) === -1 && rows[i].top + rows[i].outerHeight / 2 >= center) {\n      return i;\n    }\n  }\n  return rows.length;\n}\n\n// Columns are all one width, so unlike the day rows this is a single division.\nexport function ProgramGridGeometry_weekDropAt(\n  weekCount: number,\n  fromWeek: number,\n  translationX: number,\n  columnWidth: number\n): number {\n  return Math.max(0, Math.min(weekCount - 1, fromWeek + Math.round(translationX / columnWidth)));\n}\n\nexport interface IGridLaneSegment {\n  placement?: IProgramGridPlacement;\n  span: number;\n}\n\n// One lane across every week: a run occupies its whole span as a single segment, and the weeks it\n// doesn't reach are one-week holes.\nexport function ProgramGridGeometry_laneSegments(\n  grid: IProgramGrid,\n  rowIndex: number,\n  laneIndex: number\n): IGridLaneSegment[] {\n  const placements = grid.placements.filter((p) => p.rowIndex === rowIndex && p.laneIndex === laneIndex);\n  const result: IGridLaneSegment[] = [];\n  let weekIndex = 0;\n  while (weekIndex < grid.columns.length) {\n    const placement = placements.find((p) => p.colStart === weekIndex);\n    if (placement != null) {\n      result.push({ placement, span: placement.colEnd - placement.colStart + 1 });\n      weekIndex = placement.colEnd + 1;\n    } else {\n      result.push({ span: 1 });\n      weekIndex += 1;\n    }\n  }\n  return result;\n}\n\n// A run can never end before it starts, nor past the last week. The row being ragged doesn't\n// constrain it — a repeat simply stops at the last week that has this day.\nexport function ProgramGridGeometry_clampWeek(\n  grid: IProgramGrid,\n  placement: IProgramGridPlacement,\n  deltaWeeks: number\n): number {\n  return Math.max(placement.colStart, Math.min(grid.columns.length - 1, placement.colEnd + deltaWeeks));\n}\n\n// The other end of `clampWeek`: a run that starts in the last week is already clamped to the only\n// week it can end in, so a handle on it is a grip on nothing. Extending is the direction that runs\n// out — the lane's later weeks are free by construction, since a run that had another after it\n// wouldn't be the one carrying the handle.\nexport function ProgramGridGeometry_canResize(grid: IProgramGrid, placement: IProgramGridPlacement): boolean {\n  return placement.colStart < grid.columns.length - 1;\n}\n\n// Where the resize handle sits: the right edge of the run's card, following the preview while a\n// resize is in flight.\nexport function ProgramGridGeometry_resizeHandleLeft(args: {\n  colEnd: number;\n  columnWidth: number;\n  rem: number;\n}): number {\n  return args.columnWidth * (args.colEnd + 1) - GRID_CELL_INSET_X * args.rem - GRID_RESIZE_HANDLE_WIDTH * args.rem;\n}\n\nexport function ProgramGridGeometry_resizeHitWidth(columnWidth: number, rem: number): number {\n  return Math.min(GRID_RESIZE_HANDLE_HIT_WIDTH * rem, columnWidth * GRID_RESIZE_HANDLE_MAX_HIT_SHARE);\n}\n\n// Centred on the grip rather than starting where it does, so a wider touch box doesn't move the\n// thing it's a target for. It reaches past the run's trailing edge into the gap between strips,\n// which nothing else claims, and stops short of the next column's card.\nexport function ProgramGridGeometry_resizeHitLeft(args: { colEnd: number; columnWidth: number; rem: number }): number {\n  const gripCenter = ProgramGridGeometry_resizeHandleLeft(args) + (GRID_RESIZE_HANDLE_WIDTH * args.rem) / 2;\n  return gripCenter - ProgramGridGeometry_resizeHitWidth(args.columnWidth, args.rem) / 2;\n}\n","import { SyntaxNode, Tree } from \"@lezer/common\";\nimport { equipments, IAllCustomExercises, IEquipment, IProgramState } from \"../../types\";\nimport { equipmentName, Exercise_all, Exercise_findByName, Exercise_searchNames } from \"../../models/exercise\";\nimport { ExerciseImageUtils_exists } from \"../../models/exerciseImage\";\nimport { ObjectUtils_values } from \"../../utils/object\";\nimport { StringUtils_fuzzySearch } from \"../../utils/string\";\nimport { PlannerNodeName } from \"./plannerExerciseStyles\";\nimport { PlannerStateVars_fromArgs } from \"./models/plannerStateVars\";\nimport { liftoscriptFnSignatures, VScriptBindings, IScriptFnSignature, IScriptFnName } from \"../../liftoscriptFns\";\n\n// The completion sources, with no CodeMirror in them: CodeMirror's autocomplete pulls in\n// @codemirror/view and the DOM, and the phone's editor is a native text view driven from JS.\n// Everything the sources actually needed from CodeMirror was the text before the cursor and a\n// Lezer tree, both of which the native editor's parse cache already has.\n\nexport type ICompletionKind =\n  | \"exercise\"\n  | \"exerciseVariant\"\n  | \"reuse\"\n  | \"section\"\n  | \"progressFn\"\n  | \"stateVar\"\n  | \"liftoscript\";\n\nexport interface ICompletionOption {\n  label: string;\n  type: string;\n  detail?: string;\n  // What goes into the document. Defaults to `label`, which carries trailing punctuation for\n  // some of these (\"progress: \").\n  insert?: string;\n  // What a one-line host — the phone's suggestion strip — shows on the chip. Defaults to `label`.\n  display?: string;\n}\n\nexport interface ICompletionResult {\n  kind: ICompletionKind;\n  from: number;\n  // The text between `from` and the cursor — what the options were matched against.\n  query: string;\n  // Where the replacement ends, which is the end of the token the cursor is standing in, not the\n  // cursor itself. Accepting \"Deadlift\" with the cursor after \"Dead\" has to replace \"Deadlift\",\n  // not insert in front of the \"lift\" that's already there.\n  to: number;\n  options: ICompletionOption[];\n}\n\n// Ranking is the module's business, not a caller's: `ordered` says the options carry an order no\n// string score can recover (equipment variants are sorted by what the bare name already means),\n// and a host that re-sorted them would silently undo that. It never leaves this file — the two\n// public shapes below are each finished for the host they name.\ninterface IRankableResult extends ICompletionResult {\n  ordered?: boolean;\n}\n\n// In autocomplete the short aliases (w = weights, cr = completedReps, ...) are noise —\n// they'd pop up on almost every keystroke while saving no typing over the completion itself.\nconst bindingAliases = new Set([\"w\", \"r\", \"cr\", \"cw\", \"mr\", \"ns\"]);\n\n// CodeMirror's ensureAnchor(expr, false): wrap the source so the match has to end at the\n// cursor, leaving any leading `^` where it is.\nfunction anchorAtEnd(re: RegExp): RegExp {\n  return new RegExp(`(?:${re.source})$`, re.flags);\n}\n\n// CompletionContext.matchBefore, minus CodeMirror: match against the text from the start of the\n// line (capped 250 characters back, as CodeMirror caps it) up to the cursor.\nfunction matchBefore(text: string, pos: number, re: RegExp): { from: number; text: string } | undefined {\n  const lineStart = pos <= 0 ? 0 : text.lastIndexOf(\"\\n\", pos - 1) + 1;\n  const start = Math.max(lineStart, pos - 250);\n  const str = text.slice(start, pos);\n  const found = str.search(anchorAtEnd(re));\n  return found < 0 ? undefined : { from: start + found, text: str.slice(found) };\n}\n\n// Where the grammar says the node under the cursor ends. This is the honest answer to \"how much\n// does accepting a completion replace\": `Squat[1-12]` parses as ExerciseName[Squat] followed by a\n// separate Repeat, and only the parser knows that — a regex over the raw text either stops too\n// early or eats the repeat range with it.\nfunction nodeEndAt(tree: Tree, pos: number, name: PlannerNodeName): number | undefined {\n  let node: SyntaxNode | null = tree.resolveInner(pos, -1);\n  while (node != null && node.type.name !== name) {\n    node = node.parent;\n  }\n  return node?.to;\n}\n\n// The fallback for when the tree can't answer — a line too broken to parse mid-edit, or a token\n// the grammar gives no node of its own. `re` is matched against the text *after* the cursor, and\n// trailing whitespace is never part of the token.\nfunction tokenEnd(text: string, pos: number, re: RegExp): number {\n  const rest = text.slice(pos).match(re)?.[0] ?? \"\";\n  return pos + rest.replace(/\\s+$/, \"\").length;\n}\n\nfunction fnSignatureDetail(signature: IScriptFnSignature): string {\n  if (signature.variadic != null) {\n    return \"(...values)\";\n  }\n  return `(${(signature.args || []).map((a) => (a.optional ? `${a.name}?` : a.name)).join(\", \")})`;\n}\n\n// Building the expanded exercise list means every exercise crossed with every equipment, with\n// an image-existence check per pair — fine once, too much on every keystroke. Owned by whoever\n// is completing (the editor session) rather than living in the module, so it dies with them.\nexport class PlannerCompletionsIndex {\n  private builtinNames: string[] | undefined;\n  private builtinLabels: string[] | undefined;\n\n  // One entry per exercise, with no equipment on it. A bare name is already a complete\n  // reference — the planner resolves it to the exercise's defaultEquipment — so the suffix is\n  // only worth asking about once the user types the comma that asks for it.\n  public searchNames(query: string, customExercises: IAllCustomExercises): string[] {\n    if (this.builtinNames == null) {\n      this.builtinNames = Exercise_all({}).map((exercise) => exercise.name);\n    }\n    const needle = query.toLowerCase();\n    const customNames = ObjectUtils_values(customExercises)\n      .filter((ce) => ce != null && !ce.isDeleted)\n      .map((ce) => ce!.name);\n    const seen = new Set<string>();\n    const names: string[] = [];\n    for (const name of [...customNames, ...this.builtinNames]) {\n      const key = name.toLowerCase();\n      if (!seen.has(key) && StringUtils_fuzzySearch(needle, key)) {\n        seen.add(key);\n        names.push(name);\n      }\n    }\n    return names;\n  }\n\n  // Whole \"Name, Equipment\" labels. Only the fallback for a name the variant path can't\n  // resolve — a custom exercise with a comma of its own, say.\n  public searchLabels(query: string, customExercises: IAllCustomExercises): string[] {\n    if (this.builtinLabels == null) {\n      this.builtinLabels = Exercise_searchNames(\"\", {});\n    }\n    const needle = query.toLowerCase();\n    const labels = this.builtinLabels.filter((name) => StringUtils_fuzzySearch(needle, name.toLowerCase()));\n    const custom = Exercise_searchNames(query, customExercises).filter((name) => labels.indexOf(name) === -1);\n    return [...labels, ...custom];\n  }\n}\n\n// Custom exercises whose whole name matches what has been typed so far, commas and all.\nfunction customExerciseMatches(query: string, customExercises: IAllCustomExercises): string[] {\n  const needle = query.toLowerCase();\n  return ObjectUtils_values(customExercises)\n    .filter((ce) => ce != null && !ce.isDeleted && StringUtils_fuzzySearch(needle, ce.name.toLowerCase()))\n    .map((ce) => ce!.name);\n}\n\n// The variants of one exercise, best first: whatever the bare name already means, then the rest\n// of the catalog. undefined = not a built-in exercise name, which is the caller's cue to fall\n// back rather than to offer nothing.\nfunction exerciseVariants(\n  name: string,\n  equipmentQuery: string,\n  customExercises: IAllCustomExercises\n): ICompletionOption[] | undefined {\n  const exercise = Exercise_findByName(name, customExercises);\n  // A custom exercise is one thing under its own name; there is no equipment axis to offer.\n  if (exercise == null || exercise.defaultEquipment == null || customExercises[exercise.id] != null) {\n    return undefined;\n  }\n  const defaultEquipment = exercise.defaultEquipment;\n  // defaultEquipment goes in whether or not it has an image, unlike the rest: it is what the\n  // bare name already resolves to, so it can't be an invalid variant.\n  const ordered: IEquipment[] = [\n    defaultEquipment,\n    ...equipments.filter(\n      (equipment) =>\n        equipment !== defaultEquipment && ExerciseImageUtils_exists({ id: exercise.id, equipment }, \"small\")\n    ),\n  ];\n  const needle = equipmentQuery.toLowerCase();\n  return ordered\n    .filter((equipment) => StringUtils_fuzzySearch(needle, equipmentName(equipment).toLowerCase()))\n    .map((equipment) => ({\n      // The exercise's own name rather than what was typed, so picking a variant also fixes\n      // the casing of what came before the comma.\n      label: `${exercise.name}, ${equipmentName(equipment)}`,\n      type: \"keyword\",\n    }));\n}\n\nexport interface IPlannerCompletionsArgs {\n  customExercises?: IAllCustomExercises;\n  exerciseFullNames?: string[];\n  index?: PlannerCompletionsIndex;\n}\n\n// Every planner caller has a tree already — CodeMirror's own, or the one the parse cache just\n// built — so it is required rather than optional. What's uncertain is whether the tree has a\n// useful node at the cursor, not whether there is a tree; that's what the fallbacks are for.\ntype IPlannerCandidatesArgs = IPlannerCompletionsArgs & { tree: Tree };\n\nfunction plannerCandidates(text: string, pos: number, args: IPlannerCandidatesArgs): IRankableResult | undefined {\n  const exerciseMatch = matchBefore(text, pos, /^[^/]+/);\n  if (exerciseMatch != null) {\n    // Past a \"label:\" prefix, and then past the indentation — replacing from the raw line start\n    // would swallow the leading whitespace along with the typed name.\n    const withoutLabel = exerciseMatch.text.replace(/^[^:]*:\\s*/, \"\");\n    const query = withoutLabel.replace(/^\\s+/, \"\");\n    const from = exerciseMatch.from + (exerciseMatch.text.length - query.length);\n    const customExercises = args.customExercises || {};\n    const index = args.index ?? new PlannerCompletionsIndex();\n    // The name node, which excludes the `[1-12]` repeat that may follow it. The fallback stops at\n    // `[` for the same reason, for a line too broken to parse.\n    const to = nodeEndAt(args.tree, pos, PlannerNodeName.ExerciseName) ?? tokenEnd(text, pos, /^[^[/\\n]*/);\n    // The comma is the ask. Before it the name is the whole answer, and offering six equipment\n    // spellings of the same lift crowds out the five other lifts that might have been meant;\n    // after it the equipment is the only thing left to choose.\n    const comma = query.indexOf(\",\");\n    if (comma >= 0) {\n      const variants = exerciseVariants(query.slice(0, comma).trim(), query.slice(comma + 1).trim(), customExercises);\n      if (variants != null) {\n        // A custom exercise may itself be named with a comma — \"Bench Press, Tempo\" — and its\n        // prefix can be a built-in, so reading the comma as an equipment split would hide it for\n        // good. Both readings are legitimate here, so both are offered.\n        const customs = customExerciseMatches(query, customExercises).filter(\n          (label) => !variants.some((variant) => variant.label === label)\n        );\n        return {\n          kind: \"exerciseVariant\",\n          from,\n          query,\n          to,\n          options: [...variants, ...customs.map((label) => ({ label, type: \"keyword\" }))],\n          ordered: true,\n        };\n      }\n      return {\n        kind: \"exercise\",\n        from,\n        query,\n        to,\n        options: index.searchLabels(query, customExercises).map((label) => ({ label, type: \"keyword\" })),\n      };\n    }\n    return {\n      kind: \"exercise\",\n      from,\n      query,\n      to,\n      options: index.searchNames(query, customExercises).map((name) => ({ label: name, type: \"keyword\" })),\n    };\n  }\n\n  const reuseMatch = matchBefore(text, pos, /\\.\\.\\.[^/]*/);\n  if (reuseMatch != null) {\n    const query = reuseMatch.text.replace(\"...\", \"\");\n    // Deduped here rather than asked of every host: a day host's list comes straight from\n    // Program_getAllProgramExercises, which walks every week, so a lift used in four weeks\n    // arrives four times. Left in, the repeats fill the cap and crowd out lifts that appear\n    // once — and they collide as React keys, since a chip is keyed by its label.\n    const names = Array.from(new Set(args.exerciseFullNames || [])).filter((name) =>\n      StringUtils_fuzzySearch(query.toLowerCase(), name.toLowerCase())\n    );\n    return {\n      kind: \"reuse\",\n      from: reuseMatch.from + 3,\n      query,\n      // A reuse target nests its own ExerciseName node — `...t1` holds ExerciseName[\"t1\"] — so it\n      // stops before the `[w:d]` a sets-reuse may carry, the same way the declaration does.\n      to: nodeEndAt(args.tree, pos, PlannerNodeName.ExerciseName) ?? tokenEnd(text, pos, /^[^[/\\n]*/),\n      options: names.map((name) => ({ label: name, type: \"method\" })),\n    };\n  }\n\n  const sectionMatch = matchBefore(text, pos, /\\/\\s*\\w+$/);\n  if (sectionMatch != null) {\n    const offset = sectionMatch.text.match(/\\/\\s*/)?.[0]?.length ?? 0;\n    const query = sectionMatch.text.substring(offset);\n    return {\n      kind: \"section\",\n      from: sectionMatch.from + offset,\n      query,\n      to: tokenEnd(text, pos, /^\\w*/),\n      options: [\"progress: \"]\n        .filter((prop) => prop.startsWith(query))\n        .map((prop) => ({ label: prop, type: \"property\", display: prop.replace(\": \", \"\") })),\n    };\n  }\n\n  const propertyMatch = matchBefore(text, pos, /progress:\\s*[^(]*$/);\n  if (propertyMatch != null) {\n    const offset = propertyMatch.text.match(/progress:\\s*/)?.[0]?.length ?? 0;\n    const query = propertyMatch.text.substring(offset);\n    return {\n      kind: \"progressFn\",\n      from: propertyMatch.from + offset,\n      query,\n      to: tokenEnd(text, pos, /^\\w*/),\n      options: [\"lp\", \"sum\", \"dp\", \"custom\"]\n        .filter((fn) => fn.startsWith(query))\n        .map((fn) => ({ label: fn, type: \"function\" })),\n    };\n  }\n\n  return undefined;\n}\n\nfunction findStateInScope(tree: Tree, pos: number, source: string): IProgramState | undefined {\n  let node: SyntaxNode | null = tree.resolveInner(pos, -1);\n  while (node != null && node.type.name !== PlannerNodeName.FunctionExpression) {\n    node = node.parent;\n  }\n  if (node == null) {\n    return undefined;\n  }\n  const fnArgs = node\n    .getChildren(PlannerNodeName.FunctionArgument)\n    .map((argNode) => source.slice(argNode.from, argNode.to));\n  return PlannerStateVars_fromArgs(fnArgs).state;\n}\n\nfunction liftoscriptCandidates(\n  source: string,\n  pos: number,\n  args: { tree: Tree; state: IProgramState }\n): IRankableResult | undefined {\n  const stateVar = matchBefore(source, pos, /state\\.[a-zA-Z0-9_]*/);\n  if (stateVar != null) {\n    const query = stateVar.text.replace(/^state\\./, \"\");\n    const stateKeys = Object.keys(findStateInScope(args.tree, pos, source) || args.state);\n    return {\n      kind: \"stateVar\",\n      from: stateVar.from + \"state.\".length,\n      query,\n      to: tokenEnd(source, pos, /^[a-zA-Z0-9_]*/),\n      options: stateKeys\n        .filter((key) => key.startsWith(query))\n        .map((key) => ({ label: key, type: \"keyword liftoscript\" })),\n    };\n  }\n\n  // completeFromList bails without a word token unless the completion was asked for\n  // explicitly, and so does this — otherwise every keystroke inside a script offers the whole\n  // binding list.\n  const word = matchBefore(source, pos, /\\w+/);\n  if (word == null) {\n    return undefined;\n  }\n  const bindings = Object.keys(VScriptBindings.entries)\n    .filter((key) => !bindingAliases.has(key))\n    .map((key) => ({ label: key, type: \"keyword liftoscript\" }));\n  const fns = (Object.keys(liftoscriptFnSignatures) as IScriptFnName[]).map((name) => ({\n    label: name,\n    type: \"function liftoscript\",\n    detail: fnSignatureDetail(liftoscriptFnSignatures[name]),\n  }));\n  return {\n    kind: \"liftoscript\",\n    from: word.from,\n    query: word.text,\n    to: tokenEnd(source, pos, /^\\w*/),\n    options: [\n      { label: \"state\", type: \"keyword liftoscript\" },\n      { label: \"var\", type: \"keyword liftoscript\" },\n      ...bindings,\n      ...fns,\n    ],\n  };\n}\n\n// What LiftoEditorParseCache provides, named structurally so this module doesn't depend on the\n// native editor's brain.\nexport interface IPlannerCompletionsTrees {\n  parse(text: string): Tree;\n  parseLiftoscript(source: string): Tree;\n}\n\nfunction liftoscriptBlockAt(tree: Tree, pos: number): { from: number; to: number } | undefined {\n  let node: SyntaxNode | null = tree.resolveInner(pos, -1);\n  while (node != null && node.type.name !== PlannerNodeName.Liftoscript) {\n    node = node.parent;\n  }\n  return node != null ? { from: node.from, to: node.to } : undefined;\n}\n\n// The dispatch CodeMirror gets for free from language data at the cursor: inside a `{~ ~}` block\n// the Liftoscript source applies, outside it the planner one does.\nfunction candidatesAt(\n  text: string,\n  pos: number,\n  args: IPlannerCompletionsArgs & { cache: IPlannerCompletionsTrees; state?: IProgramState }\n): IRankableResult | undefined {\n  const tree = args.cache.parse(text);\n  const block = liftoscriptBlockAt(tree, pos);\n  if (block != null) {\n    // The planner token includes the `{~ ~}` delimiters and the Liftoscript grammar @skips\n    // them, so the raw slice parses and offsets are relative to the block's start.\n    const source = text.slice(block.from, block.to);\n    const result = liftoscriptCandidates(source, pos - block.from, {\n      tree: args.cache.parseLiftoscript(source),\n      // `custom(increment: 5lb)` is planner grammar, not Liftoscript — the args declaring the\n      // state vars sit outside the slice, so the scope is resolved against the planner tree\n      // here rather than inside. CodeMirror needs none of this: its mixed tree spans both.\n      state: args.state ?? findStateInScope(tree, pos, text) ?? {},\n    });\n    return result != null ? { ...result, from: result.from + block.from, to: result.to + block.from } : undefined;\n  }\n  return plannerCandidates(text, pos, { ...args, tree });\n}\n\n// How many chips a strip can hold before scrolling stops being worth it.\nconst HOST_LIMIT = 30;\n\n// For a host that renders the list exactly as handed over — the phone's suggestion strip.\n// Finished: dispatched, filtered, ranked, capped. There is nothing left for a caller to get\n// wrong, which is the point.\nexport function PlannerCompletions_at(\n  text: string,\n  pos: number,\n  args: IPlannerCompletionsArgs & { cache: IPlannerCompletionsTrees; state?: IProgramState }\n): ICompletionResult | undefined {\n  const result = candidatesAt(text, pos, args);\n  if (result == null) {\n    return undefined;\n  }\n  const options = result.ordered ? result.options.slice(0, HOST_LIMIT) : rank(result.options, result.query, HOST_LIMIT);\n  return options.length > 0\n    ? { kind: result.kind, from: result.from, to: result.to, query: result.query, options }\n    : undefined;\n}\n\n// For CodeMirror, which has its own fuzzy filter and scorer and re-applies them as the user\n// types — so these are candidates, deliberately unranked. Ranking here would fight CodeMirror's\n// own, and pre-filtering would hide options it expects to still have on backspace.\nexport function PlannerCompletions_codemirrorPlanner(\n  text: string,\n  pos: number,\n  args: IPlannerCandidatesArgs\n): ICompletionResult | undefined {\n  return plannerCandidates(text, pos, args);\n}\n\n// The same, for the Liftoscript language CodeMirror nests inside the planner one. `tree` is\n// CodeMirror's mixed tree, which spans both grammars, so `source` is the whole document.\nexport function PlannerCompletions_codemirrorLiftoscript(\n  source: string,\n  pos: number,\n  args: { tree: Tree; state: IProgramState }\n): ICompletionResult | undefined {\n  return liftoscriptCandidates(source, pos, args);\n}\n\nfunction matchScore(label: string, query: string): number {\n  if (query.length === 0) {\n    return 2;\n  }\n  const lower = label.toLowerCase();\n  if (lower === query) {\n    return 0;\n  }\n  if (lower.startsWith(query)) {\n    return 1;\n  }\n  if (lower.split(/[^a-z0-9]+/).some((word) => word.startsWith(query))) {\n    return 2;\n  }\n  return StringUtils_fuzzySearch(query, lower) ? 3 : 4;\n}\n\n// A strip showing five chips at a time can't afford the alphabetical order\n// Exercise_searchNames comes back in. Internal: only PlannerCompletions_at applies it, and only\n// where the options don't already carry an order of their own.\nfunction rank(options: ICompletionOption[], query: string, limit?: number): ICompletionOption[] {\n  const needle = query.trim().toLowerCase();\n  const scored = options\n    .map((option) => ({ option, score: matchScore(option.label, needle) }))\n    .filter((entry) => entry.score < 4);\n  scored.sort((a, b) => {\n    if (a.score !== b.score) {\n      return a.score - b.score;\n    }\n    if (a.option.label.length !== b.option.label.length) {\n      return a.option.label.length - b.option.label.length;\n    }\n    return a.option.label.localeCompare(b.option.label);\n  });\n  const ranked = scored.map((entry) => entry.option);\n  return limit != null ? ranked.slice(0, limit) : ranked;\n}\n","import { autocompletion, completionKeymap } from \"@codemirror/autocomplete\";\nimport { defaultKeymap, historyKeymap, history, indentWithTab } from \"@codemirror/commands\";\nimport { search, searchKeymap } from \"@codemirror/search\";\nimport { HighlightStyle, syntaxHighlighting, syntaxTree } from \"@codemirror/language\";\nimport { linter, forceLinting } from \"@codemirror/lint\";\nimport { Compartment, EditorState, Extension, RangeSet } from \"@codemirror/state\";\nimport {\n  drawSelection,\n  EditorView,\n  gutterLineClass,\n  GutterMarker,\n  highlightActiveLine,\n  highlightActiveLineGutter,\n  keymap,\n  lineNumbers,\n} from \"@codemirror/view\";\nimport { highlightSelectionMatches } from \"@codemirror/search\";\nimport { tags } from \"@lezer/highlight\";\nimport { buildPlannerExerciseLanguageSupport } from \"./plannerExerciseCodemirror\";\nimport {\n  equipmentName,\n  Exercise_findByNameAndEquipment,\n  Exercise_targetMuscles,\n  Exercise_synergistMuscles,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroups,\n} from \"../../models/exercise\";\nimport { ExerciseImageUtils_exists, ExerciseImageUtils_url } from \"../../models/exerciseImage\";\nimport { StringUtils_capitalize } from \"../../utils/string\";\nimport { TextDiff_minimalEdit } from \"../../utils/textDiff\";\nimport { IAllCustomExercises } from \"../../types\";\nimport { PlannerSyntaxError } from \"./plannerExerciseEvaluator\";\nimport { ObjectUtils_isEqual } from \"../../utils/object\";\nimport { Tailwind_semantic } from \"../../utils/tailwindConfig\";\nimport { Settings_build } from \"../../models/settings\";\nimport { Muscle_getMuscleGroupName } from \"../../models/muscle\";\n\nconst buildHighlightStyle = (): HighlightStyle => {\n  return HighlightStyle.define([\n    { tag: tags.keyword, color: Tailwind_semantic().syntax.keyword },\n    { tag: [tags.literal, tags.inserted], color: Tailwind_semantic().syntax.literal },\n    { tag: tags.variableName, color: Tailwind_semantic().syntax.variable },\n    { tag: tags.comment, color: Tailwind_semantic().syntax.comment },\n    { tag: tags.blockComment, color: Tailwind_semantic().syntax.blockComment },\n    { tag: tags.atom, color: Tailwind_semantic().syntax.atom },\n    { tag: tags.attributeName, color: Tailwind_semantic().syntax.attributeName },\n    { tag: tags.attributeValue, color: Tailwind_semantic().syntax.attributeValue },\n    { tag: tags.annotation, color: Tailwind_semantic().syntax.annotation },\n    { tag: tags.docComment, color: Tailwind_semantic().syntax.docComment },\n  ]);\n};\n\ninterface IEditorCompartments {\n  errorGutterCompartment: Compartment;\n}\n\nclass ErrorGutterMarker extends GutterMarker {\n  constructor() {\n    super();\n    this.elementClass = \"cm-errorLineGutter\";\n  }\n}\n\nfunction buildInfoLine(label: string, data: string): HTMLElement {\n  const infoContainer = document.createElement(\"div\");\n  infoContainer.classList.add(\"exercise-completion-description-info\");\n\n  const labelNode = document.createElement(\"span\");\n  labelNode.classList.add(\"exercise-completion-description-info-label\");\n  labelNode.textContent = label;\n\n  const dataNode = document.createElement(\"span\");\n  dataNode.classList.add(\"exercise-completion-description-info-data\");\n  dataNode.textContent = data;\n\n  infoContainer.appendChild(labelNode);\n  infoContainer.appendChild(dataNode);\n\n  return infoContainer;\n}\n\nfunction getEditorSetup(plannerEditor: PlannerEditor): [Extension[], IEditorCompartments] {\n  const errorGutterCompartment = new Compartment();\n  const highlightStyle = buildHighlightStyle();\n  const hasHistory = plannerEditor.args.hasHistory ?? true;\n\n  return [\n    [\n      drawSelection(),\n      autocompletion({\n        closeOnBlur: false,\n        addToOptions: [\n          {\n            render: (completion) => {\n              if (completion.type === \"keyword\") {\n                const exercise = Exercise_findByNameAndEquipment(\n                  completion.label,\n                  plannerEditor.args.customExercises || {}\n                );\n                const url =\n                  exercise && ExerciseImageUtils_exists(exercise, \"small\")\n                    ? ExerciseImageUtils_url(exercise, \"small\")\n                    : undefined;\n                if (url != null) {\n                  const element = document.createElement(\"img\");\n                  element.src = url;\n                  element.classList.add(\"exercise-image\");\n                  return element;\n                } else {\n                  const div = document.createElement(\"div\");\n                  div.classList.add(\"exercise-default-image\");\n\n                  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n                  svg.setAttribute(\"width\", \"32\");\n                  svg.setAttribute(\"height\", \"32\");\n                  svg.setAttribute(\"viewBox\", \"0 0 64 64\");\n                  svg.setAttribute(\"fill\", \"none\");\n\n                  const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n                  rect.setAttribute(\"width\", \"64\");\n                  rect.setAttribute(\"height\", \"64\");\n                  rect.setAttribute(\"rx\", \"16\");\n                  rect.setAttribute(\"fill\", \"#D9D9D9\");\n\n                  const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n                  path.setAttribute(\"fill-rule\", \"evenodd\");\n                  path.setAttribute(\"clip-rule\", \"evenodd\");\n                  path.setAttribute(\"fill\", \"#BCBCBC\");\n                  path.setAttribute(\n                    \"d\",\n                    \"M25.5716 14.9039C24.7645 15.1393 23.9687 15.4203 23.1866 15.7469L23.1757 15.7515C22.5413 16.0162 22.1752 16.6773 22.2922 17.3471L23.4988 24.2642C23.589 24.7813 23.3914 25.3056 22.9838 25.6432C19.9371 28.1663 18 31.952 18 36.1839C18 44.6348 25.725 51.3062 34.5875 49.6987C40.2007 48.6802 44.6108 44.3261 45.6397 38.7873C46.6168 33.5285 44.5595 28.6763 40.9008 25.6451C40.4923 25.3066 40.2931 24.7825 40.3834 24.264L41.5883 17.3588C41.7061 16.6822 41.3366 16.0141 40.6953 15.7469C39.9132 15.4203 39.1174 15.1393 38.3106 14.9039C36.2521 14.3032 34.1188 14 31.941 14C29.7637 14 27.6301 14.3032 25.5716 14.9039ZM26.4243 19.7917C26.2912 19.0293 26.7795 18.2932 27.5418 18.1127C28.9733 17.7739 30.4446 17.6032 31.941 17.6032C33.4378 17.6032 34.9088 17.7739 36.3404 18.1127C37.1026 18.2932 37.591 19.0293 37.4576 19.7917L36.8452 23.3044C35.3197 22.7381 33.6668 22.4286 31.941 22.4286C30.2152 22.4286 28.5624 22.7381 27.037 23.3044L26.4243 19.7917Z\"\n                  );\n\n                  div.appendChild(svg);\n                  svg.appendChild(rect);\n                  svg.appendChild(path);\n\n                  return div;\n                }\n              } else {\n                const div = document.createElement(\"div\");\n                return div;\n              }\n            },\n            position: 10,\n          },\n          {\n            render: (completion) => {\n              if (completion.type === \"keyword\") {\n                const customExercises = plannerEditor.args.customExercises || {};\n                const settings = { ...Settings_build(), exercises: customExercises };\n                const exercise = Exercise_findByNameAndEquipment(completion.label, customExercises);\n                if (exercise == null) {\n                  return document.createElement(\"span\");\n                }\n                const container = document.createElement(\"div\");\n                container.classList.add(\"exercise-completion\");\n\n                const title = document.createElement(\"div\");\n                title.classList.add(\"exercise-completion-title\");\n                title.textContent = `${exercise.name}${\n                  exercise.equipment ? `, ${equipmentName(exercise.equipment)}` : \"\"\n                }`;\n\n                const description = document.createElement(\"div\");\n                description.classList.add(\"exercise-completion-description\");\n\n                const targetMuscles = Exercise_targetMuscles(exercise, settings);\n                const targetMusclesNode = buildInfoLine(\"Target Muscles: \", targetMuscles.join(\", \"));\n\n                const synergistMuscles = Exercise_synergistMuscles(exercise, settings);\n                const synergistMusclesNode = buildInfoLine(\"Synergist Muscles: \", synergistMuscles.join(\", \"));\n\n                const targetMuscleGroups = Exercise_targetMusclesGroups(exercise, settings).map((w) =>\n                  Muscle_getMuscleGroupName(w, settings)\n                );\n                const targetMuscleGroupsNode = buildInfoLine(\"Target Muscle Groups: \", targetMuscleGroups.join(\", \"));\n                targetMuscleGroupsNode.style.marginTop = \"0.25rem\";\n\n                const synergistMuscleGroupsNode = buildInfoLine(\n                  \"Synergist Muscle Groups: \",\n                  Exercise_synergistMusclesGroups(exercise, settings)\n                    .map((w) => Muscle_getMuscleGroupName(w, settings))\n                    .filter((w) => targetMuscleGroups.indexOf(w) === -1)\n                    .join(\", \")\n                );\n\n                const types = buildInfoLine(\"Types: \", exercise.types.map((w) => StringUtils_capitalize(w)).join(\", \"));\n                types.style.marginTop = \"0.25rem\";\n\n                container.appendChild(title);\n                container.appendChild(description);\n                description.appendChild(targetMusclesNode);\n                description.appendChild(synergistMusclesNode);\n                description.appendChild(targetMuscleGroupsNode);\n                description.appendChild(synergistMuscleGroupsNode);\n                description.appendChild(types);\n\n                return container;\n              } else if (completion.type === \"property\") {\n                const container = document.createElement(\"div\");\n                container.classList.add(\"property-completion\");\n                const title = document.createElement(\"div\");\n                title.classList.add(\"property-completion-title\");\n                title.textContent = completion.label.replace(\": \", \"\");\n\n                const description = document.createElement(\"div\");\n                description.classList.add(\"property-completion-description\");\n                if (completion.label === \"progress: \") {\n                  description.textContent =\n                    \"Specifies progressive overload for the exercise. You can specify linear progression, double progression, etc.\";\n                }\n\n                container.appendChild(title);\n                container.appendChild(description);\n                return container;\n              } else if (completion.type === \"method\") {\n                const container = document.createElement(\"div\");\n                container.classList.add(\"equipment-completion\");\n                const title = document.createElement(\"div\");\n                title.classList.add(\"equipment-completion-title\");\n                title.textContent = completion.label;\n                container.appendChild(title);\n                return container;\n              } else if (completion.type === \"function\") {\n                const container = document.createElement(\"div\");\n                container.classList.add(\"function-completion\");\n                const title = document.createElement(\"div\");\n                title.classList.add(\"function-completion-title\");\n                title.textContent = completion.label.replace(\": \", \"\");\n\n                const description = document.createElement(\"div\");\n                description.classList.add(\"function-completion-description\");\n                if (completion.label === \"lp\") {\n                  description.innerHTML =\n                    \"<p><strong>Linear Progression</strong>. You can set up increments, decrements and successful/unsuccessful attempts before incrementing or decrementing.</p>\" +\n                    \"<p>For example:</p>\" +\n                    \"<ul>\" +\n                    \"<li><strong><code>lp(5lb)</code></strong> - increment by 5lb if you hit all the required reps</li>\" +\n                    \"<li><strong><code>lp(5lb, 3)</code></strong> - increment by 5lb if you hit all the required reps 3 times</li>\" +\n                    \"<li><strong><code>lp(5lb, 3, 1)</code></strong> - increment by 5lb if you hit all the required reps 3 times, and start with 1 success</li>\" +\n                    \"<li><strong><code>lp(5lb, 3, 0, 10%, 1)</code></strong> - increment by 5lb after 3 times, and decrement by 10% of 1RM if you didn't hit all the required reps.</li>\" +\n                    \"<li><strong><code>lp(5lb, 2, 0, 15lb, 4, 0)</code></strong> - increment by 5lb after 2 times, and decrement by 15lb after 4 times</li>\" +\n                    \"</ul>\" +\n                    \"<p>You can use lb or kg units, and also percentages (%)</p>\";\n                } else if (completion.label === \"sum\") {\n                  description.innerHTML =\n                    \"<p><strong>Reps Sum Progression</strong>. Increases weight when hit a total sum or reps from all sets</p>\" +\n                    \"<p>For example:</p>\" +\n                    \"<ul>\" +\n                    \"<li><strong><code>sum(30, 5lb)</code></strong> - increment by 5lb if hit 30 or more reps across all sets</li>\" +\n                    \"<li><strong><code>sum(40, 10%)</code></strong> - increment by 10% if hit 40 or more reps across all sets</li>\" +\n                    \"</ul>\" +\n                    \"<p>You can use lb or kg units, and also percentages (%)</p>\";\n                } else if (completion.label === \"dp\") {\n                  description.innerHTML =\n                    \"<p><strong>Double Progression</strong>. Increases reps within a range, and after that resets the reps and increase weight.</p>\" +\n                    \"<p>For example:</p>\" +\n                    \"<ul>\" +\n                    \"<li><strong><code>dp(5lb, 8, 12)</code></strong> - It'll keep adding reps if you hit all required reps, until it adds 4 max (from 8 to 12), then it resets to the initial reps and adds 5lb</li>.\" +\n                    \"</ul>\" +\n                    \"<p>You can use lb or kg units, and also percentages (%)</p>\";\n                }\n                container.appendChild(title);\n                container.appendChild(description);\n                return container;\n              } else {\n                return document.createElement(\"span\");\n              }\n            },\n            position: 60,\n          },\n        ],\n      }),\n      ...(plannerEditor.args.lineNumbers\n        ? [\n            lineNumbers(),\n            highlightActiveLine(),\n            highlightActiveLineGutter(),\n            errorGutterCompartment.of([]),\n            ...(hasHistory ? [history()] : []),\n          ]\n        : []),\n      syntaxHighlighting(highlightStyle),\n      highlightSelectionMatches(),\n      linter(\n        (view) => {\n          const { state } = view;\n          const tree = syntaxTree(state);\n          if (tree.length === state.doc.length) {\n            let from: number | undefined = undefined;\n            let to: number | undefined = undefined;\n            tree.iterate({\n              enter: (n) => {\n                if (from == null && n.type.isError) {\n                  from = n.from;\n                  to = n.to;\n                  return false;\n                }\n                return;\n              },\n            });\n\n            if (from != null && to != null && state.doc.length >= to) {\n              return [{ from: from, to: to, severity: \"error\", message: \"Syntax Error\" }];\n            }\n          }\n\n          const error = plannerEditor.args.error;\n          if (error != null && state.doc.length >= error.to) {\n            return [{ from: error.from, to: error.to, severity: \"error\", message: error.message }];\n          }\n\n          return [];\n        },\n        {\n          needsRefresh: (update) => {\n            if (plannerEditor.requireLint) {\n              plannerEditor.requireLint = false;\n              return true;\n            }\n            return false;\n          },\n        }\n      ),\n      search({\n        top: true,\n      }),\n      EditorState.allowMultipleSelections.of(true),\n      keymap.of([\n        ...defaultKeymap,\n        ...(hasHistory ? historyKeymap : []),\n        ...completionKeymap,\n        ...searchKeymap,\n        indentWithTab,\n      ]),\n    ],\n    { errorGutterCompartment },\n  ];\n}\n\ninterface IArgs {\n  onChange?: (newValue: string) => void;\n  onLineChange?: (newValue: number) => void;\n  onCaretChange?: (top: number, bottom: number) => void;\n  onBlur?: (event: FocusEvent, newValue: string) => void;\n  value?: string;\n  customExercises?: IAllCustomExercises;\n  exerciseFullNames?: string[];\n  height?: number;\n  error?: PlannerSyntaxError;\n  lineNumbers?: boolean;\n  hasHistory?: boolean;\n}\n\nexport class PlannerEditor {\n  public readonly args: IArgs;\n  private codeMirror?: EditorView;\n  private compartments?: IEditorCompartments;\n  public requireLint: boolean = false;\n\n  constructor(args: IArgs = {}) {\n    this.args = args;\n  }\n\n  public setValue(value: string): void {\n    const view = this.codeMirror;\n    const edit = view != null ? TextDiff_minimalEdit(view.state.doc.toString(), value) : undefined;\n    if (view != null && edit != null) {\n      view.dispatch({\n        changes: { from: edit.start, to: edit.end, insert: edit.text },\n        selection: { anchor: edit.start + edit.text.length },\n        scrollIntoView: view.hasFocus,\n      });\n    }\n  }\n\n  public destroy(): void {\n    this.codeMirror?.destroy();\n    this.codeMirror = undefined;\n  }\n\n  public setCustomExercises(customExercises: IAllCustomExercises): void {\n    this.args.customExercises = customExercises;\n    this.relint();\n  }\n\n  public setExerciseFullNames(names: string[]): void {\n    const changed = !ObjectUtils_isEqual({ arr: names }, { arr: this.args.exerciseFullNames });\n    if (changed) {\n      this.args.exerciseFullNames = names;\n      this.relint();\n    }\n  }\n\n  public setError(error?: PlannerSyntaxError): void {\n    this.args.error = error;\n    this.relint();\n  }\n\n  private relint(): void {\n    if (this.codeMirror && this.compartments) {\n      const errorGutterCompartment = this.compartments.errorGutterCompartment;\n      this.requireLint = true;\n      forceLinting(this.codeMirror);\n      const from = this.args.error?.from;\n      try {\n        const line = from != null ? this.codeMirror.state.doc.lineAt(from).from : undefined;\n        const rangeSet = RangeSet.of(line != null ? [new ErrorGutterMarker().range(line)] : []);\n        this.codeMirror.dispatch({\n          effects: errorGutterCompartment.reconfigure(gutterLineClass.of(rangeSet)),\n        });\n      } catch (e) {\n        console.error(e);\n      }\n    }\n  }\n\n  public attach(container: HTMLElement): void {\n    const updateFacet = EditorView.updateListener.of((update) => {\n      const state = update.state;\n      const line = state.doc.lineAt(state.selection.main.head);\n      if (update.view.hasFocus && this.args.onLineChange) {\n        this.args.onLineChange(line.number);\n      }\n      if (update.view.hasFocus && this.args.onCaretChange) {\n        const coords = update.view.coordsAtPos(state.selection.main.head);\n        if (coords) {\n          this.args.onCaretChange(coords.top, coords.bottom);\n        }\n      }\n      if (update.docChanged && this.args.onChange) {\n        this.args.onChange(update.state.doc.toString());\n      }\n    });\n\n    const language = buildPlannerExerciseLanguageSupport(this);\n\n    const eventHandlers = EditorView.domEventHandlers({\n      blur: (e, view) => {\n        if (this.args.onBlur) {\n          this.args.onBlur(e, view.state.doc.toString());\n        }\n      },\n    });\n\n    const [extensions, compartments] = getEditorSetup(this);\n    this.compartments = compartments;\n    const editorState = EditorState.create({\n      doc: this.args.value || \"\",\n      extensions: [keymap.of(defaultKeymap), extensions, updateFacet, language, eventHandlers],\n    });\n\n    const codemirror = new EditorView({\n      state: editorState,\n      parent: container,\n    });\n    this.codeMirror = codemirror;\n  }\n}\n","import { IPlannerProgram, ISettings, IDayData, IPlannerProgramDay } from \"../../types\";\nimport { parser as plannerExerciseParser } from \"./plannerExerciseParser\";\nimport memoize from \"micro-memoize\";\nimport {\n  IPlannerEvalFullResult,\n  IPlannerEvalResult,\n  IPlannerSyntaxPointer,\n  PlannerExerciseEvaluator,\n  PlannerSyntaxError,\n} from \"./plannerExerciseEvaluator\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseWarmupSet,\n  IPlannerProgramReuse,\n  IProgramExerciseProgress,\n  IProgramExerciseUpdate,\n  IProgramExerciseDescriptions,\n} from \"./models/types\";\nimport { PlannerKey_fromFullName, PlannerKey_fromPlannerExercise } from \"./plannerKey\";\nimport { ObjectUtils_isEqual, ObjectUtils_clone, ObjectUtils_keys, ObjectUtils_values } from \"../../utils/object\";\nimport { Weight_type } from \"../../models/weight\";\nimport { PlannerProgram_fullToWeekEvalResult, PlannerProgram_generateFullText } from \"./models/plannerProgram\";\nimport { ScriptRunner } from \"../../parser\";\nimport { Progress_createEmptyScriptBindings, Progress_createScriptFunctions } from \"../../models/progress\";\nimport { LiftoscriptSyntaxError } from \"../../liftoscriptEvaluator\";\nimport type { IPlannerReuseSection } from \"../../syntaxErrorTypes\";\nimport {\n  PlannerProgramExercise_setVariations,\n  PlannerProgramExercise_evaluateSetVariations,\n  PlannerProgramExercise_getExercise,\n  PlannerProgramExercise_getState,\n  PlannerProgramExercise_getProgressScript,\n  PlannerProgramExercise_getUpdateScript,\n  PlannerProgramExercise_buildDpRangeScript,\n} from \"./models/plannerProgramExercise\";\n\nexport type IByTag<T> = Record<number, T>;\nexport type IByExercise<T> = Record<string, T>;\nexport type IByExerciseWeekDay<T> = Record<string, Record<number, Record<number, T>>>;\nexport type IByWeekDayExercise<T> = Record<number, Record<number, Record<string, T>>>;\n\ninterface IPlannerEvalMetadata {\n  byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>;\n  byWeekDayExercise: IByWeekDayExercise<IPlannerProgramExercise>;\n  fullNames: Set<string>;\n  notused: Set<string>;\n  properties: {\n    id: IByExercise<{ property: number[]; dayData: Required<IDayData> }>;\n    progress: IByExercise<{ property: IProgramExerciseProgress; dayData: Required<IDayData> }>;\n    update: IByExercise<{ property: IProgramExerciseUpdate; dayData: Required<IDayData> }>;\n    warmup: IByExercise<{ warmupSets: IPlannerProgramExerciseWarmupSet[]; dayData: Required<IDayData> }>;\n  };\n}\n\nexport function PlannerEvaluator_getFirstError(evaluatedWeeks: IPlannerEvalResult[][]): PlannerSyntaxError | undefined {\n  let error: PlannerSyntaxError | undefined;\n  for (const week of evaluatedWeeks) {\n    for (const day of week) {\n      if (!day.success) {\n        error = day.error;\n      }\n    }\n  }\n  return error;\n}\n\nexport function PlannerEvaluator_fillInMetadata(\n  exercise: IPlannerProgramExercise,\n  metadata: IPlannerEvalMetadata,\n  dayData: Required<IDayData>\n): void {\n  if (exercise.progress?.type === \"dp\") {\n    const hasRange = exercise.setVariations.some((sv) => sv.sets.some((s) => s.repRange?.minrep != null));\n    if (hasRange) {\n      exercise.progress = { ...exercise.progress, script: PlannerProgramExercise_buildDpRangeScript() };\n    }\n  }\n  if (metadata.byWeekDayExercise[dayData.week - 1]?.[dayData.dayInWeek - 1]?.[exercise.key] != null) {\n    throw PlannerSyntaxError.fromPoint(\n      exercise.fullName,\n      `Another exercise with the same name is already used in this day. Combine them together, or add a label to separate out.`,\n      exercise.points.fullName,\n      { type: \"duplicateExerciseInDay\", data: { key: exercise.key } }\n    );\n  }\n  const tagsProp = exercise.tags;\n  if (tagsProp != null && tagsProp.length > 0) {\n    const existingTags = metadata.properties.id[exercise.key];\n    if (existingTags != null && !ObjectUtils_isEqual(existingTags.property, tagsProp)) {\n      const point = exercise.points.idPoint || exercise.points.fullName;\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Same property 'id' is specified with different arguments in multiple weeks/days for exercise '${exercise.name}': both in ` +\n          `week ${existingTags.dayData.week + 1}, day ${existingTags.dayData.dayInWeek + 1} ` +\n          `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n        point,\n        {\n          type: \"conflictingProperty\",\n          data: { property: \"id\", exercise: exercise.name, a: existingTags.dayData, b: dayData },\n        }\n      );\n    }\n    metadata.properties.id[exercise.key] = {\n      property: tagsProp,\n      dayData,\n    };\n  }\n\n  const progressProp = exercise.progress;\n  if (progressProp != null && progressProp.type !== \"none\") {\n    const existingProgress = metadata.properties.progress[exercise.key];\n    if (\n      existingProgress != null &&\n      !PlannerExerciseEvaluator.isEqualProgress(progressProp, existingProgress.property)\n    ) {\n      const point = exercise.points.progressPoint || exercise.points.fullName;\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Same property 'progress' is specified with different arguments in multiple weeks/days for exercise '${exercise.name}': both in ` +\n          `week ${existingProgress.dayData.week + 1}, day ${existingProgress.dayData.dayInWeek + 1} ` +\n          `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n        point,\n        {\n          type: \"conflictingProperty\",\n          data: { property: \"progress\", exercise: exercise.name, a: existingProgress.dayData, b: dayData },\n        }\n      );\n    }\n    metadata.properties.progress[exercise.key] = {\n      property: progressProp,\n      dayData,\n    };\n  }\n\n  const updateProp = exercise.update;\n  if (updateProp != null) {\n    const existingUpdate = metadata.properties.update[exercise.key];\n    if (existingUpdate != null && !PlannerExerciseEvaluator.isEqualUpdate(updateProp, existingUpdate.property)) {\n      const point = exercise.points.updatePoint || exercise.points.fullName;\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Same property 'update' is specified with different arguments in multiple weeks/days for exercise '${exercise.name}': both in ` +\n          `week ${existingUpdate.dayData.week + 1}, day ${existingUpdate.dayData.dayInWeek + 1} ` +\n          `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n        point,\n        {\n          type: \"conflictingProperty\",\n          data: { property: \"update\", exercise: exercise.name, a: existingUpdate.dayData, b: dayData },\n        }\n      );\n    }\n    metadata.properties.update[exercise.key] = {\n      property: updateProp,\n      dayData,\n    };\n  }\n  if (exercise.notused) {\n    metadata.notused.add(exercise.key);\n  }\n  if (exercise.warmupSets != null) {\n    const scheme = JSON.stringify(exercise.warmupSets);\n    const ws = metadata.properties.warmup[exercise.key];\n    if (ws != null && JSON.stringify(ws.warmupSets) !== scheme) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Different warmup sets are specified in multiple weeks/days for exercise '${exercise.name}': both in ` +\n          `week ${ws.dayData.week + 1}, day ${ws.dayData.dayInWeek + 1} ` +\n          `and week ${dayData.week}, day ${dayData.dayInWeek}`,\n        exercise.points.warmupPoint || exercise.points.fullName,\n        {\n          type: \"conflictingProperty\",\n          data: { property: \"warmup\", exercise: exercise.name, a: ws.dayData, b: dayData },\n        }\n      );\n    }\n    metadata.properties.warmup[exercise.key] = {\n      warmupSets: exercise.warmupSets,\n      dayData,\n    };\n  }\n  PlannerEvaluator_setByWeekDayExercise(\n    metadata.byWeekDayExercise,\n    exercise.key,\n    dayData.week - 1,\n    dayData.dayInWeek - 1,\n    exercise\n  );\n  PlannerEvaluator_setByExerciseWeekDay(\n    metadata.byExerciseWeekDay,\n    exercise.key,\n    dayData.week - 1,\n    dayData.dayInWeek - 1,\n    exercise\n  );\n  metadata.fullNames.add(exercise.fullName);\n}\n\nexport function PlannerEvaluator_evaluateDay(\n  day: IPlannerProgramDay,\n  dayData: Required<IDayData>,\n  settings: ISettings\n): IPlannerEvalResult {\n  const tree = plannerExerciseParser.parse(day.exerciseText);\n  const evaluator = new PlannerExerciseEvaluator(day.exerciseText, settings, \"perday\", dayData);\n  const result = evaluator.evaluate(tree.topNode);\n  if (result.success) {\n    const exercises = result.data[0]?.days[0]?.exercises || [];\n    return { success: true, data: exercises };\n  } else {\n    return result;\n  }\n}\n\nexport function PlannerEvaluator_getPerDayEvaluatedWeeks(\n  plannerProgram: IPlannerProgram,\n  settings: ISettings\n): {\n  evaluatedWeeks: IPlannerEvalResult[][];\n  metadata: IPlannerEvalMetadata;\n} {\n  let dayIndex = 0;\n  const metadata: IPlannerEvalMetadata = {\n    byExerciseWeekDay: {},\n    byWeekDayExercise: {},\n    fullNames: new Set(),\n    notused: new Set(),\n    properties: { progress: {}, update: {}, warmup: {}, id: {} },\n  };\n  const evaluatedWeeks: IPlannerEvalResult[][] = plannerProgram.weeks.map((week, weekIndex) => {\n    return week.days.map((day, dayInWeekIndex) => {\n      const dayData = {\n        week: weekIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n        day: dayIndex + 1,\n      };\n      const result = PlannerEvaluator_evaluateDay(\n        day,\n        { week: weekIndex + 1, dayInWeek: dayInWeekIndex + 1, day: dayIndex + 1 },\n        settings\n      );\n      dayIndex += 1;\n      if (result.success) {\n        const exercises = result.data;\n        for (const exercise of exercises) {\n          try {\n            PlannerEvaluator_fillInMetadata(exercise, metadata, dayData);\n          } catch (e) {\n            if (e instanceof PlannerSyntaxError) {\n              return { success: false, error: e };\n            } else {\n              throw e;\n            }\n          }\n        }\n        return { success: true, data: exercises };\n      } else {\n        return result;\n      }\n    });\n  });\n  return { evaluatedWeeks, metadata };\n}\n\nexport function PlannerEvaluator_changeExerciseName(\n  text: string,\n  from: string,\n  to: string,\n  settings: ISettings\n): string {\n  const evaluator = new PlannerExerciseEvaluator(text, settings, \"perday\");\n  const tree = plannerExerciseParser.parse(text);\n  const result = evaluator.changeExerciseName(tree.topNode, from, to);\n  return result;\n}\n\nexport function PlannerEvaluator_getFullEvaluatedWeeks(\n  fullProgramText: string,\n  settings: ISettings\n): {\n  evaluatedWeeks: IPlannerEvalFullResult;\n  metadata: IPlannerEvalMetadata;\n} {\n  let dayIndex = 0;\n  const metadata: IPlannerEvalMetadata = {\n    byExerciseWeekDay: {},\n    byWeekDayExercise: {},\n    fullNames: new Set(),\n    notused: new Set(),\n    properties: { progress: {}, update: {}, warmup: {}, id: {} },\n  };\n  const evaluator = new PlannerExerciseEvaluator(fullProgramText, settings, \"full\");\n  const tree = plannerExerciseParser.parse(fullProgramText);\n  const result = evaluator.evaluate(tree.topNode);\n  if (result.success) {\n    try {\n      for (let weekIndex = 0; weekIndex < result.data.length; weekIndex += 1) {\n        const week = result.data[weekIndex];\n        for (let dayInWeekIndex = 0; dayInWeekIndex < week.days.length; dayInWeekIndex += 1) {\n          const day = week.days[dayInWeekIndex];\n          const exercises = day.exercises;\n          for (const exercise of exercises) {\n            const dayData = { week: weekIndex + 1, dayInWeek: dayInWeekIndex + 1, day: dayIndex + 1 };\n            PlannerEvaluator_fillInMetadata(exercise, metadata, dayData);\n          }\n          dayIndex += 1;\n        }\n      }\n    } catch (e) {\n      if (e instanceof PlannerSyntaxError) {\n        return { evaluatedWeeks: { success: false, error: e }, metadata };\n      } else {\n        throw e;\n      }\n    }\n    return { evaluatedWeeks: result, metadata };\n  } else {\n    return { evaluatedWeeks: result, metadata };\n  }\n}\n\nexport function PlannerEvaluator_getDayIndexFromWeekAndDayInWeekIndex(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  weekIndex: number,\n  dayInWeekIndex: number\n): number | undefined {\n  let dayIndex = 0;\n  for (let i = 0; i < evaluatedWeeks.length; i += 1) {\n    const week = evaluatedWeeks[i];\n    for (let j = 0; j < week.length; j += 1) {\n      if (i === weekIndex && j === dayInWeekIndex) {\n        return dayIndex;\n      }\n      dayIndex += 1;\n    }\n  }\n  return undefined;\n}\n\nexport function PlannerEvaluator_fillRepeats(\n  exercise: IPlannerProgramExercise,\n  evaluatedWeeks: IPlannerEvalResult[][],\n  dayInWeekIndex: number,\n  byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>\n): void {\n  for (const repeatWeek of exercise.repeat ?? []) {\n    const repeatWeekIndex = repeatWeek - 1;\n    if (byExerciseWeekDay[exercise.key]?.[repeatWeekIndex]?.[dayInWeekIndex] == null) {\n      const dayData = {\n        week: repeatWeek,\n        dayInWeek: dayInWeekIndex + 1,\n        day:\n          (PlannerEvaluator_getDayIndexFromWeekAndDayInWeekIndex(evaluatedWeeks, repeatWeekIndex, dayInWeekIndex) ??\n            0) + 1,\n      };\n      const repeatedExercise: IPlannerProgramExercise = {\n        ...exercise,\n        reuse: exercise.reuse ? { ...exercise.reuse } : undefined,\n        progress: exercise.progress\n          ? { ...exercise.progress, reuse: exercise.progress.reuse ? { ...exercise.progress.reuse } : undefined }\n          : undefined,\n        update: exercise.update\n          ? { ...exercise.update, reuse: exercise.update.reuse ? { ...exercise.update.reuse } : undefined }\n          : undefined,\n        repeat: [],\n        dayData,\n        isRepeat: true,\n      };\n      PlannerEvaluator_setByExerciseWeekDay(\n        byExerciseWeekDay,\n        exercise.key,\n        repeatWeekIndex,\n        dayInWeekIndex,\n        repeatedExercise\n      );\n      const day = evaluatedWeeks[repeatWeekIndex]?.[dayInWeekIndex];\n      if (day?.success) {\n        day.data.push(repeatedExercise);\n      }\n    }\n  }\n}\n\n// The order a day's exercises must be in, whether they're evaluated exercises or the parsed top\n// lines PlannerProgram_groupedTopLines sorts. Both paths have to agree exactly: compaction matches\n// lines across weeks by exerciseIndex, so a template that lands in a different slot in one week\n// stops being recognized as the same line and its week range falls apart.\n//\n// fillRepeats appends materialized copies at the end of the day, so neither tie-break can be left\n// to document order. A `used: none` template takes the exerciseIndex of the used exercise it\n// precedes, so it sorts before it; a repeat copy sorts before the local exercise it shares an\n// index with, matching its position in the week it was written.\nexport function PlannerEvaluator_compareExerciseOrder(\n  ex1: { exerciseIndex?: number; notused?: boolean; isRepeat?: boolean },\n  ex2: { exerciseIndex?: number; notused?: boolean; isRepeat?: boolean }\n): number {\n  if ((ex1.exerciseIndex ?? 0) !== (ex2.exerciseIndex ?? 0)) {\n    return (ex1.exerciseIndex ?? 0) - (ex2.exerciseIndex ?? 0);\n  }\n  if (!!ex1.notused !== !!ex2.notused) {\n    return ex1.notused ? -1 : 1;\n  }\n  return (ex1.isRepeat ? 0 : 1) - (ex2.isRepeat ? 0 : 1);\n}\n\n// A reuse resolving back to the very instance that declares it makes exercise.reuse.exercise (or\n// progress/update/descriptions .reuse.exercise) a self-loop, and PlannerProgramExercise_getState\n// walks those pointers with no visited set - so every later read of the program died with\n// \"Maximum call stack size exceeded\" instead of showing an error. Checked before the pointer is\n// wired, so the loop never forms. Compared by identity, not by key: reusing the same exercise from\n// an earlier week (`Squat / ...Squat[1:1]`) resolves to a different instance and is legitimate.\nfunction PlannerEvaluator_checkSelfReuse(\n  exercise: IPlannerProgramExercise,\n  originalExercise: IPlannerProgramExercise | undefined,\n  message: string,\n  point: IPlannerSyntaxPointer,\n  section: IPlannerReuseSection\n): void {\n  if (originalExercise === exercise) {\n    throw PlannerSyntaxError.fromPoint(exercise.fullName, message, point, { type: \"reuseSelf\", data: { section } });\n  }\n}\n\nexport function PlannerEvaluator_fillSetReuses(\n  exercise: IPlannerProgramExercise,\n  evaluatedWeeks: IPlannerEvalResult[][],\n  weekIndex: number,\n  settings: ISettings,\n  metadata: IPlannerEvalMetadata\n): void {\n  if (exercise.reuse && exercise.points.reuseSetPoint) {\n    const reuse = exercise.reuse;\n    const originalExercises = PlannerEvaluator_findOriginalExercisesAtWeekDay(\n      settings,\n      reuse.fullName,\n      evaluatedWeeks,\n      reuse.week ?? weekIndex + 1 ?? 1,\n      reuse.day\n    );\n    if (originalExercises.length > 1) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `There're several exercises matching, please be more specific with [week:day] syntax`,\n        exercise.points.reuseSetPoint,\n        { type: \"reuseAmbiguous\" }\n      );\n    }\n    const originalExercise = originalExercises[0];\n    if (!originalExercise) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `No such exercise ${reuse.fullName} at week: ${reuse.week ?? weekIndex + 1}${\n          reuse.day != null ? `, day: ${reuse.day}` : \"\"\n        }`,\n        exercise.points.reuseSetPoint,\n        {\n          type: \"reuseTargetNotFound\",\n          data: { fullName: reuse.fullName, week: reuse.week ?? weekIndex + 1, day: reuse.day },\n        }\n      );\n    }\n    PlannerEvaluator_checkSelfReuse(\n      exercise,\n      originalExercise.exercise,\n      `Exercise cannot reuse itself`,\n      exercise.points.reuseSetPoint,\n      \"sets\"\n    );\n    if (originalExercise.exercise.reuse?.fullName != null) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Original exercise cannot reuse another exercise's sets x reps`,\n        exercise.points.reuseSetPoint,\n        { type: \"reuseChained\", data: { section: \"sets\" } }\n      );\n    }\n    if ((originalExercise.exercise.exerciseVariations?.length ?? 0) > 1) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `Cannot reuse '${reuse.fullName}' - it has multiple exercise variations. Move the shared sets/progress into a 'used: none' template and reuse that instead`,\n        exercise.points.reuseSetPoint,\n        { type: \"reuseTargetMultipleVariations\", data: { fullName: reuse.fullName } }\n      );\n    }\n    if (\n      originalExercise.exercise.progress?.reuse != null &&\n      exercise.progress == null &&\n      !originalExercise.exercise.notused\n    ) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `This exercise doesn't specify progress - so the original USED exercise's progress cannot reuse another exercise's progress`,\n        exercise.points.reuseSetPoint,\n        { type: \"reuseWithoutOwnSection\", data: { section: \"progress\" } }\n      );\n    }\n    if (\n      originalExercise.exercise.update?.reuse != null &&\n      exercise.update == null &&\n      !originalExercise.exercise.notused\n    ) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `This exercise doesn't specify 'update' - so the original exercise's 'update' cannot reuse another exercise's 'update'`,\n        exercise.points.reuseSetPoint,\n        { type: \"reuseWithoutOwnSection\", data: { section: \"update\" } }\n      );\n    }\n    if (originalExercise.exercise.progress != null && exercise.progress == null) {\n      const sharedProgressReuse: IPlannerProgramReuse = {\n        fullName: originalExercise.exercise.fullName,\n        source: \"overall\",\n      };\n      const originalProgress = originalExercise.exercise.progress;\n      PlannerEvaluator_forEachSiblingInstance(exercise, metadata, (other) => {\n        if (other.progress == null) {\n          other.progress = {\n            type: originalProgress.type,\n            state: ObjectUtils_clone(originalProgress.state),\n            stateMetadata: ObjectUtils_clone(originalProgress.stateMetadata),\n            reuse: sharedProgressReuse,\n          };\n        }\n      });\n    }\n    if (originalExercise.exercise.update != null && exercise.update == null) {\n      const sharedUpdateReuse: IPlannerProgramReuse = {\n        fullName: originalExercise.exercise.fullName,\n        source: \"overall\",\n      };\n      const originalUpdate = originalExercise.exercise.update;\n      PlannerEvaluator_forEachSiblingInstance(exercise, metadata, (other) => {\n        if (other.update == null) {\n          other.update = {\n            type: originalUpdate.type,\n            reuse: sharedUpdateReuse,\n          };\n        }\n      });\n    }\n\n    exercise.reuse.exercise = originalExercise.exercise;\n  }\n}\n\nfunction PlannerEvaluator_forEachSiblingInstance(\n  exercise: IPlannerProgramExercise,\n  metadata: IPlannerEvalMetadata,\n  cb: (other: IPlannerProgramExercise) => void\n): void {\n  const byKey = metadata.byExerciseWeekDay[exercise.key];\n  if (byKey == null) {\n    return;\n  }\n  for (const weekKey of ObjectUtils_keys(byKey)) {\n    const weekEntry = byKey[weekKey as unknown as number];\n    for (const dayKey of ObjectUtils_keys(weekEntry)) {\n      cb(weekEntry[dayKey as unknown as number]);\n    }\n  }\n}\n\nexport function PlannerEvaluator_fillEvaluatedSetVariations(exercise: IPlannerProgramExercise): void {\n  const setVariations = PlannerProgramExercise_setVariations(exercise);\n  const evaluatedSetVariations = PlannerProgramExercise_evaluateSetVariations(exercise, setVariations);\n  exercise.evaluatedSetVariations = evaluatedSetVariations;\n}\n\nexport function PlannerEvaluator_fillDescriptions(\n  exercise: IPlannerProgramExercise,\n  evaluatedWeeks: IPlannerEvalResult[][],\n  weekIndex: number,\n  dayIndex: number\n): void {\n  if (exercise.descriptions == null || exercise.descriptions.values.length === 0) {\n    const lastWeekExercise = PlannerEvaluator_findLastWeekExercise(\n      evaluatedWeeks,\n      weekIndex,\n      dayIndex,\n      exercise,\n      (ex) => ex.descriptions != null\n    );\n    if (lastWeekExercise && lastWeekExercise.descriptions) {\n      exercise.descriptions = ObjectUtils_clone(lastWeekExercise.descriptions);\n    }\n  }\n}\n\n// Whether a description is itself borrowed, asked in a way that doesn't depend on whether the\n// exercise holding it has been wired yet: before wiring it is still the literal `...name`\n// directive, after wiring it carries the reuse it came from. Reading both is what makes the check\n// below independent of the order days happen to be evaluated in.\nfunction PlannerEvaluator_isDescriptionReuse(descriptions: IProgramExerciseDescriptions): boolean {\n  return (\n    descriptions.reuse != null ||\n    (descriptions.values.length === 1 && !!descriptions.values[0].value?.startsWith(\"...\"))\n  );\n}\n\nexport function PlannerEvaluator_fillDescriptionReuses(\n  exercise: IPlannerProgramExercise,\n  weekIndex: number,\n  byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>,\n  settings: ISettings\n): void {\n  if (\n    exercise.descriptions != null &&\n    exercise.descriptions.values.length === 1 &&\n    exercise.descriptions.values[0].value?.startsWith(\"...\")\n  ) {\n    const reusingName = exercise.descriptions.values[0].value.slice(3).trim();\n    const result = PlannerEvaluator_findReusedDescriptions(reusingName, weekIndex, byExerciseWeekDay, settings);\n    if (result != null) {\n      const { descriptions, exercise: originalExercise } = result;\n      PlannerEvaluator_checkSelfReuse(\n        exercise,\n        originalExercise,\n        `Exercise cannot reuse its own description`,\n        exercise.points.fullName,\n        \"description\"\n      );\n      // Unlike sets or progress, this copies whatever the target holds at the moment it is wired\n      // rather than following a pointer, so a target that is itself borrowing hands over either\n      // the raw `...name` directive - which then reads as the description, shown to the user as\n      // literal text - or whatever it had been handed in turn, depending on the order the days\n      // were evaluated in. Requiring the target to write its own description settles both, and\n      // takes description loops with it: every exercise around such a loop is borrowing.\n      if (PlannerEvaluator_isDescriptionReuse(descriptions)) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Original exercise cannot reuse another description - reuse the one that writes it instead`,\n          exercise.points.fullName,\n          { type: \"reuseChained\", data: { section: \"description\" } }\n        );\n      }\n      exercise.descriptions = {\n        values: [...ObjectUtils_clone(descriptions.values)],\n        reuse: { fullName: originalExercise.fullName, exercise: originalExercise, source: \"specific\" },\n      };\n    }\n  }\n}\n\n// The properties fillSingleProperties copies onto every instance below — i.e. the ones a single\n// day's declaration governs the whole exercise with. Anything reasoning about \"this property is\n// program-wide\" must read this list rather than restate it; a hand-kept copy elsewhere drifted\n// the moment this function changed.\n//\n// `id` is deliberately absent. It is checked for consistency across days (see the conflict check\n// on metadata.properties.id above) but its value is never propagated, so a declaration without\n// `id:` really does evaluate with no tags.\nexport const PlannerEvaluator_hoistedProperties = [\"warmup\", \"progress\", \"update\", \"used\"] as const;\n\nexport function PlannerEvaluator_fillSingleProperties(\n  exercise: IPlannerProgramExercise,\n  metadata: IPlannerEvalMetadata\n): void {\n  if (metadata.notused.has(exercise.key)) {\n    exercise.notused = true;\n  }\n\n  if (metadata.properties.progress[exercise.key] != null) {\n    const existingProgress = exercise.progress;\n    if (!existingProgress) {\n      exercise.progress = metadata.properties.progress[exercise.key].property;\n    }\n  }\n\n  if (metadata.properties.update[exercise.key] != null && !exercise.update) {\n    exercise.update = metadata.properties.update[exercise.key].property;\n  }\n\n  if (metadata.properties.warmup[exercise.key] != null) {\n    exercise.warmupSets = metadata.properties.warmup[exercise.key].warmupSets;\n  }\n}\n\nexport function PlannerEvaluator_fillProgressReuses(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  exercise: IPlannerProgramExercise,\n  settings: ISettings,\n  metadata: IPlannerEvalMetadata\n): void {\n  const progress = exercise.progress;\n  if (progress?.type === \"custom\") {\n    const fullName = progress.reuse?.fullName;\n    if (progress.reuse && fullName) {\n      const key = PlannerKey_fromFullName(fullName, settings.exercises);\n      const point = exercise.points.progressPoint || exercise.points.fullName;\n      if (metadata.byExerciseWeekDay[key] == null) {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, `No such exercise ${fullName}`, point, {\n          type: \"reuseTargetNotFound\",\n          data: { fullName },\n        });\n      }\n      const originalProperty = metadata.properties.progress[key];\n      const dayData = originalProperty?.dayData;\n      const originalProgress = originalProperty?.property;\n      if (!originalProgress || !dayData) {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, \"Original exercise should specify progress\", point, {\n          type: \"reuseTargetMissingSection\",\n          data: { section: \"progress\" },\n        });\n      }\n      // fillSingleProperties hands every instance the same progress object, so identity here means\n      // the exercise reuses its own progress - see PlannerEvaluator_checkSelfReuse.\n      if (originalProgress === progress) {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, `Exercise cannot reuse its own progress`, point, {\n          type: \"reuseSelf\",\n          data: { section: \"progress\" },\n        });\n      }\n      if (originalProgress.reuse?.fullName != null) {\n        // originalProgress.reuse.exercise may not be resolved yet (resolution goes in document\n        // order), so check notused via metadata, which is complete before this pass.\n        const originalReuseKey = PlannerKey_fromFullName(originalProgress.reuse.fullName, settings.exercises);\n        if (!metadata.notused.has(originalReuseKey)) {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            `Original exercise cannot reuse another progress`,\n            point,\n            { type: \"reuseChained\", data: { section: \"progress\" } }\n          );\n        }\n      }\n      if (originalProgress.type !== \"custom\") {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          \"Original exercise should specify custom progress\",\n          point,\n          { type: \"reuseTargetNotCustom\", data: { section: \"progress\" } }\n        );\n      }\n      const originalState = originalProgress.state;\n      const state = progress.state;\n      for (const stateKey of ObjectUtils_keys(originalState)) {\n        const value = originalState[stateKey];\n        if (state[key] != null && Weight_type(value) !== Weight_type(state[stateKey])) {\n          throw PlannerSyntaxError.fromPoint(exercise.fullName, `Wrong type of state variable ${stateKey}`, point, {\n            type: \"reuseStateTypeMismatch\",\n            data: { stateKey },\n          });\n        }\n      }\n      const originalExercises = PlannerEvaluator_findOriginalExercisesAtWeekDay(\n        settings,\n        fullName,\n        evaluatedWeeks,\n        dayData.week,\n        dayData.dayInWeek\n      );\n      const originalExercise = originalExercises[0]?.exercise;\n      if (\n        originalExercise?.reuse != null &&\n        (originalExercise.progress == null || originalExercise.progress.reuse != null)\n      ) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Original exercise '${originalExercise.fullName}' should not reuse other exercise`,\n          point,\n          { type: \"reuseChained\", data: { section: \"progress\" } }\n        );\n      }\n      progress.reuse.exercise = originalExercise;\n    }\n  }\n}\n\nexport function PlannerEvaluator_checkUpdateScript(\n  exercise: IPlannerProgramExercise,\n  settings: ISettings,\n  dayData: IDayData\n): void {\n  const update = exercise.update;\n  if (update?.type === \"custom\") {\n    const { script, liftoscriptNode } = update;\n    if (script && liftoscriptNode) {\n      const exerciseType = PlannerProgramExercise_getExercise(exercise, settings);\n      const state = PlannerProgramExercise_getState(exercise);\n      const liftoscriptEvaluator = new ScriptRunner(\n        script,\n        state,\n        {},\n        Progress_createEmptyScriptBindings(dayData, settings),\n        Progress_createScriptFunctions(settings),\n        settings.units,\n        { exerciseType, unit: settings.units, prints: [] },\n        \"update\"\n      );\n      try {\n        liftoscriptEvaluator.parse();\n      } catch (e) {\n        if (e instanceof LiftoscriptSyntaxError && liftoscriptNode) {\n          const [line] = PlannerExerciseEvaluator.getLineAndOffset(script, liftoscriptNode);\n          throw new PlannerSyntaxError(\n            e.message,\n            line + e.line,\n            e.offset,\n            liftoscriptNode.from + e.from,\n            liftoscriptNode.from + e.to,\n            e.details\n          );\n        } else {\n          throw e;\n        }\n      }\n    }\n  }\n}\n\nexport function PlannerEvaluator_fillUpdateReuses(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  exercise: IPlannerProgramExercise,\n  settings: ISettings,\n  metadata: IPlannerEvalMetadata\n): void {\n  const update = exercise.update;\n  if (update?.type === \"custom\") {\n    const fullName = update.reuse?.fullName;\n    if (update.reuse && fullName) {\n      const key = PlannerKey_fromFullName(fullName, settings.exercises);\n      const point = exercise.points.updatePoint || exercise.points.fullName;\n\n      if (metadata.byExerciseWeekDay[key] == null) {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, `No such exercise ${fullName}`, point, {\n          type: \"reuseTargetNotFound\",\n          data: { fullName },\n        });\n      }\n      const originalProperty = metadata.properties.update[key];\n      const originalUpdate = originalProperty?.property;\n      const dayData = originalProperty?.dayData;\n      if (!originalUpdate || !dayData) {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, \"Original exercise should specify update\", point, {\n          type: \"reuseTargetMissingSection\",\n          data: { section: \"update\" },\n        });\n      }\n      // Same shared-object reasoning as the progress check above.\n      if (originalUpdate === update) {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, `Exercise cannot reuse its own update`, point, {\n          type: \"reuseSelf\",\n          data: { section: \"update\" },\n        });\n      }\n      if (originalUpdate.reuse?.fullName != null) {\n        // Same as the progress check above: reuse.exercise may not be resolved yet.\n        const originalReuseKey = PlannerKey_fromFullName(originalUpdate.reuse.fullName, settings.exercises);\n        if (!metadata.notused.has(originalReuseKey)) {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            `Original exercise cannot reuse another update`,\n            point,\n            {\n              type: \"reuseChained\",\n              data: { section: \"update\" },\n            }\n          );\n        }\n      }\n      if (originalUpdate.type !== \"custom\") {\n        throw PlannerSyntaxError.fromPoint(exercise.fullName, \"Original exercise should specify custom update\", point, {\n          type: \"reuseTargetNotCustom\",\n          data: { section: \"update\" },\n        });\n      }\n      const stateKeys = originalUpdate.meta?.stateKeys || new Set();\n      if (stateKeys.size !== 0) {\n        const progress = exercise.progress;\n        if (progress == null) {\n          throw PlannerSyntaxError.fromPoint(\n            exercise.fullName,\n            \"If 'update' block uses state variables, exercise should define them in 'progress' block\",\n            point,\n            { type: \"updateStateWithoutProgress\" }\n          );\n        }\n        const state = PlannerProgramExercise_getState(exercise);\n        for (const stateKey of stateKeys) {\n          if (state[stateKey] == null) {\n            throw PlannerSyntaxError.fromPoint(\n              exercise.fullName,\n              `Missing state variable ${stateKey} that's used in the original update block`,\n              point,\n              { type: \"reuseMissingStateVariable\", data: { stateKey } }\n            );\n          }\n        }\n      }\n      const originalExercises = PlannerEvaluator_findOriginalExercisesAtWeekDay(\n        settings,\n        fullName,\n        evaluatedWeeks,\n        dayData.week,\n        dayData.dayInWeek\n      );\n      const originalExercise = originalExercises[0]?.exercise;\n      if (\n        originalExercise?.reuse != null &&\n        (originalExercise.update == null || originalExercise.update.reuse != null)\n      ) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Original exercise '${originalExercise.fullName}' should not reuse other exercise`,\n          point,\n          { type: \"reuseChained\", data: { section: \"update\" } }\n        );\n      }\n      update.reuse.exercise = originalExercise;\n    }\n  }\n}\n\n// Only the progress edge needs a graph walk, and it is worth saying why the other three don't,\n// since the answer isn't \"the reuse graph is acyclic\" — it isn't, and deliberately so (see below).\n// What has to hold is that the resolvers terminate and every reuse resolves to something concrete,\n// which each edge secures its own way:\n//\n//   sets         can't chain at all (\"Original exercise cannot reuse another exercise's sets\")\n//   descriptions can't chain either, so no loop can form - PlannerEvaluator_fillDescriptionReuses\n//   update       chains, and a loop resolves no script, which checkReusesResolve rejects\n//   progress     chains, and a loop still resolves a script - hence the walk below\n//\n// A self reuse is caught where it is wired, but two exercises reusing each other's progress close\n// the same loop only once both are wired - and PlannerProgramExercise_getState walks exactly these\n// pointers, so the loop is an infinite recursion on every later read of the program.\n//\n// The walk mirrors those getters, stop condition included: an exercise declaring its own progress\n// ends the chain, which is why A's progress reusing B while B reuses A's sets is fine. That shape\n// does leave a cycle in the object graph; evaluated programs are allowed to be cyclic, and\n// ObjectUtils_clone carries a visited set for exactly that reason.\n//\n// Runs after every reuse is wired, since a loop isn't visible until the last pointer is in place.\nexport function PlannerEvaluator_checkReuseLoops(exercise: IPlannerProgramExercise): void {\n  const seen = new Set<IPlannerProgramExercise>();\n  let current: IPlannerProgramExercise | undefined = exercise;\n  while (current != null && !(current.progress != null && current.progress.reuse == null)) {\n    if (seen.has(current)) {\n      throw PlannerSyntaxError.fromPoint(\n        exercise.fullName,\n        `This exercise ends up reusing itself through other exercises`,\n        exercise.points.progressPoint || exercise.points.reuseSetPoint || exercise.points.fullName,\n        { type: \"reuseCycle\" }\n      );\n    }\n    seen.add(current);\n    current = current.progress?.reuse?.exercise ?? current.reuse?.exercise;\n  }\n}\n\n// How far a reused script can be passed along, asked of the thing that does the passing rather\n// than restated as a shape here. The progression and update runners resolve through these same\n// getters, so a chain they can't follow is a program that saves cleanly, shows a progression, and\n// then silently never runs it. Stated once: deepening the getters relaxes this along with them.\n//\n// Runs after every reuse is wired, since resolution reads other exercises.\nexport function PlannerEvaluator_checkReusesResolve(exercise: IPlannerProgramExercise): void {\n  if (exercise.progress?.type === \"custom\" && PlannerProgramExercise_getProgressScript(exercise) == null) {\n    throw PlannerSyntaxError.fromPoint(\n      exercise.fullName,\n      `Couldn't find the progress script this reuses - reuse the exercise that defines it instead`,\n      exercise.points.progressPoint || exercise.points.fullName,\n      { type: \"reuseScriptNotFound\", data: { section: \"progress\" } }\n    );\n  }\n  if (exercise.update != null && PlannerProgramExercise_getUpdateScript(exercise) == null) {\n    throw PlannerSyntaxError.fromPoint(\n      exercise.fullName,\n      `Couldn't find the update script this reuses - reuse the exercise that defines it instead`,\n      exercise.points.updatePoint || exercise.points.fullName,\n      { type: \"reuseScriptNotFound\", data: { section: \"update\" } }\n    );\n  }\n}\n\nexport function PlannerEvaluator_postProcess(\n  evaluatedWeeks: IPlannerEvalResult[][],\n  settings: ISettings,\n  metadata: IPlannerEvalMetadata\n): void {\n  PlannerEvaluator_iterateOverExercises(\n    evaluatedWeeks,\n    (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      PlannerEvaluator_fillDescriptions(exercise, evaluatedWeeks, weekIndex, dayInWeekIndex);\n      PlannerEvaluator_fillRepeats(exercise, evaluatedWeeks, dayInWeekIndex, metadata.byExerciseWeekDay);\n      PlannerEvaluator_fillSingleProperties(exercise, metadata);\n      PlannerEvaluator_checkUnknownExercises(exercise, metadata);\n    }\n  );\n\n  PlannerEvaluator_iterateOverExercises(\n    evaluatedWeeks,\n    (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      PlannerEvaluator_fillSetReuses(exercise, evaluatedWeeks, weekIndex, settings, metadata);\n      PlannerEvaluator_fillDescriptionReuses(exercise, weekIndex, metadata.byExerciseWeekDay, settings);\n      PlannerEvaluator_fillProgressReuses(evaluatedWeeks, exercise, settings, metadata);\n      PlannerEvaluator_fillUpdateReuses(evaluatedWeeks, exercise, settings, metadata);\n      PlannerEvaluator_checkUpdateScript(exercise, settings, {\n        week: weekIndex + 1,\n        dayInWeek: dayInWeekIndex + 1,\n        day: dayInWeekIndex + 1,\n      });\n    }\n  );\n\n  // Its own pass: reuses are wired in document order, so an exercise's chain is only complete\n  // once every exercise has been through the pass above.\n  PlannerEvaluator_iterateOverExercises(evaluatedWeeks, (_weekIndex, _dayInWeekIndex, _dayIndex, _index, exercise) => {\n    PlannerEvaluator_checkReuseLoops(exercise);\n    PlannerEvaluator_checkReusesResolve(exercise);\n  });\n  for (const week of evaluatedWeeks) {\n    for (const day of week) {\n      if (day.success) {\n        day.data.sort(PlannerEvaluator_compareExerciseOrder);\n      }\n    }\n  }\n\n  PlannerEvaluator_iterateOverExercises(\n    evaluatedWeeks,\n    (weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercise) => {\n      PlannerEvaluator_fillEvaluatedSetVariations(exercise);\n    }\n  );\n}\n\nexport function PlannerEvaluator_checkUnknownExercises(\n  exercise: IPlannerProgramExercise,\n  metadata: IPlannerEvalMetadata\n): void {\n  if (metadata.notused.has(exercise.key)) {\n    return;\n  }\n  const variations = exercise.exerciseVariations;\n  if (variations != null && variations.length > 1) {\n    for (const variation of variations) {\n      if (variation.exerciseType == null) {\n        throw PlannerSyntaxError.fromPoint(\n          exercise.fullName,\n          `Unknown exercise ${variation.name}`,\n          exercise.points.fullName,\n          { type: \"unknownExercise\", data: { name: variation.name } }\n        );\n      }\n    }\n  } else if (exercise.exerciseType == null) {\n    throw PlannerSyntaxError.fromPoint(\n      exercise.fullName,\n      `Unknown exercise ${exercise.name}`,\n      exercise.points.fullName,\n      { type: \"unknownExercise\", data: { name: exercise.name } }\n    );\n  }\n}\n\nexport function PlannerEvaluator_findReusedDescriptions(\n  reusingName: string,\n  currentWeekIndex: number,\n  byExerciseWeekDay: IByExerciseWeekDay<IPlannerProgramExercise>,\n  settings: ISettings\n): { descriptions: IProgramExerciseDescriptions; exercise: IPlannerProgramExercise } | undefined {\n  const weekDayMatch = reusingName.match(/\\[([^]+)\\]/);\n  let weekIndex: number | undefined;\n  let dayIndex: number | undefined;\n  if (weekDayMatch != null) {\n    const [dayOrWeekStr, dayStr] = weekDayMatch[1].split(\":\");\n    if (dayStr != null) {\n      weekIndex = parseInt(dayOrWeekStr, 10);\n      weekIndex = isNaN(weekIndex) ? undefined : weekIndex - 1;\n      dayIndex = parseInt(dayStr, 10);\n      dayIndex = isNaN(dayIndex) ? undefined : dayIndex - 1;\n    } else {\n      dayIndex = parseInt(dayOrWeekStr, 10);\n      dayIndex = isNaN(dayIndex) ? undefined : dayIndex - 1;\n    }\n  }\n  reusingName = reusingName.replace(/\\[([^]+)\\]/, \"\").trim();\n  const key = PlannerKey_fromFullName(reusingName, settings.exercises);\n  const weekExercises = ObjectUtils_values(byExerciseWeekDay[key]?.[weekIndex ?? currentWeekIndex] || []);\n  const weekDescriptions = weekExercises.map((d) => d.descriptions);\n  const index = dayIndex ?? 0;\n  if (weekDescriptions[index]) {\n    return { descriptions: weekDescriptions[index], exercise: weekExercises[index] };\n  } else {\n    return undefined;\n  }\n}\n\nexport function PlannerEvaluator_findOriginalExercisesAtWeekDay(\n  settings: ISettings,\n  fullName: string,\n  program: IPlannerEvalResult[][],\n  atWeek: number,\n  atDay?: number\n): { exercise: IPlannerProgramExercise; dayData: Required<IDayData> }[] {\n  const originalExercises: { exercise: IPlannerProgramExercise; dayData: Required<IDayData> }[] = [];\n  const week = program[atWeek - 1];\n  if (week == null) {\n    return originalExercises;\n  }\n  const candidateDays = atDay != null ? [week[atDay - 1]] : week;\n  const originalKey = PlannerKey_fromFullName(fullName, settings.exercises);\n  for (let dayInWeekIndex = 0; dayInWeekIndex < candidateDays.length; dayInWeekIndex += 1) {\n    const day = candidateDays[dayInWeekIndex];\n    if (day == null || !day.success) {\n      continue;\n    }\n    for (const exercise of day.data) {\n      const reusingKey = PlannerKey_fromPlannerExercise(exercise, settings);\n      if (reusingKey === originalKey) {\n        originalExercises.push({\n          exercise,\n          dayData: {\n            week: atWeek,\n            dayInWeek: dayInWeekIndex + 1,\n            day: 1,\n          },\n        });\n      }\n    }\n  }\n  return originalExercises;\n}\n\nexport function PlannerEvaluator_evaluateFull(\n  fullProgramText: string,\n  settings: ISettings\n): { evaluatedWeeks: IPlannerEvalFullResult; exerciseFullNames: string[] } {\n  const { evaluatedWeeks, metadata } = PlannerEvaluator_getFullEvaluatedWeeks(fullProgramText, settings);\n  if (evaluatedWeeks.success) {\n    const perDayEvaluatedWeeks = PlannerProgram_fullToWeekEvalResult(evaluatedWeeks);\n    PlannerEvaluator_postProcess(perDayEvaluatedWeeks, settings, metadata);\n    for (const week of perDayEvaluatedWeeks) {\n      for (const day of week) {\n        if (!day.success) {\n          return {\n            evaluatedWeeks: { success: false, error: day.error },\n            exerciseFullNames: Array.from(metadata.fullNames),\n          };\n        }\n      }\n    }\n  }\n  return { evaluatedWeeks, exerciseFullNames: Array.from(metadata.fullNames) };\n}\n\nexport function PlannerEvaluator_findLastWeekExercise(\n  program: IPlannerEvalResult[][],\n  weekIndex: number,\n  dayIndex: number,\n  exercise: IPlannerProgramExercise,\n  cond?: (ex: IPlannerProgramExercise) => boolean\n): IPlannerProgramExercise | undefined {\n  for (\n    let i = weekIndex - 1, lastWeekDay = program[i]?.[dayIndex];\n    i >= 0 && lastWeekDay != null;\n    i -= 1, lastWeekDay = program[i]?.[dayIndex]\n  ) {\n    if (lastWeekDay.success) {\n      const lastWeekExercise = lastWeekDay.data.find((ex) => ex.key === exercise.key);\n      if (lastWeekExercise != null && (cond == null || cond(lastWeekExercise))) {\n        return lastWeekExercise;\n      }\n    }\n  }\n  return undefined;\n}\n\nexport function PlannerEvaluator_setByExerciseWeekDay<T, U extends Record<string, Record<number, Record<number, T>>>>(\n  coll: U,\n  exercise: string,\n  weekIndex: number,\n  dayIndex: number,\n  val: T\n): void {\n  coll[exercise as keyof U] = coll[exercise as keyof U] || {};\n  coll[exercise as keyof U][weekIndex] = coll[exercise as keyof U][weekIndex] || {};\n  coll[exercise as keyof U][weekIndex][dayIndex] = val;\n}\n\nexport function PlannerEvaluator_setByWeekDayExercise<T, U extends Record<number, Record<number, Record<string, T>>>>(\n  coll: U,\n  exercise: string,\n  weekIndex: number,\n  dayIndex: number,\n  val: T\n): void {\n  coll[weekIndex] = coll[weekIndex] || {};\n  coll[weekIndex][dayIndex] = coll[weekIndex][dayIndex] || {};\n  coll[weekIndex][dayIndex][exercise] = val;\n}\n\nexport function PlannerEvaluator_iterateOverExercises(\n  program: IPlannerEvalResult[][],\n  cb: (\n    weekIndex: number,\n    dayInWeekIndex: number,\n    dayIndex: number,\n    exerciseIndex: number,\n    exercise: IPlannerProgramExercise\n  ) => void\n): void {\n  let dayIndex = 0;\n  for (let weekIndex = 0; weekIndex < program.length; weekIndex += 1) {\n    const week = program[weekIndex];\n    for (let dayInWeekIndex = 0; dayInWeekIndex < week.length; dayInWeekIndex += 1) {\n      const day = week[dayInWeekIndex];\n      try {\n        if (day?.success) {\n          const exercises = day.data;\n          for (let exerciseIndex = 0; exerciseIndex < exercises.length; exerciseIndex += 1) {\n            cb(weekIndex, dayInWeekIndex, dayIndex, exerciseIndex, exercises[exerciseIndex]);\n          }\n        }\n      } catch (e) {\n        if (e instanceof PlannerSyntaxError) {\n          week[dayInWeekIndex] = { success: false, error: e };\n        } else {\n          throw e;\n        }\n      }\n      dayIndex += 1;\n    }\n  }\n}\n\nexport const PlannerEvaluator_forceEvaluate = (\n  plannerProgram: IPlannerProgram,\n  settings: ISettings\n): {\n  evaluatedWeeks: IPlannerEvalResult[][];\n  exerciseFullNames: string[];\n} => {\n  const { evaluatedWeeks, metadata } = PlannerEvaluator_getPerDayEvaluatedWeeks(plannerProgram, settings);\n  PlannerEvaluator_postProcess(evaluatedWeeks, settings, metadata);\n  return { evaluatedWeeks, exerciseFullNames: Array.from(metadata.fullNames) };\n};\n\nexport const PlannerEvaluator_evaluate = memoize(PlannerEvaluator_forceEvaluate, {\n  maxSize: 10,\n  isEqual: (a: IPlannerProgram | ISettings, b: IPlannerProgram | ISettings) => {\n    if (a == null || b == null) {\n      return a === b;\n    }\n    if (\"weeks\" in a && \"weeks\" in b) {\n      const aText = PlannerProgram_generateFullText(a.weeks);\n      const bText = PlannerProgram_generateFullText(b.weeks);\n      return aText === bText;\n    } else {\n      return a === b;\n    }\n  },\n});\n","import { parser as plannerExerciseParser } from \"./plannerExerciseParser\";\nimport { LRLanguage, LanguageSupport, syntaxTree } from \"@codemirror/language\";\nimport { styleTags } from \"@lezer/highlight\";\nimport { CompletionContext, CompletionResult } from \"@codemirror/autocomplete\";\nimport { PlannerEditor } from \"./plannerEditor\";\nimport { plannerExerciseStyles } from \"./plannerExerciseStyles\";\nimport { parseMixed } from \"@lezer/common\";\nimport { buildLiftoscriptLanguageSupport } from \"../../liftoscriptCodemirror\";\nimport { liftoscriptLanguage } from \"../../liftoscriptLanguage\";\nimport { PlannerCompletions_codemirrorPlanner, PlannerCompletionsIndex } from \"./plannerCompletions\";\n\nconst parserWithMetadata = plannerExerciseParser.configure({\n  props: [styleTags(plannerExerciseStyles)],\n  wrap: parseMixed((node) => {\n    return node.name === \"Liftoscript\" ? { parser: liftoscriptLanguage.parser } : null;\n  }),\n});\n\nconst language = LRLanguage.define({\n  name: \"plannerExercise\",\n  parser: parserWithMetadata,\n});\n\nexport function buildPlannerExerciseLanguageSupport(plannerEditor: PlannerEditor): LanguageSupport {\n  const index = new PlannerCompletionsIndex();\n  const completion = language.data.of({\n    autocomplete: (context: CompletionContext): CompletionResult | undefined => {\n      const result = PlannerCompletions_codemirrorPlanner(context.state.doc.toString(), context.pos, {\n        customExercises: plannerEditor.args.customExercises,\n        exerciseFullNames: plannerEditor.args.exerciseFullNames,\n        index,\n        tree: syntaxTree(context.state),\n      });\n      if (result == null) {\n        return undefined;\n      }\n      // `to` is deliberately not forwarded: CodeMirror's own default is to replace up to the\n      // cursor, and the web editor has always behaved that way. The phone replaces the whole\n      // token because a tap puts the caret mid-word far more often than a click does.\n      return { from: result.from, options: result.options, validFor: /.*/ };\n    },\n  });\n\n  return new LanguageSupport(language, [completion, buildLiftoscriptLanguageSupport({ state: {} }).support]);\n}\n","// import util from \"util\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { Exercise_findByNameAndEquipment, Exercise_buildName } from \"../../models/exercise\";\nimport { CollectionUtils_compact } from \"../../utils/collection\";\nimport { parser as plannerExerciseParser } from \"./plannerExerciseParser\";\nimport { IEither } from \"../../utils/types\";\nimport {\n  IPlannerProgramExercise,\n  IPlannerProgramExerciseRepRange,\n  IPlannerProgramExerciseSet,\n  IPlannerProgramExerciseSetVariation,\n  IPlannerProgramExerciseVariation,\n  IPlannerProgramProperty,\n  IPlannerProgramReuse,\n  IPlannerProgramExerciseWarmupSet,\n  IProgramExerciseProgress,\n  IProgramExerciseUpdate,\n  IProgramExerciseProgressType,\n  IPlannerProgramExerciseSuperset,\n} from \"./models/types\";\nimport {\n  IWeight,\n  IProgramState,\n  IDayData,\n  ISettings,\n  IExerciseType,\n  IUnit,\n  IProgramStateMetadata,\n  IAllCustomExercises,\n} from \"../../types\";\nimport * as W from \"../../models/weight\";\nimport { PlannerNodeName } from \"./plannerExerciseStyles\";\nimport { ScriptRunner } from \"../../parser\";\nimport { Progress_createEmptyScriptBindings, Progress_createScriptFunctions } from \"../../models/progress\";\nimport { LiftoscriptSyntaxError, LiftoscriptEvaluator } from \"../../liftoscriptEvaluator\";\nimport { IPlannerErrorDetails } from \"../../syntaxErrorTypes\";\nimport { Weight_print, Weight_smartConvert } from \"../../models/weight\";\nimport { PlannerStateVars_fromArgs } from \"./models/plannerStateVars\";\nimport { PlannerKey_fromFullName, PlannerKey_fromExerciseVariations } from \"./plannerKey\";\nimport { UidFactory_generateUid } from \"../../utils/generator\";\nimport { ObjectUtils_pick, ObjectUtils_isEqual } from \"../../utils/object\";\nimport {\n  PlannerProgramExercise_buildProgress,\n  PlannerProgramExercise_shortNameFromFullName,\n} from \"./models/plannerProgramExercise\";\nimport memoize from \"micro-memoize\";\nimport { StringUtils_unindent } from \"../../utils/string\";\n\nexport interface IPlannerTopLineItem {\n  type: \"exercise\" | \"comment\" | \"description\" | \"empty\";\n  value: string;\n  exerciseIndex?: number;\n  notused?: boolean;\n  order?: number;\n  fullName?: string;\n  repeat?: number[];\n  repeatRanges?: string[];\n  isRepeat?: boolean;\n  descriptions?: string[];\n  sections?: string;\n  sectionsToReuse?: string;\n  used?: boolean;\n}\n\nexport type IPlannerSyntaxPointer = { line: number; offset: number; from: number; to: number };\n\nexport class PlannerSyntaxError extends SyntaxError {\n  public readonly line: number;\n  public readonly offset: number;\n  public readonly from: number;\n  public readonly to: number;\n  public readonly details: IPlannerErrorDetails;\n\n  public static fromPoint(\n    fullName: string | undefined,\n    message: string,\n    point: IPlannerSyntaxPointer,\n    details: IPlannerErrorDetails\n  ): PlannerSyntaxError {\n    // The subject goes into `details` as well as into the message. Every caller that knows which\n    // exercise threw passes it here, so this one line puts it on all of them - and a consumer that\n    // needs it can read a field instead of parsing it back out of the sentence.\n    return new PlannerSyntaxError(\n      `${fullName ? `${fullName}: ` : \"\"}${message} (${point.line}:${point.offset})`,\n      point.line,\n      point.offset,\n      point.from,\n      point.to,\n      fullName != null ? { ...details, subject: fullName } : details\n    );\n  }\n\n  constructor(message: string, line: number, offset: number, from: number, to: number, details: IPlannerErrorDetails) {\n    super(message);\n    this.line = line;\n    this.offset = offset;\n    this.from = from;\n    this.to = to;\n    this.details = details;\n  }\n\n  public toString(): string {\n    return this.message;\n  }\n}\n\nexport type IPlannerEvalResult = IEither<IPlannerProgramExercise[], PlannerSyntaxError>;\nexport type IPlannerEvalFullResult = IEither<IPlannerExerciseEvaluatorWeek[], PlannerSyntaxError>;\n\nfunction getChildren(node: SyntaxNode): SyntaxNode[] {\n  const cur = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cur.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cur.node);\n  } while (cur.nextSibling());\n  return result;\n}\n\nfunction assert(name: string): never {\n  throw new PlannerSyntaxError(`Missing required nodes for ${name}, this should never happen`, 0, 0, 0, 1, {\n    type: \"internal\",\n    data: { node: name },\n  });\n}\n\nexport interface IPlannerExerciseEvaluatorWeek {\n  name: string;\n  line: number;\n  days: { name: string; line: number; exercises: IPlannerProgramExercise[] }[];\n}\n\ntype IPlannerExerciseEvaluatorMode = \"perday\" | \"full\" | \"onset\";\n\nexport class PlannerExerciseEvaluator {\n  private readonly script: string;\n  private readonly mode: IPlannerExerciseEvaluatorMode;\n  private dayData: Required<IDayData>;\n  private readonly settings: ISettings;\n  private weeks: IPlannerExerciseEvaluatorWeek[] = [];\n  private exerciseIndex: number = 0;\n\n  private latestDescriptions: string[][] = [];\n\n  constructor(script: string, settings: ISettings, mode: IPlannerExerciseEvaluatorMode, dayData?: Required<IDayData>) {\n    this.script = script;\n    this.settings = settings;\n    this.dayData = dayData || { day: 1, week: 1, dayInWeek: 1 };\n    this.mode = mode;\n  }\n\n  private getValue(node: SyntaxNode): string {\n    return this.getValueTrim(node).replace(/\\n/g, \"\\\\n\").replace(/\\t/g, \"\\\\t\");\n  }\n\n  private getValueTrim(node: SyntaxNode): string {\n    return this.script.slice(node.from, node.to);\n  }\n\n  public static applyChangesToScript(script: string, ranges: [number, number, string][]): string {\n    let offset = 0;\n    while (ranges.length > 0) {\n      const [from, to, replacement] = ranges.shift()!;\n      script = script.slice(0, from + offset) + replacement + script.slice(to + offset);\n      offset += replacement.length - (to - from);\n    }\n    return script;\n  }\n\n  public static isEqualProperty(a: IPlannerProgramProperty, b: IPlannerProgramProperty): boolean {\n    return a.fnName === b.fnName && a.fnArgs.join() === b.fnArgs.join() && a.script === b.script && a.body === b.body;\n  }\n\n  public static isEqualProgress(a: IProgramExerciseProgress, b: IProgramExerciseProgress): boolean {\n    const pickA = {\n      ...ObjectUtils_pick(a, [\"type\", \"state\", \"stateMetadata\", \"script\"]),\n      reuse: a.reuse?.fullName,\n    };\n    const pickB = {\n      ...ObjectUtils_pick(b, [\"type\", \"state\", \"stateMetadata\", \"script\"]),\n      reuse: b.reuse?.fullName,\n    };\n    return ObjectUtils_isEqual(pickA, pickB);\n  }\n\n  public static isEqualUpdate(a: IProgramExerciseUpdate, b: IProgramExerciseUpdate): boolean {\n    const pickA = { ...ObjectUtils_pick(a, [\"type\", \"script\"]), reuse: a.reuse?.fullName };\n    const pickB = { ...ObjectUtils_pick(b, [\"type\", \"script\"]), reuse: b.reuse?.fullName };\n    return ObjectUtils_isEqual(pickA, pickB);\n  }\n\n  private getPoint(node: SyntaxNode): IPlannerSyntaxPointer {\n    const [line, offset] = this.getLineAndOffset(node);\n    return { line, offset, from: node.from, to: node.to };\n  }\n\n  private error(message: string, node: SyntaxNode, details: IPlannerErrorDetails): never {\n    const point = this.getPoint(node);\n    throw PlannerSyntaxError.fromPoint(undefined, message, point, details);\n  }\n\n  public static getLineAndOffset(script: string, node: SyntaxNode): [number, number] {\n    const linesLengths = script.split(\"\\n\").map((l) => l.length + 1);\n    let offset = 0;\n    for (let i = 0; i < linesLengths.length; i++) {\n      const lineLength = linesLengths[i];\n      if (node.from >= offset && node.from < offset + lineLength) {\n        return [i + 1, node.from - offset];\n      }\n      offset += lineLength;\n    }\n    return [linesLengths.length, linesLengths[linesLengths.length - 1]];\n  }\n\n  private getLineAndOffset(node: SyntaxNode): [number, number] {\n    return PlannerExerciseEvaluator.getLineAndOffset(this.script, node);\n  }\n\n  public parse(expr: SyntaxNode): void {\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.isError) {\n        this.error(\"Syntax error\", cursor.node, { type: \"parse\" });\n      }\n    } while (cursor.next());\n  }\n\n  private getWarmupReps(setParts: string): { numberOfSets: number; reps: number } {\n    let [numberOfSetsStr, repsStr] = setParts.split(\"x\", 2);\n    if (!numberOfSetsStr) {\n      return { numberOfSets: 1, reps: 1 };\n    }\n    if (!repsStr) {\n      repsStr = numberOfSetsStr;\n      numberOfSetsStr = \"1\";\n    }\n    return {\n      reps: parseInt(repsStr, 10),\n      numberOfSets: parseInt(numberOfSetsStr, 10),\n    };\n  }\n\n  private getRepRange(setParts: string): IPlannerProgramExerciseRepRange | undefined {\n    if (!setParts) {\n      return undefined;\n    }\n    const [numberOfSetsStr, repRangeStr] = setParts.split(\"x\", 2);\n\n    const reprange = repRangeStr.split(\"-\", 2);\n    let minrepStr: string | undefined = reprange[0];\n    let maxrepStr: string | undefined = reprange[1];\n    if (!maxrepStr) {\n      maxrepStr = minrepStr;\n      minrepStr = undefined;\n    }\n    let isAmrap = false;\n    if (maxrepStr.endsWith(\"+\")) {\n      isAmrap = true;\n      maxrepStr.replace(/\\+/g, \"\");\n    }\n    return {\n      numberOfSets: parseInt(numberOfSetsStr, 10),\n      minrep: minrepStr != null ? parseInt(minrepStr, 10) : undefined,\n      maxrep: parseInt(maxrepStr, 10),\n      isAmrap: isAmrap,\n      isQuickAddSet: numberOfSetsStr.endsWith(\"+\"),\n    };\n  }\n\n  private getWeight(expr?: SyntaxNode | null): IWeight | undefined {\n    if (expr?.type.name === PlannerNodeName.WeightWithPlus || expr?.type.name === PlannerNodeName.Weight) {\n      const value = this.getValue(expr).replace(\"+\", \"\");\n      const unit = value.indexOf(\"kg\") !== -1 ? \"kg\" : \"lb\";\n      return W.Weight_build(parseFloat(value), unit);\n    } else {\n      return undefined;\n    }\n  }\n\n  private evaluateWarmupSet(expr: SyntaxNode): IPlannerProgramExerciseWarmupSet {\n    if (expr.type.name === PlannerNodeName.WarmupExerciseSet) {\n      const setPartNodes = expr.getChildren(PlannerNodeName.WarmupSetPart);\n      const setParts = setPartNodes.map((setPartNode) => this.getValue(setPartNode)).join(\"\");\n      const { numberOfSets, reps } = this.getWarmupReps(setParts);\n      const percentageNode = expr.getChild(PlannerNodeName.Percentage);\n      const weightNode = expr.getChild(PlannerNodeName.Weight);\n      const percentage =\n        percentageNode == null ? undefined : parseFloat(this.getValue(percentageNode).replace(\"%\", \"\"));\n      const weight = this.getWeight(weightNode);\n      if (percentage) {\n        return {\n          type: \"warmup\",\n          reps,\n          numberOfSets,\n          percentage,\n        };\n      } else {\n        return {\n          type: \"warmup\",\n          reps,\n          numberOfSets,\n          weight: weight!,\n        };\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  public static fnArgsToStateVars(\n    fnArgs: string[],\n    onError?: (message: string, value: string) => void\n  ): {\n    state: IProgramState;\n    stateMetadata: IProgramStateMetadata;\n  } {\n    return PlannerStateVars_fromArgs(fnArgs, onError);\n  }\n\n  private evaluateSet(expr: SyntaxNode): IPlannerProgramExerciseSet {\n    if (expr.type.name === PlannerNodeName.ExerciseSet) {\n      const setPartNodes = expr.getChildren(PlannerNodeName.SetPart);\n      const setParts = setPartNodes.map((setPartNode) => this.getValue(setPartNode)).join(\"\");\n      const repRange = this.getRepRange(setParts);\n      const rpeNode = expr.getChild(PlannerNodeName.Rpe);\n      const timerNode = expr.getChild(PlannerNodeName.Timer);\n      const setTimerNode = expr.getChild(PlannerNodeName.SetTimer);\n      const autoNode = expr.getChild(PlannerNodeName.Auto);\n      const percentageNode = expr.getChild(PlannerNodeName.PercentageWithPlus);\n      const weightNode = expr.getChild(PlannerNodeName.WeightWithPlus);\n      const labelNode = expr.getChild(PlannerNodeName.SetLabel);\n      const askWeightNode = expr.getChild(PlannerNodeName.AskWeight);\n      const askWeight =\n        askWeightNode != null ||\n        (weightNode != null && this.getValue(weightNode).indexOf(\"+\") !== -1) ||\n        (percentageNode != null && this.getValue(percentageNode).indexOf(\"+\") !== -1);\n      const logRpe = rpeNode == null ? undefined : this.getValue(rpeNode).indexOf(\"+\") !== -1;\n      let rpe = rpeNode == null ? undefined : parseFloat(this.getValue(rpeNode).replace(\"@\", \"\").replace(\"+\", \"\"));\n      if (rpe != null && isNaN(rpe)) {\n        rpe = undefined;\n      }\n      let timer = timerNode == null ? undefined : parseInt(this.getValue(timerNode).replace(\"s\", \"\"), 10);\n      let setTimer: number | undefined;\n      let isOverflowSetTimer: boolean | undefined;\n      if (setTimerNode != null) {\n        // SetTimer encodes both the active timer and the rest timer, e.g. \"60s+|30s\" or \"60s|?\"\n        const [leftRaw, rightRaw] = this.getValue(setTimerNode).split(\"|\");\n        isOverflowSetTimer = leftRaw.indexOf(\"+\") !== -1 ? true : undefined;\n        setTimer = parseInt(leftRaw.replace(\"s\", \"\").replace(\"+\", \"\"), 10);\n        // \"?\" on the rest side means \"fall back to the global default rest timer\"\n        timer = rightRaw === \"?\" ? undefined : parseInt(rightRaw.replace(\"s\", \"\"), 10);\n      }\n      const auto = autoNode != null ? true : undefined;\n      const percentage =\n        percentageNode == null ? undefined : parseFloat(this.getValue(percentageNode).replace(/[%\\+]/, \"\"));\n      const weight = this.getWeight(weightNode);\n      const label = labelNode\n        ? getChildren(labelNode)\n            .map((n) => this.getValue(n))\n            .join(\" \")\n        : undefined;\n      if (labelNode && label && label.length > 8) {\n        this.error(\"Label length should be 8 chars max\", labelNode, { type: \"labelTooLong\", data: { max: 8 } });\n      }\n      return {\n        repRange,\n        timer,\n        setTimer,\n        isOverflowSetTimer,\n        auto,\n        logRpe,\n        rpe,\n        weight,\n        percentage,\n        label,\n        askWeight,\n      };\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  private evaluateId(expr: SyntaxNode): number[] {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        throw this.error(`Missing value for the property 'id'`, expr, {\n          type: \"missingPropertyValue\",\n          data: { property: \"id\" },\n        });\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      if ([\"tags\"].indexOf(fnName) === -1) {\n        this.error(`There's no such id type - '${fnName}'`, fnNameNode, {\n          type: \"unknownIdType\",\n          data: { name: fnName },\n        });\n      }\n      const fnArgs = valueNode.getChildren(PlannerNodeName.FunctionArgument).map((argNode) => this.getValue(argNode));\n      if (fnName === \"tags\") {\n        if (fnArgs.length === 0) {\n          this.error(`You should provide the list of numbers in \"tags\"`, fnNameNode, { type: \"invalidTags\" });\n        }\n      }\n      return fnArgs.map((t) => parseInt(t, 10)).filter((t) => !isNaN(t));\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateUpdate(expr: SyntaxNode, exerciseType?: IExerciseType): IProgramExerciseUpdate {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        throw this.error(`Missing value for the property 'update'`, expr, {\n          type: \"missingPropertyValue\",\n          data: { property: \"update\" },\n        });\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      const fnArgs = valueNode.getChildren(PlannerNodeName.FunctionArgument).map((argNode) => this.getValue(argNode));\n      let script: string | undefined;\n      let body: string | undefined;\n      let meta: { stateKeys: Set<string> } | undefined;\n      let liftoscriptNode: SyntaxNode | undefined;\n      if (fnName === \"custom\") {\n        liftoscriptNode = valueNode.getChild(PlannerNodeName.Liftoscript) || undefined;\n        script = liftoscriptNode ? this.getValueTrim(liftoscriptNode) : undefined;\n        if (fnArgs.length > 0) {\n          this.error(`State variables for the update script are taken from \"progress\" block`, fnNameNode, {\n            type: \"updateStateFromProgress\",\n          });\n        }\n        const reuseLiftoscriptNode = valueNode\n          .getChild(PlannerNodeName.ReuseLiftoscript)\n          ?.getChild(PlannerNodeName.ReuseSection)\n          ?.getChild(PlannerNodeName.ExerciseName);\n        body = reuseLiftoscriptNode ? this.getValue(reuseLiftoscriptNode) : undefined;\n        if (script) {\n          const liftoscriptEvaluator = new ScriptRunner(\n            script,\n            {},\n            {},\n            Progress_createEmptyScriptBindings(this.dayData, this.settings),\n            Progress_createScriptFunctions(this.settings),\n            this.settings.units,\n            { exerciseType, unit: this.settings.units, prints: [] },\n            \"update\"\n          );\n          const stateKeys = liftoscriptEvaluator.getStateVariableKeys();\n          meta = { stateKeys };\n        }\n        if (!script && !body) {\n          this.error(\n            `'custom' update requires either to specify Liftoscript block or specify which one to reuse`,\n            valueNode,\n            { type: \"customWithoutScript\", data: { section: \"update\" } }\n          );\n        }\n        return {\n          type: \"custom\",\n          script,\n          liftoscriptNode,\n          meta,\n          reuse: body ? { fullName: body, source: \"specific\" } : undefined,\n        };\n      } else {\n        this.error(`There's no such update progression exists - '${fnName}'`, fnNameNode, {\n          type: \"unknownUpdate\",\n          data: { name: fnName },\n        });\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private validateProgress(fnName: string, fnArgs: string[], fnNameNode: SyntaxNode, valueNode: SyntaxNode): void {\n    if ([\"lp\", \"sum\", \"dp\", \"custom\", \"none\"].indexOf(fnName) === -1) {\n      this.error(`There's no such progression exists - '${fnName}'`, fnNameNode, {\n        type: \"unknownProgression\",\n        data: { name: fnName },\n      });\n    }\n    if (fnName === \"lp\") {\n      if (fnArgs.length > 6) {\n        this.error(`Linear Progression 'lp' only has 6 arguments max`, valueNode, {\n          type: \"progressionArity\",\n          data: { fn: \"lp\", max: 6 },\n        });\n      } else if (fnArgs[0] && !fnArgs[0].endsWith(\"lb\") && !fnArgs[0].endsWith(\"kg\") && !fnArgs[0].endsWith(\"%\")) {\n        this.error(\n          `1st argument of 'lp' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode,\n          { type: \"progressionArgument\", data: { fn: \"lp\", index: 0, expected: \"weightOrPercentage\" } }\n        );\n      } else if (fnArgs[1] != null && isNaN(parseInt(fnArgs[1], 10))) {\n        this.error(`2nd argument of 'lp' should be a number of attempts - i.e. a number`, valueNode, {\n          type: \"progressionArgument\",\n          data: { fn: \"lp\", index: 1, expected: \"number\" },\n        });\n      } else if (fnArgs[2] != null && isNaN(parseInt(fnArgs[2], 10))) {\n        this.error(\n          `3rd argument of 'lp' should be a current number of successful attempts up to date - i.e. a number`,\n          valueNode,\n          { type: \"progressionArgument\", data: { fn: \"lp\", index: 2, expected: \"number\" } }\n        );\n      } else if (\n        fnArgs[3] != null &&\n        !fnArgs[3].endsWith(\"lb\") &&\n        !fnArgs[3].endsWith(\"kg\") &&\n        !fnArgs[3].endsWith(\"%\")\n      ) {\n        this.error(\n          `4th argument of 'lp' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode,\n          { type: \"progressionArgument\", data: { fn: \"lp\", index: 3, expected: \"weightOrPercentage\" } }\n        );\n      } else if (fnArgs[4] != null && isNaN(parseInt(fnArgs[4], 10))) {\n        this.error(`5th argument of 'lp' should be a number of failed attempts - i.e. a number`, valueNode, {\n          type: \"progressionArgument\",\n          data: { fn: \"lp\", index: 4, expected: \"number\" },\n        });\n      } else if (fnArgs[5] != null && isNaN(parseInt(fnArgs[5], 10))) {\n        this.error(\n          `6th argument of 'lp' should be a current number of failed attempts up to date - i.e. a number`,\n          valueNode,\n          { type: \"progressionArgument\", data: { fn: \"lp\", index: 5, expected: \"number\" } }\n        );\n      }\n    } else if (fnName === \"sum\") {\n      if (fnArgs.length > 2) {\n        this.error(`Reps Sum Progression 'sum' only has 2 arguments max`, valueNode, {\n          type: \"progressionArity\",\n          data: { fn: \"sum\", max: 2 },\n        });\n      } else if (fnArgs[0] == null || isNaN(parseInt(fnArgs[0], 10))) {\n        this.error(`1st argument of 'sum' should be a number of reps - i.e. a number`, valueNode, {\n          type: \"progressionArgument\",\n          data: { fn: \"sum\", index: 0, expected: \"number\" },\n        });\n      } else if (\n        fnArgs[1] == null ||\n        (!fnArgs[1].endsWith(\"lb\") && !fnArgs[1].endsWith(\"kg\") && !fnArgs[1].endsWith(\"%\"))\n      ) {\n        this.error(\n          `2nd argument of 'sum' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode,\n          { type: \"progressionArgument\", data: { fn: \"sum\", index: 1, expected: \"weightOrPercentage\" } }\n        );\n      }\n    } else if (fnName === \"dp\") {\n      if (fnArgs.length !== 3) {\n        this.error(`Double Progression 'dp' should have 3 arguments`, valueNode, {\n          type: \"progressionArity\",\n          data: { fn: \"dp\", max: 3 },\n        });\n      } else if (\n        fnArgs[0] == null ||\n        (!fnArgs[0].endsWith(\"lb\") && !fnArgs[0].endsWith(\"kg\") && !fnArgs[0].endsWith(\"%\"))\n      ) {\n        this.error(\n          `1st argument of 'dp' should be weight (ending with 'lb' or 'kg') or percentage (ending with '%'). For example '10lb' or '30%'.`,\n          valueNode,\n          { type: \"progressionArgument\", data: { fn: \"dp\", index: 0, expected: \"weightOrPercentage\" } }\n        );\n      } else if (fnArgs[1] == null || isNaN(parseInt(fnArgs[1], 10))) {\n        this.error(`2nd argument of 'dp' should be min reps in the range - i.e. a number, like 8`, valueNode, {\n          type: \"progressionArgument\",\n          data: { fn: \"dp\", index: 1, expected: \"number\" },\n        });\n      } else if (fnArgs[2] == null || isNaN(parseInt(fnArgs[2], 10))) {\n        this.error(`3rd argument of 'dp' should be max reps in the range - i.e. a number, like 12`, valueNode, {\n          type: \"progressionArgument\",\n          data: { fn: \"dp\", index: 2, expected: \"number\" },\n        });\n      }\n    } else if (fnName === \"custom\") {\n      const liftoscriptNode = valueNode.getChild(PlannerNodeName.Liftoscript);\n      const script = liftoscriptNode ? this.getValueTrim(liftoscriptNode) : undefined;\n      const reuseLiftoscriptNode = valueNode\n        .getChild(PlannerNodeName.ReuseLiftoscript)\n        ?.getChild(PlannerNodeName.ReuseSection)\n        ?.getChild(PlannerNodeName.ExerciseName);\n      const body = reuseLiftoscriptNode ? this.getValue(reuseLiftoscriptNode) : undefined;\n      if (!script && !body) {\n        this.error(\n          `'custom' progression requires either to specify Liftoscript block or specify which one to reuse`,\n          valueNode,\n          { type: \"customWithoutScript\", data: { section: \"progress\" } }\n        );\n      }\n    }\n  }\n\n  private evaluateProgress(expr: SyntaxNode, exerciseType?: IExerciseType): IProgramExerciseProgress {\n    const result = this.evaluateProgressImpl(expr, exerciseType);\n    if (result.success) {\n      return result.data;\n    } else {\n      throw this.error(result.error.message, expr, result.error.details);\n    }\n  }\n\n  private evaluateProgressImpl(\n    expr: SyntaxNode,\n    exerciseType?: IExerciseType\n  ): IEither<IProgramExerciseProgress, { message: string; details: IPlannerErrorDetails }> {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const valueNode = expr.getChild(PlannerNodeName.FunctionExpression);\n      if (valueNode == null) {\n        const none = expr.getChild(PlannerNodeName.None);\n        if (none != null) {\n          return PlannerProgramExercise_buildProgress(\"none\", []);\n        } else {\n          throw this.error(`Missing value for the property 'progress'`, expr, {\n            type: \"missingPropertyValue\",\n            data: { property: \"progress\" },\n          });\n        }\n      }\n      const fnNameNode = valueNode.getChild(PlannerNodeName.FunctionName);\n      if (fnNameNode == null) {\n        assert(PlannerNodeName.FunctionName);\n      }\n      const fnName = this.getValue(fnNameNode);\n      const fnArgs = valueNode.getChildren(PlannerNodeName.FunctionArgument).map((argNode) => this.getValue(argNode));\n      this.validateProgress(fnName, fnArgs, fnNameNode, valueNode);\n\n      const type = fnName as IProgramExerciseProgressType;\n      if (type === \"custom\") {\n        const liftoscriptNode = valueNode.getChild(PlannerNodeName.Liftoscript);\n        const script = liftoscriptNode ? this.getValueTrim(liftoscriptNode) : undefined;\n        const { state } = PlannerExerciseEvaluator.fnArgsToStateVars(fnArgs, (message, value) =>\n          this.error(message, fnNameNode, { type: \"invalidStateVariable\", data: { value } })\n        );\n        if (script) {\n          const liftoscriptEvaluator = new ScriptRunner(\n            script,\n            state,\n            {},\n            Progress_createEmptyScriptBindings(this.dayData, this.settings),\n            Progress_createScriptFunctions(this.settings),\n            this.settings.units,\n            { exerciseType, unit: this.settings.units, prints: [] },\n            \"planner\"\n          );\n          try {\n            liftoscriptEvaluator.parse();\n          } catch (e) {\n            if (e instanceof LiftoscriptSyntaxError && liftoscriptNode) {\n              const [line] = this.getLineAndOffset(liftoscriptNode);\n              throw new PlannerSyntaxError(\n                e.message,\n                line + e.line,\n                e.offset,\n                liftoscriptNode.from + e.from,\n                liftoscriptNode.from + e.to,\n                e.details\n              );\n            } else {\n              throw e;\n            }\n          }\n        }\n        const reuseLiftoscriptNode = valueNode\n          .getChild(PlannerNodeName.ReuseLiftoscript)\n          ?.getChild(PlannerNodeName.ReuseSection)\n          ?.getChild(PlannerNodeName.ExerciseName);\n        const body = reuseLiftoscriptNode ? this.getValue(reuseLiftoscriptNode) : undefined;\n        return PlannerProgramExercise_buildProgress(type, fnArgs, {\n          script,\n          reuseFullname: body,\n        });\n      } else {\n        return PlannerProgramExercise_buildProgress(type, fnArgs);\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateWarmup(expr: SyntaxNode): IPlannerProgramExerciseWarmupSet[] {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const none = expr.getChild(PlannerNodeName.None);\n      if (none != null) {\n        return [];\n      }\n      const setsNode = expr.getChild(PlannerNodeName.WarmupExerciseSets);\n      if (setsNode != null) {\n        const sets = setsNode.getChildren(PlannerNodeName.WarmupExerciseSet);\n        if (sets.length > 0) {\n          return sets.map((set) => this.evaluateWarmupSet(set));\n        }\n      }\n      return [];\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private evaluateSuperset(expr: SyntaxNode): { type: \"superset\"; data: IPlannerProgramExerciseSuperset } {\n    if (expr.type.name === PlannerNodeName.Superset) {\n      const exerciseNameNode = expr.getChild(PlannerNodeName.ExerciseName);\n      if (exerciseNameNode != null) {\n        const name = this.getValue(exerciseNameNode);\n        return {\n          type: \"superset\",\n          data: { name },\n        };\n      } else {\n        assert(PlannerNodeName.ExerciseName);\n      }\n    } else {\n      assert(PlannerNodeName.Superset);\n    }\n  }\n\n  private evaluateProperty(\n    expr: SyntaxNode,\n    exerciseType?: IExerciseType\n  ):\n    | { type: \"progress\"; data: IProgramExerciseProgress }\n    | { type: \"update\"; data: IProgramExerciseUpdate }\n    | { type: \"warmup\"; data: IPlannerProgramExerciseWarmupSet[] }\n    | { type: \"id\"; data: number[] }\n    | { type: \"used\"; data: \"\" } {\n    if (expr.type.name === PlannerNodeName.ExerciseProperty) {\n      const nameNode = expr.getChild(PlannerNodeName.ExercisePropertyName);\n      if (nameNode == null) {\n        assert(PlannerNodeName.ExercisePropertyName);\n      }\n      const name = this.getValue(nameNode);\n      if (name === \"progress\") {\n        return { type: \"progress\", data: this.evaluateProgress(expr, exerciseType) };\n      } else if (name === \"update\") {\n        return { type: \"update\", data: this.evaluateUpdate(expr, exerciseType) };\n      } else if (name === \"warmup\") {\n        return { type: \"warmup\", data: this.evaluateWarmup(expr) };\n      } else if (name === \"id\") {\n        return { type: \"id\", data: this.evaluateId(expr) };\n      } else if (name === \"used\") {\n        return { type: \"used\", data: \"\" };\n      } else {\n        this.error(`There's no such property exists - '${name}'`, nameNode, {\n          type: \"unknownProperty\",\n          data: { name },\n        });\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseProperty);\n    }\n  }\n\n  private getReuseWeekDay(weekDayNode: SyntaxNode | null): { week?: number; day?: number } {\n    let week: number | undefined;\n    let day: number | undefined;\n    if (weekDayNode != null) {\n      const result = weekDayNode.getChildren(PlannerNodeName.WeekOrDay).map((n) => {\n        const child = getChildren(n)[0];\n        if (child.type.name === PlannerNodeName.Int) {\n          return parseInt(this.getValue(child), 10);\n        } else {\n          return undefined;\n        }\n      });\n      if (result.length === 1) {\n        day = result[0];\n      } else {\n        week = result[0];\n        day = result[1];\n      }\n    }\n    return { week, day };\n  }\n\n  private evaluateReuseNode(expr: SyntaxNode): { type: \"reuse\"; data: IPlannerProgramReuse } {\n    if (expr.type.name === PlannerNodeName.ReuseSectionWithWeekDay) {\n      const nameNode = expr.getChild(PlannerNodeName.ReuseSection)?.getChild(PlannerNodeName.ExerciseName);\n      if (nameNode == null) {\n        assert(PlannerNodeName.ExerciseName);\n      }\n      const name = this.getValue(nameNode);\n      const { week, day } = this.getReuseWeekDay(expr.getChild(PlannerNodeName.WeekDay));\n      return { type: \"reuse\", data: { fullName: name, week, day, source: \"overall\" } };\n    } else {\n      assert(PlannerNodeName.ReuseSectionWithWeekDay);\n    }\n  }\n\n  private evaluateSection(\n    expr: SyntaxNode,\n    exerciseType?: IExerciseType\n  ):\n    | { type: \"sets\"; data: IPlannerProgramExerciseSet[]; isCurrent: boolean }\n    | { type: \"progress\"; data: IProgramExerciseProgress }\n    | { type: \"update\"; data: IProgramExerciseUpdate }\n    | { type: \"id\"; data: number[] }\n    | { type: \"reuse\"; data: IPlannerProgramReuse }\n    | { type: \"warmup\"; data: IPlannerProgramExerciseWarmupSet[] }\n    | { type: \"superset\"; data: IPlannerProgramExerciseSuperset }\n    | { type: \"used\"; data: \"\" } {\n    if (expr.type.name === PlannerNodeName.ExerciseSection) {\n      const reuseNode = expr.getChild(PlannerNodeName.ReuseSectionWithWeekDay);\n      if (reuseNode != null) {\n        return this.evaluateReuseNode(reuseNode);\n      }\n      const setsNode = expr.getChild(PlannerNodeName.ExerciseSets);\n      if (setsNode != null) {\n        const sets = setsNode.getChildren(PlannerNodeName.ExerciseSet);\n        const isCurrent = setsNode.getChild(PlannerNodeName.CurrentVariation) != null;\n        if (sets.length > 0) {\n          return { type: \"sets\", data: sets.map((set) => this.evaluateSet(set)), isCurrent };\n        }\n      }\n      const superset = expr.getChild(PlannerNodeName.Superset);\n      if (superset != null) {\n        return this.evaluateSuperset(superset);\n      }\n      const property = expr.getChild(PlannerNodeName.ExerciseProperty);\n      if (property != null) {\n        return this.evaluateProperty(property, exerciseType);\n      } else {\n        assert(PlannerNodeName.ExerciseProperty);\n      }\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  public static extractNameParts = memoize(\n    (str: string, exercises: IAllCustomExercises): { name: string; label?: string; equipment?: string } => {\n      let [label, ...nameEquipmentItems] = str.split(\":\");\n      if (nameEquipmentItems.length === 0) {\n        nameEquipmentItems = [label];\n        label = \"\";\n      } else {\n        label = label.trim();\n      }\n      const nameEquipment = nameEquipmentItems.join(\":\").trim();\n      const matchingExercise = Exercise_findByNameAndEquipment(nameEquipment, exercises);\n      if (matchingExercise) {\n        return { name: matchingExercise.name, label: label ? label : undefined, equipment: matchingExercise.equipment };\n      }\n      return { name: nameEquipment, label: label ? label : undefined };\n    },\n    { maxSize: 1000 }\n  );\n\n  private addDescription(value: string): void {\n    value = value.replace(/^\\/\\//, \"\");\n    if (this.latestDescriptions.length === 0) {\n      this.latestDescriptions.push([]);\n    }\n    this.latestDescriptions[this.latestDescriptions.length - 1].push(value);\n  }\n\n  private getOrder(expr: SyntaxNode): number {\n    if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const repeatNode = expr.getChild(PlannerNodeName.Repeat);\n      if (repeatNode == null) {\n        return 0;\n      }\n      const children = getChildren(repeatNode);\n      for (const childNode of children) {\n        if (childNode.type.name === PlannerNodeName.Rep) {\n          return parseInt(this.getValue(childNode), 10);\n        }\n      }\n      return 0;\n    } else {\n      assert(PlannerNodeName.ExerciseExpression);\n    }\n  }\n\n  private getRepeat(expr: SyntaxNode): number[] {\n    if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const repeatNode = expr.getChild(PlannerNodeName.Repeat);\n      if (repeatNode == null) {\n        return [];\n      }\n      const result: Set<number> = new Set();\n      const children = getChildren(repeatNode);\n      for (const childNode of children) {\n        if (childNode.type.name === PlannerNodeName.RepRange) {\n          const [from, to] = getChildren(childNode).map((n) => parseInt(this.getValue(n), 10));\n          for (let i = from; i <= to; i += 1) {\n            result.add(i);\n          }\n          break;\n        }\n      }\n      return Array.from(result).sort((a, b) => a - b);\n    } else {\n      assert(PlannerNodeName.ExerciseExpression);\n    }\n  }\n\n  private getRepeatRanges(numbers: number[]): string[] {\n    // Check if the input array is empty\n    if (numbers.length === 0) {\n      return [];\n    }\n\n    const ranges: string[] = [];\n    let rangeStart = numbers[0];\n    let rangeEnd = numbers[0];\n\n    for (let i = 1; i < numbers.length; i++) {\n      if (numbers[i] === rangeEnd + 1) {\n        // If the current number is consecutive, extend the current range\n        rangeEnd = numbers[i];\n      } else {\n        // If not consecutive, add the current range to results and start a new range\n        ranges.push(`${rangeStart}-${rangeEnd}`);\n        rangeStart = numbers[i];\n        rangeEnd = numbers[i];\n      }\n    }\n\n    // Add the last range to results\n    ranges.push(`${rangeStart}-${rangeEnd}`);\n\n    return ranges;\n  }\n\n  private getIsNotUsed(expr: SyntaxNode): boolean {\n    if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const sections = expr.getChildren(PlannerNodeName.ExerciseSection);\n      for (const section of sections) {\n        const properties = section.getChildren(PlannerNodeName.ExerciseProperty);\n        for (const property of properties) {\n          const nameNode = property.getChild(PlannerNodeName.ExercisePropertyName);\n          const name = nameNode ? this.getValueTrim(nameNode) : undefined;\n          const valueNode = property.getChild(PlannerNodeName.None);\n          if (name === \"used\" && valueNode != null) {\n            return true;\n          }\n        }\n      }\n      return false;\n    } else {\n      assert(PlannerNodeName.ExerciseSection);\n    }\n  }\n\n  private evaluateExercise(expr: SyntaxNode): void {\n    if (expr.type.name === PlannerNodeName.EmptyExpression || expr.type.name === PlannerNodeName.TripleLineComment) {\n      if (this.latestDescriptions.length > 0) {\n        this.latestDescriptions.push([]);\n      }\n      return;\n    } else if (expr.type.name === PlannerNodeName.Week) {\n      if (this.mode === \"perday\") {\n        this.error(\n          `You cannot specify weeks in the per-day exercise lists. Switch to the full program mode for that.`,\n          expr,\n          { type: \"weeksNotAllowedInDayMode\" }\n        );\n      }\n      const weekName = this.getValueTrim(expr).replace(/^#+/, \"\").trim();\n      const [line] = this.getLineAndOffset(expr);\n      this.weeks.push({ name: weekName, line, days: [] });\n      this.dayData = { day: this.dayData.day, week: this.weeks.length + 1, dayInWeek: 0 };\n    } else if (expr.type.name === PlannerNodeName.Day) {\n      if (this.mode === \"perday\") {\n        this.error(\n          `You cannot specify days in the per-day exercise lists. Switch to the full program mode for that.`,\n          expr,\n          { type: \"daysNotAllowedInDayMode\" }\n        );\n      }\n      if (this.weeks.length === 0) {\n        this.error(`You need to specify a week before a day`, expr, { type: \"dayWithoutWeek\" });\n      }\n      const dayName = this.getValueTrim(expr).replace(/^#+/, \"\").trim();\n      const [line] = this.getLineAndOffset(expr);\n      this.weeks[this.weeks.length - 1].days.push({ name: dayName, line, exercises: [] });\n      this.dayData = {\n        day: this.dayData.day + 1,\n        week: this.dayData.week,\n        dayInWeek: (this.dayData.dayInWeek || 0) + 1,\n      };\n      this.exerciseIndex = 0;\n    } else if (expr.type.name === PlannerNodeName.LineComment) {\n      const value = this.getValueTrim(expr).trim();\n      this.addDescription(value);\n      return undefined;\n    } else if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      if (this.mode === \"full\" && (this.weeks.length === 0 || this.weeks[this.weeks.length - 1].days.length === 0)) {\n        this.error(`You should first define a week and a day before listing exercises.`, expr, {\n          type: \"exerciseWithoutDay\",\n        });\n      } else if (this.weeks.length === 0) {\n        this.weeks.push({ name: \"Week 1\", line: 1, days: [{ name: \"Day 1\", line: 1, exercises: [] }] });\n      }\n      const variationsNode = expr.getChild(PlannerNodeName.ExerciseVariations);\n      if (variationsNode == null) {\n        assert(PlannerNodeName.ExerciseVariations);\n      }\n      const nameNode = variationsNode;\n\n      const fullName = this.getValue(variationsNode);\n      const variationNodes = variationsNode.getChildren(PlannerNodeName.ExerciseVariation);\n      const exerciseVariations: IPlannerProgramExerciseVariation[] = [];\n      let label: string | undefined;\n      for (let i = 0; i < variationNodes.length; i += 1) {\n        const variationNode = variationNodes[i];\n        const isCurrent = variationNode.getChild(PlannerNodeName.CurrentVariation) != null;\n        const variationNameNode = variationNode.getChild(PlannerNodeName.ExerciseName);\n        if (variationNameNode == null) {\n          assert(PlannerNodeName.ExerciseName);\n        }\n        const variationFullName = this.getValue(variationNameNode);\n        const parts = PlannerExerciseEvaluator.extractNameParts(variationFullName, this.settings.exercises);\n        if (i === 0) {\n          label = parts.label;\n        }\n        const variationShortName = PlannerProgramExercise_shortNameFromFullName(variationFullName, this.settings);\n        const variationExerciseType = Exercise_findByNameAndEquipment(variationShortName, this.settings.exercises);\n        exerciseVariations.push({\n          exerciseType: variationExerciseType,\n          name: parts.name,\n          isCurrent,\n        });\n      }\n      const currentVariationIndex = exerciseVariations.findIndex((v) => v.isCurrent);\n      const activeVariationIndex = currentVariationIndex === -1 ? 0 : currentVariationIndex;\n      const activeVariation = exerciseVariations[activeVariationIndex];\n      const name = activeVariation?.name ?? \"\";\n      const exercise = activeVariation?.exerciseType;\n      const equipment = exercise?.equipment;\n      const key = PlannerKey_fromExerciseVariations(exerciseVariations, label);\n      const shortName = Exercise_buildName(name, this.settings, undefined, equipment);\n      let notused = this.getIsNotUsed(expr);\n      const sectionNodes = expr.getChildren(PlannerNodeName.ExerciseSection);\n      const setVariations: IPlannerProgramExerciseSetVariation[] = [];\n      const allSets: IPlannerProgramExerciseSet[] = [];\n      let allWarmupSets: IPlannerProgramExerciseWarmupSet[] | undefined;\n      let reuse: IPlannerProgramReuse | undefined;\n      const repeat = this.getRepeat(expr);\n      const order = this.getOrder(expr);\n      const text = this.getValueTrim(expr).trim();\n      let tags: number[] = [];\n      let progress: IProgramExerciseProgress | undefined;\n      let update: IProgramExerciseUpdate | undefined;\n      let superset: IPlannerProgramExerciseSuperset | undefined;\n      for (const sectionNode of sectionNodes) {\n        const section = this.evaluateSection(sectionNode, exercise ? { id: exercise.id, equipment } : undefined);\n        if (section.type === \"sets\") {\n          allSets.push(...section.data);\n          if (section.data.some((set) => set.repRange != null)) {\n            setVariations.push({ sets: section.data, isCurrent: section.isCurrent });\n          }\n        } else if (section.type === \"warmup\") {\n          allWarmupSets = allWarmupSets || [];\n          allWarmupSets.push(...section.data);\n        } else if (section.type === \"progress\") {\n          progress = section.data;\n        } else if (section.type === \"update\") {\n          update = section.data;\n        } else if (section.type === \"reuse\") {\n          reuse = section.data;\n        } else if (section.type === \"id\") {\n          tags = tags.concat(section.data);\n        } else if (section.type === \"superset\") {\n          superset = section.data;\n        } else if (section.type === \"used\") {\n          notused = true;\n        } else {\n          throw new Error(`Unexpected section type`);\n        }\n      }\n      const rpe = allSets.find((set) => set.repRange == null && set.rpe != null)?.rpe;\n      const timer = allSets.find((set) => set.repRange == null && set.timer != null)?.timer;\n      const setTimer = allSets.find((set) => set.repRange == null && set.setTimer != null)?.setTimer;\n      const isOverflowSetTimer = allSets.find(\n        (set) => set.repRange == null && set.isOverflowSetTimer != null\n      )?.isOverflowSetTimer;\n      const auto = allSets.find((set) => set.repRange == null && set.auto != null)?.auto;\n      const percentage = allSets.find((set) => set.repRange == null && set.percentage != null)?.percentage;\n      const weight = allSets.find((set) => set.repRange == null && set.weight != null)?.weight;\n      const logRpe = allSets.find((set) => set.repRange == null && set.logRpe != null)?.logRpe;\n      const askWeight = allSets.find((set) => set.repRange == null && set.askWeight != null)?.askWeight;\n      const [line] = this.getLineAndOffset(expr);\n      const rawDescriptions: string[] = this.latestDescriptions.map((d) => d.join(\"\\n\"));\n      const currentDescriptionIndex = rawDescriptions.findIndex((d) => /^\\s*!/.test(d));\n      let descriptions = rawDescriptions.map((d, i) => ({\n        value: d.replace(/^\\s*!/, \"\"),\n        isCurrent: i === currentDescriptionIndex,\n      }));\n      if (descriptions.length > 1) {\n        descriptions = descriptions.filter((d) => d.value);\n      }\n      descriptions = descriptions.map((d) => ({ ...d, value: StringUtils_unindent(d.value) }));\n      this.latestDescriptions = [];\n      const fullNamePoint = this.getPoint(nameNode);\n\n      const reuseSetsNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => n.getChild(PlannerNodeName.ReuseSectionWithWeekDay))\n        .filter((n) => n)[0];\n      const reuseSetPoint = reuseSetsNode ? this.getPoint(reuseSetsNode) : undefined;\n\n      const progressNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"progress\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const progressPoint = progressNode ? this.getPoint(progressNode) : undefined;\n\n      const updateNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"update\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const updatePoint = updateNode ? this.getPoint(updateNode) : undefined;\n\n      const idNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"id\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const idPoint = idNode ? this.getPoint(idNode) : undefined;\n\n      // On the property name rather than on WarmupExerciseSets, so that `warmup: none` - which\n      // parses to a None node and no sets - still records where it was written.\n      const warmupNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => {\n          const node = n.getChild(PlannerNodeName.ExerciseProperty)?.getChild(PlannerNodeName.ExercisePropertyName);\n          return node != null && this.getValueTrim(node) === \"warmup\" ? node : undefined;\n        })\n        .flat(2)\n        .filter((n) => n)[0];\n      const warmupPoint = warmupNode ? this.getPoint(warmupNode) : undefined;\n\n      const supersetNode = expr\n        .getChildren(PlannerNodeName.ExerciseSection)\n        .map((n) => n.getChild(PlannerNodeName.Superset))\n        .filter((n) => n)[0];\n      const supersetPoint = supersetNode ? this.getPoint(supersetNode) : undefined;\n\n      const plannerExercise: IPlannerProgramExercise = {\n        id: UidFactory_generateUid(8),\n        key,\n        fullName,\n        shortName,\n        exerciseType: exercise,\n        label,\n        dayData: this.dayData,\n        text,\n        repeat,\n        repeating: [...repeat],\n        order,\n        superset,\n        name,\n        equipment,\n        exerciseIndex: this.exerciseIndex,\n        line,\n        tags,\n        notused: notused,\n        evaluatedSetVariations: [],\n        setVariations,\n        exerciseVariations,\n        descriptions: {\n          values: descriptions,\n        },\n        warmupSets: allWarmupSets,\n        reuse,\n        progress,\n        update,\n        globals: {\n          rpe,\n          logRpe,\n          askWeight,\n          timer,\n          setTimer,\n          isOverflowSetTimer,\n          auto,\n          percentage,\n          weight,\n        },\n        points: {\n          fullName: fullNamePoint,\n          supersetPoint,\n          reuseSetPoint,\n          progressPoint,\n          idPoint,\n          updatePoint,\n          warmupPoint,\n        },\n      };\n      this.weeks[this.weeks.length - 1].days[this.weeks[this.weeks.length - 1].days.length - 1].exercises.push(\n        plannerExercise\n      );\n      if (!notused) {\n        this.exerciseIndex += 1;\n      }\n    } else {\n      this.error(`Unexpected node type ${expr.node.type.name}`, expr, {\n        type: \"unexpectedNode\",\n        data: { node: expr.node.type.name },\n      });\n    }\n  }\n\n  private evaluateProgram(expr: SyntaxNode): IPlannerExerciseEvaluatorWeek[] {\n    if (expr.type.name === PlannerNodeName.Program) {\n      this.weeks = [];\n      this.exerciseIndex = 0;\n      for (const child of CollectionUtils_compact(getChildren(expr))) {\n        this.evaluateExercise(child);\n      }\n      return this.weeks;\n    } else {\n      this.error(`Unexpected node type ${expr.node.type.name}`, expr, {\n        type: \"unexpectedNode\",\n        data: { node: expr.node.type.name },\n      });\n    }\n  }\n\n  public evaluate(programNode: SyntaxNode): IPlannerEvalFullResult {\n    try {\n      this.parse(programNode);\n      const program = this.evaluateProgram(programNode);\n      return { data: program, success: true };\n    } catch (e) {\n      if (e instanceof PlannerSyntaxError) {\n        return { error: e, success: false };\n      } else {\n        throw e;\n      }\n    }\n  }\n\n  public hasWeightInUnit(programNode: SyntaxNode, unit: IUnit): boolean {\n    const cursor = programNode.cursor();\n    do {\n      const weight = this.getWeight(cursor.node);\n      if (weight != null) {\n        if (weight.unit === unit) {\n          return true;\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  public switchWeightsToUnit(programNode: SyntaxNode, settings: ISettings): string {\n    const cursor = programNode.cursor();\n    let script = this.script;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === PlannerNodeName.Weight) {\n        const weight = this.getWeight(cursor.node);\n        if (weight != null) {\n          if (weight.unit !== settings.units) {\n            const from = cursor.node.from;\n            const to = cursor.node.to;\n            const oldWeightStr = Weight_print(weight);\n            const newWeightStr = Weight_print(Weight_smartConvert(weight, settings.units));\n            script = script.substring(0, from + shift) + newWeightStr + script.substring(to + shift);\n            shift = shift + newWeightStr.length - oldWeightStr.length;\n          }\n        }\n      } else if (cursor.node.type.name === PlannerNodeName.Liftoscript) {\n        const oldLiftoscript = this.getValueTrim(cursor.node);\n        const liftoscriptEvaluator = new ScriptRunner(\n          oldLiftoscript,\n          {},\n          {},\n          Progress_createEmptyScriptBindings({ day: 1, week: 1, dayInWeek: 1 }, settings),\n          Progress_createScriptFunctions(settings),\n          settings.units,\n          { unit: settings.units, prints: [] },\n          \"planner\"\n        );\n        const newLiftoscript = liftoscriptEvaluator.switchWeightsToUnit(settings.units);\n        script =\n          script.substring(0, cursor.node.from + shift) + newLiftoscript + script.substring(cursor.node.to + shift);\n        shift = shift + newLiftoscript.length - oldLiftoscript.length;\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public changeExerciseName(node: SyntaxNode, from: string, to: string): string {\n    const cursor = node.cursor();\n    let script = this.script;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === PlannerNodeName.ExerciseName) {\n        const name = this.getValue(cursor.node);\n        if (name === from) {\n          const fromNode = cursor.node.from;\n          const toNode = cursor.node.to;\n          script = script.substring(0, fromNode + shift) + to + script.substring(toNode + shift);\n          shift = shift + to.length - name.length;\n        }\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public static changeWeightsToCompletedWeights(oldScript: string): string {\n    const node = plannerExerciseParser.parse(oldScript);\n    const cursor = node.cursor();\n    let script = oldScript;\n    let shift = 0;\n    do {\n      if (cursor.node.type.name === PlannerNodeName.Liftoscript) {\n        const value = LiftoscriptEvaluator.getValueRaw(oldScript, cursor.node);\n        const from = cursor.node.from;\n        const to = cursor.node.to;\n        const newValue = LiftoscriptEvaluator.changeWeightsToCompleteWeights(value);\n        script = script.substring(0, from + shift) + newValue + script.substring(to + shift);\n        shift = shift + newValue.length - value.length;\n      }\n    } while (cursor.next());\n    return script;\n  }\n\n  public topLineMap(programNode: SyntaxNode): IPlannerTopLineItem[] {\n    if (programNode.type.name !== PlannerNodeName.Program) {\n      this.error(`Unexpected node type ${programNode.type.name} - should be Program`, programNode, {\n        type: \"unexpectedNode\",\n        data: { node: programNode.type.name },\n      });\n    }\n    const children = getChildren(programNode);\n    const result: IPlannerTopLineItem[] = [];\n    let lastDescriptions: string[][] = [];\n    let ongoingDescriptions = false;\n    let exerciseIndex = 0;\n    for (const child of children) {\n      if (child.type.name === PlannerNodeName.ExerciseExpression) {\n        ongoingDescriptions = false;\n        const nameNode = child.getChild(PlannerNodeName.ExerciseVariations)!;\n        const fullName = this.getValue(nameNode);\n        const key = PlannerKey_fromFullName(fullName, this.settings.exercises);\n        const repeat = this.getRepeat(child);\n        const repeatRanges = this.getRepeatRanges(repeat);\n        const order = this.getOrder(child);\n        const isUsed = !this.getIsNotUsed(child);\n        const sectionsNode = child.getChildren(PlannerNodeName.ExerciseSection);\n        const sections = sectionsNode.map((section) => this.getValueTrim(section).trim()).join(\" / \");\n        const sectionsToReuse = sectionsNode\n          .filter((section) => {\n            const properties = section.getChild(PlannerNodeName.ExerciseProperty);\n            if (properties == null) {\n              return true;\n            }\n            const propertyNameNode = properties.getChild(PlannerNodeName.ExercisePropertyName);\n            const propertyName = propertyNameNode ? this.getValue(propertyNameNode) : undefined;\n            if (propertyName === \"progress\") {\n              const none = properties.getChild(PlannerNodeName.None);\n              return none != null;\n            }\n            return false;\n          })\n          .map((section) => this.getValueTrim(section).trim())\n          .join(\" / \");\n        result.push({\n          type: \"exercise\",\n          fullName,\n          order,\n          notused: !isUsed,\n          value: key,\n          exerciseIndex,\n          repeat,\n          repeatRanges,\n          descriptions: lastDescriptions.map((d) => d.join(\"\\n\")),\n          sections,\n          sectionsToReuse,\n        });\n        if (isUsed) {\n          exerciseIndex += 1;\n        }\n        lastDescriptions = [];\n      } else if (child.type.name === PlannerNodeName.LineComment) {\n        ongoingDescriptions = true;\n        const description = this.getValueTrim(child).trim();\n        if (lastDescriptions.length === 0) {\n          lastDescriptions.push([]);\n        }\n        lastDescriptions[lastDescriptions.length - 1].push(description);\n        result.push({ type: \"description\", value: description });\n      } else if (child.type.name === PlannerNodeName.TripleLineComment) {\n        result.push({ type: \"comment\", value: this.getValueTrim(child).trim() });\n      } else if (child.type.name === PlannerNodeName.EmptyExpression) {\n        result.push({ type: \"empty\", value: \"\" });\n        if (ongoingDescriptions) {\n          lastDescriptions.push([]);\n        }\n      } else {\n        this.error(\n          `Unexpected node type ${child.type.name}, should be only exercise, comment, description or empty line`,\n          child,\n          { type: \"unexpectedNode\", data: { node: child.type.name } }\n        );\n      }\n    }\n    return result;\n  }\n}\n","import { SyntaxNode } from \"@lezer/common\";\nimport { CollectionUtils_compact } from \"../../utils/collection\";\nimport { PlannerNodeName } from \"./plannerExerciseStyles\";\nimport { PlannerExerciseEvaluator, PlannerSyntaxError } from \"./plannerExerciseEvaluator\";\nimport { IPlannerErrorDetails } from \"../../syntaxErrorTypes\";\n\nfunction getChildren(node: SyntaxNode): SyntaxNode[] {\n  const cur = node.cursor();\n  const result: SyntaxNode[] = [];\n  if (!cur.firstChild()) {\n    return result;\n  }\n  do {\n    result.push(cur.node);\n  } while (cur.nextSibling());\n  return result;\n}\n\nexport interface IPlannerExerciseEvaluatorTextWeek {\n  name: string;\n  description?: string;\n  days: IPlannerExerciseEvaluatorTextDay[];\n}\n\nexport interface IPlannerExerciseEvaluatorTextDay {\n  name: string;\n  description?: string;\n  exercises: string[];\n}\n\ntype IPlannerNonExerciseFullTextLine =\n  | { type: \"comment\"; line: string }\n  | { type: \"triplelinecomment\"; line: string }\n  | { type: \"empty\"; line: string };\n\nfunction fullTextLineToWeekdayDescription(line: IPlannerNonExerciseFullTextLine): string {\n  switch (line.type) {\n    case \"comment\":\n      return line.line.replace(/^\\s*\\/\\/\\s*/, \"\").trim();\n    case \"triplelinecomment\":\n      return line.line.replace(/^\\s*\\/\\/\\/\\s*/, \"\").trim();\n    case \"empty\":\n      return \"\";\n  }\n}\n\nexport class PlannerExerciseEvaluatorText {\n  private readonly script: string;\n  private weeks: IPlannerExerciseEvaluatorTextWeek[] = [];\n  private ongoingLines: IPlannerNonExerciseFullTextLine[] = [];\n\n  private readonly isStrict: boolean;\n\n  constructor(script: string, options: { isStrict?: boolean } = {}) {\n    this.script = script;\n    this.isStrict = options.isStrict ?? false;\n  }\n\n  private getValue(node: SyntaxNode): string {\n    return this.script.slice(node.from, node.to);\n  }\n\n  private getWeekDayOngoingLines(): {\n    linesToPreviousExercise: IPlannerNonExerciseFullTextLine[];\n    nextLines: IPlannerNonExerciseFullTextLine[];\n  } {\n    const ongoingLines = [...this.ongoingLines];\n    let anyCommentStarted = false;\n    let commentStarted = false;\n    const linesToPreviousExercise: IPlannerNonExerciseFullTextLine[] = [];\n    const nextLines: IPlannerNonExerciseFullTextLine[] = [];\n    for (let i = 0; i < ongoingLines.length; i++) {\n      const line = ongoingLines[i];\n      if (!anyCommentStarted && line?.type === \"empty\") {\n        continue;\n      }\n      if (line?.type === \"comment\" || line?.type === \"triplelinecomment\") {\n        anyCommentStarted = true;\n      }\n      if (line?.type === \"comment\") {\n        commentStarted = true;\n      }\n      if (anyCommentStarted && !commentStarted) {\n        linesToPreviousExercise.push(line);\n      }\n      if (commentStarted && line?.type === \"comment\") {\n        nextLines.push(line);\n      }\n    }\n    for (let i = nextLines.length - 1; i >= 0; i--) {\n      const line = nextLines[i];\n      if (line.type === \"empty\") {\n        nextLines.pop();\n      } else {\n        break;\n      }\n    }\n    for (let i = linesToPreviousExercise.length - 1; i >= 0; i--) {\n      const line = linesToPreviousExercise[i];\n      if (line.type === \"empty\") {\n        linesToPreviousExercise.pop();\n      } else {\n        break;\n      }\n    }\n    return { linesToPreviousExercise, nextLines };\n  }\n\n  private getWeekDayDescriptionAndFillLastDay(): string | undefined {\n    const { linesToPreviousExercise, nextLines } = this.getWeekDayOngoingLines();\n    if (linesToPreviousExercise.length > 0) {\n      const lastDay = this.getLastDay();\n      if (lastDay) {\n        lastDay.exercises.push(...linesToPreviousExercise.map((line) => line.line));\n      }\n    }\n    const description =\n      nextLines.length > 0 ? nextLines.map(fullTextLineToWeekdayDescription).join(\"\\n\").trim() : undefined;\n    return description;\n  }\n\n  private error(message: string, node: SyntaxNode, details: IPlannerErrorDetails): never {\n    const [line, offset] = PlannerExerciseEvaluator.getLineAndOffset(this.script, node);\n    throw PlannerSyntaxError.fromPoint(undefined, message, { line, offset, from: node.from, to: node.to }, details);\n  }\n\n  private getLastDay(): IPlannerExerciseEvaluatorTextDay | undefined {\n    const lastWeek = this.weeks[this.weeks.length - 1];\n    return lastWeek?.days[lastWeek.days.length - 1];\n  }\n\n  private evaluateLine(expr: SyntaxNode): void {\n    if (expr.type.name === PlannerNodeName.Week) {\n      const weekName = this.getValue(expr).replace(/^#+/, \"\").trim();\n      const description = this.getWeekDayDescriptionAndFillLastDay();\n      this.weeks.push({ name: weekName, description, days: [] });\n      this.ongoingLines = [];\n    } else if (expr.type.name === PlannerNodeName.Day) {\n      if (this.weeks.length === 0) {\n        this.error(`You need to specify a week before a day`, expr, { type: \"dayWithoutWeek\" });\n      }\n      const dayName = this.getValue(expr).replace(/^#+/, \"\").trim();\n      const description = this.getWeekDayDescriptionAndFillLastDay();\n      this.weeks[this.weeks.length - 1].days.push({ name: dayName, exercises: [], description });\n      this.ongoingLines = [];\n    } else if (expr.type.name === PlannerNodeName.EmptyExpression) {\n      this.ongoingLines.push({ type: \"empty\", line: this.getValue(expr) });\n    } else if (expr.type.name === PlannerNodeName.LineComment) {\n      this.ongoingLines.push({ type: \"comment\", line: this.getValue(expr) });\n    } else if (expr.type.name === PlannerNodeName.TripleLineComment) {\n      this.ongoingLines.push({ type: \"triplelinecomment\", line: this.getValue(expr) });\n    } else if (expr.type.name === PlannerNodeName.ExerciseExpression) {\n      const lastDay = this.getLastDay();\n      if (lastDay == null) {\n        if (!this.isStrict) {\n          return;\n        }\n        this.error(`You should first define a week and a day before listing exercises.`, expr, {\n          type: \"exerciseWithoutDay\",\n        });\n      }\n      for (const line of this.ongoingLines) {\n        lastDay.exercises.push(line.line);\n      }\n      lastDay.exercises.push(this.getValue(expr));\n      this.ongoingLines = [];\n    }\n  }\n\n  public evaluate(expr: SyntaxNode): IPlannerExerciseEvaluatorTextWeek[] {\n    if (expr.type.name === PlannerNodeName.Program) {\n      this.ongoingLines = [];\n      this.weeks = [];\n      for (const child of CollectionUtils_compact(getChildren(expr))) {\n        this.evaluateLine(child);\n      }\n      return this.weeks;\n    } else {\n      throw new Error(`Unexpected node type ${expr.type.name}`);\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport { LRParser } from \"@lezer/lr\";\nconst spec_Keyword: any = { __proto__: null, none: 168, auto: 172 };\nexport const parser = LRParser.deserialize({\n  version: 14,\n  states:\n    \"3nQVQPOOOOQO'#Ce'#CeOOQO'#Dg'#DgOnQQO'#CfOOQO'#Cd'#CdO!SQPO'#CdO!XQQO'#CcO!gQQO'#CbOOQO'#De'#DeOOQO'#Ds'#DsOOQO'#Df'#DfQVQPOOOOQO-E7e-E7eOOQO,59O,59OO!rQPO'#DhO!zQQO,58}O#YQSO'#ChO#yQSO'#DjO$aQQO,58|OOQO,58|,58|O$aQQO,58|OOQO-E7d-E7dOOQO,5:S,5:SOOQO-E7f-E7fOOQO'#Ci'#CiO$iQSO,59SO$lQSO,59SO$tQWO'#CiOOQO'#Co'#CoO%PQSO'#CzO!SQPO'#DOO%[QSO'#CnOOQO'#DX'#DXO%aQWO'#DYO%iQSO'#DZO&dQSO'#D[O!SQPO'#D]OOQO'#Dn'#DnO'_QSO'#DUO'oQSO'#DTO#_QSO'#DTO'}QQO'#D_O(]QSO'#DcO(bQQO'#CmOOQO,5:U,5:UOOQO-E7h-E7hOOQO1G.h1G.hO(mQQO1G.hO#YQSO,59VO#YQSO'#DiO(uQSO1G.nOOQO1G.n1G.nOOQO,59r,59rOOQO'#Cv'#CvO(}QSO,59fOOQO,59f,59fOOQO,59j,59jO){QSO,59YO#YQSO,59tO*^QWO,59tOOQO,59u,59uOOQO,59v,59vO*cQPO,59wOOQO-E7l-E7lO#_QSO'#DoO*kQSO,59oO*kQSO,59oO*yQWO'#D`OOQO,59y,59yO!SQPO,59}O+RQPO,59XOOQO7+$S7+$SOOQO1G.q1G.qO+WQSO,5:TOOQO,5:T,5:TOOQO-E7g-E7gOOQO7+$Y7+$YOOQO1G/Q1G/QOOQO'#Cr'#CrO+cQQO'#CqO+wQWO'#DROOQO'#Dl'#DlO,cQSO'#DQO,zQSO'#DPOOQO'#DS'#DSOOQO1G.t1G.tO.TQSO1G/`O-YQSO1G/`O#YQSO1G/`OOQO1G/c1G/cOOQO,5:Z,5:ZOOQO-E7m-E7mO.[QSO1G/ZOOQO'#Da'#DaO.jQSO,59zOOQO1G/i1G/iOOQO1G.s1G.sO.rQSO'#C}OOQO,59],59]O/cQSO,59]O#YQSO,59mOOQO-E7j-E7jO/mQSO'#DmO/xQSO,59kOOQO7+$z7+$zO1RQSO7+$zO0WQSO7+$zOOQO1G/f1G/fO*yQWO1G/fO1YQPO,59iO1_QSO'#CiO1jQSO'#CkOOQO'#Ct'#CtO1oQSO'#CtO1wQSO'#C{OOQO'#Cs'#CsO.wQSO'#DkO2PQSO1G.wO2XQQO1G.wO2PQSO1G.wOOQO1G/X1G/XOOQO,5:X,5:XOOQO-E7k-E7kOOQO<<Hf<<HfO2jQPO7+%QO2oQPO'#CfOOQO1G/T1G/TOOQO,59`,59`O2wQSO,59gO3]QSO,59gOOQO,5:V,5:VOOQO-E7i-E7iO3bQQO7+$cOOQO7+$c7+$cO3sQSO7+$cOOQO<<Hl<<HlOOQO1G/R1G/RO3{QSO1G/ROOQO<<G}<<G}O4aQQO<<G}OOQO7+$m7+$mOOQOAN=iAN=iO!SQPO'#DO\",\n  stateData:\n    \"5U~O!fOS~OQXORXOSXOTXOZQO!hPO!zWO~OZQO`YX!iYX!jYX!{YX!yYX~OZQO~O!i^O`VX!jVX!{VX~O`aO!j`O!{cO~OZQO!hPO~O!i^O`Va!jVa!{Va~O^hO~O^kOlrOmsOyuO!QuO!otO!pmO!xpO~OdlO!WzO!hPO!snO`!^X!{!^X~P#_O`aO!{!OO~O!k!QO!l!RO!m!TO~O!w!UOi]X!u]X~O^!VOi!XOk!VO~O!n!ZO~Oi!]O!u![O~Oi!^O^}X`}Xl}Xm}Xy}X!Q}X!l}X!o}X!p}X!x}X!y}X!{}X~Oi!_O^!OX`!OXl!OXm!OXy!OX!Q!OX!l!OX!o!OX!p!OX!x!OX!y!OX!{!OX~O`xX!lxX!yxX!{xX~P#_O!l!bO`wX!ywX!{wX~O!j!eO`!RX!y!RX!{!RX~O!n!gO~O!y!hO`aX!{aX~O`aO!{!iO~O!l!RO!m!nO~Oi!oO^na`nalnamnayna!Qna!lna!ona!pna!xna!yna!{na!qna~O^hOd!pOl!sOm!sO!v!vO~O!u!zO~OZQO!q!{O~O!l!bO`wa!ywa!{wa~O^#PO!U#PO~O!z#SO~O!k!QO!l!]a!m!]a~Op#UO!o#VO!r#TO`eX!yeX!{eX~O!u#WO^uX`uXluXmuX!luX!yuX!{uX~O^hOl!sOm!sO`tX!ltX!ytX!{tX~O!l#YO`sX!ysX!{sX~Oi#[O^|i`|il|im|iy|i!Q|i!l|i!o|i!p|i!x|i!y|i!{|i~O!k!QO~P-YO!l!bO`wi!ywi!{wi~O!m#_O!n#`O~O!s$SO~O^#bOd#fOi#eOk!VOl#gOm#gO!k#eO!pmO~O!l#hO!q#jO~P.wO^hOl!sOm!sO~O!l#YO`sa!ysa!{sa~Oi#oO^|q`|ql|qm|qy|q!Q|q!l|q!o|q!p|q!x|q!y|q!{|q~O!k!QO~P0WO!t#rO~O!k]X!ljX!qjX~O!k!QO~O^!VOk!VO~Oi#uO!n#tO~O!l#hO!q#xO~Op#yO!r#TO`ei!yei!{ei~O!m#{O~OZQO!tYX~O^!VOi#eOk!VOl#|Om#|O!k#eO~O!n#}O~Op$OO!r#TO`eq!yeq!{eq~O!l#hO!q$PO~O^!VOi#eOk!VOl$QOm$QO!k#eO~Op$RO!r#TO`ey!yey!{ey~Ol!Wd!y!j!m!QRQTSZmyk^m~\",\n  goto: \"(v!hPPPPPP!i!m!q!x#QP#a#dP$VP$g$j$mP$p$s$v$|P%WPPP%d$cP%n%z$p&Q&W$p$j&]P&f&f&f&f&f&fP$j&l&oP$jP!i&u&{'`'f'm'w(R(Y(`(hPPP(rTXOZTVOZSUOZRf^UTOZ^RxaUSOZ^Q]TS!Yn$SR#R!gRdVQi`Wqavx!bQ!j!QQ!k!RU!r!Z!t#YQ!x![Q#]!zS#c#V#hR#l#WQj`Q!l!RQ!y![Q#^!zT#g#V#hR|aR{aRoaR!w!ZR!q!ZQ#k#VR#v#hS#g#V#hQ#|#tR$Q#}Q!WmW#d#V#h#t#}R#s#eWuavx!bT#g#V#hQ#U!qQ#y#jQ$O#xR$R$PQyaR#a#TQ!u!ZR#m#YV!s!Z!t#YQwaQ!dxR!|!bXuavx!bR!fyQ#Q!eR#p#`QZOReZ[ROTZ^n!gU[R!`#qQ!`tR#q$SQ_URg_S!SijR!m!SQbVS}b!PR!PdQ#i#VS#w#i#zR#z#kS!t!Z#YR#X!tQ#Z!uR#n#ZUvax!bR!avQ!cwS!}!c#OR#O!dTYOZ\",\n  nodeNames:\n    \"⚠ Program LineComment TripleLineComment Week Day ExerciseExpression ExerciseVariations ExerciseVariation CurrentVariation ExerciseName NonSeparator Repeat Rep Int RepRange SectionSeparator ExerciseSection ExerciseProperty ExercisePropertyName Keyword FunctionExpression FunctionName FunctionArgument Number Plus PosNumber Float Weight Percentage Rpe KeyValue Liftoscript ReuseLiftoscript ReuseSection WarmupExerciseSets WarmupExerciseSet WarmupSetPart None ExerciseSets ExerciseSet SetTimer Timer Auto SetPart WeightWithPlus PercentageWithPlus SetLabel AskWeight ReuseSectionWithWeekDay WeekDay WeekOrDay Current Superset SupersetKeyword EmptyExpression\",\n  maxTerm: 89,\n  skippedNodes: [0],\n  repeatNodeCount: 10,\n  tokenData:\n    \"!)W~R|OX#{XY$|YZ%XZ]#{]^%`^p#{pq$|qr%jrs#{st%otx#{xy)qyz)vz{#{{|){|}2g}!O3d!O!P4g!P!Q8r!Q![<|![!]A}!]!a#{!a!bBz!b!cDx!c!}Eu!}#OGR#O#PGW#P#QHT#Q#R#{#R#SHY#S#T#{#T#gEu#g#hIh#h#lEu#l#m!&l#m#oEu#o#p!'z#p#q!(w#q#r!(|#r;'S#{;'S;=`$v<%l~#{~O#{~~!)RR$Q[ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{R$yP;=`<%l#{~%RQ!f~XY$|pq$|_%`O!zP!{^_%gP!zP!{^YZ%X~%oO!h~~%rZOY&eYZ'TZ]&e]^'Y^s&est(Qt;'S&e;'S;=`'z<%l~&e~O&e~~'T~&hXOY&eYZ'TZ]&e]^'Y^;'S&e;'S;=`'z<%l~&e~O&e~~'T~'YOS~~'_XS~OY&eYZ'TZ]&e]^'Y^;'S&e;'S;=`'z<%l~&e~O&e~~'T~'}P;=`<%l&e~(TXOY(QYZ(pZ](Q]^(w^;'S(Q;'S;=`)k<%l~(Q~O(Q~~(p~(wOT~S~~)OXT~S~OY(QYZ(pZ](Q]^(w^;'S(Q;'S;=`)k<%l~(Q~O(Q~~(p~)nP;=`<%l(Q~)vO!o~~){O!q~_*S^i[ZROX#{Z]#{^p#{rs#{tx#{z!O#{!O!P+O!Q![1V![!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_+T]ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![+|![!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_,RbZROX#{Z]#{^p#{rs#{tu#{uv-Zvx#{z!P#{!Q![+|![!}#{#O#P#{#Q#_#{#_#`.W#`#a0U#a#o#{#r;'S#{;'S;=`$v<%lO#{_-b[ZRm[OX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_.]^ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#Z#{#Z#[/X#[#o#{#r;'S#{;'S;=`$v<%lO#{_/`[l[ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_0Z^ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#U#{#U#V/X#V#o#{#r;'S#{;'S;=`$v<%lO#{_1[cZROX#{Z]#{^p#{rs#{tu#{uv-Zvx#{z!O#{!O!P+O!Q![1V![!}#{#O#P#{#Q#_#{#_#`.W#`#a0U#a#o#{#r;'S#{;'S;=`$v<%lO#{_2n[!l[ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_3k^!kSZROX#{Z]#{^p#{rs#{tx#{z!O#{!O!P+O!Q![1V![!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_4l^ZROX#{Z]#{^p#{rs#{tx#{z!O#{!O!P5h!Q![7c![!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{V5m]ZROX#{Z]#{^p#{rs#{tx#{z!O#{!O!P6f!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{V6m[!sSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{_7jbZRkSOX#{Z]#{^p#{rs#{tu#{uv-Zvx#{z!P#{!Q![7c![!}#{#O#P#{#Q#_#{#_#`.W#`#a0U#a#o#{#r;'S#{;'S;=`$v<%lO#{_8wP`^!P!Q8zP8}ZOY9pYZ:`Z]9p]^:e^!P9p!P!Q;]!Q;'S9p;'S;=`;V<%l~9p~O9p~~:`P9sXOY9pYZ:`Z]9p]^:e^;'S9p;'S;=`;V<%l~9p~O9p~~:`P:eOQPP:jXQPOY9pYZ:`Z]9p]^:e^;'S9p;'S;=`;V<%l~9p~O9p~~:`P;YP;=`<%l9pP;`XOY;]YZ;{Z];]]^<S^;'S;];'S;=`<v<%l~;]~O;]~~;{P<SORPQPP<ZXRPQPOY;]YZ;{Z];]]^<S^;'S;];'S;=`<v<%l~;]~O;]~~;{P<yP;=`<%l;]_=TeZR^[OX#{Z]#{^p#{rs#{tu#{uv-Zvx#{z!O#{!O!P>f!Q![<|![!}#{#O#P#{#Q#_#{#_#`.W#`#a0U#a#g#{#g#h?d#h#o#{#r;'S#{;'S;=`$v<%lO#{_>k]ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![7c![!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{V?i_ZROX#{Z]#{^p#{rs#{tx#{z{#{{|@h|!P#{!Q!}#{#O#P#{#Q#o#{#p#qAf#r;'S#{;'S;=`$v<%lO#{V@m]ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#p#qAf#r;'S#{;'S;=`$v<%lO#{SAiQ!Q![Ao!a!bAxSArQ!Q![Ao#g#hAxSA}OySVBU[!nSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{~CP^ZROX#{Z]#{^p#{rs#{tx#{z{#{{|C{|!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{~DS[!Q~ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{VEP[!pSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{VE|adSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#oEu#r;'S#{;'S;=`$v<%lO#{~GWO!j~~G_[!y~ZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q!}#{#O#P#{#Q#o#{#r;'S#{;'S;=`$v<%lO#{~HYO!m~_Hca!UWdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#oEu#r;'S#{;'S;=`$v<%lO#{_Iqc!wWdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#iEu#i#jJ|#j#oEu#r;'S#{;'S;=`$v<%lO#{VKTcdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#dEu#d#eL`#e#oEu#r;'S#{;'S;=`$v<%lO#{VLgcdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#XEu#X#YMr#Y#oEu#r;'S#{;'S;=`$v<%lO#{VMycdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#fEu#f#g! U#g#oEu#r;'S#{;'S;=`$v<%lO#{V! ]cdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#gEu#g#h!!h#h#oEu#r;'S#{;'S;=`$v<%lO#{V!!ocdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#XEu#X#Y!#z#Y#oEu#r;'S#{;'S;=`$v<%lO#{V!$RcdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#hEu#h#i!%^#i#oEu#r;'S#{;'S;=`$v<%lO#{V!%ga!WSdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#oEu#r;'S#{;'S;=`$v<%lO#{_!&ua!uWdSZROX#{Z]#{^p#{rs#{tx#{z!P#{!Q![Eu![!c#{!c!}Eu#O#P#{#Q#R#{#R#SEu#S#T#{#T#oEu#r;'S#{;'S;=`$v<%lO#{~!(PP!r~#r#s!(S~!(VTO#r!(S#r#s!(f#s;'S!(S;'S;=`!(q<%lO!(S~!(iP#q#r!(l~!(qOp~~!(tP;=`<%l!(S~!(|O!i~~!)RO!t~^!)WO!{^\",\n  tokenizers: [0, 1, 2, 3],\n  topRules: { Program: [0, 1] },\n  specialized: [{ term: 20, get: (value: any) => spec_Keyword[value] || -1 }],\n  tokenPrec: 908,\n});\n","import { tags as t } from \"@lezer/highlight\";\n\nexport enum PlannerNodeName {\n  Program = \"Program\",\n  LineComment = \"LineComment\",\n  TripleLineComment = \"TripleLineComment\",\n  Week = \"Week\",\n  Day = \"Day\",\n  ExerciseExpression = \"ExerciseExpression\",\n  ExerciseVariations = \"ExerciseVariations\",\n  ExerciseVariation = \"ExerciseVariation\",\n  ExerciseName = \"ExerciseName\",\n  NonSeparator = \"NonSeparator\",\n  Repeat = \"Repeat\",\n  Rep = \"Rep\",\n  Int = \"Int\",\n  RepRange = \"RepRange\",\n  SectionSeparator = \"SectionSeparator\",\n  ExerciseSection = \"ExerciseSection\",\n  ExerciseProperty = \"ExerciseProperty\",\n  ExercisePropertyName = \"ExercisePropertyName\",\n  Keyword = \"Keyword\",\n  FunctionExpression = \"FunctionExpression\",\n  FunctionName = \"FunctionName\",\n  FunctionArgument = \"FunctionArgument\",\n  Number = \"Number\",\n  Plus = \"Plus\",\n  PosNumber = \"PosNumber\",\n  Float = \"Float\",\n  Weight = \"Weight\",\n  Percentage = \"Percentage\",\n  Rpe = \"Rpe\",\n  KeyValue = \"KeyValue\",\n  Liftoscript = \"Liftoscript\",\n  ReuseLiftoscript = \"ReuseLiftoscript\",\n  ReuseSection = \"ReuseSection\",\n  WarmupExerciseSets = \"WarmupExerciseSets\",\n  WarmupExerciseSet = \"WarmupExerciseSet\",\n  WarmupSetPart = \"WarmupSetPart\",\n  None = \"None\",\n  ExerciseSets = \"ExerciseSets\",\n  CurrentVariation = \"CurrentVariation\",\n  ExerciseSet = \"ExerciseSet\",\n  Timer = \"Timer\",\n  SetTimer = \"SetTimer\",\n  Auto = \"Auto\",\n  SetPart = \"SetPart\",\n  WeightWithPlus = \"WeightWithPlus\",\n  PercentageWithPlus = \"PercentageWithPlus\",\n  SetLabel = \"SetLabel\",\n  ReuseSectionWithWeekDay = \"ReuseSectionWithWeekDay\",\n  WeekDay = \"WeekDay\",\n  WeekOrDay = \"WeekOrDay\",\n  Current = \"Current\",\n  Superset = \"Superset\",\n  SupersetKeyword = \"SupersetKeyword\",\n  AskWeight = \"AskWeight\",\n  EmptyExpression = \"EmptyExpression\",\n}\n\nexport const plannerExerciseStyles = {\n  [`${[PlannerNodeName.SetPart]}/...`]: t.atom,\n  [`${[PlannerNodeName.WarmupSetPart]}/...`]: t.atom,\n  [`${[PlannerNodeName.Rpe]}/...`]: t.number,\n  [`${[PlannerNodeName.Timer]}/...`]: t.keyword,\n  [`${[PlannerNodeName.SetTimer]}/...`]: t.keyword,\n  [PlannerNodeName.Auto]: t.keyword,\n  [`${[PlannerNodeName.Weight]}/...`]: t.number,\n  [`${[PlannerNodeName.Percentage]}/...`]: t.number,\n  [PlannerNodeName.AskWeight]: t.number,\n  [PlannerNodeName.LineComment]: t.lineComment,\n  [PlannerNodeName.TripleLineComment]: t.blockComment,\n  [PlannerNodeName.SupersetKeyword]: t.keyword,\n  [PlannerNodeName.SectionSeparator]: t.lineComment,\n  [`${[PlannerNodeName.ExercisePropertyName]}/...`]: t.keyword,\n  [`${[PlannerNodeName.FunctionName]}/...`]: t.attributeName,\n  [`${[PlannerNodeName.FunctionArgument]}/...`]: t.attributeValue,\n  [PlannerNodeName.None]: t.atom,\n  [PlannerNodeName.Week]: t.annotation,\n  [PlannerNodeName.Day]: t.docComment,\n  [PlannerNodeName.WeekDay]: t.atom,\n  [PlannerNodeName.Repeat]: t.atom,\n};\n","import { JSX, useMemo } from \"react\";\nimport { View } from \"react-native\";\nimport { LineChart, ILineChartSeries } from \"../../components/lineChart\";\nimport { GraphLegendOverlay, useGraphActiveCursor } from \"../../components/graphLegendOverlay\";\nimport { MathUtils_formatCompact } from \"../../utils/math\";\nimport { Text } from \"../../components/primitives/text\";\n\ninterface IPlannerGraphProps {\n  id: string;\n  title: string;\n  yAxisLabel: string;\n  color: string;\n  height?: string;\n  data: [number[], number[]];\n}\n\nfunction parseHeight(height?: string): number {\n  if (!height) {\n    return 160;\n  }\n  const match = height.match(/^([\\d.]+)(em|rem|px)?$/);\n  if (!match) {\n    return 160;\n  }\n  const value = parseFloat(match[1]);\n  const unit = match[2] || \"px\";\n  if (unit === \"em\" || unit === \"rem\") {\n    return value * 16;\n  }\n  return value;\n}\n\nexport function PlannerGraph(props: IPlannerGraphProps): JSX.Element {\n  const height = parseHeight(props.height);\n  const series: ILineChartSeries[] = useMemo(\n    () => [{ label: props.yAxisLabel, color: props.color, show: true }],\n    [props.yAxisLabel, props.color]\n  );\n  const xAxisTicks = useMemo(() => props.data[0], [props.data]);\n  const { cursorIdx, chartRef, handleCursorChange, onCloseOverlay, overlayVisible } = useGraphActiveCursor(props.id);\n\n  const week = cursorIdx != null ? props.data[0][cursorIdx] : null;\n  const value = cursorIdx != null ? props.data[1][cursorIdx] : null;\n\n  return (\n    <View className=\"relative\" testID=\"graph\" data-testid=\"graph\">\n      <View testID=\"graph-data\" data-testid=\"graph-data\">\n        <View className=\"items-center pt-1\">\n          <Text className=\"text-xs text-text-primary\">{props.title}</Text>\n        </View>\n        <LineChart\n          ref={chartRef}\n          data={props.data}\n          series={series}\n          height={height}\n          xMode=\"linear\"\n          xAxisTicks={xAxisTicks}\n          xAxisFormatter={(v) => `${v}`}\n          yAxisFormatter={(v) => MathUtils_formatCompact(v)}\n          yAxisWidth={32}\n          onCursorChange={handleCursorChange}\n        />\n        <GraphLegendOverlay visible={overlayVisible} onClose={onCloseOverlay}>\n          {week != null && value != null && (\n            <Text className=\"text-sm\">\n              Week {week}, {props.yAxisLabel}: <Text className=\"text-sm font-bold\">{value}</Text>\n            </Text>\n          )}\n        </GraphLegendOverlay>\n      </View>\n    </View>\n  );\n}\n","import { highlightTree, classHighlighter, styleTags } from \"@lezer/highlight\";\nimport { parser as plannerExerciseParser } from \"./plannerExerciseParser\";\nimport { plannerExerciseStyles } from \"./plannerExerciseStyles\";\nimport { parseMixed } from \"@lezer/common\";\nimport { liftoscriptLanguage } from \"../../liftoscriptLanguage\";\n\nconst parserWithMetadata = plannerExerciseParser.configure({\n  props: [styleTags(plannerExerciseStyles)],\n  wrap: parseMixed((node) => {\n    return node.name === \"Liftoscript\" ? { parser: liftoscriptLanguage.parser } : null;\n  }),\n});\n\ntype IRange = { from: number; to: number; clazz: string };\n\nexport interface IHighlightSegment {\n  text: string;\n  clazz: string | null;\n}\n\nfunction buildRanges(script: string): IRange[] {\n  const tree = parserWithMetadata.parse(script);\n  const ranges: IRange[] = [];\n  highlightTree(tree, classHighlighter, (from, to, classes) => {\n    ranges.push({ from, to, clazz: classes });\n  });\n  return ranges;\n}\n\nexport function PlannerHighlighter_highlight(script: string): string {\n  const ranges = buildRanges(script);\n  const highlightedSource = ranges.reduceRight((acc, range) => {\n    const clazz = range.clazz;\n    const highlighted = `<span class=\"${clazz}\">${acc.slice(range.from, range.to)}</span>`;\n    return acc.slice(0, range.from) + highlighted + acc.slice(range.to);\n  }, script);\n  return highlightedSource;\n}\n\nexport function PlannerHighlighter_segments(script: string): IHighlightSegment[] {\n  const ranges = buildRanges(script)\n    .slice()\n    .sort((a, b) => a.from - b.from);\n  const segments: IHighlightSegment[] = [];\n  let cursor = 0;\n  for (const range of ranges) {\n    if (range.from < cursor) {\n      continue;\n    }\n    if (range.from > cursor) {\n      segments.push({ text: script.slice(cursor, range.from), clazz: null });\n    }\n    segments.push({ text: script.slice(range.from, range.to), clazz: range.clazz });\n    cursor = range.to;\n  }\n  if (cursor < script.length) {\n    segments.push({ text: script.slice(cursor), clazz: null });\n  }\n  return segments;\n}\n","import memoize from \"micro-memoize\";\nimport { Exercise_toKey, Exercise_findByNameEquipment } from \"../../models/exercise\";\nimport { IAllCustomExercises, IExerciseType, ISettings } from \"../../types\";\nimport { IPlannerProgramExercise, IPlannerProgramExerciseVariation } from \"./models/types\";\nimport { PlannerExerciseEvaluator } from \"./plannerExerciseEvaluator\";\n\nexport function PlannerKey_fromPlannerExercise(plannerExercise: IPlannerProgramExercise, settings: ISettings): string {\n  if (plannerExercise.exerciseVariations != null && plannerExercise.exerciseVariations.length > 1) {\n    return PlannerKey_fromExerciseVariations(plannerExercise.exerciseVariations, plannerExercise.label);\n  } else if (plannerExercise.exerciseType) {\n    return PlannerKey_fromExerciseType(plannerExercise.exerciseType, plannerExercise.label);\n  } else {\n    return PlannerKey_fromFullName(plannerExercise.fullName, settings.exercises);\n  }\n}\n\nexport function PlannerKey_fromExerciseVariations(\n  variations: IPlannerProgramExerciseVariation[],\n  label: string | undefined\n): string {\n  const keyPart = variations.map((v) => (v.exerciseType ? Exercise_toKey(v.exerciseType) : v.name)).join(\"_\");\n  return `${label ? `${label}-` : \"\"}${keyPart}`.toLowerCase();\n}\n\nexport function PlannerKey_fromExerciseType(exerciseType: IExerciseType, label?: string): string {\n  const key = Exercise_toKey(exerciseType);\n  const plannerKey = `${label ? `${label}-` : \"\"}${key}`.toLowerCase();\n  return plannerKey;\n}\n\nexport const PlannerKey_fromFullName = memoize(\n  (fullName: string, exercises: IAllCustomExercises): string => {\n    const segments = fullName.split(\"|\");\n    if (segments.length === 1) {\n      const { label, name, equipment } = PlannerExerciseEvaluator.extractNameParts(fullName, exercises);\n      return PlannerKey_fromLabelNameAndEquipment(label, name, equipment, exercises);\n    }\n    let label: string | undefined;\n    const keyParts = segments.map((segment, i) => {\n      const cleaned = segment.trim().replace(/^!\\s*/, \"\");\n      const { label: segmentLabel, name, equipment } = PlannerExerciseEvaluator.extractNameParts(cleaned, exercises);\n      if (i === 0) {\n        label = segmentLabel;\n      }\n      const exercise = Exercise_findByNameEquipment(exercises, name, equipment);\n      return exercise ? Exercise_toKey(exercise) : name;\n    });\n    return `${label ? `${label}-` : \"\"}${keyParts.join(\"_\")}`.toLowerCase();\n  },\n  { maxSize: 1000 }\n);\n\nexport const PlannerKey_fromLabelNameAndEquipment = memoize(\n  (label: string | undefined, name: string, equipment: string | undefined, exercises: IAllCustomExercises): string => {\n    const exercise = Exercise_findByNameEquipment(exercises, name, equipment);\n    const key = exercise ? Exercise_toKey(exercise) : name;\n    const plannerKey = `${label ? `${label}-` : \"\"}${key}`.toLowerCase();\n    return plannerKey;\n  },\n  {\n    maxSize: 1000,\n  }\n);\n","/* eslint-disable @typescript-eslint/unified-signatures */\nimport { LiftoscriptEvaluator, NodeName, LiftoscriptSyntaxError } from \"./liftoscriptEvaluator\";\nimport { parser as LiftoscriptParser } from \"./liftoscript\";\nimport {\n  IScriptBindings,\n  IScriptFnContext,\n  Progress_createEmptyScriptBindings,\n  Progress_createScriptFunctions,\n} from \"./models/progress\";\nimport { IScriptFunctions } from \"./liftoscriptFns\";\nimport { Weight_build } from \"./models/weight\";\nimport { IUnit, IWeight, IProgramState, IPercentage, IDayData, IExerciseType, ISettings } from \"./types\";\nimport type { Tree } from \"@lezer/common\";\nimport RB from \"rollbar\";\nimport { IProgramMode } from \"./models/program\";\nimport { ILiftoscriptEvaluatorUpdate } from \"./liftoscriptEvaluator\";\nimport { Dialog_alert } from \"./utils/dialog\";\nimport memoize from \"micro-memoize\";\n\ndeclare let Rollbar: RB;\n\nconst lastAlertDisplayedTs: Partial<Record<string, number>> = {};\n\nconst parseLiftoscript = memoize((script: string): Tree => LiftoscriptParser.parse(script), { maxSize: 200 });\n\n// The semantic pass reads only the script, the mode, and which state and binding keys exist, never their values.\n// A pass that throws is not cached, so every run of a broken script still reports its error.\nconst validateLiftoscript = memoize(\n  (_script: string, _mode: IProgramMode, _stateKeys: string, _bindingKeys: string, validate: () => void): true => {\n    validate();\n    return true;\n  },\n  { maxSize: 500, transformKey: (args) => args.slice(0, 4) }\n);\n\n// The pass checks membership with `in`, which also sees inherited keys. A state variable named `__proto__`\n// gives the state a prototype, and then `Object.keys` no longer describes what `in` finds.\nfunction hasOnlyOwnKeys(value: object): boolean {\n  return Object.getPrototypeOf(value) === Object.prototype;\n}\n\nconst hasKeywordMemoized = memoize(\n  (script: string, name: string): boolean => {\n    const expr = parseLiftoscript(script);\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.name === NodeName.Keyword) {\n        if (LiftoscriptEvaluator.getValue(script, cursor.node) === name) {\n          return true;\n        }\n      }\n    } while (cursor.next());\n    return false;\n  },\n  { maxSize: 200 }\n);\n\nexport class ScriptRunner {\n  private readonly script: string;\n  private readonly state: IProgramState;\n  private readonly otherStates: Record<number, IProgramState>;\n  private readonly bindings: IScriptBindings;\n  private readonly fns: IScriptFunctions;\n  private readonly units: IUnit;\n  private readonly context: IScriptFnContext;\n  private readonly mode: IProgramMode;\n  private updates: ILiftoscriptEvaluatorUpdate[] = [];\n\n  constructor(\n    script: string,\n    state: IProgramState,\n    otherStates: Record<number, IProgramState>,\n    bindings: IScriptBindings,\n    fns: IScriptFunctions,\n    units: IUnit,\n    context: IScriptFnContext,\n    mode: IProgramMode\n  ) {\n    this.script = script;\n    this.state = state;\n    this.otherStates = otherStates;\n    this.bindings = bindings;\n    this.fns = fns;\n    this.units = units;\n    this.context = context;\n    this.mode = mode;\n  }\n\n  public static isValid(\n    script: string,\n    state: IProgramState,\n    dayData: IDayData,\n    settings: ISettings,\n    exerciseType?: IExerciseType\n  ): LiftoscriptSyntaxError | undefined {\n    const liftoscriptEvaluator = new ScriptRunner(\n      script,\n      state,\n      {},\n      Progress_createEmptyScriptBindings(dayData, settings),\n      Progress_createScriptFunctions(settings),\n      settings.units,\n      { exerciseType: exerciseType, unit: settings.units, prints: [] },\n      \"planner\"\n    );\n    try {\n      liftoscriptEvaluator.parse();\n    } catch (e) {\n      if (e instanceof LiftoscriptSyntaxError) {\n        return e;\n      } else {\n        throw e;\n      }\n    }\n    return undefined;\n  }\n\n  public parse(): [LiftoscriptEvaluator, Tree] {\n    const liftoscriptTree = parseLiftoscript(this.script);\n    const liftoscriptEvaluator = new LiftoscriptEvaluator(\n      this.script,\n      this.state,\n      this.otherStates,\n      this.bindings,\n      this.fns,\n      this.context,\n      this.units,\n      this.mode\n    );\n    const validate = (): void => liftoscriptEvaluator.parse(liftoscriptTree.topNode);\n    if (hasOnlyOwnKeys(this.state) && hasOnlyOwnKeys(this.bindings)) {\n      validateLiftoscript(\n        this.script,\n        this.mode,\n        Object.keys(this.state).sort().join(\"\\n\"),\n        Object.keys(this.bindings).sort().join(\"\\n\"),\n        validate\n      );\n    } else {\n      validate();\n    }\n    return [liftoscriptEvaluator, liftoscriptTree];\n  }\n\n  public switchWeightsToUnit(toUnit: IUnit): string {\n    const liftoscriptTree = parseLiftoscript(this.script);\n    const liftoscriptEvaluator = new LiftoscriptEvaluator(\n      this.script,\n      this.state,\n      this.otherStates,\n      this.bindings,\n      this.fns,\n      this.context,\n      this.units,\n      this.mode\n    );\n    return liftoscriptEvaluator.switchWeightsToUnit(liftoscriptTree.topNode, toUnit);\n  }\n\n  public getStateVariableKeys(): Set<string> {\n    const liftoscriptTree = parseLiftoscript(this.script);\n    const liftoscriptEvaluator = new LiftoscriptEvaluator(\n      this.script,\n      this.state,\n      this.otherStates,\n      this.bindings,\n      this.fns,\n      this.context,\n      this.units,\n      this.mode\n    );\n    return liftoscriptEvaluator.getStateVariableKeys(liftoscriptTree.topNode);\n  }\n\n  public static hasStateVariable(script: string, name: string): boolean {\n    const expr = parseLiftoscript(script);\n    const cursor = expr.cursor();\n    do {\n      if (cursor.node.type.name === NodeName.StateVariable) {\n        const keywordNode = cursor.node.getChild(NodeName.Keyword);\n        if (keywordNode != null) {\n          const value = LiftoscriptEvaluator.getValue(script, keywordNode);\n          if (value === name) {\n            return true;\n          }\n        }\n      }\n    } while (cursor.next());\n    return false;\n  }\n\n  public static hasKeyword(script: string, name: string): boolean {\n    // A keyword node's value is a slice of the script, so a name absent from the text cannot match.\n    if (script.indexOf(name) === -1) {\n      return false;\n    }\n    return hasKeywordMemoized(script, name);\n  }\n\n  public static safe<T>(cb: () => T, errorMsg: (e: Error) => string, defaultValue: T, disabled?: boolean): T {\n    let value: T;\n    try {\n      value = cb();\n    } catch (e) {\n      if (!disabled && e instanceof LiftoscriptSyntaxError) {\n        const lastAlertTs = lastAlertDisplayedTs[e.message];\n        console.error(e);\n        if (lastAlertTs == null || lastAlertTs < Date.now() - 1000 * 60 * 1) {\n          Dialog_alert(errorMsg(e));\n          this.reportError(\"Error during Liftoscript execution\", e);\n          lastAlertDisplayedTs[e.message] = Date.now();\n        }\n        value = defaultValue;\n      } else {\n        throw e;\n      }\n    }\n    return value;\n  }\n\n  public execute(type: \"reps\"): number;\n  public execute(type: \"rpe\"): number;\n  public execute(type: \"weight\"): IWeight | IPercentage;\n  public execute(type: \"timer\"): number;\n  public execute(type?: undefined): number | IWeight | boolean;\n  public execute(type?: \"reps\" | \"weight\" | \"timer\" | \"rpe\"): number | IWeight | IPercentage | boolean {\n    const [liftoscriptEvaluator, liftoscriptTree] = this.parse();\n    const rawResult = liftoscriptEvaluator.evaluate(liftoscriptTree.topNode);\n    let result = Array.isArray(rawResult) ? rawResult[0] : rawResult;\n    if (result == null) {\n      result = 0;\n    }\n    const output = this.convertResult(type, result);\n    this.updates = liftoscriptEvaluator.updates;\n\n    return output;\n  }\n\n  public getUpdates(): ILiftoscriptEvaluatorUpdate[] {\n    return this.updates;\n  }\n\n  private convertResult(\n    type: \"reps\" | \"weight\" | \"timer\" | \"rpe\" | undefined,\n    result: number | IWeight | IPercentage | boolean\n  ): number | IWeight | IPercentage | boolean {\n    if (type === \"reps\" || type === \"timer\") {\n      if (typeof result !== \"number\") {\n        throw new LiftoscriptSyntaxError(\"Expected to get number as a result\", 0, 0, 0, 0, {\n          type: \"wrongResultType\",\n          data: { expected: \"number\" },\n        });\n      } else if (result < 0) {\n        return 0;\n      } else {\n        return result;\n      }\n    } else if (type === \"rpe\") {\n      if (typeof result !== \"number\") {\n        throw new LiftoscriptSyntaxError(\"Expected to get number as a result\", 0, 0, 0, 0, {\n          type: \"wrongResultType\",\n          data: { expected: \"number\" },\n        });\n      } else {\n        return Math.round(Math.min(10, Math.max(0, result)) / 0.5) * 0.5;\n      }\n    } else if (type === \"weight\") {\n      if (typeof result === \"boolean\") {\n        throw new LiftoscriptSyntaxError(\"Expected to get number, percentage or weight as a result\", 0, 0, 0, 0, {\n          type: \"wrongResultType\",\n          data: { expected: \"numberOrPercentageOrWeight\" },\n        });\n      } else if (typeof result === \"number\") {\n        return Weight_build(result, this.units);\n      } else {\n        if (result.value < 0) {\n          return Weight_build(0, this.units);\n        } else {\n          return result;\n        }\n      }\n    } else {\n      return result;\n    }\n  }\n\n  private static reportError(msg: string, error?: Error): void {\n    if (typeof Rollbar === \"undefined\") {\n      return;\n    }\n    const payload = {\n      error: error ? { message: error.message, name: error.name, stack: error.stack } : undefined,\n    };\n    Rollbar.error(msg, payload);\n  }\n}\n","import { IProgram } from \"../types\";\n\nexport const basicBeginnerProgram: IProgram = {\n  vtype: \"program\",\n  weeks: [],\n  author: \"/r/fitness\",\n  clonedAt: 1708563096401,\n  description:\n    \"<div><p>This is a great starting routine for complete beginners.</p><p>It's simple, easy to follow routine, which will introduce you to weight lifting.</p><p>You should run it for ~3 months, and then switch to some other routine, like '5/3/1 for beginners'.</p></div>\",\n  shortDescription: \"Great first starter program\",\n  url: \"https://thefitness.wiki/routines/r-fitness-basic-beginner-routine/\",\n  tags: [],\n  exercises: [],\n  name: \"Basic Beginner Routine\",\n  days: [],\n  id: \"basicBeginner\",\n  planner: {\n    vtype: \"planner\",\n    name: \"Basic Beginner Routine\",\n    weeks: [\n      {\n        name: \"Week 1\",\n        days: [\n          {\n            name: \"Workout A\",\n            exerciseText:\n              \"Bent Over Row / 2x5, 1x5+ / 95lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nBench Press / 2x5, 1x5+ / 45lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nSquat / 2x5, 1x5+ / 45lb / progress: lp(5lb, 1, 0, 10%, 1, 0)\",\n          },\n          {\n            name: \"Workout B\",\n            exerciseText:\n              \"Chin Up / 2x5, 1x5+ / 0lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nOverhead Press / 2x5, 1x5+ / 45lb / progress: lp(2.5lb, 1, 0, 10%, 1, 0)\\nDeadlift / 2x5, 1x5+ / 95lb / progress: lp(5lb, 1, 0, 10%, 1, 0)\",\n          },\n          {\n            name: \"Workout A\",\n            exerciseText: \"Bent Over Row / 2x5, 1x5+ / 95lb\\nBench Press / 2x5, 1x5+ / 45lb\\nSquat / 2x5, 1x5+ / 45lb\",\n          },\n        ],\n      },\n      {\n        name: \"Week 2\",\n        days: [\n          {\n            name: \"Workout A\",\n            exerciseText: \"Chin Up / 2x5, 1x5+ / 0lb\\nOverhead Press / 2x5, 1x5+ / 45lb\\nDeadlift / 2x5, 1x5+ / 95lb\",\n          },\n          {\n            name: \"Workout B\",\n            exerciseText: \"Bent Over Row / 2x5, 1x5+ / 95lb\\nBench Press / 2x5, 1x5+ / 45lb\\nSquat / 2x5, 1x5+ / 45lb\",\n          },\n          {\n            name: \"Workout B\",\n            exerciseText: \"Chin Up / 2x5, 1x5+ / 0lb\\nOverhead Press / 2x5, 1x5+ / 45lb\\nDeadlift / 2x5, 1x5+ / 95lb\",\n          },\n        ],\n      },\n    ],\n  },\n  nextDay: 1,\n  isMultiweek: true,\n};\n","/* eslint-disable no-void */\nimport * as v from \"valibot\";\nimport { IVersions, IVersionTypes } from \"./models/versionTracker/types\";\nimport { IEquals } from \"./utils/types\";\n\nexport const equipments = [\n  \"barbell\",\n  \"cable\",\n  \"dumbbell\",\n  \"smith\",\n  \"band\",\n  \"kettlebell\",\n  \"bodyweight\",\n  \"leverageMachine\",\n  \"medicineball\",\n  \"ezbar\",\n  \"trapbar\",\n] as const;\n\nexport const exerciseTypes = [\n  \"abWheel\",\n  \"arnoldPress\",\n  \"aroundTheWorld\",\n  \"backExtension\",\n  \"ballSlams\",\n  \"battleRopes\",\n  \"benchDip\",\n  \"benchPress\",\n  \"benchPressCloseGrip\",\n  \"benchPressWideGrip\",\n  \"bentOverOneArmRow\",\n  \"bentOverRow\",\n  \"bicepCurl\",\n  \"bicycleCrunch\",\n  \"boxJump\",\n  \"boxSquat\",\n  \"bulgarianSplitSquat\",\n  \"burpee\",\n  \"cableCrossover\",\n  \"cableCrunch\",\n  \"cableKickback\",\n  \"cablePullThrough\",\n  \"cableTwist\",\n  \"calfPressOnLegPress\",\n  \"calfPressOnSeatedLegPress\",\n  \"chestDip\",\n  \"chestFly\",\n  \"chestPress\",\n  \"chinUp\",\n  \"clean\",\n  \"cleanandJerk\",\n  \"concentrationCurl\",\n  \"crossBodyCrunch\",\n  \"crunch\",\n  \"cycling\",\n  \"deadlift\",\n  \"deadliftHighPull\",\n  \"declineBenchPress\",\n  \"declineCrunch\",\n  \"deficitDeadlift\",\n  \"ellipticalMachine\",\n  \"facePull\",\n  \"flatKneeRaise\",\n  \"flatLegRaise\",\n  \"frontRaise\",\n  \"frontSquat\",\n  \"gluteBridge\",\n  \"gluteBridgeMarch\",\n  \"gluteKickback\",\n  \"gobletSquat\",\n  \"goodMorning\",\n  \"hackSquat\",\n  \"hammerCurl\",\n  \"handstandPushUp\",\n  \"hangClean\",\n  \"hangSnatch\",\n  \"hangingLegRaise\",\n  \"highKneeSkips\",\n  \"highRow\",\n  \"hipAbductor\",\n  \"hipAdductor\",\n  \"hipThrust\",\n  \"inclineBenchPress\",\n  \"inclineChestFly\",\n  \"inclineChestPress\",\n  \"inclineCurl\",\n  \"inclineRow\",\n  \"invertedRow\",\n  \"isoLateralChestPress\",\n  \"isoLateralRow\",\n  \"jackknifeSitUp\",\n  \"jumpRope\",\n  \"jumpSquat\",\n  \"jumpingJack\",\n  \"kettlebellSwing\",\n  \"kettlebellTurkishGetUp\",\n  \"kippingPullUp\",\n  \"kneeRaise\",\n  \"kneelingPulldown\",\n  \"kneestoElbows\",\n  \"latPulldown\",\n  \"lateralBoxJump\",\n  \"lateralRaise\",\n  \"legExtension\",\n  \"legPress\",\n  \"lunge\",\n  \"lyingLegCurl\",\n  \"mountainClimber\",\n  \"muscleUp\",\n  \"obliqueCrunch\",\n  \"overheadPress\",\n  \"overheadSquat\",\n  \"pecDeck\",\n  \"pendlayRow\",\n  \"pistolSquat\",\n  \"plank\",\n  \"powerClean\",\n  \"powerSnatch\",\n  \"preacherCurl\",\n  \"pressUnder\",\n  \"pullUp\",\n  \"pullover\",\n  \"pushPress\",\n  \"pushUp\",\n  \"reverseCrunch\",\n  \"reverseCurl\",\n  \"reverseFly\",\n  \"reverseGripConcentrationCurl\",\n  \"reverseHyperextension\",\n  \"reverseWristCurl\",\n  \"reverseLunge\",\n  \"reversePlank\",\n  \"romanianDeadlift\",\n  \"rowing\",\n  \"russianTwist\",\n  \"seatedCalfRaise\",\n  \"seatedLegCurl\",\n  \"seatedLegPress\",\n  \"seatedOverheadPress\",\n  \"seatedPalmsUpWristCurl\",\n  \"seatedRow\",\n  \"seatedWideGripRow\",\n  \"shoulderPress\",\n  \"shrug\",\n  \"sideBend\",\n  \"sideCrunch\",\n  \"sideHipAbductor\",\n  \"sideLyingClam\",\n  \"sidePlank\",\n  \"singleLegBridge\",\n  \"singleLegDeadlift\",\n  \"singleLegGluteBridgeBench\",\n  \"singleLegGluteBridgeStraight\",\n  \"singleLegGluteBridgeBentKnee\",\n  \"singleLegHipThrust\",\n  \"sitUp\",\n  \"skullcrusher\",\n  \"snatch\",\n  \"snatchPull\",\n  \"splitSquat\",\n  \"splitJerk\",\n  \"squat\",\n  \"squatRow\",\n  \"standingCalfRaise\",\n  \"stepUp\",\n  \"stiffLegDeadlift\",\n  \"straightLegDeadlift\",\n  \"sumoDeadlift\",\n  \"sumoDeadliftHighPull\",\n  \"superman\",\n  \"tBarRow\",\n  \"thruster\",\n  \"toesToBar\",\n  \"torsoRotation\",\n  \"trapBarDeadlift\",\n  \"tricepsDip\",\n  \"tricepsExtension\",\n  \"tricepsPushdown\",\n  \"uprightRow\",\n  \"vUp\",\n  \"widePullUp\",\n  \"wristCurl\",\n  \"wristRoller\",\n  \"zercherSquat\",\n] as const;\nexport const availableMuscles = [\n  \"Adductor Brevis\",\n  \"Adductor Longus\",\n  \"Adductor Magnus\",\n  \"Biceps Brachii\",\n  \"Brachialis\",\n  \"Brachioradialis\",\n  \"Deltoid Anterior\",\n  \"Deltoid Lateral\",\n  \"Deltoid Posterior\",\n  \"Erector Spinae\",\n  \"Gastrocnemius\",\n  \"Gluteus Maximus\",\n  \"Gluteus Medius\",\n  \"Hamstrings\",\n  \"Iliopsoas\",\n  \"Infraspinatus\",\n  \"Latissimus Dorsi\",\n  \"Levator Scapulae\",\n  \"Obliques\",\n  \"Pectineous\",\n  \"Pectoralis Major Clavicular Head\",\n  \"Pectoralis Major Sternal Head\",\n  \"Quadriceps\",\n  \"Rectus Abdominis\",\n  \"Sartorius\",\n  \"Serratus Anterior\",\n  \"Soleus\",\n  \"Splenius\",\n  \"Sternocleidomastoid\",\n  \"Tensor Fasciae Latae\",\n  \"Teres Major\",\n  \"Teres Minor\",\n  \"Tibialis Anterior\",\n  \"Trapezius Lower Fibers\",\n  \"Trapezius Middle Fibers\",\n  \"Trapezius Upper Fibers\",\n  \"Triceps Brachii\",\n  \"Wrist Extensors\",\n  \"Wrist Flexors\",\n] as const;\n\nexport const availableBodyParts: string[] = [\n  \"Back\",\n  \"Calves\",\n  \"Chest\",\n  \"Forearms\",\n  \"Hips\",\n  \"Shoulders\",\n  \"Thighs\",\n  \"Upper Arms\",\n  \"Waist\",\n];\n\nexport const exerciseKinds = [\"core\", \"pull\", \"push\", \"legs\", \"upper\", \"lower\"] as const;\nexport const graphExerciseSelectedTypes = [\"weight\", \"volume\"] as const;\nexport const graphMuscleGroupSelectedTypes = [\"volume\", \"sets\"] as const;\nexport const units = [\"kg\", \"lb\"] as const;\nexport const percentageUnits = [\"%\"] as const;\nexport const lengthUnits = [\"in\", \"cm\"] as const;\nexport const historyRecordChange = [\"order\"] as const;\nexport const targetTypes = [\"target\", \"lasttime\", \"platescalculator\", \"e1rm\"] as const;\nexport const exercisePickerSorts = [\"name_asc\", \"similar_muscles\"] as const;\n\nexport const screenMuscles: string[] = [\n  \"shoulders\",\n  \"triceps\",\n  \"back\",\n  \"abs\",\n  \"glutes\",\n  \"hamstrings\",\n  \"quadriceps\",\n  \"chest\",\n  \"biceps\",\n  \"calves\",\n  \"forearms\",\n];\n\nexport const statsWeightDef = [\"weight\"] as const;\nexport const statsLengthDef = [\n  \"neck\",\n  \"shoulders\",\n  \"bicepLeft\",\n  \"bicepRight\",\n  \"forearmLeft\",\n  \"forearmRight\",\n  \"chest\",\n  \"waist\",\n  \"hips\",\n  \"thighLeft\",\n  \"thighRight\",\n  \"calfLeft\",\n  \"calfRight\",\n] as const;\nexport const statsPercentageDef = [\"bodyfat\"] as const;\n// Personal fork: graphs built from the food log. Ids are prefixed because graph ids are the sync key.\nexport const nutritionGraphDef = [\"nutritionCalories\", \"nutritionProtein\"] as const;\nexport type INutritionGraphId = (typeof nutritionGraphDef)[number];\nexport const statsHealthDef = [\"sleep\", \"calories\", \"protein\"] as const;\n\nexport const VUnit = v.picklist(units);\nexport type IUnit = v.InferOutput<typeof VUnit>;\n\nexport const VPercentageUnit = v.picklist(percentageUnits);\nexport type IPercentageUnit = v.InferOutput<typeof VPercentageUnit>;\n\nexport const VLengthUnit = v.picklist(lengthUnits);\nexport type ILengthUnit = v.InferOutput<typeof VLengthUnit>;\n\nexport const VExerciseKind = v.picklist(exerciseKinds);\nexport type IExerciseKind = v.InferOutput<typeof VExerciseKind>;\n\nexport const VMuscle = v.picklist(availableMuscles);\nexport type IMuscle = v.InferOutput<typeof VMuscle>;\n\nexport const VBodyPart = v.picklist(availableBodyParts as readonly string[]);\nexport type IBodyPart = v.InferOutput<typeof VBodyPart>;\n\nexport const VBarKey = v.picklist([\"barbell\", \"ezbar\", \"dumbbell\"] as const);\nexport type IBarKey = v.InferOutput<typeof VBarKey>;\n\nexport const VBuiltinEquipment = v.picklist(equipments);\nexport type IBuiltinEquipment = v.InferOutput<typeof VBuiltinEquipment>;\n\nexport const VExercisePickerSort = v.picklist(exercisePickerSorts);\nexport type IExercisePickerSort = v.InferOutput<typeof VExercisePickerSort>;\n\nexport const VExercisePickerScreen = v.picklist([\"exercisePicker\", \"customExercise\", \"filter\", \"settings\"] as const);\nexport type IExercisePickerScreen = v.InferOutput<typeof VExercisePickerScreen>;\n\nexport const VHistoryRecordChange = v.picklist(historyRecordChange);\nexport type IHistoryRecordChange = v.InferOutput<typeof VHistoryRecordChange>;\n\nexport const VTargetType = v.picklist(targetTypes);\nexport type ITargetType = v.InferOutput<typeof VTargetType>;\n\nexport const VProgressMode = v.picklist([\"warmup\", \"workout\"] as const);\nexport type IProgressMode = v.InferOutput<typeof VProgressMode>;\n\nexport const VTimedSetSide = v.picklist([\"left\", \"right\", \"bilateral\"] as const);\nexport type ITimedSetSide = v.InferOutput<typeof VTimedSetSide>;\n\n// Liftoscript runtime failures are shown to the user as an alert and the offending change is dropped. Callers\n// with no UI (the public API in lambda) pass this instead, so a failed script can be surfaced as an error\n// response rather than silently no-opping.\nexport type IScriptErrorHandler = (message: string) => void;\n\nexport const VProgramTag = v.picklist([\n  \"first-starter\",\n  \"beginner\",\n  \"barbell\",\n  \"dumbbell\",\n  \"intermediate\",\n  \"woman\",\n  \"ppl\",\n  \"hypertrophy\",\n] as const);\nexport type IProgramTag = v.InferOutput<typeof VProgramTag>;\n\nexport const VGraphExerciseSelectedType = v.picklist(graphExerciseSelectedTypes);\nexport type IGraphExerciseSelectedType = v.InferOutput<typeof VGraphExerciseSelectedType>;\n\nexport const VGraphMuscleGroupSelectedType = v.picklist(graphMuscleGroupSelectedTypes);\nexport type IGraphMuscleGroupSelectedType = v.InferOutput<typeof VGraphMuscleGroupSelectedType>;\n\nexport const VScreenMuscle = v.union([v.picklist(screenMuscles as readonly string[]), v.string()]);\nexport type IScreenMuscle = v.InferOutput<typeof VScreenMuscle>;\n\nexport const VEquipment = v.string();\nexport type IEquipment = v.InferOutput<typeof VEquipment>;\n\nexport const VExerciseId = v.string();\nexport type IExerciseId = v.InferOutput<typeof VExerciseId>;\n\nexport interface IWeight {\n  value: number;\n  unit: IUnit;\n}\nconst _VWeight = v.object({\n  value: v.number(),\n  unit: VUnit,\n});\nconst _VWeightMatches: IEquals<v.InferOutput<typeof _VWeight>, IWeight> = true;\nvoid _VWeightMatches;\nexport const VWeight: v.GenericSchema<IWeight> = _VWeight;\n\nexport interface IPercentage {\n  value: number;\n  unit: IPercentageUnit;\n}\nconst _VPercentage = v.object({\n  value: v.number(),\n  unit: VPercentageUnit,\n});\nconst _VPercentageMatches: IEquals<v.InferOutput<typeof _VPercentage>, IPercentage> = true;\nvoid _VPercentageMatches;\nexport const VPercentage: v.GenericSchema<IPercentage> = _VPercentage;\n\nexport interface ILength {\n  value: number;\n  unit: ILengthUnit;\n}\nconst _VLength = v.object({\n  value: v.number(),\n  unit: VLengthUnit,\n});\nconst _VLengthMatches: IEquals<v.InferOutput<typeof _VLength>, ILength> = true;\nvoid _VLengthMatches;\nexport const VLength: v.GenericSchema<ILength> = _VLength;\n\nexport interface IPlate {\n  weight: IWeight;\n  num: number;\n}\nconst _VPlate = v.object({\n  weight: VWeight,\n  num: v.number(),\n});\nconst _VPlateMatches: IEquals<v.InferOutput<typeof _VPlate>, IPlate> = true;\nvoid _VPlateMatches;\nexport const VPlate: v.GenericSchema<IPlate> = _VPlate;\n\nexport const VBars = v.record(v.string(), VWeight);\nexport type IBars = v.InferOutput<typeof VBars>;\n\nexport interface IMetaExercises {\n  bodyParts: IBodyPart[];\n  targetMuscles: IMuscle[];\n  synergistMuscles: IMuscle[];\n  sortedEquipment?: IEquipment[];\n}\nconst _VMetaExercises = v.object({\n  bodyParts: v.array(VBodyPart),\n  targetMuscles: v.array(VMuscle),\n  synergistMuscles: v.array(VMuscle),\n  sortedEquipment: v.optional(v.array(VEquipment)),\n});\nconst _VMetaExercisesMatches: IEquals<v.InferOutput<typeof _VMetaExercises>, IMetaExercises> = true;\nvoid _VMetaExercisesMatches;\nexport const VMetaExercises: v.GenericSchema<IMetaExercises> = _VMetaExercises;\n\nexport interface IExerciseType {\n  id: IExerciseId;\n  equipment?: IEquipment;\n}\nconst _VExerciseType = v.object({\n  id: VExerciseId,\n  equipment: v.optional(VEquipment),\n});\nconst _VExerciseTypeMatches: IEquals<v.InferOutput<typeof _VExerciseType>, IExerciseType> = true;\nvoid _VExerciseTypeMatches;\nexport const VExerciseType: v.GenericSchema<IExerciseType> = _VExerciseType;\n\nexport interface ICustomExercise {\n  vtype: \"custom_exercise\";\n  id: IExerciseId;\n  name: string;\n  isDeleted: boolean;\n  meta: IMetaExercises;\n  defaultEquipment?: IEquipment;\n  types?: IExerciseKind[];\n  clonedFrom?: IExerciseType;\n  reuseImageFrom?: IExerciseType;\n  largeImageUrl?: string;\n  smallImageUrl?: string;\n}\nconst _VCustomExercise = v.object({\n  vtype: v.literal(\"custom_exercise\"),\n  id: VExerciseId,\n  name: v.string(),\n  isDeleted: v.boolean(),\n  meta: VMetaExercises,\n  defaultEquipment: v.optional(VEquipment),\n  types: v.optional(v.array(VExerciseKind)),\n  clonedFrom: v.optional(VExerciseType),\n  reuseImageFrom: v.optional(VExerciseType),\n  largeImageUrl: v.optional(v.string()),\n  smallImageUrl: v.optional(v.string()),\n});\nconst _VCustomExerciseMatches: IEquals<v.InferOutput<typeof _VCustomExercise>, ICustomExercise> = true;\nvoid _VCustomExerciseMatches;\nexport const VCustomExercise: v.GenericSchema<ICustomExercise> = _VCustomExercise;\nexport type IAllCustomExercises = Partial<Record<string, ICustomExercise>>;\n\nexport interface ISet {\n  vtype: \"set\";\n  index: number;\n  id: string;\n  reps?: number;\n  originalWeight?: IWeight | IPercentage;\n  weight?: IWeight;\n  minReps?: number;\n  rpe?: number;\n  logRpe?: boolean;\n  timestamp?: number;\n  isAmrap?: boolean;\n  label?: string;\n  timer?: number;\n  setTimer?: number;\n  isOverflowSetTimer?: boolean;\n  auto?: boolean;\n  askWeight?: boolean;\n  isCompleted?: boolean;\n  isUnilateral?: boolean;\n  completedRepsLeft?: number;\n  completedReps?: number;\n  completedWeight?: IWeight;\n  completedRpe?: number;\n  completedSetTimer?: number;\n  completedSetTimerLeft?: number;\n  programSetIndex?: number;\n}\nconst _VSet = v.object({\n  vtype: v.literal(\"set\"),\n  index: v.number(),\n  id: v.string(),\n  reps: v.optional(v.number()),\n  originalWeight: v.optional(v.union([VWeight, VPercentage])),\n  weight: v.optional(VWeight),\n  minReps: v.optional(v.number()),\n  rpe: v.optional(v.number()),\n  logRpe: v.optional(v.boolean()),\n  timestamp: v.optional(v.number()),\n  isAmrap: v.optional(v.boolean()),\n  label: v.optional(v.string()),\n  timer: v.optional(v.number()),\n  setTimer: v.optional(v.number()),\n  isOverflowSetTimer: v.optional(v.boolean()),\n  auto: v.optional(v.boolean()),\n  askWeight: v.optional(v.boolean()),\n  isCompleted: v.optional(v.boolean()),\n  isUnilateral: v.optional(v.boolean()),\n  completedRepsLeft: v.optional(v.number()),\n  completedReps: v.optional(v.number()),\n  completedWeight: v.optional(VWeight),\n  completedRpe: v.optional(v.number()),\n  completedSetTimer: v.optional(v.number()),\n  completedSetTimerLeft: v.optional(v.number()),\n  programSetIndex: v.optional(v.number()),\n});\nconst _VSetMatches: IEquals<v.InferOutput<typeof _VSet>, ISet> = true;\nvoid _VSetMatches;\nexport const VSet: v.GenericSchema<ISet> = _VSet;\n\nexport const VProgramState = v.record(v.string(), v.union([v.number(), VWeight, VPercentage]));\nexport type IProgramState = v.InferOutput<typeof VProgramState>;\n\nexport interface IHistoryEntryProgressSnapshot {\n  diffState?: Record<string, string>;\n  diffVars?: Record<string, string>;\n  prints?: (number | IWeight | IPercentage)[][];\n  updatePrints?: (number | IWeight | IPercentage)[][];\n}\nconst _VHistoryEntryProgressSnapshot = v.object({\n  diffState: v.optional(v.record(v.string(), v.string())),\n  diffVars: v.optional(v.record(v.string(), v.string())),\n  prints: v.optional(v.array(v.array(v.union([v.number(), VWeight, VPercentage])))),\n  updatePrints: v.optional(v.array(v.array(v.union([v.number(), VWeight, VPercentage])))),\n});\nconst _VHistoryEntryProgressSnapshotMatches: IEquals<\n  v.InferOutput<typeof _VHistoryEntryProgressSnapshot>,\n  IHistoryEntryProgressSnapshot\n> = true;\nvoid _VHistoryEntryProgressSnapshotMatches;\nexport const VHistoryEntryProgressSnapshot: v.GenericSchema<IHistoryEntryProgressSnapshot> =\n  _VHistoryEntryProgressSnapshot;\n\nexport interface IHistoryEntry {\n  vtype: \"history_entry\";\n  exercise: IExerciseType;\n  sets: ISet[];\n  warmupSets: ISet[];\n  index: number;\n  id: string;\n  programExerciseId?: string;\n  state?: IProgramState;\n  vars?: IProgramState;\n  notes?: string;\n  changed?: boolean;\n  isSuppressed?: boolean;\n  superset?: string;\n  updatePrints?: (number | IWeight | IPercentage)[][];\n  descriptionSnapshot?: string;\n  progressSnapshot?: IHistoryEntryProgressSnapshot;\n}\nconst _VHistoryEntry = v.object({\n  vtype: v.literal(\"history_entry\"),\n  exercise: VExerciseType,\n  sets: v.array(VSet),\n  warmupSets: v.array(VSet),\n  index: v.number(),\n  id: v.string(),\n  programExerciseId: v.optional(v.string()),\n  state: v.optional(VProgramState),\n  vars: v.optional(VProgramState),\n  notes: v.optional(v.string()),\n  changed: v.optional(v.boolean()),\n  isSuppressed: v.optional(v.boolean()),\n  superset: v.optional(v.string()),\n  updatePrints: v.optional(v.array(v.array(v.union([v.number(), VWeight, VPercentage])))),\n  descriptionSnapshot: v.optional(v.string()),\n  progressSnapshot: v.optional(VHistoryEntryProgressSnapshot),\n});\nconst _VHistoryEntryMatches: IEquals<v.InferOutput<typeof _VHistoryEntry>, IHistoryEntry> = true;\nvoid _VHistoryEntryMatches;\nexport const VHistoryEntry: v.GenericSchema<IHistoryEntry> = _VHistoryEntry;\n\nexport interface IProgramStateMetadataValue {\n  userPrompted?: boolean;\n}\nconst _VProgramStateMetadataValue = v.object({\n  userPrompted: v.optional(v.boolean()),\n});\nconst _VProgramStateMetadataValueMatches: IEquals<\n  v.InferOutput<typeof _VProgramStateMetadataValue>,\n  IProgramStateMetadataValue\n> = true;\nvoid _VProgramStateMetadataValueMatches;\nexport const VProgramStateMetadataValue: v.GenericSchema<IProgramStateMetadataValue> = _VProgramStateMetadataValue;\n\nexport const VProgramStateMetadata = v.record(v.string(), v.optional(VProgramStateMetadataValue));\nexport type IProgramStateMetadata = v.InferOutput<typeof VProgramStateMetadata>;\n\nexport interface IProgramSet {\n  repsExpr: string;\n  weightExpr: string;\n  isAmrap?: boolean;\n  rpeExpr?: string;\n  minRepsExpr?: string;\n  logRpe?: boolean;\n  askWeight?: boolean;\n  label?: string;\n  timerExpr?: string;\n}\nconst _VProgramSet = v.object({\n  repsExpr: v.string(),\n  weightExpr: v.string(),\n  isAmrap: v.optional(v.boolean()),\n  rpeExpr: v.optional(v.string()),\n  minRepsExpr: v.optional(v.string()),\n  logRpe: v.optional(v.boolean()),\n  askWeight: v.optional(v.boolean()),\n  label: v.optional(v.string()),\n  timerExpr: v.optional(v.string()),\n});\nconst _VProgramSetMatches: IEquals<v.InferOutput<typeof _VProgramSet>, IProgramSet> = true;\nvoid _VProgramSetMatches;\nexport const VProgramSet: v.GenericSchema<IProgramSet> = _VProgramSet;\n\nexport interface IProgramExerciseVariation {\n  sets: IProgramSet[];\n  quickAddSets?: boolean;\n}\nconst _VProgramExerciseVariation = v.object({\n  sets: v.array(VProgramSet),\n  quickAddSets: v.optional(v.boolean()),\n});\nconst _VProgramExerciseVariationMatches: IEquals<\n  v.InferOutput<typeof _VProgramExerciseVariation>,\n  IProgramExerciseVariation\n> = true;\nvoid _VProgramExerciseVariationMatches;\nexport const VProgramExerciseVariation: v.GenericSchema<IProgramExerciseVariation> = _VProgramExerciseVariation;\n\nexport interface IProgramExerciseWarmupSet {\n  reps: number;\n  value: IWeight | number;\n  threshold: IWeight;\n}\nconst _VProgramExerciseWarmupSet = v.object({\n  reps: v.number(),\n  value: v.union([VWeight, v.number()]),\n  threshold: VWeight,\n});\nconst _VProgramExerciseWarmupSetMatches: IEquals<\n  v.InferOutput<typeof _VProgramExerciseWarmupSet>,\n  IProgramExerciseWarmupSet\n> = true;\nvoid _VProgramExerciseWarmupSetMatches;\nexport const VProgramExerciseWarmupSet: v.GenericSchema<IProgramExerciseWarmupSet> = _VProgramExerciseWarmupSet;\n\nexport interface IProgramExerciseReuseLogic {\n  selected?: string;\n  states: Record<string, IProgramState>;\n}\nconst _VProgramExerciseReuseLogic = v.object({\n  selected: v.optional(v.string()),\n  states: v.record(v.string(), VProgramState),\n});\nconst _VProgramExerciseReuseLogicMatches: IEquals<\n  v.InferOutput<typeof _VProgramExerciseReuseLogic>,\n  IProgramExerciseReuseLogic\n> = true;\nvoid _VProgramExerciseReuseLogicMatches;\nexport const VProgramExerciseReuseLogic: v.GenericSchema<IProgramExerciseReuseLogic> = _VProgramExerciseReuseLogic;\n\nexport interface IProgramExercise {\n  exerciseType: IExerciseType;\n  id: string;\n  name: string;\n  variations: v.InferOutput<typeof VProgramExerciseVariation>[];\n  state: IProgramState;\n  variationExpr: string;\n  finishDayExpr: string;\n  descriptions: string[];\n  tags?: number[];\n  updateDayExpr?: string;\n  diffPaths?: string[];\n  description?: string;\n  descriptionExpr?: string;\n  quickAddSets?: boolean;\n  enableRepRanges?: boolean;\n  enableRpe?: boolean;\n  stateMetadata?: IProgramStateMetadata;\n  timerExpr?: string;\n  reuseLogic?: v.InferOutput<typeof VProgramExerciseReuseLogic>;\n  warmupSets?: v.InferOutput<typeof VProgramExerciseWarmupSet>[];\n  reuseFinishDayScript?: string;\n  reuseUpdateDayScript?: string;\n}\nconst _VProgramExercise = v.object({\n  exerciseType: VExerciseType,\n  id: v.string(),\n  name: v.string(),\n  variations: v.array(VProgramExerciseVariation),\n  state: VProgramState,\n  variationExpr: v.string(),\n  finishDayExpr: v.string(),\n  descriptions: v.array(v.string()),\n  tags: v.optional(v.array(v.number())),\n  updateDayExpr: v.optional(v.string()),\n  diffPaths: v.optional(v.array(v.string())),\n  description: v.optional(v.string()),\n  descriptionExpr: v.optional(v.string()),\n  quickAddSets: v.optional(v.boolean()),\n  enableRepRanges: v.optional(v.boolean()),\n  enableRpe: v.optional(v.boolean()),\n  stateMetadata: v.optional(VProgramStateMetadata),\n  timerExpr: v.optional(v.string()),\n  reuseLogic: v.optional(VProgramExerciseReuseLogic),\n  warmupSets: v.optional(v.array(VProgramExerciseWarmupSet)),\n  reuseFinishDayScript: v.optional(v.string()),\n  reuseUpdateDayScript: v.optional(v.string()),\n});\nconst _VProgramExerciseMatches: IEquals<v.InferOutput<typeof _VProgramExercise>, IProgramExercise> = true;\nvoid _VProgramExerciseMatches;\nexport const VProgramExercise: v.GenericSchema<IProgramExercise> = _VProgramExercise;\n\nexport interface IExercisePickerFilters {\n  equipment?: IBuiltinEquipment[];\n  type?: IExerciseKind[];\n  muscles?: IMuscle[];\n  isStarred?: boolean;\n}\nconst _VExercisePickerFilters = v.object({\n  equipment: v.optional(v.array(VBuiltinEquipment)),\n  type: v.optional(v.array(VExerciseKind)),\n  muscles: v.optional(v.array(VMuscle)),\n  isStarred: v.optional(v.boolean()),\n});\nconst _VExercisePickerFiltersMatches: IEquals<\n  v.InferOutput<typeof _VExercisePickerFilters>,\n  IExercisePickerFilters\n> = true;\nvoid _VExercisePickerFiltersMatches;\nexport const VExercisePickerFilters: v.GenericSchema<IExercisePickerFilters> = _VExercisePickerFilters;\n\nexport interface IExercisePickerProgramExercise {\n  type: \"program\";\n  exerciseType: IExerciseType;\n  week: number;\n  dayInWeek: number;\n}\nconst _VExercisePickerProgramExercise = v.object({\n  type: v.literal(\"program\"),\n  exerciseType: VExerciseType,\n  week: v.number(),\n  dayInWeek: v.number(),\n});\nconst _VExercisePickerProgramExerciseMatches: IEquals<\n  v.InferOutput<typeof _VExercisePickerProgramExercise>,\n  IExercisePickerProgramExercise\n> = true;\nvoid _VExercisePickerProgramExerciseMatches;\nexport const VExercisePickerProgramExercise: v.GenericSchema<IExercisePickerProgramExercise> =\n  _VExercisePickerProgramExercise;\n\nexport interface IExercisePickerAdhocExercise {\n  type: \"adhoc\";\n  exerciseType: IExerciseType;\n  label?: string;\n}\nconst _VExercisePickerAdhocExercise = v.object({\n  type: v.literal(\"adhoc\"),\n  exerciseType: VExerciseType,\n  label: v.optional(v.string()),\n});\nconst _VExercisePickerAdhocExerciseMatches: IEquals<\n  v.InferOutput<typeof _VExercisePickerAdhocExercise>,\n  IExercisePickerAdhocExercise\n> = true;\nvoid _VExercisePickerAdhocExerciseMatches;\nexport const VExercisePickerAdhocExercise: v.GenericSchema<IExercisePickerAdhocExercise> =\n  _VExercisePickerAdhocExercise;\n\nexport interface IExercisePickerTemplate {\n  type: \"template\";\n  name: string;\n  label?: string;\n}\nconst _VExercisePickerTemplate = v.object({\n  type: v.literal(\"template\"),\n  name: v.string(),\n  label: v.optional(v.string()),\n});\nconst _VExercisePickerTemplateMatches: IEquals<\n  v.InferOutput<typeof _VExercisePickerTemplate>,\n  IExercisePickerTemplate\n> = true;\nvoid _VExercisePickerTemplateMatches;\nexport const VExercisePickerTemplate: v.GenericSchema<IExercisePickerTemplate> = _VExercisePickerTemplate;\n\nexport const VExercisePickerSelectedExercise = v.union([\n  VExercisePickerProgramExercise,\n  VExercisePickerAdhocExercise,\n  VExercisePickerTemplate,\n]);\nexport type IExercisePickerSelectedExercise = v.InferOutput<typeof VExercisePickerSelectedExercise>;\n\nexport interface IExercisePickerState {\n  screenStack: IExercisePickerScreen[];\n  sort: IExercisePickerSort;\n  filters: IExercisePickerFilters;\n  selectedExercises: IExercisePickerSelectedExercise[];\n  mode: \"workout\" | \"program\";\n  showMuscles?: boolean;\n  customExerciseName?: string;\n  label?: string;\n  templateName?: string;\n  selectedTab?: number;\n  editCustomExercise?: ICustomExercise;\n  search?: string;\n  exerciseType?: IExerciseType;\n  entryIndex?: number;\n  hideLabel?: boolean;\n  hideTemplate?: boolean;\n}\nconst _VExercisePickerState = v.object({\n  screenStack: v.array(VExercisePickerScreen),\n  sort: VExercisePickerSort,\n  filters: VExercisePickerFilters,\n  selectedExercises: v.array(VExercisePickerSelectedExercise),\n  mode: v.union([v.literal(\"workout\"), v.literal(\"program\")]),\n  showMuscles: v.optional(v.boolean()),\n  customExerciseName: v.optional(v.string()),\n  label: v.optional(v.string()),\n  templateName: v.optional(v.string()),\n  selectedTab: v.optional(v.number()),\n  editCustomExercise: v.optional(VCustomExercise),\n  search: v.optional(v.string()),\n  exerciseType: v.optional(VExerciseType),\n  entryIndex: v.optional(v.number()),\n  hideLabel: v.optional(v.boolean()),\n  hideTemplate: v.optional(v.boolean()),\n});\nconst _VExercisePickerStateMatches: IEquals<v.InferOutput<typeof _VExercisePickerState>, IExercisePickerState> = true;\nvoid _VExercisePickerStateMatches;\nexport const VExercisePickerState: v.GenericSchema<IExercisePickerState> = _VExercisePickerState;\n\nexport interface IProgressUi {\n  vtype?: \"progress_ui\";\n  id?: string;\n  editModal?: {\n    programExerciseId: string;\n    entryIndex: number;\n  };\n  dateModal?: {\n    date: string;\n    time: number;\n  };\n  exercisePicker?: {\n    state?: IExercisePickerState;\n  };\n  equipmentModal?: {\n    exerciseType?: IExerciseType;\n  };\n  rm1Modal?: {\n    exerciseType?: IExerciseType;\n  };\n  editSetModal?: {\n    isWarmup: boolean;\n    entryIndex: number;\n    exerciseType?: IExerciseType;\n    programExerciseId?: string;\n    set: ISet;\n    setIndex?: number;\n  };\n  setTimerEditModal?: {\n    entryIndex: number;\n    setIndex: number;\n  };\n  roundingModal?: {\n    entryIndex: number;\n    setIndex: number;\n  };\n  exerciseBottomSheet?: {\n    entryIndex: number;\n  };\n  entryIndexEditMode?: number;\n  showSupersetPicker?: IHistoryEntry;\n  forceUpdateEntryIndex?: boolean;\n  isExternal?: boolean;\n  nativeNotificationScheduled?: boolean;\n}\nconst _VProgressUi = v.object({\n  vtype: v.optional(v.literal(\"progress_ui\")),\n  id: v.optional(v.string()),\n  editModal: v.optional(\n    v.object({\n      programExerciseId: v.string(),\n      entryIndex: v.number(),\n    })\n  ),\n  dateModal: v.optional(\n    v.object({\n      date: v.string(),\n      time: v.number(),\n    })\n  ),\n  exercisePicker: v.optional(\n    v.object({\n      state: v.optional(VExercisePickerState),\n    })\n  ),\n  equipmentModal: v.optional(\n    v.object({\n      exerciseType: v.optional(VExerciseType),\n    })\n  ),\n  rm1Modal: v.optional(\n    v.object({\n      exerciseType: v.optional(VExerciseType),\n    })\n  ),\n  editSetModal: v.optional(\n    v.object({\n      isWarmup: v.boolean(),\n      entryIndex: v.number(),\n      exerciseType: v.optional(VExerciseType),\n      programExerciseId: v.optional(v.string()),\n      set: VSet,\n      setIndex: v.optional(v.number()),\n    })\n  ),\n  setTimerEditModal: v.optional(\n    v.object({\n      entryIndex: v.number(),\n      setIndex: v.number(),\n    })\n  ),\n  roundingModal: v.optional(\n    v.object({\n      entryIndex: v.number(),\n      setIndex: v.number(),\n    })\n  ),\n  exerciseBottomSheet: v.optional(\n    v.object({\n      entryIndex: v.number(),\n    })\n  ),\n  entryIndexEditMode: v.optional(v.number()),\n  showSupersetPicker: v.optional(v.lazy(() => VHistoryEntry)),\n  forceUpdateEntryIndex: v.optional(v.boolean()),\n  isExternal: v.optional(v.boolean()),\n  nativeNotificationScheduled: v.optional(v.boolean()),\n});\nconst _VProgressUiMatches: IEquals<v.InferOutput<typeof _VProgressUi>, IProgressUi> = true;\nvoid _VProgressUiMatches;\nexport const VProgressUi: v.GenericSchema<IProgressUi> = _VProgressUi;\n\nexport const VIntervals = v.array(v.tuple([v.number(), v.union([v.number(), v.undefined(), v.null()])]));\nexport type IIntervals = v.InferOutput<typeof VIntervals>;\n\nexport interface IHistoryRecord {\n  vtype: \"history_record\" | \"progress\";\n  date: string;\n  programId: string;\n  programName: string;\n  day: number;\n  dayName: string;\n  entries: IHistoryEntry[];\n  startTime: number;\n  id: number;\n  endTime?: number;\n  week?: number;\n  dayInWeek?: number;\n  ui?: IProgressUi;\n  intervals?: IIntervals;\n  deletedProgramExercises?: Record<string, boolean | undefined>;\n  userPromptedStateVars?: Record<string, IProgramState | undefined>;\n  changes?: IHistoryRecordChange[];\n  timerSince?: number;\n  timerMode?: IProgressMode;\n  timer?: number;\n  timerEntryIndex?: number;\n  timerSetIndex?: number;\n  // The running clock for a time-based set. Lives on the record (not under `ui`) so it's version-tracked\n  // and syncs across devices like the rest timer — a clock started on the watch shows in the app and vice\n  // versa. `nonce` drives re-presenting the modal; `keepTiming` survives the AMRAP resolution.\n  setTimer?: {\n    entryIndex: number;\n    setIndex: number;\n    setId: string;\n    id: string;\n    side: ITimedSetSide;\n    startedAt: number;\n    nonce?: number;\n    keepTiming?: boolean;\n  };\n  // Must stay a sibling of setTimer, never a phase inside it: the watch, the iOS widget and the Android\n  // live update all read setTimer's presence as \"the work clock is live\".\n  setTimerGetReady?: {\n    entryIndex: number;\n    setIndex: number;\n    setId: string;\n    id: string;\n    side: ITimedSetSide;\n    startedAt: number;\n    getReady: number;\n    nonce?: number;\n  };\n  // Lives on the record (not under `ui`) so it's version-tracked and syncs across devices like setTimer — an\n  // AMRAP prompt opened on the watch shows in the app and vice versa, and resolving it on either device\n  // dismisses it on both. `nonce` drives re-presenting the modal.\n  amrapModal?: {\n    entryIndex: number;\n    setIndex: number;\n    isAmrap?: boolean;\n    logRpe?: boolean;\n    askWeight?: boolean;\n    userVars?: boolean;\n    nonce?: number;\n  };\n  // The exercise the workout screen is scrolled to. Lives on the record (not under `ui`) so it version-syncs\n  // across devices — auto-advancing past an exercise (EMOM/Tabata) on one client moves the others too.\n  currentEntryIndex?: number;\n  notes?: string;\n  updatedAt?: number;\n  // Which client wrote this workout, from the X-Liftosaur-Client header on the public API. Absent for\n  // anything logged in our own apps. Provenance can't be reconstructed later, so it's recorded at write time.\n  source?: string;\n}\nconst _VHistoryRecord = v.object({\n  vtype: v.union([v.literal(\"history_record\"), v.literal(\"progress\")]),\n  date: v.string(),\n  programId: v.string(),\n  programName: v.string(),\n  day: v.number(),\n  dayName: v.string(),\n  entries: v.array(VHistoryEntry),\n  startTime: v.number(),\n  id: v.number(),\n  endTime: v.optional(v.number()),\n  week: v.optional(v.number()),\n  dayInWeek: v.optional(v.number()),\n  ui: v.optional(VProgressUi),\n  intervals: v.optional(VIntervals),\n  deletedProgramExercises: v.optional(v.record(v.string(), v.optional(v.boolean()))),\n  userPromptedStateVars: v.optional(v.record(v.string(), v.optional(VProgramState))),\n  changes: v.optional(v.array(VHistoryRecordChange)),\n  timerSince: v.optional(v.number()),\n  timerMode: v.optional(VProgressMode),\n  timer: v.optional(v.number()),\n  timerEntryIndex: v.optional(v.number()),\n  timerSetIndex: v.optional(v.number()),\n  setTimer: v.optional(\n    v.object({\n      entryIndex: v.number(),\n      setIndex: v.number(),\n      setId: v.string(),\n      id: v.string(),\n      side: VTimedSetSide,\n      startedAt: v.number(),\n      nonce: v.optional(v.number()),\n      keepTiming: v.optional(v.boolean()),\n    })\n  ),\n  setTimerGetReady: v.optional(\n    v.object({\n      entryIndex: v.number(),\n      setIndex: v.number(),\n      setId: v.string(),\n      id: v.string(),\n      side: VTimedSetSide,\n      startedAt: v.number(),\n      getReady: v.number(),\n      nonce: v.optional(v.number()),\n    })\n  ),\n  amrapModal: v.optional(\n    v.object({\n      entryIndex: v.number(),\n      setIndex: v.number(),\n      isAmrap: v.optional(v.boolean()),\n      logRpe: v.optional(v.boolean()),\n      askWeight: v.optional(v.boolean()),\n      userVars: v.optional(v.boolean()),\n      nonce: v.optional(v.number()),\n    })\n  ),\n  currentEntryIndex: v.optional(v.number()),\n  notes: v.optional(v.string()),\n  updatedAt: v.optional(v.number()),\n  source: v.optional(v.string()),\n});\nconst _VHistoryRecordMatches: IEquals<v.InferOutput<typeof _VHistoryRecord>, IHistoryRecord> = true;\nvoid _VHistoryRecordMatches;\nexport const VHistoryRecord: v.GenericSchema<IHistoryRecord> = _VHistoryRecord;\n\nexport interface IProgramDayEntry {\n  exercise: IExerciseType;\n  sets: IProgramSet[];\n}\nconst _VProgramDayEntry = v.object({\n  exercise: VExerciseType,\n  sets: v.array(VProgramSet),\n});\nconst _VProgramDayEntryMatches: IEquals<v.InferOutput<typeof _VProgramDayEntry>, IProgramDayEntry> = true;\nvoid _VProgramDayEntryMatches;\nexport const VProgramDayEntry: v.GenericSchema<IProgramDayEntry> = _VProgramDayEntry;\n\nexport interface IProgramWeek {\n  id: string;\n  name: string;\n  days: { id: string }[];\n  description?: string;\n}\nconst _VProgramWeek = v.object({\n  id: v.string(),\n  name: v.string(),\n  days: v.array(v.object({ id: v.string() })),\n  description: v.optional(v.string()),\n});\nconst _VProgramWeekMatches: IEquals<v.InferOutput<typeof _VProgramWeek>, IProgramWeek> = true;\nvoid _VProgramWeekMatches;\nexport const VProgramWeek: v.GenericSchema<IProgramWeek> = _VProgramWeek;\n\nexport interface IProgramDay {\n  id: string;\n  name: string;\n  exercises: { id: string }[];\n  description?: string;\n}\nconst _VProgramDay = v.object({\n  id: v.string(),\n  name: v.string(),\n  exercises: v.array(v.object({ id: v.string() })),\n  description: v.optional(v.string()),\n});\nconst _VProgramDayMatches: IEquals<v.InferOutput<typeof _VProgramDay>, IProgramDay> = true;\nvoid _VProgramDayMatches;\nexport const VProgramDay: v.GenericSchema<IProgramDay> = _VProgramDay;\n\nexport interface IPlannerProgramDay {\n  name: string;\n  exerciseText: string;\n  id?: string;\n  description?: string;\n}\nconst _VPlannerProgramDay = v.object({\n  name: v.string(),\n  exerciseText: v.string(),\n  id: v.optional(v.string()),\n  description: v.optional(v.string()),\n});\nconst _VPlannerProgramDayMatches: IEquals<v.InferOutput<typeof _VPlannerProgramDay>, IPlannerProgramDay> = true;\nvoid _VPlannerProgramDayMatches;\nexport const VPlannerProgramDay: v.GenericSchema<IPlannerProgramDay> = _VPlannerProgramDay;\n\nexport interface IPlannerProgramWeek {\n  name: string;\n  days: IPlannerProgramDay[];\n  id?: string;\n  description?: string;\n}\nconst _VPlannerProgramWeek = v.object({\n  name: v.string(),\n  days: v.array(VPlannerProgramDay),\n  id: v.optional(v.string()),\n  description: v.optional(v.string()),\n});\nconst _VPlannerProgramWeekMatches: IEquals<v.InferOutput<typeof _VPlannerProgramWeek>, IPlannerProgramWeek> = true;\nvoid _VPlannerProgramWeekMatches;\nexport const VPlannerProgramWeek: v.GenericSchema<IPlannerProgramWeek> = _VPlannerProgramWeek;\n\nexport interface IPlannerProgram {\n  vtype: \"planner\";\n  name: string;\n  weeks: IPlannerProgramWeek[];\n}\nconst _VPlannerProgram = v.object({\n  vtype: v.literal(\"planner\"),\n  name: v.string(),\n  weeks: v.array(VPlannerProgramWeek),\n});\nconst _VPlannerProgramMatches: IEquals<v.InferOutput<typeof _VPlannerProgram>, IPlannerProgram> = true;\nvoid _VPlannerProgramMatches;\nexport const VPlannerProgram: v.GenericSchema<IPlannerProgram> = _VPlannerProgram;\n\nexport interface IProgram {\n  vtype: \"program\";\n  exercises: IProgramExercise[];\n  id: string;\n  name: string;\n  description: string;\n  url: string;\n  author: string;\n  nextDay: number;\n  days: IProgramDay[];\n  weeks: IProgramWeek[];\n  isMultiweek: boolean;\n  tags: IProgramTag[];\n  clonedAt?: number;\n  shortDescription?: string;\n  planner?: IPlannerProgram;\n  updatedAt?: number;\n  authorid?: string | null;\n  source?: string | null;\n}\nconst _VProgram = v.object({\n  vtype: v.literal(\"program\"),\n  exercises: v.array(VProgramExercise),\n  id: v.string(),\n  name: v.string(),\n  description: v.string(),\n  url: v.string(),\n  author: v.string(),\n  nextDay: v.number(),\n  days: v.array(VProgramDay),\n  weeks: v.array(VProgramWeek),\n  isMultiweek: v.boolean(),\n  tags: v.array(VProgramTag),\n  clonedAt: v.optional(v.number()),\n  shortDescription: v.optional(v.string()),\n  planner: v.optional(VPlannerProgram),\n  updatedAt: v.optional(v.number()),\n  authorid: v.optional(v.union([v.string(), v.null()])),\n  source: v.optional(v.union([v.string(), v.null()])),\n});\nconst _VProgramMatches: IEquals<v.InferOutput<typeof _VProgram>, IProgram> = true;\nvoid _VProgramMatches;\nexport const VProgram: v.GenericSchema<IProgram> = _VProgram;\n\nexport interface IStatsWeightValue {\n  vtype: \"stat\";\n  value: IWeight;\n  timestamp: number;\n  updatedAt?: number;\n  appleUuid?: string;\n  googleUuid?: string;\n}\nconst _VStatsWeightValue = v.object({\n  vtype: v.literal(\"stat\"),\n  value: VWeight,\n  timestamp: v.number(),\n  updatedAt: v.optional(v.number()),\n  appleUuid: v.optional(v.string()),\n  googleUuid: v.optional(v.string()),\n});\nconst _VStatsWeightValueMatches: IEquals<v.InferOutput<typeof _VStatsWeightValue>, IStatsWeightValue> = true;\nvoid _VStatsWeightValueMatches;\nexport const VStatsWeightValue: v.GenericSchema<IStatsWeightValue> = _VStatsWeightValue;\n\nexport const VStatsWeight = v.object({\n  weight: v.optional(v.array(VStatsWeightValue)),\n});\nexport type IStatsWeight = v.InferOutput<typeof VStatsWeight>;\n\nexport interface IStatsLengthValue {\n  vtype: \"stat\";\n  value: ILength;\n  timestamp: number;\n  updatedAt?: number;\n  appleUuid?: string;\n  googleUuid?: string;\n}\nconst _VStatsLengthValue = v.object({\n  vtype: v.literal(\"stat\"),\n  value: VLength,\n  timestamp: v.number(),\n  updatedAt: v.optional(v.number()),\n  appleUuid: v.optional(v.string()),\n  googleUuid: v.optional(v.string()),\n});\nconst _VStatsLengthValueMatches: IEquals<v.InferOutput<typeof _VStatsLengthValue>, IStatsLengthValue> = true;\nvoid _VStatsLengthValueMatches;\nexport const VStatsLengthValue: v.GenericSchema<IStatsLengthValue> = _VStatsLengthValue;\n\nexport type IStatsLength = Partial<Record<(typeof statsLengthDef)[number], IStatsLengthValue[]>>;\nexport const VStatsLength: v.GenericSchema<IStatsLength> = v.object(\n  statsLengthDef.reduce<Record<string, v.GenericSchema<IStatsLengthValue[] | undefined>>>((memo, key) => {\n    memo[key] = v.optional(v.array(VStatsLengthValue));\n    return memo;\n  }, {})\n);\n\nexport interface IStatsPercentageValue {\n  vtype: \"stat\";\n  value: IPercentage;\n  timestamp: number;\n  updatedAt?: number;\n  appleUuid?: string;\n  googleUuid?: string;\n}\nconst _VStatsPercentageValue = v.object({\n  vtype: v.literal(\"stat\"),\n  value: VPercentage,\n  timestamp: v.number(),\n  updatedAt: v.optional(v.number()),\n  appleUuid: v.optional(v.string()),\n  googleUuid: v.optional(v.string()),\n});\nconst _VStatsPercentageValueMatches: IEquals<\n  v.InferOutput<typeof _VStatsPercentageValue>,\n  IStatsPercentageValue\n> = true;\nvoid _VStatsPercentageValueMatches;\nexport const VStatsPercentageValue: v.GenericSchema<IStatsPercentageValue> = _VStatsPercentageValue;\n\nexport const VStatsPercentage = v.object({\n  bodyfat: v.optional(v.array(VStatsPercentageValue)),\n});\nexport type IStatsPercentage = v.InferOutput<typeof VStatsPercentage>;\n\n// Read-only daily metrics imported from Apple Health / Health Connect (sleep minutes, dietary\n// calories, protein grams). Unlike body measurements these are daily aggregates, keyed by the\n// local-midnight timestamp of the day they belong to; the value is a plain number whose unit is\n// implied by the key.\nexport interface IStatsHealthValue {\n  vtype: \"stat\";\n  value: number;\n  timestamp: number;\n  updatedAt?: number;\n  appleUuid?: string;\n  googleUuid?: string;\n  // Read-only imported records can't be truly deleted (they'd just re-sync), so the user hides them\n  // instead; the record stays in storage and re-syncs normally, it's just filtered out of the UI.\n  hidden?: boolean;\n}\nconst _VStatsHealthValue = v.object({\n  vtype: v.literal(\"stat\"),\n  value: v.number(),\n  timestamp: v.number(),\n  updatedAt: v.optional(v.number()),\n  appleUuid: v.optional(v.string()),\n  googleUuid: v.optional(v.string()),\n  hidden: v.optional(v.boolean()),\n});\nconst _VStatsHealthValueMatches: IEquals<v.InferOutput<typeof _VStatsHealthValue>, IStatsHealthValue> = true;\nvoid _VStatsHealthValueMatches;\nexport const VStatsHealthValue: v.GenericSchema<IStatsHealthValue> = _VStatsHealthValue;\n\nexport type IStatsHealthKey = (typeof statsHealthDef)[number];\nexport type IStatsHealth = Partial<Record<IStatsHealthKey, IStatsHealthValue[]>>;\nexport const VStatsHealth: v.GenericSchema<IStatsHealth> = v.object(\n  statsHealthDef.reduce<Record<string, v.GenericSchema<IStatsHealthValue[] | undefined>>>((memo, key) => {\n    memo[key] = v.optional(v.array(VStatsHealthValue));\n    return memo;\n  }, {})\n);\n\n// Personal fork: food logging. Entries are a stats category so they reuse the per-row lftStats storage\n// and the stat sync path; the timestamp is the entry id, `date` is the local day the food counts toward.\nexport interface INutrients {\n  calories: number;\n  protein: number;\n  carbs: number;\n  fat: number;\n  fiber?: number;\n}\nconst _VNutrients = v.object({\n  calories: v.number(),\n  protein: v.number(),\n  carbs: v.number(),\n  fat: v.number(),\n  fiber: v.optional(v.number()),\n});\nconst _VNutrientsMatches: IEquals<v.InferOutput<typeof _VNutrients>, INutrients> = true;\nvoid _VNutrientsMatches;\nexport const VNutrients: v.GenericSchema<INutrients> = _VNutrients;\n\nexport const foodMeals = [\"breakfast\", \"lunch\", \"dinner\", \"snack\"] as const;\nexport type IFoodMeal = (typeof foodMeals)[number];\nexport const VFoodMeal = v.picklist(foodMeals);\n\nexport const foodSources = [\"off\", \"usda\", \"custom\", \"recipe\", \"quick\"] as const;\nexport type IFoodSource = (typeof foodSources)[number];\nexport const VFoodSource = v.picklist(foodSources);\n\nexport interface IFoodEntryValue {\n  date: string;\n  meal: IFoodMeal;\n  name: string;\n  brand?: string;\n  servings: number;\n  servingLabel: string;\n  perServing: INutrients;\n  source: IFoodSource;\n  foodId?: string;\n  barcode?: string;\n}\nconst _VFoodEntryValue = v.object({\n  date: v.string(),\n  meal: VFoodMeal,\n  name: v.string(),\n  brand: v.optional(v.string()),\n  servings: v.number(),\n  servingLabel: v.string(),\n  perServing: VNutrients,\n  source: VFoodSource,\n  foodId: v.optional(v.string()),\n  barcode: v.optional(v.string()),\n});\nconst _VFoodEntryValueMatches: IEquals<v.InferOutput<typeof _VFoodEntryValue>, IFoodEntryValue> = true;\nvoid _VFoodEntryValueMatches;\nexport const VFoodEntryValue: v.GenericSchema<IFoodEntryValue> = _VFoodEntryValue;\n\nexport interface IStatsFoodEntry {\n  vtype: \"stat\";\n  timestamp: number;\n  updatedAt?: number;\n  value: IFoodEntryValue;\n}\nconst _VStatsFoodEntry = v.object({\n  vtype: v.literal(\"stat\"),\n  timestamp: v.number(),\n  updatedAt: v.optional(v.number()),\n  value: VFoodEntryValue,\n});\nconst _VStatsFoodEntryMatches: IEquals<v.InferOutput<typeof _VStatsFoodEntry>, IStatsFoodEntry> = true;\nvoid _VStatsFoodEntryMatches;\nexport const VStatsFoodEntry: v.GenericSchema<IStatsFoodEntry> = _VStatsFoodEntry;\n\n// Water is its own stat key so each drink is one row named `${timestamp}_water`.\nexport interface IWaterEntryValue {\n  date: string;\n  ml: number;\n}\nexport interface IStatsWaterEntry {\n  vtype: \"stat\";\n  timestamp: number;\n  updatedAt?: number;\n  value: IWaterEntryValue;\n}\nconst _VStatsWaterEntry = v.object({\n  vtype: v.literal(\"stat\"),\n  timestamp: v.number(),\n  updatedAt: v.optional(v.number()),\n  value: v.object({ date: v.string(), ml: v.number() }),\n});\nconst _VStatsWaterEntryMatches: IEquals<v.InferOutput<typeof _VStatsWaterEntry>, IStatsWaterEntry> = true;\nvoid _VStatsWaterEntryMatches;\nexport const VStatsWaterEntry: v.GenericSchema<IStatsWaterEntry> = _VStatsWaterEntry;\n\nexport interface IStatsFood {\n  entries?: IStatsFoodEntry[];\n  water?: IStatsWaterEntry[];\n}\nexport const VStatsFood: v.GenericSchema<IStatsFood> = v.object({\n  entries: v.optional(v.array(VStatsFoodEntry)),\n  water: v.optional(v.array(VStatsWaterEntry)),\n});\n\n// A meal template logs each of its items as its own entry, unlike a recipe, which logs as one food.\nexport type IMealTemplateItem = Omit<IFoodEntryValue, \"date\" | \"meal\">;\nconst _VMealTemplateItem = v.object({\n  name: v.string(),\n  brand: v.optional(v.string()),\n  servings: v.number(),\n  servingLabel: v.string(),\n  perServing: VNutrients,\n  source: VFoodSource,\n  foodId: v.optional(v.string()),\n  barcode: v.optional(v.string()),\n});\nconst _VMealTemplateItemMatches: IEquals<v.InferOutput<typeof _VMealTemplateItem>, IMealTemplateItem> = true;\nvoid _VMealTemplateItemMatches;\n\nexport interface IMealTemplate {\n  vtype: \"meal_template\";\n  id: string;\n  name: string;\n  meal?: IFoodMeal;\n  items: IMealTemplateItem[];\n  createdAt: number;\n  updatedAt?: number;\n}\nconst _VMealTemplate = v.object({\n  vtype: v.literal(\"meal_template\"),\n  id: v.string(),\n  name: v.string(),\n  meal: v.optional(VFoodMeal),\n  items: v.array(_VMealTemplateItem),\n  createdAt: v.number(),\n  updatedAt: v.optional(v.number()),\n});\nconst _VMealTemplateMatches: IEquals<v.InferOutput<typeof _VMealTemplate>, IMealTemplate> = true;\nvoid _VMealTemplateMatches;\nexport const VMealTemplate: v.GenericSchema<IMealTemplate> = _VMealTemplate;\n\nexport interface IFoodIngredient {\n  name: string;\n  servings: number;\n  servingLabel: string;\n  perServing: INutrients;\n  foodId?: string;\n}\nconst _VFoodIngredient = v.object({\n  name: v.string(),\n  servings: v.number(),\n  servingLabel: v.string(),\n  perServing: VNutrients,\n  foodId: v.optional(v.string()),\n});\nconst _VFoodIngredientMatches: IEquals<v.InferOutput<typeof _VFoodIngredient>, IFoodIngredient> = true;\nvoid _VFoodIngredientMatches;\n\n// A saved food or a recipe. For a recipe, perServing is derived from ingredients / recipeServings.\nexport interface IFoodItem {\n  vtype: \"food_item\";\n  id: string;\n  name: string;\n  brand?: string;\n  servingLabel: string;\n  servingGrams?: number;\n  perServing: INutrients;\n  source: IFoodSource;\n  sourceId?: string;\n  barcode?: string;\n  ingredients?: IFoodIngredient[];\n  recipeServings?: number;\n  createdAt: number;\n  updatedAt?: number;\n}\nconst _VFoodItem = v.object({\n  vtype: v.literal(\"food_item\"),\n  id: v.string(),\n  name: v.string(),\n  brand: v.optional(v.string()),\n  servingLabel: v.string(),\n  servingGrams: v.optional(v.number()),\n  perServing: VNutrients,\n  source: VFoodSource,\n  sourceId: v.optional(v.string()),\n  barcode: v.optional(v.string()),\n  ingredients: v.optional(v.array(_VFoodIngredient)),\n  recipeServings: v.optional(v.number()),\n  createdAt: v.number(),\n  updatedAt: v.optional(v.number()),\n});\nconst _VFoodItemMatches: IEquals<v.InferOutput<typeof _VFoodItem>, IFoodItem> = true;\nvoid _VFoodItemMatches;\nexport const VFoodItem: v.GenericSchema<IFoodItem> = _VFoodItem;\n\nexport interface INutritionGoals {\n  calories?: number;\n  protein?: number;\n  carbs?: number;\n  fat?: number;\n  fiber?: number;\n  waterMl?: number;\n}\nconst _VNutritionGoals = v.object({\n  calories: v.optional(v.number()),\n  protein: v.optional(v.number()),\n  carbs: v.optional(v.number()),\n  fat: v.optional(v.number()),\n  fiber: v.optional(v.number()),\n  waterMl: v.optional(v.number()),\n});\nconst _VNutritionGoalsMatches: IEquals<v.InferOutput<typeof _VNutritionGoals>, INutritionGoals> = true;\nvoid _VNutritionGoalsMatches;\n\nexport type IStatsKey = keyof IStatsLength | keyof IStatsWeight | keyof IStatsPercentage;\n\nexport type IExerciseSelectedType = \"weight\" | \"volume\";\nexport type IVolumeSelectedType = \"sets\" | \"volume\";\n\nfunction buildBoolPartial<K extends string>(\n  keys: readonly K[]\n): v.ObjectSchema<Record<K, v.OptionalSchema<v.BooleanSchema<undefined>, undefined>>, undefined> {\n  const entries = keys.reduce<Record<string, v.OptionalSchema<v.BooleanSchema<undefined>, undefined>>>((memo, key) => {\n    memo[key] = v.optional(v.boolean());\n    return memo;\n  }, {});\n  return v.object(entries) as v.ObjectSchema<\n    Record<K, v.OptionalSchema<v.BooleanSchema<undefined>, undefined>>,\n    undefined\n  >;\n}\n\nexport const VStatsWeightEnabled = buildBoolPartial(statsWeightDef);\nexport type IStatsWeightEnabled = v.InferOutput<typeof VStatsWeightEnabled>;\n\nexport const VStatsLengthEnabled = buildBoolPartial(statsLengthDef);\nexport type IStatsLengthEnabled = v.InferOutput<typeof VStatsLengthEnabled>;\n\nexport const VStatsPercentageEnabled = buildBoolPartial(statsPercentageDef);\nexport type IStatsPercentageEnabled = v.InferOutput<typeof VStatsPercentageEnabled>;\n\nexport interface IStatsEnabled {\n  weight: IStatsWeightEnabled;\n  length: IStatsLengthEnabled;\n  percentage: IStatsPercentageEnabled;\n}\nconst _VStatsEnabled = v.object({\n  weight: VStatsWeightEnabled,\n  length: VStatsLengthEnabled,\n  percentage: VStatsPercentageEnabled,\n});\nconst _VStatsEnabledMatches: IEquals<v.InferOutput<typeof _VStatsEnabled>, IStatsEnabled> = true;\nvoid _VStatsEnabledMatches;\nexport const VStatsEnabled: v.GenericSchema<IStatsEnabled> = _VStatsEnabled;\n\nexport interface ISettingsTimers {\n  warmup?: number | null;\n  workout?: number | null;\n  reminder?: number;\n  superset?: number;\n  getReady?: number;\n}\nconst _VSettingsTimers = v.object({\n  warmup: v.optional(v.union([v.number(), v.null()])),\n  workout: v.optional(v.union([v.number(), v.null()])),\n  reminder: v.optional(v.number()),\n  superset: v.optional(v.number()),\n  getReady: v.optional(v.number()),\n});\nconst _VSettingsTimersMatches: IEquals<v.InferOutput<typeof _VSettingsTimers>, ISettingsTimers> = true;\nvoid _VSettingsTimersMatches;\nexport const VSettingsTimers: v.GenericSchema<ISettingsTimers> = _VSettingsTimers;\n\nexport const VGraph = v.union([\n  v.object({ vtype: v.literal(\"graph\"), type: v.literal(\"exercise\"), id: VExerciseId }),\n  v.object({\n    vtype: v.literal(\"graph\"),\n    type: v.literal(\"statsWeight\"),\n    id: v.picklist(statsWeightDef),\n  }),\n  v.object({\n    vtype: v.literal(\"graph\"),\n    type: v.literal(\"statsLength\"),\n    id: v.picklist(statsLengthDef),\n  }),\n  v.object({\n    vtype: v.literal(\"graph\"),\n    type: v.literal(\"statsPercentage\"),\n    id: v.picklist(statsPercentageDef),\n  }),\n  v.object({\n    vtype: v.literal(\"graph\"),\n    type: v.literal(\"nutrition\"),\n    id: v.picklist(nutritionGraphDef),\n  }),\n  v.object({ vtype: v.literal(\"graph\"), type: v.literal(\"muscleGroup\"), id: v.string() }),\n]);\nexport type IGraph = v.InferOutput<typeof VGraph>;\n\nexport interface IEquipmentData {\n  vtype: \"equipment_data\";\n  bar: { lb: IWeight; kg: IWeight };\n  multiplier: number;\n  plates: { weight: IWeight; num: number }[];\n  fixed: IWeight[];\n  isFixed: boolean;\n  unit?: IUnit;\n  name?: string;\n  similarTo?: string;\n  isDeleted?: boolean;\n  useBodyweightForBar?: boolean;\n  isAssisting?: boolean;\n  notes?: string;\n}\nconst _VEquipmentData = v.object({\n  vtype: v.literal(\"equipment_data\"),\n  bar: v.object({ lb: VWeight, kg: VWeight }),\n  multiplier: v.number(),\n  plates: v.array(v.object({ weight: VWeight, num: v.number() })),\n  fixed: v.array(VWeight),\n  isFixed: v.boolean(),\n  unit: v.optional(VUnit),\n  name: v.optional(v.string()),\n  similarTo: v.optional(v.string()),\n  isDeleted: v.optional(v.boolean()),\n  useBodyweightForBar: v.optional(v.boolean()),\n  isAssisting: v.optional(v.boolean()),\n  notes: v.optional(v.string()),\n});\nconst _VEquipmentDataMatches: IEquals<v.InferOutput<typeof _VEquipmentData>, IEquipmentData> = true;\nvoid _VEquipmentDataMatches;\nexport const VEquipmentData: v.GenericSchema<IEquipmentData> = _VEquipmentData;\nexport type IAllEquipment = Partial<Record<string, IEquipmentData>>;\n\nexport interface IGraphOptions {\n  movingAverageWindowSize?: number;\n}\nconst _VGraphOptions = v.object({\n  movingAverageWindowSize: v.optional(v.number()),\n});\nconst _VGraphOptionsMatches: IEquals<v.InferOutput<typeof _VGraphOptions>, IGraphOptions> = true;\nvoid _VGraphOptionsMatches;\nexport const VGraphOptions: v.GenericSchema<IGraphOptions> = _VGraphOptions;\n\nexport interface IMuscleMultiplier {\n  muscle: IMuscle;\n  multiplier: number;\n}\nconst _VMuscleMultiplier = v.object({\n  muscle: VMuscle,\n  multiplier: v.number(),\n});\nconst _VMuscleMultiplierMatches: IEquals<v.InferOutput<typeof _VMuscleMultiplier>, IMuscleMultiplier> = true;\nvoid _VMuscleMultiplierMatches;\nexport const VMuscleMultiplier: v.GenericSchema<IMuscleMultiplier> = _VMuscleMultiplier;\n\n// The schema accepts any string key for muscleMultipliers so stale or future muscle\n// keys do not invalidate storage. Consumers that need IMuscle keys narrow at the call site\n// with `as IMuscle[]` after ObjectUtils_keys / Object.keys. (A union override here would\n// create real structural divergence between IExerciseDataValue and the schema's inferred\n// output, which would propagate through ISettings and break the IEquals check.)\nexport interface IExerciseDataValue {\n  rm1?: IWeight;\n  rounding?: number;\n  equipment?: Record<string, string | undefined>;\n  notes?: string;\n  muscleMultipliers?: Record<string, number | undefined>;\n  isUnilateral?: boolean;\n  volumeMultiplier?: number;\n}\nconst _VExerciseDataValue = v.object({\n  rm1: v.optional(VWeight),\n  rounding: v.optional(v.number()),\n  equipment: v.optional(v.record(v.string(), v.optional(v.string()))),\n  notes: v.optional(v.string()),\n  muscleMultipliers: v.optional(v.record(v.string(), v.optional(v.number()))),\n  isUnilateral: v.optional(v.boolean()),\n  volumeMultiplier: v.optional(v.number()),\n});\nconst _VExerciseDataValueMatches: IEquals<v.InferOutput<typeof _VExerciseDataValue>, IExerciseDataValue> = true;\nvoid _VExerciseDataValueMatches;\nexport const VExerciseDataValue: v.GenericSchema<IExerciseDataValue> = _VExerciseDataValue;\nexport type IExerciseData = Partial<Record<string, IExerciseDataValue>>;\n\nexport interface IPlannerSettings {\n  synergistMultiplier: number;\n  strengthSetsPct: number;\n  hypertrophySetsPct: number;\n  weeklyRangeSets: Record<IScreenMuscle, [number, number] | undefined>;\n  weeklyFrequency: Record<IScreenMuscle, number | undefined>;\n}\nconst _VPlannerSettings = v.object({\n  synergistMultiplier: v.number(),\n  strengthSetsPct: v.number(),\n  hypertrophySetsPct: v.number(),\n  weeklyRangeSets: v.record(VScreenMuscle, v.optional(v.tuple([v.number(), v.number()]))),\n  weeklyFrequency: v.record(VScreenMuscle, v.optional(v.number())),\n});\nconst _VPlannerSettingsMatches: IEquals<v.InferOutput<typeof _VPlannerSettings>, IPlannerSettings> = true;\nvoid _VPlannerSettingsMatches;\nexport const VPlannerSettings: v.GenericSchema<IPlannerSettings> = _VPlannerSettings;\n\nexport interface IGym {\n  vtype: \"gym\";\n  id: string;\n  name: string;\n  equipment: Record<IEquipment, IEquipmentData | undefined>;\n}\nconst _VGym = v.object({\n  vtype: v.literal(\"gym\"),\n  id: v.string(),\n  name: v.string(),\n  equipment: v.record(VEquipment, v.optional(VEquipmentData)),\n});\nconst _VGymMatches: IEquals<v.InferOutput<typeof _VGym>, IGym> = true;\nvoid _VGymMatches;\nexport const VGym: v.GenericSchema<IGym> = _VGym;\n\nexport interface IWorkoutSettings {\n  targetType: ITargetType;\n  shouldHideGraphs?: boolean;\n  shouldKeepProgramExerciseId?: boolean;\n  shouldShowInvisibleEquipment?: boolean;\n  pickerSort?: IExercisePickerSort;\n  showWorkoutNotes?: boolean;\n  showExerciseNotes?: boolean;\n  shouldCollapseSets?: boolean;\n}\nconst _VWorkoutSettings = v.object({\n  targetType: VTargetType,\n  shouldHideGraphs: v.optional(v.boolean()),\n  shouldKeepProgramExerciseId: v.optional(v.boolean()),\n  shouldShowInvisibleEquipment: v.optional(v.boolean()),\n  pickerSort: v.optional(VExercisePickerSort),\n  showWorkoutNotes: v.optional(v.boolean()),\n  showExerciseNotes: v.optional(v.boolean()),\n  shouldCollapseSets: v.optional(v.boolean()),\n});\nconst _VWorkoutSettingsMatches: IEquals<v.InferOutput<typeof _VWorkoutSettings>, IWorkoutSettings> = true;\nvoid _VWorkoutSettingsMatches;\nexport const VWorkoutSettings: v.GenericSchema<IWorkoutSettings> = _VWorkoutSettings;\n\nexport interface IGraphs {\n  vtype: \"graphs\";\n  graphs: IGraph[];\n}\nconst _VGraphs = v.object({\n  vtype: v.literal(\"graphs\"),\n  graphs: v.array(VGraph),\n});\nconst _VGraphsMatches: IEquals<v.InferOutput<typeof _VGraphs>, IGraphs> = true;\nvoid _VGraphsMatches;\nexport const VGraphs: v.GenericSchema<IGraphs> = _VGraphs;\n\nexport interface IMuscleGroupsSettings {\n  vtype: \"muscle_groups_settings\";\n  data: Record<string, { name?: string; isHidden?: boolean; muscles?: IMuscle[] } | undefined>;\n}\nconst _VMuscleGroupsSettings = v.object({\n  vtype: v.literal(\"muscle_groups_settings\"),\n  data: v.record(\n    v.string(),\n    v.optional(\n      v.object({\n        name: v.optional(v.string()),\n        isHidden: v.optional(v.boolean()),\n        muscles: v.optional(v.array(VMuscle)),\n      })\n    )\n  ),\n});\nconst _VMuscleGroupsSettingsMatches: IEquals<\n  v.InferOutput<typeof _VMuscleGroupsSettings>,\n  IMuscleGroupsSettings\n> = true;\nvoid _VMuscleGroupsSettingsMatches;\nexport const VMuscleGroupsSettings: v.GenericSchema<IMuscleGroupsSettings> = _VMuscleGroupsSettings;\n\nexport interface ISettings {\n  timers: ISettingsTimers;\n  gyms: IGym[];\n  deletedGyms?: string[];\n  graphs: IGraphs;\n  graphOptions: Record<string, IGraphOptions | undefined>;\n  graphsSettings: {\n    isSameXAxis?: boolean;\n    isWithBodyweight?: boolean;\n    isWithOneRm?: boolean;\n    isWithProgramLines?: boolean;\n    defaultType?: IGraphExerciseSelectedType;\n    defaultMuscleGroupType?: IGraphMuscleGroupSelectedType;\n  };\n  exerciseStatsSettings: {\n    ascendingSort?: boolean;\n    hideWithoutWorkoutNotes?: boolean;\n    hideWithoutExerciseNotes?: boolean;\n  };\n  exercises: Record<string, ICustomExercise | undefined>;\n  statsEnabled: IStatsEnabled;\n  units: IUnit;\n  lengthUnits: ILengthUnit;\n  volume: number;\n  exerciseData: Record<string, IExerciseDataValue | undefined>;\n  planner: IPlannerSettings;\n  workoutSettings: IWorkoutSettings;\n  muscleGroups: IMuscleGroupsSettings;\n  appleHealthSyncWorkout?: boolean;\n  appleHealthSyncMeasurements?: boolean;\n  appleHealthSyncSleepNutrition?: boolean;\n  appleHealthAnchor?: string;\n  googleHealthSyncWorkout?: boolean;\n  googleHealthSyncMeasurements?: boolean;\n  googleHealthSyncSleepNutrition?: boolean;\n  googleHealthAnchor?: string;\n  healthConfirmation?: boolean;\n  ignoreDoNotDisturb?: boolean;\n  currentGymId?: string;\n  isPublicProfile?: boolean;\n  nickname?: string;\n  alwaysOnDisplay?: boolean;\n  vibration?: boolean;\n  startWeekFromMonday?: boolean;\n  textSize?: number;\n  starredExercises?: Record<string, boolean | undefined>;\n  recentExercises?: Partial<Record<string, string[]>>;\n  theme?: \"dark\" | \"light\";\n  currentBodyweight?: IWeight;\n  affiliateEnabled?: boolean;\n  nutritionGoals?: INutritionGoals;\n}\nconst _VSettings = v.object({\n  timers: VSettingsTimers,\n  gyms: v.array(VGym),\n  deletedGyms: v.optional(v.array(v.string())),\n  graphs: VGraphs,\n  graphOptions: v.record(v.string(), v.optional(VGraphOptions)),\n  graphsSettings: v.object({\n    isSameXAxis: v.optional(v.boolean()),\n    isWithBodyweight: v.optional(v.boolean()),\n    isWithOneRm: v.optional(v.boolean()),\n    isWithProgramLines: v.optional(v.boolean()),\n    defaultType: v.optional(VGraphExerciseSelectedType),\n    defaultMuscleGroupType: v.optional(VGraphMuscleGroupSelectedType),\n  }),\n  exerciseStatsSettings: v.object({\n    ascendingSort: v.optional(v.boolean()),\n    hideWithoutWorkoutNotes: v.optional(v.boolean()),\n    hideWithoutExerciseNotes: v.optional(v.boolean()),\n  }),\n  exercises: v.record(v.string(), v.optional(VCustomExercise)),\n  statsEnabled: VStatsEnabled,\n  units: VUnit,\n  lengthUnits: VLengthUnit,\n  volume: v.number(),\n  exerciseData: v.record(v.string(), v.optional(VExerciseDataValue)),\n  planner: VPlannerSettings,\n  workoutSettings: VWorkoutSettings,\n  muscleGroups: VMuscleGroupsSettings,\n  appleHealthSyncWorkout: v.optional(v.boolean()),\n  appleHealthSyncMeasurements: v.optional(v.boolean()),\n  appleHealthSyncSleepNutrition: v.optional(v.boolean()),\n  appleHealthAnchor: v.optional(v.string()),\n  googleHealthSyncWorkout: v.optional(v.boolean()),\n  googleHealthSyncMeasurements: v.optional(v.boolean()),\n  googleHealthSyncSleepNutrition: v.optional(v.boolean()),\n  googleHealthAnchor: v.optional(v.string()),\n  healthConfirmation: v.optional(v.boolean()),\n  ignoreDoNotDisturb: v.optional(v.boolean()),\n  currentGymId: v.optional(v.string()),\n  isPublicProfile: v.optional(v.boolean()),\n  nickname: v.optional(v.string()),\n  alwaysOnDisplay: v.optional(v.boolean()),\n  vibration: v.optional(v.boolean()),\n  startWeekFromMonday: v.optional(v.boolean()),\n  textSize: v.optional(v.number()),\n  starredExercises: v.optional(v.record(VExerciseId, v.optional(v.boolean()))),\n  recentExercises: v.optional(v.record(VExerciseId, v.optional(v.array(VExerciseId)))),\n  theme: v.optional(v.union([v.literal(\"dark\"), v.literal(\"light\")])),\n  currentBodyweight: v.optional(VWeight),\n  affiliateEnabled: v.optional(v.boolean()),\n  nutritionGoals: v.optional(_VNutritionGoals),\n});\nconst _VSettingsMatches: IEquals<v.InferOutput<typeof _VSettings>, ISettings> = true;\nvoid _VSettingsMatches;\nexport const VSettings: v.GenericSchema<ISettings> = _VSettings;\n\nexport interface IStats {\n  weight: IStatsWeight;\n  length: IStatsLength;\n  percentage: IStatsPercentage;\n  health?: IStatsHealth;\n  food?: IStatsFood;\n}\nconst _VStats = v.object({\n  weight: VStatsWeight,\n  length: VStatsLength,\n  percentage: VStatsPercentage,\n  health: v.optional(VStatsHealth),\n  food: v.optional(VStatsFood),\n});\nconst _VStatsMatches: IEquals<v.InferOutput<typeof _VStats>, IStats> = true;\nvoid _VStatsMatches;\nexport const VStats: v.GenericSchema<IStats> = _VStats;\n\nexport interface ISubscriptionReceipt {\n  vtype: \"subscription_receipt\";\n  id: string;\n  value: string;\n  createdAt: number;\n}\nconst _VSubscriptionReceipt = v.object({\n  vtype: v.literal(\"subscription_receipt\"),\n  id: v.string(),\n  value: v.string(),\n  createdAt: v.number(),\n});\nconst _VSubscriptionReceiptMatches: IEquals<v.InferOutput<typeof _VSubscriptionReceipt>, ISubscriptionReceipt> = true;\nvoid _VSubscriptionReceiptMatches;\nexport const VSubscriptionReceipt: v.GenericSchema<ISubscriptionReceipt> = _VSubscriptionReceipt;\n\nexport interface ISubscription {\n  apple: ISubscriptionReceipt[];\n  google: ISubscriptionReceipt[];\n  key?: string;\n}\nconst _VSubscription = v.object({\n  apple: v.array(VSubscriptionReceipt),\n  google: v.array(VSubscriptionReceipt),\n  key: v.optional(v.string()),\n});\nconst _VSubscriptionMatches: IEquals<v.InferOutput<typeof _VSubscription>, ISubscription> = true;\nvoid _VSubscriptionMatches;\nexport const VSubscription: v.GenericSchema<ISubscription> = _VSubscription;\n\nexport interface IAffiliateData {\n  id: string;\n  timestamp: number;\n  type: \"coupon\" | \"program\";\n  vtype: \"affiliate\";\n}\nconst _VAffiliateData = v.object({\n  id: v.string(),\n  timestamp: v.number(),\n  type: v.union([v.literal(\"coupon\"), v.literal(\"program\")]),\n  vtype: v.literal(\"affiliate\"),\n});\nconst _VAffiliateDataMatches: IEquals<v.InferOutput<typeof _VAffiliateData>, IAffiliateData> = true;\nvoid _VAffiliateDataMatches;\nexport const VAffiliateData: v.GenericSchema<IAffiliateData> = _VAffiliateData;\n\nexport interface IImportSession {\n  vtype: \"import_session\";\n  id: string;\n  timestamp: number;\n  source: \"hevy\" | \"liftosaurCsv\";\n  historyRecordIds: number[];\n  customExerciseIds: string[];\n  workoutCount: number;\n}\nconst _VImportSession = v.object({\n  vtype: v.literal(\"import_session\"),\n  id: v.string(),\n  timestamp: v.number(),\n  source: v.union([v.literal(\"hevy\"), v.literal(\"liftosaurCsv\")]),\n  historyRecordIds: v.array(v.number()),\n  customExerciseIds: v.array(v.string()),\n  workoutCount: v.number(),\n});\nconst _VImportSessionMatches: IEquals<v.InferOutput<typeof _VImportSession>, IImportSession> = true;\nvoid _VImportSessionMatches;\nexport const VImportSession: v.GenericSchema<IImportSession> = _VImportSession;\n\nexport interface IWorkoutOutcome {\n  vtype: \"workout_outcome\";\n  id: number;\n  outcome: \"finish\" | \"discard\";\n  healthSync: boolean;\n  endTime: number;\n}\nconst _VWorkoutOutcome = v.object({\n  vtype: v.literal(\"workout_outcome\"),\n  id: v.number(),\n  outcome: v.union([v.literal(\"finish\"), v.literal(\"discard\")]),\n  healthSync: v.boolean(),\n  endTime: v.number(),\n});\nconst _VWorkoutOutcomeMatches: IEquals<v.InferOutput<typeof _VWorkoutOutcome>, IWorkoutOutcome> = true;\nvoid _VWorkoutOutcomeMatches;\nexport const VWorkoutOutcome: v.GenericSchema<IWorkoutOutcome> = _VWorkoutOutcome;\n\nexport interface IHearAboutUs {\n  result?: {\n    source: string;\n    detail?: string;\n    freeform?: string;\n    ts: number;\n  };\n  requests: number[];\n  done?: boolean;\n}\nconst _VHearAboutUs = v.object({\n  result: v.optional(\n    v.object({\n      source: v.string(),\n      detail: v.optional(v.string()),\n      freeform: v.optional(v.string()),\n      ts: v.number(),\n    })\n  ),\n  requests: v.array(v.number()),\n  done: v.optional(v.boolean()),\n});\nconst _VHearAboutUsMatches: IEquals<v.InferOutput<typeof _VHearAboutUs>, IHearAboutUs> = true;\nvoid _VHearAboutUsMatches;\nexport const VHearAboutUs: v.GenericSchema<IHearAboutUs> = _VHearAboutUs;\n\ninterface IStorageRaw {\n  history: IHistoryRecord[];\n  deletedHistory?: number[];\n  stats: IStats;\n  deletedStats?: number[];\n  settings: ISettings;\n  currentProgramId?: string;\n  version: string;\n  programs: IProgram[];\n  deletedPrograms?: number[];\n  reviewRequests: number[];\n  signupRequests: number[];\n  hearAboutUs?: IHearAboutUs;\n  helps: string[];\n  tempUserId: string;\n  email?: string;\n  affiliates: Record<string, IAffiliateData | undefined>;\n  subscription: ISubscription;\n  whatsNew?: string;\n  progress: IHistoryRecord[];\n  originalId?: number;\n  id?: number;\n  referrer?: string;\n  landingPage?: string;\n  attribution?: string;\n  importSessions?: IImportSession[];\n  workoutOutcomes?: IWorkoutOutcome[];\n  foodLibrary?: IFoodItem[];\n  mealTemplates?: IMealTemplate[];\n  // Localized store prices (displayPrice strings keyed by product id) captured on a native device,\n  // synced so the web paywall can show the user's real prices instead of hardcoded US defaults.\n  subscriptionPrices?: Partial<Record<string, string>>;\n  _versions?: unknown;\n}\nconst _VStorage = v.object({\n  history: v.array(VHistoryRecord),\n  deletedHistory: v.optional(v.array(v.number())),\n  stats: VStats,\n  deletedStats: v.optional(v.array(v.number())),\n  settings: VSettings,\n  currentProgramId: v.optional(v.string()),\n  version: v.string(),\n  programs: v.array(VProgram),\n  deletedPrograms: v.optional(v.array(v.number())),\n  reviewRequests: v.array(v.number()),\n  signupRequests: v.array(v.number()),\n  hearAboutUs: v.optional(_VHearAboutUs),\n  helps: v.array(v.string()),\n  tempUserId: v.string(),\n  email: v.optional(v.string()),\n  affiliates: v.record(v.string(), v.optional(VAffiliateData)),\n  subscription: VSubscription,\n  whatsNew: v.optional(v.string()),\n  progress: v.array(VHistoryRecord),\n  originalId: v.optional(v.number()),\n  id: v.optional(v.number()),\n  referrer: v.optional(v.string()),\n  landingPage: v.optional(v.string()),\n  attribution: v.optional(v.string()),\n  importSessions: v.optional(v.array(VImportSession)),\n  workoutOutcomes: v.optional(v.array(VWorkoutOutcome)),\n  foodLibrary: v.optional(v.array(VFoodItem)),\n  mealTemplates: v.optional(v.array(VMealTemplate)),\n  subscriptionPrices: v.optional(v.record(v.string(), v.optional(v.string()))),\n  _versions: v.optional(v.unknown()),\n});\nconst _VStorageMatches: IEquals<v.InferOutput<typeof _VStorage>, IStorageRaw> = true;\nvoid _VStorageMatches;\nexport const VStorage: v.GenericSchema<IStorageRaw> = _VStorage;\n\nexport interface IMuscleGeneratorResponse {\n  targetMuscles: IMuscle[];\n  synergistMuscles: IMuscle[];\n  types: IExerciseKind[];\n}\nconst _VMuscleGeneratorResponse = v.object({\n  targetMuscles: v.array(VMuscle),\n  synergistMuscles: v.array(VMuscle),\n  types: v.array(VExerciseKind),\n});\nconst _VMuscleGeneratorResponseMatches: IEquals<\n  v.InferOutput<typeof _VMuscleGeneratorResponse>,\n  IMuscleGeneratorResponse\n> = true;\nvoid _VMuscleGeneratorResponseMatches;\nexport const VMuscleGeneratorResponse: v.GenericSchema<IMuscleGeneratorResponse> = _VMuscleGeneratorResponse;\n\nexport function vIs<T>(schema: v.GenericSchema<T>): { is: (u: unknown) => boolean } {\n  return { is: (u: unknown): boolean => v.safeParse(schema, u).success };\n}\n\nexport type IStorage = Omit<IStorageRaw, \"_versions\"> & {\n  _versions?: IVersions<Omit<IStorageRaw, \"_versions\">>;\n};\n\nexport type IPartialStorage = Omit<IStorage, \"history\" | \"stats\" | \"programs\"> &\n  Partial<Pick<IStorage, \"history\" | \"stats\" | \"programs\">>;\n\nexport type IProgramContentSettings = Partial<\n  Pick<ISettings, \"units\" | \"planner\" | \"muscleGroups\" | \"exerciseData\" | \"workoutSettings\"> & {\n    timers: Partial<ISettings[\"timers\"]>;\n  }\n>;\nexport type IWebEditorSettings = Partial<\n  Pick<ISettings, \"units\" | \"planner\" | \"muscleGroups\" | \"exerciseData\" | \"exercises\" | \"starredExercises\"> & {\n    timers: Partial<ISettings[\"timers\"]>;\n    workoutSettings: Partial<IWorkoutSettings>;\n  }\n>;\n// Only /api/settings validates against this - the export/import paths keep passing it around unchecked\nconst _VWebEditorSettings = v.object({\n  units: v.optional(VUnit),\n  timers: v.optional(VSettingsTimers),\n  planner: v.optional(VPlannerSettings),\n  muscleGroups: v.optional(VMuscleGroupsSettings),\n  exerciseData: v.optional(v.record(v.string(), v.optional(VExerciseDataValue))),\n  workoutSettings: v.optional(v.partial(_VWorkoutSettings)),\n  exercises: v.optional(v.record(v.string(), v.optional(VCustomExercise))),\n  starredExercises: v.optional(v.record(VExerciseId, v.optional(v.boolean()))),\n});\nconst _VWebEditorSettingsMatches: IEquals<v.InferOutput<typeof _VWebEditorSettings>, IWebEditorSettings> = true;\nvoid _VWebEditorSettingsMatches;\nexport const VWebEditorSettings: v.GenericSchema<IWebEditorSettings> = _VWebEditorSettings;\nexport const VDeletedSettingsKeys: v.GenericSchema<string[]> = v.array(v.string());\n\nexport type IDayData = {\n  week?: number;\n  day: number;\n  dayInWeek?: number;\n};\n\nexport type IShortDayData = {\n  week: number;\n  dayInWeek: number;\n};\n\nexport type IDaySetData = {\n  week: number;\n  dayInWeek: number;\n  setVariation: number;\n  set: number;\n};\n\nexport const ATOMIC_TYPES = [\n  \"history_record\",\n  \"progress_ui\",\n  \"set\",\n  \"equipment_data\",\n  \"custom_exercise\",\n  \"planner\",\n  \"stat\",\n  \"graph\",\n  \"graphs\",\n  \"subscription_receipt\",\n  \"affiliate\",\n  \"muscle_groups_settings\",\n  \"import_session\",\n  \"workout_outcome\",\n  \"food_item\",\n  \"meal_template\",\n] as const;\n\nexport type IAtomicType = (typeof ATOMIC_TYPES)[number];\n\nexport const CONTROLLED_TYPES = [\"program\", \"gym\", \"progress\", \"history_entry\"] as const;\n\nexport type IControlledType = (typeof CONTROLLED_TYPES)[number];\n\nexport const CONTROLLED_FIELDS: Record<IControlledType, readonly string[]> = {\n  program: [\"name\", \"nextDay\", \"planner\"] as const,\n  gym: [\"name\", \"equipment\"] as const,\n  progress: [\n    \"entries\",\n    \"endTime\",\n    \"intervals\",\n    \"notes\",\n    \"deletedProgramExercises\",\n    \"userPromptedStateVars\",\n    \"updatedAt\",\n    \"changes\",\n    \"timerSince\",\n    \"timerMode\",\n    \"timer\",\n    \"timerEntryIndex\",\n    \"timerSetIndex\",\n    \"setTimer\",\n    \"setTimerGetReady\",\n    \"amrapModal\",\n    \"currentEntryIndex\",\n  ] as const,\n  history_entry: [\n    \"exercise\",\n    \"sets\",\n    \"warmupSets\",\n    \"index\",\n    \"isSuppressed\",\n    \"programExerciseId\",\n    \"state\",\n    \"vars\",\n    \"notes\",\n    \"changed\",\n    \"superset\",\n    \"updatePrints\",\n  ] as const,\n};\n\nexport const TYPE_ID_MAPPING: Record<IAtomicType | IControlledType, string> = {\n  affiliate: \"id\",\n  program: \"clonedAt\",\n  history_record: \"id\",\n  set: \"id\",\n  progress_ui: \"id\",\n  history_entry: \"id\",\n  progress: \"startTime\",\n  gym: \"id\",\n  custom_exercise: \"id\",\n  stat: \"timestamp\",\n  equipment_data: \"id\",\n  planner: \"name\",\n  subscription_receipt: \"id\",\n  graph: \"id\",\n  graphs: \"id\",\n  muscle_groups_settings: \"vtype\",\n  import_session: \"id\",\n  workout_outcome: \"id\",\n  food_item: \"id\",\n  meal_template: \"id\",\n};\n\nexport const DICTIONARY_FIELDS = [\n  \"settings.exercises\",\n  \"settings.exerciseData\",\n  \"settings.gyms.equipment\",\n  \"affiliates\",\n] as const;\n\nexport type IDictionaryFieldPath = (typeof DICTIONARY_FIELDS)[number];\n\nexport const EXCLUDED_FIELDS: Partial<Record<IControlledType, readonly string[]>> = {\n  progress: [\"ui\"] as const,\n};\n\nexport const STORAGE_VERSION_TYPES: IVersionTypes<IAtomicType, IControlledType> = {\n  atomicTypes: ATOMIC_TYPES,\n  controlledTypes: CONTROLLED_TYPES,\n  typeIdMapping: TYPE_ID_MAPPING,\n  controlledFields: CONTROLLED_FIELDS,\n  excludedFields: EXCLUDED_FIELDS,\n  dictionaryFields: DICTIONARY_FIELDS,\n  compactionThresholds: {\n    \"subscription.apple\": 14 * 24 * 60 * 60 * 1000,\n    \"subscription.google\": 14 * 24 * 60 * 60 * 1000,\n    history: 180 * 24 * 60 * 60 * 1000,\n    progress: 30 * 24 * 60 * 60 * 1000,\n    workoutOutcomes: 30 * 24 * 60 * 60 * 1000,\n  },\n  typeValidators: {\n    progress: vIs(VHistoryRecord),\n  },\n} as const;\n","export interface IActionSheetOptions {\n  title?: string;\n  options: string[];\n  cancelButtonIndex?: number;\n  destructiveButtonIndex?: number;\n}\n\nexport function ActionSheet_show(_options: IActionSheetOptions, _callback: (buttonIndex?: number) => void): void {}\n","import { IAttributionData } from \"../models/state\";\n\nexport interface IAnalyticsPurchaseEvent {\n  productId: string;\n  price: number;\n  currency: string;\n  transactionId?: string;\n  transactionDate?: number;\n}\n\nexport interface IAnalyticsInitOptions {\n  userId?: string;\n  onAttribution: (data: IAttributionData) => void;\n  onLandingPage?: (landingPage: string) => void;\n}\n\nexport function Analytics_initialize(_opts: IAnalyticsInitOptions): () => void {\n  return () => undefined;\n}\n\nexport function Analytics_setUserId(_userId: string): void {}\n\nexport function Analytics_trackFinishWorkout(): void {}\n\nexport function Analytics_trackSignUp(): void {}\n\nexport function Analytics_trackPurchase(_event: IAnalyticsPurchaseEvent): void {}\n\nexport const Analytics_platform = \"web\";\n\nexport type { IAttributionData };\n","import { WatchHost_appVersion, WatchHost_isAvailable } from \"./watchHost\";\n\nexport interface IAppAttribution {\n  isMobile: boolean;\n  iOSVersion?: number;\n  androidVersion?: number;\n  iOSOSVersion?: number;\n  androidOSVersion?: number;\n  deviceModel?: string;\n}\n\nexport function AppAttribution_get(): IAppAttribution {\n  const isWatch = WatchHost_isAvailable();\n  return {\n    isMobile: isWatch,\n    iOSVersion: isWatch ? WatchHost_appVersion() : undefined,\n  };\n}\n","import { Platform } from \"react-native\";\n\ndeclare let __HOST__: string;\n\nexport type IAppleAuthResult =\n  | { type: \"success\"; id_token: string; code: string }\n  | { type: \"cancelled\" }\n  | { type: \"error\"; error: string };\n\ntype IAppleAuthSdk = NonNullable<Window[\"AppleID\"]>[\"auth\"];\n\nconst mountSdkWaitMs = 10000;\n// Browsers drop transient user activation ~5s after the click, and signIn() opens a popup, so waiting\n// out the full mount-time budget here would just trade the init error for a blocked popup. Bailing early\n// instead means the retry succeeds — by then the mount-time wait has init'ed the SDK.\nconst clickSdkWaitMs = 2000;\nconst sdkPollIntervalMs = 50;\n\nconst cancelErrorCodes = [\"popup_closed_by_user\", \"user_cancelled_authorize\", \"user_trigger_new_signin_flow\"];\n\n// appleid.auth.js is loaded with `async`, so it may land after the account screen mounts. Polling instead of\n// checking once means a slow script (common in Firefox, which rarely serves it from a warm cache) still gets\n// init'ed rather than silently leaving signIn() to throw 'The \"init\" function must be called first.'\nasync function waitForSdk(timeoutMs: number): Promise<IAppleAuthSdk | undefined> {\n  const deadline = Date.now() + timeoutMs;\n  while (window.AppleID?.auth == null) {\n    if (Date.now() > deadline) {\n      return undefined;\n    }\n    await new Promise((resolve) => setTimeout(resolve, sdkPollIntervalMs));\n  }\n  return window.AppleID.auth;\n}\n\nexport async function AppleAuth_init(timeoutMs: number = mountSdkWaitMs): Promise<boolean> {\n  if (Platform.OS !== \"web\" || typeof window === \"undefined\") {\n    return false;\n  }\n  const auth = await waitForSdk(timeoutMs);\n  if (auth == null) {\n    return false;\n  }\n  auth.init({\n    clientId: \"com.liftosaur.www.signinapple\",\n    scope: \"email\",\n    redirectURI: `${__HOST__}/appleauthcallback.html`,\n    usePopup: true,\n  });\n  return true;\n}\n\nexport async function AppleAuth_signIn(): Promise<IAppleAuthResult> {\n  // When the SDK is already loaded this resolves without yielding to the event loop, so the popup opened by\n  // signIn() still runs under the click's transient user activation and isn't blocked.\n  const isInitialized = await AppleAuth_init(clickSdkWaitMs);\n  if (!isInitialized || window.AppleID?.auth == null) {\n    return { type: \"error\", error: \"Apple Sign In is still loading. Please try again in a moment.\" };\n  }\n  try {\n    const response = await window.AppleID.auth.signIn();\n    const { id_token, code } = response.authorization;\n    if (id_token == null || code == null) {\n      return { type: \"error\", error: \"Apple Sign In didn't return the credentials\" };\n    }\n    return { type: \"success\", id_token, code };\n  } catch (e) {\n    const error = e as { error?: string } | undefined;\n    if (error?.error != null && cancelErrorCodes.indexOf(error.error) !== -1) {\n      return { type: \"cancelled\" };\n    }\n    return { type: \"error\", error: \"Couldn't sign in with Apple. Please try again.\" };\n  }\n}\n","import { useEffect } from \"react\";\nimport { ISettings } from \"../types\";\nimport { Theme_apply, Theme_system, useSystemTheme } from \"./theme\";\n\nexport function AppliedTheme_get(settings: ISettings): \"dark\" | \"light\" {\n  return settings.theme ?? Theme_system();\n}\n\nexport function useAppliedTheme(settings: ISettings): void {\n  const systemTheme = useSystemTheme();\n  useEffect(() => {\n    Theme_apply(settings.theme);\n  }, [settings.theme, systemTheme]);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DateUtils_formatYYYYMMDDHHMM } from \"./date\";\nimport { lg } from \"./posthog\";\n\nexport interface IAsyncQueueOptions {\n  timeoutMs?: number;\n}\n\nexport class AsyncQueueTimeoutError extends Error {\n  constructor(timeoutMs: number) {\n    super(`Operation timed out after ${timeoutMs}ms`);\n    this.name = \"AsyncQueueTimeoutError\";\n  }\n}\n\ninterface IQueueItem {\n  key: string;\n  deps: any;\n  operation: (deps: any, signal: AbortSignal) => Promise<unknown>;\n  timeoutMs: number | undefined;\n  controller: AbortController;\n  enqueuedAt: number;\n}\n\nexport class AsyncQueue {\n  public queue: IQueueItem[] = [];\n  public isProcessing = false;\n  public readonly defaultTimeoutMs = 120000;\n  public currentItem: IQueueItem | null = null;\n  public readonly logs: [string, string, Record<string, string | number>][] = [];\n  private _processingGeneration = 0;\n\n  public enqueue<T, V>(\n    operation: (deps: V, signal: AbortSignal) => Promise<T>,\n    deps?: V,\n    options?: IAsyncQueueOptions\n  ): Promise<void> {\n    const key = JSON.stringify(deps);\n    const timeoutMs = options?.timeoutMs ?? this.defaultTimeoutMs;\n    const controller = new AbortController();\n\n    return new Promise<void>((resolve, reject) => {\n      const item: IQueueItem = {\n        key,\n        deps,\n        operation: async (d: any, signal: AbortSignal) => {\n          try {\n            await operation(d, signal);\n            if (!signal.aborted) {\n              resolve();\n            }\n          } catch (e) {\n            if (!signal.aborted) {\n              reject(e);\n            }\n          }\n        },\n        timeoutMs,\n        controller,\n        enqueuedAt: Date.now(),\n      };\n\n      this.queue.push(item);\n      this.processQueue();\n    });\n  }\n\n  private async processQueue(): Promise<void> {\n    if (this.isProcessing || this.queue.length === 0) {\n      return;\n    }\n\n    this.isProcessing = true;\n    this._processingGeneration += 1;\n    const generation = this._processingGeneration;\n    try {\n      const item = this.queue.shift();\n      this.addLog(\"processing item\", { queueLength: this.queue.length });\n      if (item) {\n        this.currentItem = item;\n        const { deps, operation, timeoutMs, controller } = item;\n\n        if (timeoutMs && timeoutMs > 0) {\n          let timeoutId: NodeJS.Timeout | undefined = undefined;\n\n          const timeoutPromise = new Promise<void>((resolve) => {\n            timeoutId = setTimeout(() => {\n              controller.abort();\n              console.error(`AsyncQueue operation timed out after ${timeoutMs}ms`, this.queue.length);\n              this.log(\"async-queue-timeout\", {\n                timeout: timeoutMs,\n                queueLength: this.queue.length,\n              });\n              resolve();\n            }, timeoutMs);\n          });\n\n          const operationPromise = operation(deps, controller.signal);\n\n          await Promise.race([operationPromise, timeoutPromise]);\n          this.addLog(\"finish item\", { queueLength: this.queue.length });\n          if (timeoutId != null) {\n            clearTimeout(timeoutId);\n          }\n        } else {\n          await operation(deps, controller.signal);\n        }\n      }\n    } catch (error) {\n      throw error;\n    } finally {\n      if (generation === this._processingGeneration) {\n        this.currentItem = null;\n        this.isProcessing = false;\n        this.processQueue();\n      }\n    }\n  }\n\n  private log(name: string, extra?: Record<string, string | number>): void {\n    this.addLog(name, extra);\n    lg(name, extra);\n  }\n\n  private addLog(name: string, extra?: Record<string, string | number>): void {\n    const currentTime = DateUtils_formatYYYYMMDDHHMM(Date.now(), \"-\");\n    this.logs.push([currentTime, name, extra || {}]);\n    if (this.logs.length > 1000) {\n      this.logs.shift();\n    }\n  }\n\n  public clear(): void {\n    for (const item of this.queue) {\n      item.controller.abort();\n    }\n    this.queue = [];\n  }\n\n  // On mobile, backgrounding freezes the JS thread: the in-flight operation's fetch and the\n  // processQueue timeout both suspend, so currentItem/isProcessing stay latched and block every\n  // later sync until the next wake. Abort everything proactively when going to background so the\n  // queue is clean on resume. Bumping the generation neutralizes the frozen processQueue's finally\n  // so it can't double-process after we reset state here.\n  public abortAll(): void {\n    this.addLog(\"abort-all\", { queueLength: this.queue.length });\n    this._processingGeneration += 1;\n    if (this.currentItem) {\n      this.currentItem.controller.abort();\n      this.currentItem = null;\n    }\n    for (const item of this.queue) {\n      item.controller.abort();\n    }\n    this.queue = [];\n    this.isProcessing = false;\n  }\n\n  public length(): number {\n    return this.queue.length;\n  }\n\n  public getIsProcessing(): boolean {\n    return this.isProcessing;\n  }\n\n  public clearStaleOperations(): void {\n    const now = Date.now();\n    this.addLog(\"clear-stale-operations\", { queueLength: this.queue.length });\n\n    if (this.currentItem && this.currentItem.timeoutMs) {\n      const elapsed = now - this.currentItem.enqueuedAt;\n      if (elapsed > this.currentItem.timeoutMs) {\n        console.error(\n          `Clearing stale current operation (elapsed: ${elapsed}ms, timeout: ${this.currentItem.timeoutMs}ms)`\n        );\n        this.log(\"async-queue-stale-current\", {\n          elapsed,\n          timeout: this.currentItem.timeoutMs,\n        });\n        this._processingGeneration += 1;\n        this.currentItem.controller.abort();\n        this.currentItem = null;\n        this.isProcessing = false;\n      }\n    }\n\n    const staleIndices: number[] = [];\n    this.queue.forEach((item, index) => {\n      if (item.timeoutMs) {\n        const elapsed = now - item.enqueuedAt;\n        if (elapsed > item.timeoutMs) {\n          console.error(\n            `Clearing stale queued operation at index ${index} (elapsed: ${elapsed}ms, timeout: ${item.timeoutMs}ms)`\n          );\n          this.log(\"async-queue-stale-queued\", {\n            elapsed,\n            timeout: item.timeoutMs,\n            index,\n          });\n          item.controller.abort();\n          staleIndices.push(index);\n        }\n      }\n    });\n\n    for (let i = staleIndices.length - 1; i >= 0; i--) {\n      this.queue.splice(staleIndices[i], 1);\n    }\n\n    if (!this.isProcessing && this.queue.length > 0) {\n      this.processQueue();\n    }\n  }\n}\n","import { ImageSourcePropType } from \"react-native\";\nimport { HostConfig_resolveUrl } from \"./hostConfig\";\n\nexport function BundledImages_resolve(path: string): ImageSourcePropType {\n  return { uri: HostConfig_resolveUrl(path) };\n}\n\nexport function BundledImages_svgXml(_path: string): string | undefined {\n  return undefined;\n}\n","import { createContext, useCallback, useContext } from \"react\";\nimport type { IDispatch } from \"../ducks/types\";\nimport { Thunk_log, Thunk_postevent } from \"../ducks/thunks\";\n\nexport const ClickTrackingContext = createContext<IDispatch | null>(null);\n\nexport function useTrackClick(): (name: string, className?: string, extra?: Record<string, string | number>) => void {\n  const dispatch = useContext(ClickTrackingContext);\n  return useCallback(\n    (name: string, className?: string, extra?: Record<string, string | number>) => {\n      if (!dispatch) {\n        return;\n      }\n      const lsClass = className?.split(/\\s+/).find((c) => c.startsWith(\"ls-\"));\n      const eventName = lsClass || `nm-${name}`;\n      dispatch(Thunk_postevent(\"click-\" + eventName, extra));\n      if (lsClass) {\n        dispatch(Thunk_log(lsClass));\n      }\n    },\n    [dispatch]\n  );\n}\n","import { IEither } from \"./types\";\n\nexport async function ClipboardUtils_paste(): Promise<string | undefined> {\n  if (!navigator.clipboard) {\n    return fallbackReadTextFromClipboard();\n  } else {\n    try {\n      const result = await readTextFromClipboard();\n      if (result.success) {\n        return result.data;\n      } else {\n        return fallbackReadTextFromClipboard();\n      }\n    } catch (e) {\n      return fallbackReadTextFromClipboard();\n    }\n  }\n}\n\nexport async function ClipboardUtils_copy(text: string): Promise<void> {\n  if (!navigator.clipboard) {\n    fallbackCopyTextToClipboard(text);\n  } else {\n    try {\n      await copyTextToClipboard(text);\n      fallbackCopyTextToClipboard(text);\n    } catch (e) {\n      fallbackCopyTextToClipboard(text);\n    }\n  }\n}\n\nfunction fallbackCopyTextToClipboard(text: string): void {\n  window.disableCopying = true;\n  const textArea = document.createElement(\"textarea\");\n  textArea.value = text;\n\n  textArea.style.top = \"0\";\n  textArea.style.left = \"0\";\n  textArea.style.position = \"fixed\";\n\n  document.body.appendChild(textArea);\n  textArea.focus();\n  textArea.select();\n\n  document.execCommand(\"copy\");\n  document.body.removeChild(textArea);\n  window.disableCopying = false;\n}\n\nfunction copyTextToClipboard(text: string): Promise<boolean> {\n  return new Promise(async (resolve, reject) => {\n    try {\n      navigator.permissions\n        .query({ name: \"clipboard-write\" as PermissionName })\n        .then(async (result) => {\n          if (result.state === \"granted\" || result.state === \"prompt\") {\n            await navigator.clipboard.writeText(text);\n            resolve(true);\n          } else {\n            resolve(false);\n          }\n        })\n        .catch(async () => {\n          try {\n            await navigator.clipboard.writeText(text);\n            resolve(true);\n          } catch (e) {\n            resolve(false);\n          }\n        });\n    } catch (_) {\n      try {\n        await navigator.clipboard.writeText(text);\n        resolve(true);\n      } catch (e) {\n        resolve(false);\n      }\n    }\n  });\n}\n\nexport async function ClipboardUtils_canReadTextFromClipboard(): Promise<boolean> {\n  try {\n    const queryResult = await navigator.permissions.query({ name: \"clipboard-read\" as PermissionName });\n    return queryResult.state === \"granted\" || queryResult.state === \"prompt\";\n  } catch (_) {\n    return false;\n  }\n}\n\nasync function readTextFromClipboard(): Promise<IEither<string | undefined, undefined>> {\n  try {\n    const queryResult = await navigator.permissions.query({ name: \"clipboard-read\" as PermissionName });\n    if (queryResult.state === \"granted\" || queryResult.state === \"prompt\") {\n      return { success: true, data: await navigator.clipboard.readText() };\n    } else {\n      throw new Error(\"Can't read from clipboard\");\n    }\n  } catch (_) {\n    try {\n      return { success: true, data: await navigator.clipboard.readText() };\n    } catch {\n      return { success: false, error: undefined };\n    }\n  }\n}\n\nfunction fallbackReadTextFromClipboard(): string | undefined {\n  const contentEditableElement = document.createElement(\"div\");\n  contentEditableElement.contentEditable = \"true\";\n  document.body.appendChild(contentEditableElement);\n  contentEditableElement.focus();\n\n  document.execCommand(\"paste\");\n  const result = contentEditableElement.innerText;\n  document.body.removeChild(contentEditableElement);\n  return result;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ObjectUtils_isEqual } from \"./object\";\n\nexport interface ICollectionDiff<T> {\n  changed: T[];\n  removedKeys: string[];\n}\n\nexport function CollectionUtils_diffByKey<T>(previous: T[], next: T[], keyOf: (item: T) => string): ICollectionDiff<T> {\n  const previousByKey = new Map(previous.map((item) => [keyOf(item), item]));\n  const nextKeys = new Set(next.map(keyOf));\n  const changed = next.filter((item) => {\n    const before = previousByKey.get(keyOf(item));\n    return before == null || !ObjectUtils_isEqual(before as Record<string, unknown>, item as Record<string, unknown>);\n  });\n  const removedKeys = Array.from(previousByKey.keys()).filter((key) => !nextKeys.has(key));\n  return { changed, removedKeys };\n}\n\n// inGroupsOf([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3).forEach((e) => print(e));\n//\n// [\"1\", \"2\", \"3\"]\n// [\"4\", \"5\", \"6\"]\n// [\"7\", \"8\", \"9\"]\n// [\"10\"]\nexport function CollectionUtils_inGroupsOf<T>(length: number, collection: T[]): T[][] {\n  if (collection.length > 0) {\n    const result: T[][] = [[]];\n    collection.forEach((item) => {\n      let lastColl = result[result.length - 1];\n      if (lastColl.length >= length) {\n        lastColl = [];\n        result.push(lastColl);\n      }\n      lastColl.push(item);\n    });\n\n    return result;\n  } else {\n    return [];\n  }\n}\n\nexport function CollectionUtils_splitIntoNGroups<T>(coll: T[], numberOfGroups: number): T[][] {\n  const result: T[][] = [];\n  for (let i = 0; i < numberOfGroups; i += 1) {\n    result.push([]);\n  }\n  let index = 0;\n  for (const item of coll) {\n    result[index].push(item);\n    index += 1;\n    if (index >= numberOfGroups) {\n      index = 0;\n    }\n  }\n  return result;\n}\n\nexport function CollectionUtils_inGroupsOfFilled<T>(\n  length: number,\n  collection: T[],\n  shouldFill?: boolean\n): (T | undefined)[][] {\n  const result = CollectionUtils_inGroupsOf(length, collection) as (T | undefined)[][];\n  if (result.length > 0) {\n    const lastColl = result[result.length - 1];\n    if (lastColl != null) {\n      for (let i = 0; i < length; i += 1) {\n        lastColl[i] = lastColl[i] ?? undefined;\n      }\n    }\n  }\n  return result;\n}\n\nexport function CollectionUtils_groupBy<T>(items: T[], cond: (last: T, item: T) => boolean): T[][] {\n  return items.reduce<T[][]>(\n    (memo, set) => {\n      let lastGroup = memo[memo.length - 1];\n      const last = lastGroup[lastGroup.length - 1];\n      if (last != null && cond(last, set)) {\n        memo.push([]);\n        lastGroup = memo[memo.length - 1];\n      }\n      lastGroup.push(set);\n      return memo;\n    },\n    [[]]\n  );\n}\n\nexport function CollectionUtils_repeat<T>(el: T, length: number): T[] {\n  const arr: T[] = [];\n  for (let i = 0; i < length; i += 1) {\n    arr.push(el);\n  }\n  return arr;\n}\n\nexport function CollectionUtils_concatBy<T>(from: T[], to: T[], condition: (el: T) => string): T[] {\n  const map = [...from, ...to].reduce<Record<string, T>>((memo, item) => {\n    memo[condition(item)] = item;\n    return memo;\n  }, {});\n  return Object.keys(map).map((key) => map[key]);\n}\n\nexport function CollectionUtils_compatBy<T>(arr: T[], condition: (el: T) => string): T[] {\n  const map = arr.reduce<Record<string, T>>((memo, item) => {\n    memo[condition(item)] = item;\n    return memo;\n  }, {});\n  return Object.keys(map).map((key) => map[key]);\n}\n\nexport function CollectionUtils_compact<T>(arr: (T | undefined)[]): T[] {\n  return arr.filter((i) => i) as T[];\n}\n\nexport function CollectionUtils_groupByKey<\n  T,\n  K extends keyof T,\n  U extends T[K] extends string ? string : T[K] extends number ? number : never,\n>(arr: T[], key: K): Partial<Record<U, T[]>> {\n  return arr.reduce<Partial<Record<U, T[]>>>((memo, item) => {\n    const value = item[key] as unknown as U;\n    memo[value] = memo[value] || [];\n    memo[value]!.push(item);\n    return memo;\n  }, {});\n}\n\nexport function CollectionUtils_groupByExpr<T>(arr: T[], expr: (item: T) => string): Partial<Record<string, T[]>> {\n  return arr.reduce<Partial<Record<string, T[]>>>((memo, item) => {\n    const value = expr(item);\n    memo[value] = memo[value] || [];\n    memo[value]!.push(item);\n    return memo;\n  }, {});\n}\n\nexport function CollectionUtils_groupByKeyUniq<\n  T,\n  K extends keyof T,\n  U extends T[K] extends string ? string : T[K] extends number ? number : never,\n>(arr: T[], key: K): Partial<Record<U, T>> {\n  return arr.reduce<Partial<Record<U, T>>>((memo, item) => {\n    const value = item[key] as unknown as U;\n    memo[value] = item;\n    return memo;\n  }, {});\n}\n\nexport function CollectionUtils_groupByExprUniq<T>(arr: T[], expr: (item: T) => string): Partial<Record<string, T>> {\n  return arr.reduce<Partial<Record<string, T>>>((memo, item) => {\n    const value = expr(item);\n    memo[value] = item;\n    return memo;\n  }, {});\n}\n\nexport function CollectionUtils_collectToSet<T, K extends keyof T>(arr: T[], key: K): Set<T[K]> {\n  const set = new Set<T[K]>();\n  for (const el of arr) {\n    set.add(el[key]);\n  }\n  return set;\n}\n\nexport function CollectionUtils_collectToSetTransform<T, K extends keyof T, U>(\n  arr: T[],\n  key: K,\n  transformer: (val: T[K]) => U\n): Set<U> {\n  const set = new Set<U>();\n  for (const el of arr) {\n    set.add(transformer(el[key]));\n  }\n  return set;\n}\n\nexport function CollectionUtils_flat<T>(from: T[][]): T[] {\n  return from.reduce((acc, val) => acc.concat(val), []);\n}\n\nexport function CollectionUtils_sort<T>(arr: T[], compareFn?: (a: T, b: T) => number): T[] {\n  const arrCopy = [...arr];\n  arrCopy.sort(compareFn);\n  return arrCopy;\n}\n\nexport function CollectionUtils_immutableSort<T>(arr: T[], compare: (a: T, b: T) => number): T[] {\n  for (let i = 1; i < arr.length; i++) {\n    if (compare(arr[i - 1], arr[i]) > 0) {\n      return arr.slice().sort(compare);\n    }\n  }\n  return arr;\n}\n\nexport function CollectionUtils_reorder<T>(arr: T[], start: number, end: number): T[] {\n  const newDays = [...arr];\n  const [daysToMove] = newDays.splice(start, 1);\n  newDays.splice(end, 0, daysToMove);\n  return newDays;\n}\n\nexport function CollectionUtils_sortInOrder<T extends {}, K extends keyof T>(arr: T[], key: K, order: T[K][]): T[] {\n  const arrCopy = [...arr];\n  arrCopy.sort((a, b) => {\n    const aIndex = order.indexOf(a[key]);\n    const bIndex = order.indexOf(b[key]);\n    if (aIndex === -1) {\n      return 1;\n    } else if (bIndex === -1) {\n      return -1;\n    } else {\n      return aIndex - bIndex;\n    }\n  });\n  return arrCopy;\n}\n\nexport function CollectionUtils_sortByMultiple<T extends {}, K extends keyof T>(\n  arr: T[],\n  keys: K[],\n  isReverse?: boolean\n): T[] {\n  const arrCopy = [...arr];\n  arrCopy.sort((a, b) => {\n    for (const key of keys) {\n      const aVal = a[key] as any;\n      const bVal = b[key] as any;\n      if (aVal === bVal) {\n        continue;\n      } else {\n        if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n          return isReverse ? bVal - aVal : aVal - bVal;\n        } else if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n          return isReverse ? bVal.localeCompare(aVal) : aVal.localeCompare(bVal);\n        } else if (typeof aVal === \"boolean\" && typeof bVal === \"boolean\") {\n          return isReverse ? (bVal ? -1 : 1) : aVal ? -1 : 1;\n        } else if (aVal == null || bVal == null) {\n          return isReverse ? (bVal == null ? -1 : 1) : aVal == null ? -1 : 1;\n        }\n      }\n    }\n    return 0;\n  });\n\n  return arrCopy as any;\n}\n\nexport function CollectionUtils_sortBy<T extends {}, K extends keyof T>(\n  arr: T[],\n  key: K,\n  isReverse?: boolean\n): T[K] extends number ? T[] : never {\n  const arrCopy = [...arr];\n  arrCopy.sort((a, b) => {\n    const aVal = a[key] as any;\n\n    const bVal = b[key] as any;\n    return isReverse ? bVal - aVal : aVal - bVal;\n  });\n\n  return arrCopy as any;\n}\n\nexport function CollectionUtils_sortByExpr<T extends {}>(arr: T[], fn: (item: T) => number, isReverse?: boolean): T[] {\n  const arrCopy = [...arr];\n  arrCopy.sort((a, b) => {\n    const aVal = fn(a) as any;\n\n    const bVal = fn(b) as any;\n    return isReverse ? bVal - aVal : aVal - bVal;\n  });\n\n  return arrCopy as any;\n}\n\nexport function CollectionUtils_diff<T>(from: T[], to: T[]): T[] {\n  return from.filter((x) => !to.includes(x)).concat(to.filter((x) => !from.includes(x)));\n}\n\nexport function CollectionUtils_diffBy<T extends {}>(from: T[], to: T[], key: keyof T): T[] {\n  return from\n    .filter((x) => !to.some((y) => x[key] === y[key]))\n    .concat(to.filter((x) => !from.some((y) => x[key] === y[key])));\n}\n\nexport function CollectionUtils_remove<T>(from: T[], item: T): T[] {\n  return from.filter((t) => t !== item);\n}\n\nexport function CollectionUtils_removeAll<T>(from: T[], item: T[]): T[] {\n  return from.filter((t) => !item.includes(t));\n}\n\nexport function CollectionUtils_removeAt<T>(from: T[], index: number): T[] {\n  const result = [...from];\n  result.splice(index, 1);\n  return result;\n}\n\nexport function CollectionUtils_setAt<T>(from: T[], index: number, item: T): T[] {\n  return from.map((e, i) => (i === index ? item : e));\n}\n\nexport function CollectionUtils_setBy<T extends {}, K extends keyof T, V extends T[K]>(\n  from: T[],\n  key: K,\n  value: V,\n  newItem: T\n): T[] {\n  return from.map((e) => (e[key] === value ? newItem : e));\n}\n\nexport function CollectionUtils_setOrAddBy<T extends {}, K extends keyof T, V extends T[K]>(\n  from: T[],\n  key: K,\n  value: V,\n  newItem: T\n): T[] {\n  const hasKeyValue = from.some((e) => e[key] === value);\n  if (hasKeyValue) {\n    return CollectionUtils_setBy(from, key, value, newItem);\n  } else {\n    return [...from, newItem];\n  }\n}\n\nexport function CollectionUtils_removeBy<T extends {}, K extends keyof T, V extends T[K]>(\n  from: T[],\n  key: K,\n  value: V\n): T[] {\n  return from.filter((t) => t[key] !== value);\n}\n\nexport function CollectionUtils_nonnull<T>(from: (T | undefined)[]): T[] {\n  return from.filter((t) => t != null) as T[];\n}\n\nexport function CollectionUtils_uniqBy<T extends {}>(from: T[], key: keyof T): T[] {\n  const set = new Set();\n  const result = [];\n  for (const el of from) {\n    const id = el[key];\n    if (!set.has(id)) {\n      result.push(el);\n      set.add(id);\n    }\n  }\n  return result;\n}\n\nexport function CollectionUtils_uniqByExpr<T extends {}, V>(from: T[], fn: (item: T) => V): T[] {\n  const set = new Set();\n  const result = [];\n  for (const el of from) {\n    const id = fn(el);\n    if (!set.has(id)) {\n      result.push(el);\n      set.add(id);\n    }\n  }\n  return result;\n}\n\nexport function CollectionUtils_findBy<T extends {}, K extends keyof T>(from: T[], key: K, value: T[K]): T | undefined {\n  let result: T | undefined = undefined;\n  for (const el of from) {\n    if (el[key] === value) {\n      result = el;\n      break;\n    }\n  }\n  return result;\n}\n\nexport function CollectionUtils_findIndexReverse<T>(from: T[], cb: (item: T) => boolean): number {\n  for (let i = from.length - 1; i >= 0; i -= 1) {\n    if (cb(from[i])) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nexport function CollectionUtils_merge<T>(from: T[], to: T[]): T[] {\n  return Array.from(new Set([...from, ...to]));\n}\n\nexport function CollectionUtils_compressArray(arr: number[], threshold: number): string[] {\n  const result: string[] = [];\n  let count = 1;\n\n  for (let i = 1; i <= arr.length; i++) {\n    if (arr[i] === arr[i - 1]) {\n      count += 1;\n    } else {\n      if (count >= threshold) {\n        result.push(`${count}x${arr[i - 1]}`);\n      } else {\n        while (count > 0) {\n          result.push(`${arr[i - 1]}`);\n          count -= 1;\n        }\n      }\n      count = 1;\n    }\n  }\n\n  return result;\n}\n\nexport function CollectionUtils_areSortedInSameOrder<T, U>(\n  coll1: T[],\n  coll2: U[],\n  areEqual: (a: T, b: U) => boolean\n): boolean {\n  if (coll1.length !== coll2.length) {\n    return false;\n  }\n  for (let i = 0; i < coll1.length; i += 1) {\n    if (!areEqual(coll1[i], coll2[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type ICollectorFn<T, U> = { fn: (acc: U, item: T) => U; initial: U };\n\ntype IValuesFromCallbacks<V> = V extends [infer A, ...infer B]\n  ? A extends ICollectorFn<any, infer C>\n    ? [C, ...IValuesFromCallbacks<B>]\n    : never\n  : [];\n\nexport class Collector<ItemType, T extends ICollectorFn<ItemType, any>[] = []> {\n  private readonly callbacks: T;\n\n  public static build<IT>(items: IT[]): Collector<IT> {\n    return new Collector(items, []);\n  }\n\n  private constructor(\n    private readonly collection: ItemType[],\n    callbacks: T\n  ) {\n    this.callbacks = callbacks;\n  }\n\n  public addFn<U>(\n    callback: ICollectorFn<ItemType, U>\n  ): Collector<ItemType, T extends never[] ? [ICollectorFn<ItemType, U>] : [...T, ICollectorFn<ItemType, U>]> {\n    return new Collector(this.collection, [...this.callbacks, callback]) as any;\n  }\n\n  public add<U>(\n    fn: ICollectorFn<ItemType, U>[\"fn\"],\n    initial: U\n  ): Collector<ItemType, T extends never[] ? [ICollectorFn<ItemType, U>] : [...T, ICollectorFn<ItemType, U>]> {\n    const callback = { fn, initial };\n    return new Collector(this.collection, [...this.callbacks, callback]) as any;\n  }\n\n  public run(): IValuesFromCallbacks<T> {\n    const values = this.callbacks.map((callback) => callback.initial);\n    for (const item of this.collection) {\n      for (let i = 0; i < this.callbacks.length; i += 1) {\n        values[i] = this.callbacks[i].fn(values[i], item);\n      }\n    }\n    return values as any;\n  }\n}\n","import { ObjectUtils_keys } from \"./object\";\n\nexport function ComparerUtils_noFns<T extends object>(prev: T, next: T): boolean {\n  if (Object.keys(prev).length !== Object.keys(next).length) {\n    return false;\n  } else {\n    const result = ObjectUtils_keys(prev).every((key) => {\n      if (typeof prev[key] !== \"function\") {\n        const result2 = prev[key] === next[key];\n        return result2;\n      } else {\n        return true;\n      }\n    });\n    return result;\n  }\n}\n","export function CSV_toString(data: (number | string | null)[][]): string {\n  return data\n    .map((line) => {\n      return line\n        .map((value) => {\n          let shouldWrapIntoQuotes = false;\n          if (typeof value === \"string\") {\n            if (value.indexOf(\",\") !== -1 || value.indexOf(\"\\n\") !== -1 || value.indexOf(\"\\r\") !== -1) {\n              shouldWrapIntoQuotes = true;\n            }\n            if (value.indexOf('\"') !== -1) {\n              shouldWrapIntoQuotes = true;\n              value = value.replace(/\"/g, '\"\"');\n            }\n            if (shouldWrapIntoQuotes) {\n              value = `\"${value}\"`;\n            }\n          }\n          if (value === null) {\n            value = \"\";\n          }\n          return value;\n        })\n        .join(\",\");\n    })\n    .join(\"\\n\");\n}\n","export function DateUtils_format(dateStr: string | Date | number, hideWeekday?: boolean, hideYear?: boolean): string {\n  let date;\n  if (typeof dateStr === \"string\") {\n    date = new Date(Date.parse(dateStr));\n  } else if (typeof dateStr === \"number\") {\n    date = new Date(dateStr);\n  } else {\n    date = dateStr;\n  }\n  return date.toLocaleDateString(undefined, {\n    weekday: !hideWeekday ? \"short\" : undefined,\n    year: !hideYear ? \"numeric\" : undefined,\n    month: \"short\",\n    day: \"numeric\",\n  });\n}\n\nexport function DateUtils_formatDayMonth(timestamp: number, now: number = Date.now()): string {\n  const isThisYear = new Date(timestamp).getFullYear() === new Date(now).getFullYear();\n  return DateUtils_format(timestamp, true, isThisYear);\n}\n\nexport function DateUtils_formatWithTime(dateStr: string | Date | number): string {\n  let date;\n  if (typeof dateStr === \"string\") {\n    date = new Date(Date.parse(dateStr));\n  } else if (typeof dateStr === \"number\") {\n    date = new Date(dateStr);\n  } else {\n    date = dateStr;\n  }\n  return date.toLocaleDateString(undefined, {\n    weekday: \"short\",\n    year: \"numeric\",\n    month: \"short\",\n    day: \"numeric\",\n    hour: \"numeric\",\n    minute: \"numeric\",\n  });\n}\n\nexport function DateUtils_formatYYYYMMDD(date: Date | string | number, separator: string = \"-\"): string {\n  const d = new Date(date);\n  let month = `${d.getMonth() + 1}`;\n  let day = `${d.getDate()}`;\n  const year = `${d.getFullYear()}`;\n\n  if (month.length < 2) {\n    month = `0${month}`;\n  }\n  if (day.length < 2) {\n    day = `0${day}`;\n  }\n\n  return [year, month, day].join(separator);\n}\n\nexport function DateUtils_formatUTCYYYYMMDD(date: Date | string | number): string {\n  const d = new Date(date);\n  let month = `${d.getUTCMonth() + 1}`;\n  let day = `${d.getUTCDate()}`;\n  const year = `${d.getUTCFullYear()}`;\n\n  if (month.length < 2) {\n    month = `0${month}`;\n  }\n  if (day.length < 2) {\n    day = `0${day}`;\n  }\n\n  return [year, month, day].join(\"-\");\n}\n\nexport function DateUtils_formatUTCYYYYMMDDHHMM(date: Date | string | number): string {\n  const d = new Date(date);\n  let minutes = `${d.getUTCMinutes()}`;\n  let hours = `${d.getUTCHours()}`;\n  let day = `${d.getUTCDate()}`;\n  let month = `${d.getUTCMonth() + 1}`;\n  const year = `${d.getUTCFullYear()}`;\n\n  if (minutes.length < 2) {\n    minutes = `0${minutes}`;\n  }\n  if (hours.length < 2) {\n    hours = `0${hours}`;\n  }\n  if (month.length < 2) {\n    month = `0${month}`;\n  }\n  if (day.length < 2) {\n    day = `0${day}`;\n  }\n\n  return `${[year, month, day].join(\"-\")} ${hours}:${minutes}`;\n}\n\nexport function DateUtils_parseYYYYMMDDHHMM(dateStr: string): Date | undefined {\n  const match = dateStr.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$/);\n  if (match != null) {\n    const [, year, month, day, hours, minutes, seconds] = match;\n    return new Date(\n      new Date(\n        parseInt(year, 10),\n        parseInt(month, 10) - 1,\n        parseInt(day, 10),\n        parseInt(hours, 10),\n        parseInt(minutes, 10),\n        parseInt(seconds, 10)\n      )\n    );\n  }\n  return undefined;\n}\n\nconst monthNames = [\n  \"january\",\n  \"february\",\n  \"march\",\n  \"april\",\n  \"may\",\n  \"june\",\n  \"july\",\n  \"august\",\n  \"september\",\n  \"october\",\n  \"november\",\n  \"december\",\n];\n\nfunction monthIndexFromName(word: string): number | undefined {\n  if (word.length < 3) {\n    return undefined;\n  }\n  const index = monthNames.findIndex((name) => name.startsWith(word));\n  return index === -1 ? undefined : index;\n}\n\n// Hermes only parses ISO 8601 strings, so locale formats like \"Oct 17, 2026, 8:30 AM\" need this\nexport function DateUtils_parseNamedMonthDateTime(dateStr: string): number | undefined {\n  const tokens = dateStr.toLowerCase().match(/\\d+:\\d+(?::\\d+)?|[a-z]+|\\d+/g) ?? [];\n  let year: number | undefined;\n  let month: number | undefined;\n  let day: number | undefined;\n  let time: number[] | undefined;\n  let meridiem: string | undefined;\n  for (const token of tokens) {\n    if (token.includes(\":\")) {\n      if (time != null) {\n        return undefined;\n      }\n      time = token.split(\":\").map(Number);\n    } else if (token === \"am\" || token === \"pm\") {\n      if (meridiem != null) {\n        return undefined;\n      }\n      meridiem = token;\n    } else if (/^[a-z]/.test(token)) {\n      if (month != null) {\n        return undefined;\n      }\n      month = monthIndexFromName(token);\n      if (month == null) {\n        return undefined;\n      }\n    } else if (token.length === 4 && year == null) {\n      year = Number(token);\n    } else if (token.length <= 2 && day == null) {\n      day = Number(token);\n    } else {\n      return undefined;\n    }\n  }\n  if (year == null || month == null || day == null || time == null) {\n    return undefined;\n  }\n  const [rawHour, minute, second = 0] = time;\n  if (meridiem != null ? rawHour < 1 || rawHour > 12 : rawHour > 23) {\n    return undefined;\n  }\n  const hour = meridiem != null ? (rawHour % 12) + (meridiem === \"pm\" ? 12 : 0) : rawHour;\n  if (minute > 59 || second > 59) {\n    return undefined;\n  }\n  const date = new Date(year, month, day, hour, minute, second);\n  return date.getDate() === day ? date.getTime() : undefined;\n}\n\nexport function DateUtils_formatYYYYMMDDHHMM(date: Date | string | number, separator: string = \"\"): string {\n  const d = new Date(date);\n  let seconds = `${d.getSeconds()}`;\n  let minutes = `${d.getMinutes()}`;\n  let hours = `${d.getHours()}`;\n  let day = `${d.getDate()}`;\n  let month = `${d.getMonth() + 1}`;\n  const year = `${d.getFullYear()}`;\n\n  if (seconds.length < 2) {\n    seconds = `0${seconds}`;\n  }\n  if (minutes.length < 2) {\n    minutes = `0${minutes}`;\n  }\n  if (hours.length < 2) {\n    hours = `0${hours}`;\n  }\n  if (month.length < 2) {\n    month = `0${month}`;\n  }\n  if (day.length < 2) {\n    day = `0${day}`;\n  }\n\n  return [year, month, day, hours, minutes, seconds].join(separator);\n}\n\nexport function DateUtils_firstDayOfWeekTimestamp(date: Date | number, startWeekFromMonday?: boolean): number {\n  const d = new Date(date);\n  let weekDay = d.getDay();\n  if (startWeekFromMonday && weekDay === 0) {\n    weekDay = 7;\n  }\n  const currentDay = d.getDate();\n  const beginningOfWeekDay = currentDay - weekDay + (startWeekFromMonday ? 1 : 0);\n  const newDate = new Date(d.getFullYear(), d.getMonth(), beginningOfWeekDay);\n  return newDate.getTime();\n}\n\nexport function DateUtils_lastDayOfWeekTimestamp(date: Date | number, startWeekFromMonday?: boolean): number {\n  const d = new Date(date);\n  let weekDay = d.getDay();\n  if (startWeekFromMonday && weekDay === 0) {\n    weekDay = 7;\n  }\n  const currentDay = d.getDate();\n  const endOfWeekDay = currentDay + (7 - weekDay) + (startWeekFromMonday ? 1 : 0);\n  const newDate = new Date(d.getFullYear(), d.getMonth(), endOfWeekDay, 23, 59, 59);\n  return newDate.getTime();\n}\n\nexport function DateUtils_formatHHMMSS(date: Date | string | number, withMs: boolean = false): string {\n  const d = new Date(date);\n  let seconds = `${d.getSeconds()}`;\n  let minutes = `${d.getMinutes()}`;\n  let hours = `${d.getHours()}`;\n\n  if (seconds.length < 2) {\n    seconds = `0${seconds}`;\n  }\n  if (minutes.length < 2) {\n    minutes = `0${minutes}`;\n  }\n  if (hours.length < 2) {\n    hours = `0${hours}`;\n  }\n  let result = [hours, minutes, seconds].join(\":\");\n  if (withMs) {\n    result += `.${d.getMilliseconds()}`;\n  }\n  return result;\n}\n\nexport function DateUtils_fromYYYYMMDD(dateStr: string, separator: string = \"-\"): Date {\n  const regexp = new RegExp(`^(\\\\d{4})${separator}(\\\\d{2})${separator}(\\\\d{2})$`);\n  const regexpMatchArray = dateStr.match(regexp);\n  if (regexpMatchArray) {\n    const [, year, month, day] = regexpMatchArray;\n    const date = new Date(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10));\n    return date;\n  } else {\n    return new Date(Date.UTC(1970, 1, 1));\n  }\n}\n\nexport function DateUtils_fromYYYYMMDDStr(dateStr: string, separator: string = \"-\"): string {\n  return DateUtils_fromYYYYMMDD(dateStr, separator).toISOString();\n}\n\nexport function DateUtils_yearAndMonth(date: Date | string | number): [number, number] {\n  const d = new Date(date);\n  return [d.getUTCFullYear(), d.getUTCMonth()];\n}\n\nexport function DateUtils_startOfUTCMonth(date: Date | string | number): number {\n  const d = new Date(date);\n  return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);\n}\n\nexport function DateUtils_addUTCMonths(timestamp: number, months: number): number {\n  const d = new Date(timestamp);\n  return Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + months, 1);\n}\n\nexport function DateUtils_dayOfWeekStr(date: string): string {\n  const d = new Date(DateUtils_fromYYYYMMDDStr(date));\n  return d.toLocaleDateString(undefined, { weekday: \"long\" });\n}\n\nexport function DateUtils_formatRange(start: Date | string | number, end: Date | string | number): string {\n  const startDate = new Date(start);\n  const endDate = new Date(end);\n  if (startDate.getFullYear() !== endDate.getFullYear()) {\n    return `${DateUtils_format(startDate, true)} - ${DateUtils_format(endDate, true)}`;\n  } else {\n    if (startDate.getMonth() !== endDate.getMonth()) {\n      const formattedStart = startDate.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n      const formattedEnd = endDate.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n      return `${formattedStart} - ${formattedEnd}, ${startDate.getFullYear()}`;\n    } else {\n      const month = startDate.toLocaleDateString(undefined, { month: \"short\" });\n      return `${month} ${startDate.getDate()}-${endDate.getDate()}, ${startDate.getFullYear()}`;\n    }\n  }\n}\n","import { IndexedDBUtils_get, IndexedDBUtils_set } from \"./indexeddb\";\nimport { UidFactory_generateUid } from \"./generator\";\nimport { StoreRuntime_isIos, StoreRuntime_isAndroid } from \"./storeRuntime\";\n\nexport async function DeviceId_get(): Promise<string> {\n  if (DeviceId_cachedId) {\n    return DeviceId_cachedId;\n  }\n\n  const type = DeviceId_getDeviceType();\n  const storageKey = `${DeviceId_STORAGE_KEY}_${type}`;\n  const stored = await IndexedDBUtils_get(storageKey);\n  if (stored && typeof stored === \"string\") {\n    DeviceId_cachedId = stored;\n    return stored;\n  }\n\n  const newId = DeviceId_generate();\n  await IndexedDBUtils_set(storageKey, newId);\n  DeviceId_cachedId = newId;\n  return newId;\n}\n\nexport function DeviceId_generate(): string {\n  const type = DeviceId_getDeviceType();\n  const uid = UidFactory_generateUid(8);\n  return `${type}_${uid}`;\n}\n\n// Platform detection goes through StoreRuntime, not SendMessage: the latter only probes the old\n// WebView bridge, so on bare React Native it reports neither platform and every phone would end up\n// claiming a \"web\" node.\nexport function DeviceId_getDeviceType(): string {\n  if (typeof window === \"undefined\") {\n    return \"srv\";\n  } else if (window.webeditor) {\n    return \"edt\";\n  } else if (StoreRuntime_isIos()) {\n    return \"ios\";\n  } else if (StoreRuntime_isAndroid()) {\n    return \"and\";\n  } else {\n    return \"web\";\n  }\n}\n\nexport const DeviceId_STORAGE_KEY = \"device_id\";\n\nexport let DeviceId_cachedId: string | undefined;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { IState } from \"../models/state\";\n\nconst MAX_ACTIONS = 31;\n\ninterface IDiagnosticsAction {\n  type: string;\n  time?: string;\n  desc?: string;\n  ts?: number;\n  [key: string]: any;\n}\n\nlet lastState: IState | undefined;\nlet lastActions: IDiagnosticsAction[] = [];\nlet lastValidationErrors: string[] | undefined;\n\nexport function Diagnostics_setLastState(state: IState): void {\n  lastState = state;\n}\n\nexport function Diagnostics_getLastState(): IState | undefined {\n  return lastState;\n}\n\nexport function Diagnostics_recordAction(action: IDiagnosticsAction): void {\n  lastActions = [{ ...action, ts: Date.now() }, ...lastActions.slice(0, MAX_ACTIONS - 1)];\n}\n\nexport function Diagnostics_getLastActions(): IDiagnosticsAction[] {\n  return lastActions;\n}\n\nexport function Diagnostics_setLastValidationErrors(errors: string[]): void {\n  lastValidationErrors = errors;\n}\n\nexport function Diagnostics_getLastValidationErrors(): string[] | undefined {\n  return lastValidationErrors;\n}\n","export async function Dialog_confirm(message: string): Promise<boolean> {\n  if (typeof window !== \"undefined\") {\n    return Promise.resolve(window.confirm(message));\n  } else {\n    return Promise.resolve(false);\n  }\n}\n\n// The native version is an Alert with one button per option plus Cancel; the browser has no\n// multi-button primitive, so each branch is spelled out in the message and dismissing the\n// dialog picks the last option rather than cancelling.\nexport async function Dialog_choice(title: string, message: string, options: string[]): Promise<number | undefined> {\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(undefined);\n  }\n  const spelled = options.map((option, index) => `${index === 0 ? \"OK\" : \"Cancel\"} — ${option}`).join(\"\\n\");\n  return Promise.resolve(window.confirm(`${title}\\n\\n${message}\\n\\n${spelled}`) ? 0 : options.length - 1);\n}\n\nexport async function Dialog_prompt(message: string): Promise<string | undefined> {\n  if (typeof window !== \"undefined\") {\n    const result = window.prompt(message);\n    return result == null ? undefined : result;\n  } else {\n    return Promise.resolve(undefined);\n  }\n}\n\nexport function Dialog_alert(message: string): void {\n  if (typeof window !== \"undefined\") {\n    window.alert(message);\n  }\n}\n","import { gzip, gzipSync, gunzip, gunzipSync } from \"fflate\";\nimport { UrlUtils_build } from \"./url\";\n\nconst isBrowser = typeof FileReader !== \"undefined\" && typeof Worker !== \"undefined\";\n\nexport async function Encoder_encodeIntoUrlAndSetUrl(str: string): Promise<void> {\n  const url = await Encoder_encodeIntoUrl(str, window.location.href);\n  window.history.replaceState({ path: url.toString() }, \"\", url.toString());\n}\n\nexport async function Encoder_encodeIntoUrl(str: string, base: string): Promise<URL> {\n  const base64data = await Encoder_encode(str.replace(\"liftosaur://\", \"https://\"));\n  const url = UrlUtils_build(base);\n  const urlParams = new URLSearchParams(url.search);\n  urlParams.set(\"data\", base64data);\n  url.search = urlParams.toString();\n  return url;\n}\n\nexport function Encoder_encode(str: string): Promise<string> {\n  const textEncoder = new TextEncoder();\n  const input = textEncoder.encode(str);\n\n  if (!isBrowser) {\n    const result = gzipSync(input);\n    let binary = \"\";\n    for (let i = 0; i < result.length; i++) {\n      binary += String.fromCharCode(result[i]);\n    }\n    const b64 = btoa(binary);\n    const dataUrl = `data:application/octet-stream;base64,${b64}`;\n    return Promise.resolve(btoa(dataUrl));\n  }\n\n  return new Promise((resolve, reject) => {\n    gzip(input, (err, result) => {\n      if (err) {\n        reject(err);\n        return;\n      }\n      if (typeof FileReader !== \"undefined\") {\n        const reader = new FileReader();\n        reader.onload = function () {\n          const b64 = reader.result;\n          if (typeof b64 === \"string\") {\n            resolve(btoa(b64));\n          }\n        };\n        reader.readAsDataURL(new Blob([result]));\n      } else {\n        let binary = \"\";\n        for (let i = 0; i < result.length; i++) {\n          binary += String.fromCharCode(result[i]);\n        }\n        const b64 = btoa(binary);\n        const dataUrl = `data:application/octet-stream;base64,${b64}`;\n        resolve(btoa(dataUrl));\n      }\n    });\n  });\n}\n\nexport function Encoder_decode(str: string): Promise<string> {\n  return new Promise(async (resolve, reject) => {\n    try {\n      const dataUrl = atob(str);\n      let uintarray: Uint8Array;\n      if (isBrowser) {\n        const response = await fetch(dataUrl);\n        const blob = await response.blob();\n        uintarray = new Uint8Array(await blob.arrayBuffer());\n      } else {\n        // RN: fetch doesn't support data: URLs, decode base64 directly\n        const b64 = dataUrl.replace(/^data:[^;]+;base64,/, \"\");\n        const binary = atob(b64);\n        uintarray = new Uint8Array(binary.length);\n        for (let i = 0; i < binary.length; i++) {\n          uintarray[i] = binary.charCodeAt(i);\n        }\n      }\n      const result = isBrowser ? await gunzipPromise(uintarray) : gunzipSync(uintarray);\n      if (typeof TextDecoder !== \"undefined\") {\n        resolve(new TextDecoder(\"utf-8\").decode(result));\n      } else {\n        let str2 = \"\";\n        for (let i = 0; i < result.length; i++) {\n          str2 += String.fromCharCode(result[i]);\n        }\n        resolve(decodeURIComponent(escape(str2)));\n      }\n    } catch (e) {\n      reject(e);\n    }\n  });\n}\n\nfunction gunzipPromise(data: Uint8Array): Promise<Uint8Array> {\n  return new Promise((resolve, reject) => {\n    gunzip(data, (err, result) => {\n      if (err) {\n        reject(err);\n      } else {\n        resolve(result);\n      }\n    });\n  });\n}\n","export function EventManager_isAvailable(): boolean {\n  return false;\n}\n\nexport function EventManager_log(_data: string): void {\n  // no-op on web; callers fall back to direct POST\n}\n\nexport function EventManager_flush(): Promise<void> {\n  return Promise.resolve();\n}\n\nexport type IEventManagerTelemetryHandler = (event: {\n  name: string;\n  timestamp: number;\n  extra: Record<string, string>;\n}) => void;\n\nexport function EventManager_initTelemetry(_handler: IEventManagerTelemetryHandler): void {\n  // no-op on web\n}\n","export function Exporter_toFile(filename: string, contents: string): void {\n  const blob = new Blob([contents], { type: \"text/plain\" });\n  const objectUrl = URL.createObjectURL(blob);\n  const a = document.createElement(\"a\");\n  a.href = objectUrl;\n  a.setAttribute(\"download\", filename);\n  document.body.appendChild(a);\n  a.click();\n  document.body.removeChild(a);\n}\n","import { StringUtils_hashCode0To1 } from \"./string\";\nimport { Platform } from \"react-native\";\n\nexport interface IFeature {\n  name: string;\n  rollout: number;\n  userids: string[];\n  platform?: \"ios\" | \"android\";\n}\n\nconst affiliates: IFeature = {\n  name: \"affiliates\",\n  rollout: 0.0,\n  userids: [\"tiolnbjbleke\", \"txgxmqgyps\", \"gwwxznaz\", \"egedgruckx\", \"kaqcnvsbyq\", \"ozlkwrauwl\"],\n};\n\nexport function Features_isEnabled(name: keyof typeof Features_features, userid?: string): boolean {\n  userid = userid || (typeof window !== \"undefined\" ? window.tempUserId || undefined : undefined);\n  const feature = Features_features[name];\n  if (!feature) {\n    return false;\n  }\n  if (userid == null) {\n    return false;\n  }\n  if (\n    feature.platform &&\n    ((feature.platform === \"ios\" && Platform.OS !== \"ios\") ||\n      (feature.platform === \"android\" && Platform.OS !== \"android\"))\n  ) {\n    return false;\n  }\n  const hash = StringUtils_hashCode0To1(userid);\n  const isRolloutEnabled = feature.rollout > 0 && hash <= feature.rollout;\n  if (isRolloutEnabled) {\n    return true;\n  }\n  if (feature.userids.indexOf(userid) !== -1) {\n    return true;\n  }\n  return false;\n}\n\nexport const Features_features = {\n  affiliates,\n} as const;\n","import { Dialog_confirm } from \"./dialog\";\n\nexport type IFileImportType = \"json\" | \"csv\" | \"any\";\n\nexport async function FileImport_pickFile(_fileType: IFileImportType = \"any\"): Promise<string | undefined> {\n  return new Promise((resolve) => {\n    const input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.style.display = \"none\";\n    input.onchange = () => {\n      const file = input.files?.[0];\n      if (!file) {\n        resolve(undefined);\n        return;\n      }\n      const reader = new FileReader();\n      reader.onload = (e) => {\n        const result = e.target?.result;\n        resolve(typeof result === \"string\" ? result : undefined);\n      };\n      reader.onerror = () => resolve(undefined);\n      reader.readAsText(file);\n    };\n    input.click();\n  });\n}\n\nexport async function FileImport_confirm(message: string): Promise<boolean> {\n  return Dialog_confirm(message);\n}\n","// Poppins digits sit around 0.62em wide. The estimate is deliberately on the generous side so a\n// value never renders wider than the field that holds it - overshooting costs a slightly smaller\n// font, undershooting clips the number.\nconst CHAR_WIDTH_EM = 0.62;\nconst MIN_RATIO = 0.6;\n\nexport function FitText_fontSize(text: string, availableWidth: number, baseFontSize: number): number {\n  if (!text || availableWidth <= 0) {\n    return baseFontSize;\n  }\n  const neededWidth = text.length * CHAR_WIDTH_EM * baseFontSize;\n  if (neededWidth <= availableWidth) {\n    return baseFontSize;\n  }\n  return Math.max(baseFontSize * MIN_RATIO, availableWidth / (text.length * CHAR_WIDTH_EM));\n}\n","let currentFlushCallback: (() => void) | null = null;\n\nexport function FocusedInputFlush_register(cb: () => void): void {\n  currentFlushCallback = cb;\n}\n\nexport function FocusedInputFlush_unregister(cb: () => void): void {\n  if (currentFlushCallback === cb) {\n    currentFlushCallback = null;\n  }\n}\n\nexport function FocusedInputFlush_flush(): void {\n  if (currentFlushCallback) {\n    currentFlushCallback();\n  }\n}\n","// Browsers apply their own font-size preference to the root rem, but Rem_set overwrites\n// documentElement.style.fontSize outright, so there is nothing left to read here.\nexport function useOsFontScale(): number {\n  return 1;\n}\n\nexport function OsFontScale_get(): number {\n  return 1;\n}\n","export function UidFactory_generateUid(length: number): string {\n  const domain = \"abcdefghijklmnopqrstuvwxyz\";\n  let uid = \"\";\n  for (let i = 0; i < length; i += 1) {\n    uid += domain[Math.floor(Math.random() * domain.length)];\n  }\n  return uid;\n}\n","import { IRect } from \"./types\";\n\nexport function Geometry_fitRectIntoRect(rect: IRect, into: IRect): IRect {\n  const scale = Math.min(into.width / rect.width, into.height / rect.height);\n  const width = rect.width * scale;\n  const height = rect.height * scale;\n  return {\n    x: into.x + (into.width - width) / 2,\n    y: into.y + (into.height - height) / 2,\n    width,\n    height,\n  };\n}\n\nexport function Geometry_rectCenter(rect: IRect): { x: number; y: number } {\n  return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n}\n","import { UrlUtils_build } from \"./url\";\n\ndeclare let __HOST__: string;\n\nlet windowRef: Window | null = null;\nlet windowUrl: string | undefined;\nlet receiveMessage: ((event: MessageEvent) => void) | undefined;\n\nexport function getGoogleAccessToken(useBrowserCallback?: boolean): Promise<string | undefined> {\n  return new Promise((resolve) => {\n    const callbackPath = useBrowserCallback ? \"/googleauthcallback-web.html\" : \"/googleauthcallback.html\";\n    const urlBuilder = UrlUtils_build(\"https://accounts.google.com/o/oauth2/v2/auth\");\n    urlBuilder.searchParams.append(\"scope\", \"openid email\");\n    urlBuilder.searchParams.append(\"include_granted_scopes\", \"true\");\n    urlBuilder.searchParams.append(\"response_type\", \"token\");\n    urlBuilder.searchParams.append(\"redirect_uri\", `${__HOST__}${callbackPath}`);\n    urlBuilder.searchParams.append(\n      \"client_id\",\n      \"944666871420-p8kv124sgte8o0p6ev2ah6npudsl7e4f.apps.googleusercontent.com\"\n    );\n    const url = urlBuilder.toString();\n\n    if (receiveMessage != null) {\n      window.removeEventListener(\"message\", receiveMessage);\n    }\n\n    const windowOpts = \"toolbar=no, menubar=no, width=600, height=700, top=100, left=100\";\n\n    if (windowRef == null || windowRef.closed) {\n      windowRef = window.open(url, \"google-auth\", windowOpts);\n    } else if (windowUrl !== url) {\n      windowRef = window.open(url, \"google-auth\", windowOpts);\n      if (windowRef != null) {\n        windowRef.focus();\n      }\n    } else {\n      windowRef.focus();\n    }\n\n    receiveMessage = (event) => {\n      const data = event.data;\n      if (typeof data !== \"string\") {\n        return;\n      }\n      if (!data.startsWith(\"http://\") && !data.startsWith(\"https://\")) {\n        return;\n      }\n      const callbackUrl = UrlUtils_build(data);\n      const params = callbackUrl.hash.slice(1);\n      const exUrl = UrlUtils_build(\"https://www.example.com\");\n      exUrl.search = params;\n      const accessToken = exUrl.searchParams.get(\"access_token\")!;\n      resolve(accessToken);\n    };\n    window.addEventListener(\"message\", receiveMessage);\n    windowUrl = url;\n  });\n}\n","import {\n  HeartRateReading_apply,\n  HeartRateReading_expiresAt,\n  HeartRateReading_visibleBpm,\n  IHeartRateReading,\n} from \"../models/heartRateReading\";\nimport { IWorkoutMirroring } from \"./workoutMirroring\";\n\nexport interface IHeartRateStore {\n  getBpm(): number | undefined;\n  subscribe(listener: () => void): () => void;\n}\n\nexport class HeartRateStore implements IHeartRateStore {\n  private reading: IHeartRateReading | undefined = undefined;\n  private visibleBpm: number | undefined = undefined;\n  private expiryTimer: ReturnType<typeof setTimeout> | undefined = undefined;\n  private readonly listeners = new Set<() => void>();\n\n  constructor(mirroring: IWorkoutMirroring) {\n    mirroring.subscribe((event) => {\n      const next = HeartRateReading_apply(this.reading, event);\n      if (next !== this.reading) {\n        this.reading = next;\n        this.refresh();\n        this.scheduleExpiry();\n      }\n    });\n  }\n\n  public getBpm = (): number | undefined => {\n    return this.visibleBpm;\n  };\n\n  public subscribe = (listener: () => void): (() => void) => {\n    this.listeners.add(listener);\n    return () => {\n      this.listeners.delete(listener);\n    };\n  };\n\n  private refresh(): void {\n    const visibleBpm = HeartRateReading_visibleBpm(this.reading, Date.now());\n    if (visibleBpm !== this.visibleBpm) {\n      this.visibleBpm = visibleBpm;\n      for (const listener of this.listeners) {\n        listener();\n      }\n    }\n  }\n\n  private scheduleExpiry(): void {\n    if (this.expiryTimer != null) {\n      clearTimeout(this.expiryTimer);\n      this.expiryTimer = undefined;\n    }\n    const expiresAt = HeartRateReading_expiresAt(this.reading);\n    if (expiresAt != null) {\n      this.expiryTimer = setTimeout(() => this.refresh(), Math.max(0, expiresAt - Date.now()));\n    }\n  }\n}\n","// The native spec's TurboModuleRegistry call throws outside React Native and would break mocha.\nexport function HermesProfile_captureOnce(_label: string, _sampleMs?: number): void {}\n","import { ICollectionVersions, IVersions, isCollectionVersions, isFieldVersion } from \"../models/versionTracker\";\nimport { VersionTrackerUtils_compareVersions } from \"../models/versionTracker/utils\";\nimport { IHistoryRecord, IStorage } from \"../types\";\nimport { CollectionUtils_uniqBy } from \"./collection\";\n\nexport interface IHistoryDeltaLocal {\n  history: IHistoryRecord[];\n  versions: IVersions<IStorage> | undefined;\n}\n\nfunction historyVersions(versions: IVersions<IStorage> | undefined): ICollectionVersions | undefined {\n  const history = versions?.history;\n  return isCollectionVersions(history) ? history : undefined;\n}\n\nfunction isSameVersion(local: unknown, server: unknown): boolean {\n  if (isFieldVersion(local) && isFieldVersion(server)) {\n    return VersionTrackerUtils_compareVersions(local, server) === \"equal\";\n  }\n  return JSON.stringify(local) === JSON.stringify(server);\n}\n\nexport function HistoryDelta_missingIds(\n  local: IHistoryDeltaLocal,\n  serverVersions: IVersions<IStorage> | undefined,\n  present: IHistoryRecord[]\n): number[] | undefined {\n  const server = historyVersions(serverVersions);\n  if (server == null) {\n    return undefined;\n  }\n  const localItems = historyVersions(local.versions)?.items || {};\n  const localIds = new Set(local.history.map((r) => r.id));\n  const presentIds = new Set(present.map((r) => r.id));\n  const deleted = server.deleted || {};\n  const missing: number[] = [];\n  for (const key of Object.keys(server.items || {})) {\n    const id = Number(key);\n    if (presentIds.has(id) || key in deleted) {\n      continue;\n    }\n    const localVersion = localItems[key];\n    if (!localIds.has(id) || localVersion == null || !isSameVersion(localVersion, server.items?.[key])) {\n      missing.push(id);\n    }\n  }\n  return missing.sort((a, b) => b - a);\n}\n\nexport function HistoryDelta_unresolvedIds(requestedIds: number[], fetched: IHistoryRecord[]): number[] {\n  const fetchedIds = new Set(fetched.map((r) => r.id));\n  return requestedIds.filter((id) => !fetchedIds.has(id));\n}\n\nexport function HistoryDelta_apply(storage: IStorage, fetched: IHistoryRecord[]): IStorage {\n  return { ...storage, history: CollectionUtils_uniqBy([...storage.history, ...fetched], \"id\") };\n}\n\nexport function HistoryDelta_sortNewestFirst(history: IHistoryRecord[]): IHistoryRecord[] {\n  return [...history].sort((a, b) => b.id - a.id);\n}\n","import { IEither } from \"./types\";\n\nexport const HistoryIds_MAX = 100;\n\nexport function HistoryIds_parse(raw: string): IEither<number[], string> {\n  const ids: number[] = [];\n  for (const part of raw.split(\",\")) {\n    if (part === \"\") {\n      continue;\n    }\n    const id = Number(part);\n    if (!Number.isSafeInteger(id)) {\n      return { success: false, error: `Invalid history id: ${part}` };\n    }\n    if (ids.indexOf(id) === -1) {\n      ids.push(id);\n    }\n  }\n  if (ids.length > HistoryIds_MAX) {\n    return { success: false, error: `At most ${HistoryIds_MAX} history ids per request` };\n  }\n  return { success: true, data: ids };\n}\n","export interface IHorizontalScrollWheel {\n  deltaX: number;\n  deltaY: number;\n  deltaMode: number;\n  offset: number;\n  maxOffset: number;\n  viewportWidth: number;\n}\n\nexport interface IHorizontalScrollEdges {\n  hasMoreLeft: boolean;\n  hasMoreRight: boolean;\n}\n\nconst LINE_HEIGHT_PX = 16;\nconst DOM_DELTA_LINE = 1;\nconst DOM_DELTA_PAGE = 2;\n\nexport function HorizontalScroll_wheelDelta(w: IHorizontalScrollWheel): number | undefined {\n  if (w.maxOffset <= 0 || Math.abs(w.deltaX) >= Math.abs(w.deltaY)) {\n    return undefined;\n  }\n  const scale = w.deltaMode === DOM_DELTA_LINE ? LINE_HEIGHT_PX : w.deltaMode === DOM_DELTA_PAGE ? w.viewportWidth : 1;\n  const delta = w.deltaY * scale;\n  const isAtEnd = delta > 0 ? w.offset >= w.maxOffset - 1 : w.offset <= 1;\n  return isAtEnd ? undefined : delta;\n}\n\nexport function HorizontalScroll_edges(\n  offset: number,\n  contentWidth: number,\n  viewportWidth: number\n): IHorizontalScrollEdges {\n  const maxOffset = Math.max(0, contentWidth - viewportWidth);\n  return { hasMoreLeft: offset > 1, hasMoreRight: offset < maxOffset - 1 };\n}\n\nexport function HorizontalScroll_fadeMask(edges: IHorizontalScrollEdges, fadePx: number): string | undefined {\n  if (!edges.hasMoreLeft && !edges.hasMoreRight) {\n    return undefined;\n  }\n  const left = edges.hasMoreLeft ? `transparent 0, black ${fadePx}px` : \"black 0\";\n  const right = edges.hasMoreRight ? `black calc(100% - ${fadePx}px), transparent 100%` : \"black 100%\";\n  return `linear-gradient(to right, ${left}, ${right})`;\n}\n","import { Platform } from \"react-native\";\n\nfunction baseHost(): string {\n  return (globalThis as { __HOST__?: string }).__HOST__ ?? \"https://www.liftosaur.com\";\n}\n\nexport function HostConfig_imageHost(): string {\n  if (Platform.OS === \"web\") {\n    return \"\";\n  }\n  return baseHost();\n}\n\nexport function HostConfig_resolveUrl(path: string): string {\n  if (Platform.OS === \"web\" || !path.startsWith(\"/\")) {\n    return path;\n  }\n  return `${baseHost()}${path}`;\n}\n","import { Platform } from \"react-native\";\nimport { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IApplePromotionalOffer, ISubscriptionLoading, IState, updateState } from \"../models/state\";\nimport { Dialog_alert } from \"./dialog\";\nimport { IIapAdapter, IIapApplePromoOffer, IIapPurchase } from \"./iapAdapter\";\nimport { StoreRuntime_storeName } from \"./storeRuntime\";\n\nconst APPLE_KEY_IDENTIFIER = \"CNHQ5ZL35U\";\n\nexport function IapHelpers_getSkus(): { monthly: string; yearly: string; lifetime: string } {\n  return Platform.OS === \"ios\"\n    ? {\n        monthly: \"com.liftosaur.subscription.ios_montly\",\n        yearly: \"com.liftosaur.subscription.ios_yearly\",\n        lifetime: \"com.liftosaur.subscription.ios_lifetime\",\n      }\n    : {\n        monthly: \"com.liftosaur.subscription.and_montly\",\n        yearly: \"com.liftosaur.subscription.and_yearly\",\n        lifetime: \"com.liftosaur.subscription.and_lifetime\",\n      };\n}\n\nexport function IapHelpers_clearLoading(dispatch: IDispatch): void {\n  updateState(dispatch, [lb<IState>().p(\"subscriptionLoading\").record(undefined)], \"Stop subscription loading\");\n}\n\nconst SUBSCRIPTION_LOADING_TIMEOUT_MS = 60000;\n\n// Sets the spinner on a plan card and arms a safety timeout: if no purchase/error event clears it\n// within the window (e.g. StoreKit never delivers an actionable event), the card can't spin forever.\n// Only clears if the same loading object is still active, so it never cancels a newer attempt.\nexport function IapHelpers_setLoading(\n  dispatch: IDispatch,\n  getState: () => IState,\n  loading: ISubscriptionLoading\n): void {\n  updateState(dispatch, [lb<IState>().p(\"subscriptionLoading\").record(loading)], \"Start subscription loading\");\n  const timer = setTimeout(() => {\n    if (getState().subscriptionLoading === loading) {\n      IapHelpers_clearLoading(dispatch);\n    }\n  }, SUBSCRIPTION_LOADING_TIMEOUT_MS);\n  // Don't keep the Node process (tests) alive for the full window; no-op on RN where setTimeout returns a number.\n  (timer as unknown as { unref?: () => void }).unref?.();\n}\n\nexport function IapHelpers_alertAlreadySubscribed(): void {\n  Dialog_alert(\n    `You already have an active Liftosaur Premium purchase on this account. Manage or change your plan from your ${StoreRuntime_storeName()} subscriptions.`\n  );\n}\n\nexport function IapHelpers_applePromoToAdapter(promo?: IApplePromotionalOffer): IIapApplePromoOffer | undefined {\n  if (!promo) {\n    return undefined;\n  }\n  return {\n    identifier: promo.offerId,\n    keyIdentifier: APPLE_KEY_IDENTIFIER,\n    nonce: promo.nonce,\n    signature: promo.signature,\n    timestamp: promo.timestamp,\n  };\n}\n\nexport async function IapHelpers_readReceiptOrJwsIOS(\n  iap: IIapAdapter,\n  purchase?: IIapPurchase\n): Promise<string | undefined> {\n  const jws = purchase?.purchaseToken;\n  if (jws) {\n    console.log(\"IAP: using StoreKit 2 JWS\", jws.slice(0, 32) + \"...\");\n    return jws;\n  }\n  const data = await iap.getReceiptDataIOS();\n  if (data) {\n    console.log(\"IAP: using legacy App Store receipt\", data.slice(0, 32) + \"...\");\n    return data;\n  }\n  const refreshed = await iap.getReceiptIOS();\n  if (refreshed) {\n    console.log(\"IAP: using refreshed legacy receipt\", refreshed.slice(0, 32) + \"...\");\n    return refreshed;\n  }\n  console.warn(\"IAP: no receipt nor JWS available\", purchase);\n  return undefined;\n}\n","export function ImageCache_initialUri(remoteUrl: string): string {\n  return remoteUrl;\n}\n\nexport function ImageCache_markMissing(_remoteUrl: string): void {}\n\nexport async function ImageCache_download(_remoteUrl: string): Promise<void> {}\n","export async function ImagePicker_pick(source: \"camera\" | \"photo-library\"): Promise<string | undefined> {\n  return new Promise((resolve) => {\n    const input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.accept = \"image/*\";\n    if (source === \"camera\") {\n      input.capture = \"environment\";\n    }\n    input.onchange = () => {\n      const file = input.files?.[0];\n      if (!file) {\n        resolve(undefined);\n        return;\n      }\n      const reader = new FileReader();\n      reader.onload = () => {\n        const dataUrl = reader.result as string;\n        const outputType = file.type === \"image/png\" ? \"image/png\" : \"image/jpeg\";\n        downscaleDataUrl(dataUrl, 1600, outputType, 0.8)\n          .then(resolve)\n          .catch(() => resolve(dataUrl));\n      };\n      reader.onerror = () => resolve(undefined);\n      reader.readAsDataURL(file);\n    };\n    input.click();\n  });\n}\n\nasync function downscaleDataUrl(\n  dataUrl: string,\n  maxDim: number,\n  outputType: \"image/png\" | \"image/jpeg\",\n  quality: number\n): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.onload = () => {\n      const scale = Math.min(1, maxDim / Math.max(img.width, img.height));\n      const width = Math.round(img.width * scale);\n      const height = Math.round(img.height * scale);\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = width;\n      canvas.height = height;\n      const ctx = canvas.getContext(\"2d\");\n      if (!ctx) {\n        reject(new Error(\"No canvas context\"));\n        return;\n      }\n      ctx.drawImage(img, 0, 0, width, height);\n      resolve(canvas.toDataURL(outputType, quality));\n    };\n    img.onerror = () => reject(new Error(\"Image load failed\"));\n    img.src = dataUrl;\n  });\n}\n","export function ImagePreloader_preload(url: string): Promise<HTMLImageElement> {\n  if (ImagePreloader_images[url]) {\n    return Promise.resolve(ImagePreloader_images[url]);\n  }\n\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.src = url;\n    img.onload = () => {\n      ImagePreloader_images[url] = img;\n      resolve(img);\n    };\n  });\n}\n\nexport function ImagePreloader_uri(path: string): string {\n  return path;\n}\n\nexport function ImagePreloader_clear(): void {}\n\nexport const ImagePreloader_dynocoach: string = \"/images/dinocoach.svg\";\n\nexport const ImagePreloader_dynoflex: string = \"/images/dinoflex.svg\";\n\nexport const ImagePreloader_dynohappy: string = \"/images/dinohappy.svg\";\n\nexport const ImagePreloader_images: Record<string, HTMLImageElement> = {};\n","import { Service } from \"../api/service\";\n\nexport class ImageUploader {\n  private readonly MAX_WIDTH = 600;\n  private readonly MAX_HEIGHT = 900;\n\n  constructor(private readonly service: Service) {}\n\n  public async uploadImage(file: File, exerciseId: string): Promise<string> {\n    const extension = file.name.split(\".\").pop() || \"png\";\n    const fileName = `${exerciseId}.${extension}`;\n    const resizedFile = await this.resizeImage(file);\n    const presignedUrlResponse = await this.service.postImageUploadUrl(fileName, resizedFile.type);\n    await this.uploadToS3(presignedUrlResponse.uploadUrl, resizedFile);\n    return presignedUrlResponse.imageUrl;\n  }\n\n  public async uploadBase64Image(base64Data: string, exerciseId: string): Promise<string> {\n    const response = await this.service.client(base64Data);\n    const blob = await response.blob();\n    const extension = blob.type.split(\"/\")[1] || \"png\";\n    const fileName = `${exerciseId}.${extension}`;\n    const file = new File([blob], fileName, { type: blob.type });\n    return this.uploadImage(file, exerciseId);\n  }\n\n  private async resizeImage(file: File): Promise<File> {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      const canvas = document.createElement(\"canvas\");\n      const ctx = canvas.getContext(\"2d\");\n\n      if (!ctx) {\n        reject(new Error(\"Could not get canvas context\"));\n        return;\n      }\n\n      img.onload = () => {\n        const width = img.width;\n        const height = img.height;\n        const currentAspectRatio = width / height;\n        const targetAspectRatio = this.MAX_WIDTH / this.MAX_HEIGHT;\n\n        let canvasWidth: number;\n        let canvasHeight: number;\n        let imageWidth: number;\n        let imageHeight: number;\n\n        if (width > this.MAX_WIDTH || height > this.MAX_HEIGHT) {\n          canvasWidth = this.MAX_WIDTH;\n          canvasHeight = this.MAX_HEIGHT;\n\n          if (currentAspectRatio > targetAspectRatio) {\n            imageWidth = this.MAX_WIDTH;\n            imageHeight = Math.round(this.MAX_WIDTH / currentAspectRatio);\n          } else {\n            imageHeight = this.MAX_HEIGHT;\n            imageWidth = Math.round(this.MAX_HEIGHT * currentAspectRatio);\n          }\n        } else {\n          imageWidth = width;\n          imageHeight = height;\n\n          if (currentAspectRatio > targetAspectRatio) {\n            canvasWidth = width;\n            canvasHeight = Math.round(width / targetAspectRatio);\n          } else {\n            canvasHeight = height;\n            canvasWidth = Math.round(height * targetAspectRatio);\n          }\n\n          if (canvasWidth > this.MAX_WIDTH || canvasHeight > this.MAX_HEIGHT) {\n            const scale = Math.min(this.MAX_WIDTH / canvasWidth, this.MAX_HEIGHT / canvasHeight);\n            canvasWidth = Math.round(canvasWidth * scale);\n            canvasHeight = Math.round(canvasHeight * scale);\n            imageWidth = Math.round(imageWidth * scale);\n            imageHeight = Math.round(imageHeight * scale);\n          }\n        }\n\n        if (width === canvasWidth && height === canvasHeight) {\n          resolve(file);\n          return;\n        }\n\n        canvas.width = canvasWidth;\n        canvas.height = canvasHeight;\n\n        ctx.imageSmoothingEnabled = true;\n        ctx.imageSmoothingQuality = \"high\";\n\n        const xOffset = Math.round((canvasWidth - imageWidth) / 2);\n        const yOffset = Math.round((canvasHeight - imageHeight) / 2);\n\n        if (width > imageWidth * 2 || height > imageHeight * 2) {\n          const tempCanvas = document.createElement(\"canvas\");\n          const tempCtx = tempCanvas.getContext(\"2d\");\n\n          if (tempCtx) {\n            const tempWidth = imageWidth * 2;\n            const tempHeight = imageHeight * 2;\n            tempCanvas.width = tempWidth;\n            tempCanvas.height = tempHeight;\n\n            tempCtx.imageSmoothingEnabled = true;\n            tempCtx.imageSmoothingQuality = \"high\";\n            tempCtx.drawImage(img, 0, 0, tempWidth, tempHeight);\n\n            ctx.drawImage(tempCanvas, 0, 0, tempWidth, tempHeight, xOffset, yOffset, imageWidth, imageHeight);\n          } else {\n            ctx.drawImage(img, xOffset, yOffset, imageWidth, imageHeight);\n          }\n        } else {\n          ctx.drawImage(img, xOffset, yOffset, imageWidth, imageHeight);\n        }\n\n        const isPng = file.type === \"image/png\";\n        const outputType = \"image/png\";\n        const quality = isPng ? undefined : 0.95;\n\n        canvas.toBlob(\n          (blob) => {\n            if (blob) {\n              const resizedFile = new File([blob], file.name, {\n                type: outputType,\n                lastModified: Date.now(),\n              });\n              console.log(`Processed image from ${width}x${height} to ${canvasWidth}x${canvasHeight} canvas`);\n              resolve(resizedFile);\n            } else {\n              reject(new Error(\"Failed to create blob from canvas\"));\n            }\n          },\n          outputType,\n          quality\n        );\n      };\n\n      img.onerror = () => {\n        reject(new Error(\"Failed to load image\"));\n      };\n\n      const reader = new FileReader();\n      reader.onload = (e) => {\n        img.src = e.target?.result as string;\n      };\n      reader.onerror = () => {\n        reject(new Error(\"Failed to read file\"));\n      };\n      reader.readAsDataURL(file);\n    });\n  }\n\n  private async uploadToS3(uploadUrl: string, file: File): Promise<void> {\n    console.log(\"Uploading image to S3\", { uploadUrl, fileName: file.name, fileType: file.type });\n    const response = await this.service.client(uploadUrl, {\n      method: \"PUT\",\n      body: file,\n      headers: {\n        \"Content-Type\": file.type,\n      },\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to upload image to S3: ${response.statusText}`);\n    }\n  }\n}\n","import { Mobile_isMobile } from \"../../lambda/utils/mobile\";\nimport * as htmlToImage from \"html-to-image\";\nimport { Dialog_alert } from \"./dialog\";\n\nexport class ImageShareUtils {\n  constructor(\n    private readonly dataURL: string,\n    private readonly fileName: string\n  ) {}\n\n  public static async generateImageDataUrl(\n    element: unknown,\n    _options?: { width?: number; height?: number }\n  ): Promise<string> {\n    const maybeRef = element as { current?: HTMLElement } | null;\n    const el = (maybeRef && \"current\" in maybeRef ? maybeRef.current : (element as HTMLElement)) as HTMLElement;\n    await htmlToImage.toPng(el, { pixelRatio: 2 });\n    await htmlToImage.toPng(el, { pixelRatio: 2 });\n    return htmlToImage.toPng(el, { pixelRatio: 2 });\n  }\n\n  public static async shareToSocial(\n    _target: \"igstory\" | \"igfeed\" | \"tiktok\",\n    _workoutImage: string,\n    _options: { backgroundImage?: string } = {}\n  ): Promise<void> {}\n\n  public async shareOrDownload(): Promise<void> {\n    if (this.canShareDataUrl()) {\n      await this.shareDataURL();\n    } else {\n      this.saveDataURLToFile();\n    }\n  }\n\n  private canShareDataUrl(): boolean {\n    const blob = this.dataURLToBlob();\n    const file = new File([blob], this.fileName, { type: blob.type });\n    return Mobile_isMobile(navigator.userAgent) && navigator.canShare && navigator.canShare({ files: [file] });\n  }\n\n  private saveDataURLToFile(): void {\n    const link = document.createElement(\"a\");\n    link.href = this.dataURL;\n    link.download = this.fileName;\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  private async shareDataURL(): Promise<void> {\n    // Check if the Web Share API is available\n    if (!this.canShareDataUrl()) {\n      return;\n    }\n\n    try {\n      // Convert the data URL to a Blob\n      const blob = this.dataURLToBlob();\n\n      // Create a File object\n      const file = new File([blob], this.fileName, { type: blob.type });\n\n      // Use the Web Share API to open the share dialog\n      await navigator.share({\n        files: [file],\n        title: \"Workout Program Image\",\n      });\n    } catch (error) {\n      Dialog_alert(\n        \"Error sharing file. Likely because the image is too large to generate. Try to disable some weeks/days.\"\n      );\n    }\n  }\n\n  private dataURLToBlob(): Blob {\n    const [header, base64Data] = this.dataURL.split(\",\");\n    const mimeTypeMatch = header.match(/:(.*?);/);\n    if (!mimeTypeMatch) {\n      throw new Error(\"Invalid data URL format.\");\n    }\n    const mimeType = mimeTypeMatch[1];\n\n    // Decode base64 to binary\n    const binaryString = atob(base64Data);\n    const binaryLength = binaryString.length;\n    const bytes = new Uint8Array(binaryLength);\n\n    for (let i = 0; i < binaryLength; i++) {\n      bytes[i] = binaryString.charCodeAt(i);\n    }\n\n    return new Blob([bytes], { type: mimeType });\n  }\n}\n","import { IHistoryRecord, ICustomExercise, ISettings, IWeight, VHistoryRecord } from \"../types\";\nimport Papa from \"papaparse\";\nimport { CollectionUtils_compact, CollectionUtils_groupByKey } from \"./collection\";\nimport { ObjectUtils_values } from \"./object\";\nimport { Exercise_findByName, Exercise_getIsUnilateral, Exercise_sanitizeName } from \"../models/exercise\";\nimport { Weight_build } from \"../models/weight\";\nimport { UidFactory_generateUid } from \"./generator\";\nimport { Progress_getEntryId } from \"../models/progress\";\nimport { History_generateId } from \"../models/history\";\nimport { Storage_validate } from \"../models/storage\";\nimport { DateUtils_parseNamedMonthDateTime } from \"./date\";\nimport {\n  IImportResult,\n  IImportRowError,\n  ImportFileError,\n  ImportUtils_detectCsvKind,\n  ImportUtils_isSuspiciousReps,\n  ImportUtils_isSuspiciousTimestamp,\n  ImportUtils_isSuspiciousWeight,\n} from \"./importTypes\";\n\nconst exerciseMapping: Partial<Record<string, [string, string | undefined]>> = {\n  \"21s Bicep Curl\": [\"Bicep Curl\", \"barbell\"],\n  \"Ab Wheel\": [\"Ab Wheel\", \"bodyweight\"],\n  \"Arnold Press (Dumbbell)\": [\"Arnold Press\", \"dumbbell\"],\n  \"Assisted Pistol Squats\": [\"Pistol Squat\", \"bodyweight\"],\n  \"Back Extension (Hyperextension)\": [\"Back Extension\", \"bodyweight\"],\n  \"Back Extension (Machine)\": [\"Back Extension\", \"leverageMachine\"],\n  \"Ball Slams\": [\"Ball Slams\", \"medicineball\"],\n  \"Bench Dip\": [\"Bench Dip\", \"bodyweight\"],\n  \"Bench Press - Close Grip (Barbell)\": [\"Bench Press Close Grip\", \"barbell\"],\n  \"Bench Press - Wide Grip (Barbell)\": [\"Bench Press Wide Grip\", \"barbell\"],\n  \"Bench Press (Barbell)\": [\"Bench Press\", \"barbell\"],\n  \"Bench Press (Cable)\": [\"Chest Press\", \"cable\"],\n  \"Bench Press (Dumbbell)\": [\"Chest Press\", \"dumbbell\"],\n  \"Bench Press (Smith Machine)\": [\"Chest Press\", \"smith\"],\n  \"Bent Over Row (Band)\": [\"Bent Over Row\", \"band\"],\n  \"Bent Over Row (Barbell)\": [\"Bent Over Row\", \"barbell\"],\n  \"Bent Over Row (Dumbbell)\": [\"Bent Over One Arm Row\", \"dumbbell\"],\n  \"Bicep Curl (Barbell)\": [\"Bicep Curl\", \"barbell\"],\n  \"Bicep Curl (Cable)\": [\"Bicep Curl\", \"cable\"],\n  \"Bicep Curl (Dumbbell)\": [\"Bicep Curl\", \"dumbbell\"],\n  \"Bicycle Crunch\": [\"Bicycle Crunch\", \"bodyweight\"],\n  \"Box Jump\": [\"Box Jump\", \"bodyweight\"],\n  \"Box Squat (Barbell)\": [\"Box Squat\", \"barbell\"],\n  \"Bulgarian Split Squat\": [\"Bulgarian Split Squat\", \"bodyweight\"],\n  Burpee: [\"Burpee\", \"bodyweight\"],\n  \"Butterfly (Pec Deck)\": [\"Pec Deck\", \"leverageMachine\"],\n  \"Cable Crunch\": [\"Cable Crunch\", \"cable\"],\n  \"Cable Pull Through\": [\"Cable Pull Through\", \"cable\"],\n  \"Cable Twist (Down to up)\": [\"Cable Twist\", \"cable\"],\n  \"Cable Twist (Up to down)\": [\"Cable Twist\", \"cable\"],\n  \"Calf Press (Machine)\": [\"Calf Press on Seated Leg Press\", \"leverageMachine\"],\n  \"Chest Dip\": [\"Chest Dip\", \"bodyweight\"],\n  \"Chest Fly (Band)\": [\"Chest Fly\", \"band\"],\n  \"Chest Fly (Dumbbell)\": [\"Chest Fly\", \"dumbbell\"],\n  \"Chest Fly (Machine)\": [\"Chest Fly\", \"leverageMachine\"],\n  \"Chest Press (Band)\": [\"Chest Press\", \"band\"],\n  \"Chest Press (Machine)\": [\"Chest Press\", \"leverageMachine\"],\n  \"Chest Supported Incline Row (Dumbbell)\": [\"Incline Row\", \"dumbbell\"],\n  \"Chin Up\": [\"Chin Up\", \"bodyweight\"],\n  Clamshell: [\"Side Lying Clam\", \"bodyweight\"],\n  Clean: [\"Clean\", \"barbell\"],\n  \"Clean and Jerk\": [\"Clean and Jerk\", \"barbell\"],\n  \"Concentration Curl\": [\"Concentration Curl\", \"dumbbell\"],\n  Crunch: [\"Crunch\", \"bodyweight\"],\n  \"Crunch (Machine)\": [\"Crunch\", \"leverageMachine\"],\n  \"Curtsy Lunge (Dumbbell)\": [\"Lunge\", \"dumbbell\"],\n  \"Deadlift (Band)\": [\"Deadlift\", \"band\"],\n  \"Deadlift (Barbell)\": [\"Deadlift\", \"barbell\"],\n  \"Deadlift (Dumbbell)\": [\"Deadlift\", \"dumbbell\"],\n  \"Deadlift (Smith Machine)\": [\"Deadlift\", \"smith\"],\n  \"Deadlift (Trap bar)\": [\"Trap Bar Deadlift\", \"trapbar\"],\n  \"Deadlift High Pull\": [\"Deadlift High Pull\", \"barbell\"],\n  \"Decline Bench Press (Barbell)\": [\"Decline Bench Press\", \"barbell\"],\n  \"Decline Bench Press (Dumbbell)\": [\"Decline Bench Press\", \"dumbbell\"],\n  \"Decline Bench Press (Machine)\": [\"Decline Bench Press\", \"leverageMachine\"],\n  \"Decline Bench Press (Smith Machine)\": [\"Decline Bench Press\", \"smith\"],\n  \"Decline Chest Fly (Dumbbell)\": [\"Chest Fly\", \"dumbbell\"],\n  \"Decline Crunch\": [\"Decline Crunch\", \"bodyweight\"],\n  \"Dumbbell Row\": [\"Bent Over One Arm Row\", \"dumbbell\"],\n  \"Dumbbell Step Up\": [\"Step up\", \"dumbbell\"],\n  \"EZ Bar Biceps Curl\": [\"Bicep Curl\", \"ezbar\"],\n  \"Face Pull\": [\"Face Pull\", \"cable\"],\n  \"Front Raise (Band)\": [\"Front Raise\", \"band\"],\n  \"Front Raise (Barbell)\": [\"Front Raise\", \"barbell\"],\n  \"Front Raise (Cable)\": [\"Front Raise\", \"cable\"],\n  \"Front Raise (Dumbbell)\": [\"Front Raise\", \"dumbbell\"],\n  \"Front Squat\": [\"Front Squat\", \"barbell\"],\n  \"Full Squat\": [\"Squat\", \"barbell\"],\n  \"Glute Bridge\": [\"Glute Bridge\", \"bodyweight\"],\n  \"Glute Kickback (Machine)\": [\"Cable Kickback\", \"cable\"],\n  \"Goblet Squat\": [\"Goblet Squat\", \"kettlebell\"],\n  \"Good Morning (Barbell)\": [\"Good Morning\", \"barbell\"],\n  \"Hack Squat\": [\"Hack Squat\", \"barbell\"],\n  \"Hack Squat (Machine)\": [\"Hack Squat\", \"leverageMachine\"],\n  \"Hammer Curl (Band)\": [\"Hammer Curl\", \"band\"],\n  \"Hammer Curl (Cable)\": [\"Hammer Curl\", \"cable\"],\n  \"Hammer Curl (Dumbbell)\": [\"Hammer Curl\", \"dumbbell\"],\n  \"Handstand Push Up\": [\"Handstand Push Up\", \"bodyweight\"],\n  \"Hang Clean\": [\"Hang Clean\", \"barbell\"],\n  \"Hang Snatch\": [\"Hang Snatch\", \"barbell\"],\n  \"Hanging Leg Raise\": [\"Hanging Leg Raise\", \"bodyweight\"],\n  \"High Knee Skips\": [\"High Knee Skips\", \"bodyweight\"],\n  \"Hip Abduction (Machine)\": [\"Hip Abductor\", \"leverageMachine\"],\n  \"Hip Thrust\": [\"Hip Thrust\", \"bodyweight\"],\n  \"Hip Thrust (Barbell)\": [\"Hip Thrust\", \"barbell\"],\n  \"Incline Bench Press (Barbell)\": [\"Incline Bench Press\", \"barbell\"],\n  \"Incline Bench Press (Dumbbell)\": [\"Incline Bench Press\", \"dumbbell\"],\n  \"Incline Bench Press (Smith Machine)\": [\"Incline Bench Press\", \"smith\"],\n  \"Incline Chest Fly (Dumbbell)\": [\"Incline Chest Fly\", \"dumbbell\"],\n  \"Incline Chest Press (Machine)\": [\"Incline Chest Press\", \"leverageMachine\"],\n  \"Inverted Row\": [\"Inverted Row\", \"bodyweight\"],\n  \"Jump Squat\": [\"Jump Squat\", \"bodyweight\"],\n  \"Jumping Jack\": [\"Jumping Jack\", \"bodyweight\"],\n  \"Kettlebell Clean\": [\"Clean\", \"kettlebell\"],\n  \"Kettlebell Goblet Squat\": [\"Goblet Squat\", \"kettlebell\"],\n  \"Kettlebell Shoulder Press\": [\"Shoulder Press\", \"kettlebell\"],\n  \"Kettlebell Swing\": [\"Kettlebell Swing\", \"kettlebell\"],\n  \"Lat Pulldown (Band)\": [\"Lat Pulldown\", \"band\"],\n  \"Lat Pulldown (Cable)\": [\"Lat Pulldown\", \"cable\"],\n  \"Lat Pulldown (Machine)\": [\"Lat Pulldown\", \"leverageMachine\"],\n  \"Lateral Raise (Band)\": [\"Lateral Raise\", \"band\"],\n  \"Lateral Raise (Cable)\": [\"Lateral Raise\", \"cable\"],\n  \"Lateral Raise (Dumbbell)\": [\"Lateral Raise\", \"dumbbell\"],\n  \"Lateral Raise (Machine)\": [\"Lateral Raise\", \"leverageMachine\"],\n  \"Leg Extension (Machine)\": [\"Leg Extension\", \"leverageMachine\"],\n  \"Leg Press (Machine)\": [\"Leg Press\", \"leverageMachine\"],\n  Lunge: [\"Lunge\", \"bodyweight\"],\n  \"Lunge (Barbell)\": [\"Lunge\", \"barbell\"],\n  \"Lunge (Dumbbell)\": [\"Lunge\", \"dumbbell\"],\n  \"Lying Leg Curl (Machine)\": [\"Lying Leg Curl\", \"leverageMachine\"],\n  \"Mountain Climber\": [\"Mountain Climber\", \"bodyweight\"],\n  \"Overhead Press (Barbell)\": [\"Overhead Press\", \"barbell\"],\n  \"Overhead Press (Dumbbell)\": [\"Overhead Press\", \"dumbbell\"],\n  \"Overhead Press (Smith Machine)\": [\"Overhead Press\", \"smith\"],\n  \"Overhead Squat\": [\"Overhead Squat\", \"barbell\"],\n  \"Pistol Squat\": [\"Pistol Squat\", \"bodyweight\"],\n  Plank: [\"Plank\", \"bodyweight\"],\n  \"Power Clean\": [\"Power Clean\", \"barbell\"],\n  \"Power Snatch\": [\"Power Snatch\", \"barbell\"],\n  \"Preacher Curl (Barbell)\": [\"Preacher Curl\", \"barbell\"],\n  \"Preacher Curl (Dumbbell)\": [\"Preacher Curl\", \"dumbbell\"],\n  \"Preacher Curl (Machine)\": [\"Preacher Curl\", \"leverageMachine\"],\n  \"Pull Up\": [\"Pull Up\", \"bodyweight\"],\n  \"Pull Up (Band)\": [\"Pull Up\", \"band\"],\n  \"Pullover (Dumbbell)\": [\"Pullover\", \"dumbbell\"],\n  \"Push Press\": [\"Push Press\", \"barbell\"],\n  \"Reverse Crunch\": [\"Reverse Crunch\", \"bodyweight\"],\n  \"Reverse Curl (Barbell)\": [\"Reverse Curl\", \"barbell\"],\n  \"Reverse Curl (Dumbbell)\": [\"Reverse Curl\", \"dumbbell\"],\n  \"Reverse Fly (Cable)\": [\"Reverse Fly\", \"cable\"],\n  \"Reverse Fly (Dumbbell)\": [\"Reverse Fly\", \"dumbbell\"],\n  \"Reverse Grip Lat Pulldown (Cable)\": [\"Lat Pulldown\", \"cable\"],\n  \"Reverse Hyperextension\": [\"Reverse Hyperextension\", \"bodyweight\"],\n  \"Romanian Deadlift (Barbell)\": [\"Romanian Deadlift\", \"barbell\"],\n  \"Romanian Deadlift (Dumbbell)\": [\"Romanian Deadlift\", \"dumbbell\"],\n  \"Russian Twist (Bodyweight)\": [\"Russian Twist\", \"bodyweight\"],\n  \"Seated Leg Curl (Machine)\": [\"Seated Leg Curl\", \"leverageMachine\"],\n  \"Seated Row (Machine)\": [\"Seated Row\", \"leverageMachine\"],\n  \"Seated Shoulder Press (Machine)\": [\"Shoulder Press\", \"leverageMachine\"],\n  \"Shoulder Press (Dumbbell)\": [\"Shoulder Press\", \"dumbbell\"],\n  \"Shrug (Barbell)\": [\"Shrug\", \"barbell\"],\n  \"Shrug (Cable)\": [\"Shrug\", \"cable\"],\n  \"Shrug (Dumbbell)\": [\"Shrug\", \"dumbbell\"],\n  \"Shrug (Smith Machine)\": [\"Shrug\", \"smith\"],\n  \"Side Bend\": [\"Side Bend\", \"bodyweight\"],\n  \"Side Bend (Dumbbell)\": [\"Side Bend\", \"dumbbell\"],\n  \"Side Plank\": [\"Side Plank\", \"bodyweight\"],\n  \"Single Leg Glute Bridge\": [\"Single Leg Bridge\", \"bodyweight\"],\n  \"Single Leg Hip Thrust\": [\"Single Leg Hip Thrust\", \"bodyweight\"],\n  \"Single Leg Romanian Deadlift (Barbell)\": [\"Single Leg Deadlift\", \"barbell\"],\n  \"Single Leg Romanian Deadlift (Dumbbell)\": [\"Single Leg Deadlift\", \"dumbbell\"],\n  \"Sit Up\": [\"Sit Up\", \"bodyweight\"],\n  \"Skullcrusher (Barbell)\": [\"Skullcrusher\", \"barbell\"],\n  \"Skullcrusher (Dumbbell)\": [\"Skullcrusher\", \"dumbbell\"],\n  Snatch: [\"Power Snatch\", \"barbell\"],\n  \"Split Jerk\": [\"Split Jerk\", \"barbell\"],\n  \"Squat (Band)\": [\"Squat\", \"band\"],\n  \"Squat (Barbell)\": [\"Squat\", \"barbell\"],\n  \"Squat (Bodyweight)\": [\"Squat\", \"bodyweight\"],\n  \"Squat (Dumbbell)\": [\"Squat\", \"dumbbell\"],\n  \"Squat (Machine)\": [\"Squat\", \"leverageMachine\"],\n  \"Squat (Smith Machine)\": [\"Squat\", \"smith\"],\n  \"Standing Military Press (Barbell)\": [\"Overhead Press\", \"barbell\"],\n  \"Straight Leg Deadlift\": [\"Stiff Leg Deadlift\", \"barbell\"],\n  \"Sumo Deadlift\": [\"Deadlift\", \"barbell\"],\n  Superman: [\"Superman\", \"bodyweight\"],\n  \"Thruster (Barbell)\": [\"Thruster\", \"barbell\"],\n  \"Thruster (Kettlebell)\": [\"Thruster\", \"kettlebell\"],\n  \"Upright Row (Barbell)\": [\"Upright Row\", \"barbell\"],\n  \"Upright Row (Cable)\": [\"Upright Row\", \"cable\"],\n  \"Upright Row (Dumbbell)\": [\"Upright Row\", \"dumbbell\"],\n  \"V Up\": [\"V Up\", \"bodyweight\"],\n  \"Wide Pull Up\": [\"Pull Up\", \"bodyweight\"],\n  \"Zercher Squat\": [\"Squat\", \"barbell\"],\n  \"Around The World\": [\"Around The World\", \"dumbbell\"],\n  \"Back Extension (Weighted Hyperextension)\": [\"Back Extension\", \"leverageMachine\"],\n  \"Battle Ropes\": [\"Battle Ropes\", \"bodyweight\"],\n  \"Bicep Curl (Machine)\": [\"Bicep Curl\", \"leverageMachine\"],\n  \"Bicep Curl (Suspension)\": [\"Bicep Curl\", \"dumbbell\"],\n  \"Bicycle Crunch Raised Legs\": [\"Bicycle Crunch\", \"bodyweight\"],\n  \"Burpee Over the Bar\": [\"Burpee\", \"bodyweight\"],\n  \"Cable Fly Crossovers\": [\"Cable Crossover\", \"cable\"],\n  \"Chest Dip (Assisted)\": [\"Chest Dip\", \"bodyweight\"],\n  \"Chest Dip (Weighted)\": [\"Chest Dip\", \"bodyweight\"],\n  \"Chest Fly (Suspension)\": [\"Chest Fly\", \"dumbbell\"],\n  \"Chin Up (Assisted)\": [\"Chin Up\", \"bodyweight\"],\n  \"Chin Up (Weighted)\": [\"Chin Up\", \"bodyweight\"],\n  \"Clean and Press\": [\"Clean and Jerk\", \"barbell\"],\n  \"Crunch (Weighted)\": [\"Crunch\", \"bodyweight\"],\n  Cycling: [\"Cycling\", \"bodyweight\"],\n  \"Decline Crunch (Weighted)\": [\"Decline Crunch\", \"bodyweight\"],\n  \"Decline Push Up\": [\"Push Up\", \"bodyweight\"],\n  \"Diamond Push Up\": [\"Push Up\", \"bodyweight\"],\n  \"Dumbbell Snatch\": [\"Power Snatch\", \"dumbbell\"],\n  \"Dumbbell Squeeze Press\": [\"Chest Press\", \"dumbbell\"],\n  \"Elliptical Trainer\": [\"Elliptical Machine\", \"leverageMachine\"],\n  \"Floor Press (Barbell)\": [\"Chest Press\", \"barbell\"],\n  \"Floor Press (Dumbbell)\": [\"Chest Press\", \"dumbbell\"],\n  \"Floor Triceps Dip\": [\"Triceps Dip\", \"bodyweight\"],\n  \"Frog Jumps\": [\"Box Jump\", \"bodyweight\"],\n  \"Frog Pumps (Dumbbell)\": [\"Glute Bridge\", \"dumbbell\"],\n  \"Front Raise (Suspension)\": [\"Front Raise\", \"dumbbell\"],\n  \"Handstand Hold\": [\"Handstand Push Up\", \"bodyweight\"],\n  \"Hanging Knee Raise\": [\"Hanging Leg Raise\", \"bodyweight\"],\n  \"High Knees\": [\"High Knee Skips\", \"bodyweight\"],\n  \"Incline Push Ups\": [\"Push Up\", \"bodyweight\"],\n  \"Iso-Lateral Chest Press (Machine)\": [\"Iso-Lateral Chest Press\", \"leverageMachine\"],\n  \"Iso-Lateral Row (Machine)\": [\"Iso-Lateral Row\", \"leverageMachine\"],\n  \"Jack Knife (Suspension)\": [\"Jackknife Sit Up\", \"bodyweight\"],\n  \"Jackknife Sit Up\": [\"Jackknife Sit Up\", \"bodyweight\"],\n  \"Jump Rope\": [\"Jump Rope\", \"bodyweight\"],\n  \"Kettlebell High Pull\": [\"Deadlift High Pull\", \"kettlebell\"],\n  \"Kettlebell Snatch\": [\"Power Snatch\", \"kettlebell\"],\n  \"Kettlebell Turkish Get Up\": [\"Kettlebell Turkish Get Up\", \"kettlebell\"],\n  \"Kipping Pull Up\": [\"Kipping Pull Up\", \"bodyweight\"],\n  \"Knee Raise Parallel Bars\": [\"Knee Raise\", \"bodyweight\"],\n  \"Lateral Box Jump\": [\"Lateral Box Jump\", \"bodyweight\"],\n  \"Leg Press Horizontal (Machine)\": [\"Leg Press\", \"leverageMachine\"],\n  \"Low Cable Fly Crossovers\": [\"Cable Crossover\", \"cable\"],\n  \"Lying Leg Raise\": [\"Flat Leg Raise\", \"bodyweight\"],\n  \"Muscle Up\": [\"Muscle Up\", \"bodyweight\"],\n  \"Oblique Crunch\": [\"Oblique Crunch\", \"bodyweight\"],\n  \"Overhead Dumbbell Lunge\": [\"Lunge\", \"dumbbell\"],\n  \"Pendlay Row (Barbell)\": [\"Pendlay Row\", \"barbell\"],\n  \"Press Under\": [\"Press Under\", \"barbell\"],\n  \"Pull Up (Assisted)\": [\"Pull Up\", \"bodyweight\"],\n  \"Pull Up (Weighted)\": [\"Pull Up\", \"bodyweight\"],\n  \"Push Up\": [\"Push Up\", \"bodyweight\"],\n  \"Push Up (Weighted)\": [\"Push Up\", \"bodyweight\"],\n  \"Rear Delt Reverse Fly (Machine)\": [\"Reverse Fly\", \"leverageMachine\"],\n  \"Reverse Fly Single Arm (Cable)\": [\"Reverse Fly\", \"cable\"],\n  \"Reverse Grip Concentration Curl\": [\"Reverse Grip Concentration Curl\", \"dumbbell\"],\n  \"Reverse Plank\": [\"Reverse Plank\", \"bodyweight\"],\n  \"Rowing Machine\": [\"Rowing\", \"leverageMachine\"],\n  \"Russian Twist (Weighted)\": [\"Russian Twist\", \"bodyweight\"],\n  \"Seated Cable Row\": [\"Seated Row\", \"cable\"],\n  \"Seated Calf Raise\": [\"Seated Calf Raise\", \"barbell\"],\n  \"Seated Incline Curl (Dumbbell)\": [\"Incline Curl\", \"dumbbell\"],\n  \"Seated Palms Up Wrist Curl\": [\"Seated Palms Up Wrist Curl\", \"dumbbell\"],\n  \"Single Arm Cable Crossover\": [\"Cable Crossover\", \"cable\"],\n  \"Single Leg Standing Calf Raise\": [\"Single Leg Calf Raise\", \"barbell\"],\n  \"Single Leg Standing Calf Raise (Barbell)\": [\"Single Leg Calf Raise\", \"barbell\"],\n  \"Single Leg Standing Calf Raise (Dumbbell)\": [\"Single Leg Calf Raise\", \"dumbbell\"],\n  \"Single Leg Standing Calf Raise (Machine)\": [\"Single Leg Calf Raise\", \"leverageMachine\"],\n  \"Sissy Squat (Weighted)\": [\"Sissy Squat\", \"bodyweight\"],\n  \"Sit Up (Weighted)\": [\"Sit Up\", \"bodyweight\"],\n  \"Split Squat (Dumbbell)\": [\"Bulgarian Split Squat\", \"dumbbell\"],\n  \"Squat Row\": [\"Squat Row\", \"band\"],\n  \"Standing Calf Raise\": [\"Standing Calf Raise\", \"dumbbell\"],\n  \"Standing Calf Raise (Barbell)\": [\"Standing Calf Raise\", \"barbell\"],\n  \"Standing Calf Raise (Dumbbell)\": [\"Standing Calf Raise\", \"dumbbell\"],\n  \"Standing Calf Raise (Machine)\": [\"Standing Calf Raise\", \"leverageMachine\"],\n  \"Step Up\": [\"Step up\", \"dumbbell\"],\n  \"T Bar Row\": [\"T Bar Row\", \"leverageMachine\"],\n  \"Toes to Bar\": [\"Toes To Bar\", \"bodyweight\"],\n  \"Torso Rotation\": [\"Torso Rotation\", \"bodyweight\"],\n  \"Triceps Dip\": [\"Triceps Dip\", \"bodyweight\"],\n  \"Triceps Dip (Assisted)\": [\"Triceps Dip\", \"bodyweight\"],\n  \"Triceps Dip (Weighted)\": [\"Triceps Dip\", \"bodyweight\"],\n  \"Triceps Extension (Cable)\": [\"Triceps Extension\", \"cable\"],\n  \"Triceps Extension (Dumbbell)\": [\"Triceps Extension\", \"dumbbell\"],\n  \"Triceps Extension (Machine)\": [\"Triceps Extension\", \"leverageMachine\"],\n  \"Triceps Extension (Suspension)\": [\"Triceps Extension\", \"dumbbell\"],\n  \"Triceps Extension (Barbell)\": [\"Triceps Extension\", \"barbell\"],\n  \"Triceps Pressdown\": [\"Triceps Pushdown\", \"cable\"],\n  \"Triceps Pushdown\": [\"Triceps Pushdown\", \"cable\"],\n  \"Triceps Rope Pushdown\": [\"Triceps Pushdown\", \"cable\"],\n  \"Wrist Roller\": [\"Wrist Roller\", \"bodyweight\"],\n};\n\nfunction parseHevyDate(raw: string | undefined): number | undefined {\n  if (!raw) {\n    return undefined;\n  }\n  const ts = DateUtils_parseNamedMonthDateTime(raw) ?? new Date(raw).getTime();\n  return isNaN(ts) ? undefined : ts;\n}\n\ninterface IHevyRecord {\n  title: string;\n  start_time: string;\n  end_time: string;\n  exercise_title: string;\n  description: string;\n  exercise_notes: string;\n  set_index: number;\n  set_type: string;\n  weight_lbs?: number;\n  weight_kg?: number;\n  reps: number;\n}\n\ninterface IHevyStructExercise {\n  exercise_title: string;\n  exercise_notes: string;\n  sets: IHevyStructSet[];\n  warmupSets: IHevyStructSet[];\n}\n\ninterface IHevyStructSet {\n  weight_lbs?: number;\n  weight_kg?: number;\n  reps: number;\n}\n\ninterface IHevyStruct {\n  title: string;\n  start_time: string;\n  end_time: string;\n  description: string;\n  exercises: IHevyStructExercise[];\n  row: number;\n}\n\nfunction parseHevyNumber(value: string | number | undefined | null): number | undefined {\n  if (value == null || `${value}`.trim() === \"\") {\n    return undefined;\n  }\n  const num = Number(`${value}`);\n  return isNaN(num) ? undefined : num;\n}\n\n// Leave the weight undefined when both columns are blank (bodyweight set) instead of fabricating 0kg.\nfunction buildHevyWeight(set: IHevyStructSet): IWeight | undefined {\n  if (set.weight_lbs != null) {\n    return Weight_build(set.weight_lbs, \"lb\");\n  }\n  if (set.weight_kg != null) {\n    return Weight_build(set.weight_kg, \"kg\");\n  }\n  return undefined;\n}\n\nfunction validateHevyRecord(record: IHevyRecord & { row: number }): IImportRowError | undefined {\n  if (parseHevyDate(record.start_time) == null) {\n    return {\n      row: record.row,\n      column: \"start_time\",\n      value: `${record.start_time ?? \"\"}`,\n      message: `\"${record.start_time ?? \"\"}\" is not a valid date`,\n    };\n  }\n  for (const column of [\"reps\", \"weight_lbs\", \"weight_kg\"] as const) {\n    const value = record[column];\n    if (value != null && `${value}`.trim() !== \"\" && isNaN(Number(`${value}`))) {\n      return { row: record.row, column, value: `${value}`, message: `\"${value}\" is not a number` };\n    }\n  }\n  return undefined;\n}\n\nfunction collectHevyWarnings(record: IHevyRecord & { row: number }, warnings: IImportRowError[]): void {\n  const startTs = parseHevyDate(record.start_time);\n  if (startTs != null && ImportUtils_isSuspiciousTimestamp(startTs)) {\n    warnings.push({\n      row: record.row,\n      column: \"start_time\",\n      value: `${record.start_time}`,\n      message: `\"${record.start_time}\" looks like an implausible workout date`,\n    });\n  }\n  for (const [column, unit] of [\n    [\"weight_lbs\", \"lb\"],\n    [\"weight_kg\", \"kg\"],\n  ] as const) {\n    const value = parseHevyNumber(record[column]);\n    if (value != null && ImportUtils_isSuspiciousWeight(value, unit)) {\n      warnings.push({\n        row: record.row,\n        column,\n        value: `${record[column]}`,\n        message: `${value} ${unit} looks like an implausible weight`,\n      });\n    }\n  }\n  const reps = parseHevyNumber(record.reps);\n  if (reps != null && ImportUtils_isSuspiciousReps(reps)) {\n    warnings.push({\n      row: record.row,\n      column: \"reps\",\n      value: `${record.reps}`,\n      message: `${reps} looks like an implausible rep count`,\n    });\n  }\n}\n\nexport function ImportFromHevy_convertHevyCsvToHistoryRecords(hevyCsvRaw: string, settings: ISettings): IImportResult {\n  const parsed = Papa.parse<IHevyRecord>(hevyCsvRaw, { header: true, skipEmptyLines: true });\n  const kind = ImportUtils_detectCsvKind((parsed.meta.fields ?? []).map((f) => `${f}`));\n  if (kind === \"liftosaur\") {\n    throw new ImportFileError(\n      'This looks like a Liftosaur history CSV. Use \"Import history from CSV file\" in Settings instead.'\n    );\n  }\n  if (kind !== \"hevy\") {\n    throw new ImportFileError(\"This doesn't look like a Hevy workout export CSV.\");\n  }\n  const hevyRecords = parsed.data.map((record, i) => ({ ...record, row: i + 2 }));\n  if (hevyRecords.length === 0) {\n    throw new ImportFileError(\"The file has no workout rows\");\n  }\n\n  const errors: IImportRowError[] = [];\n  const warnings: IImportRowError[] = [];\n  const validRecords: (IHevyRecord & { row: number })[] = [];\n  for (const record of hevyRecords) {\n    const error = validateHevyRecord(record);\n    if (error) {\n      errors.push(error);\n    } else {\n      collectHevyWarnings(record, warnings);\n      validRecords.push(record);\n    }\n  }\n  if (validRecords.length < hevyRecords.length / 2) {\n    throw new ImportFileError(\n      `${errors.length} of ${hevyRecords.length} rows failed to parse - this doesn't look like a valid Hevy export.`\n    );\n  }\n\n  const hevyWorkouts: IHevyStruct[] = [];\n  for (const workout of ObjectUtils_values(CollectionUtils_groupByKey(validRecords, \"start_time\"))) {\n    if (!workout) {\n      continue;\n    }\n    const hevyExercises: IHevyStructExercise[] = [];\n    const exercises = CollectionUtils_groupByKey(workout, \"exercise_title\");\n    for (const exercise of ObjectUtils_values(exercises)) {\n      if (!exercise) {\n        continue;\n      }\n      const warmupSets = exercise.filter((record) => record.set_type === \"warmup\");\n      warmupSets.sort((a, b) => (a.set_index ?? 0) - (b.set_index ?? 0));\n      const sets = exercise.filter((record) => record.set_type !== \"warmup\");\n      sets.sort((a, b) => (a.set_index ?? 0) - (b.set_index ?? 0));\n      hevyExercises.push({\n        exercise_title: exercise[0].exercise_title,\n        exercise_notes: (exercise[0].exercise_notes || \"\").replace(/\\\\n/g, \"\\n\"),\n        warmupSets: warmupSets.map((set) => ({\n          weight_lbs: parseHevyNumber(set.weight_lbs),\n          weight_kg: parseHevyNumber(set.weight_kg),\n          reps: parseHevyNumber(set.reps) ?? 1,\n        })),\n        sets: sets.map((set) => ({\n          weight_lbs: parseHevyNumber(set.weight_lbs),\n          weight_kg: parseHevyNumber(set.weight_kg),\n          reps: parseHevyNumber(set.reps) ?? 1,\n        })),\n      });\n    }\n    hevyWorkouts.push({\n      title: workout[0].title,\n      start_time: workout[0].start_time,\n      end_time: workout[0].end_time,\n      description: (workout[0].description || \"\").replace(/\\\\n/g, \"\\n\"),\n      exercises: hevyExercises,\n      row: workout[0].row,\n    });\n  }\n\n  const customExercises: Record<string, ICustomExercise> = {};\n  const backMap: Partial<Record<string, string>> = {};\n  const historyRecords = hevyWorkouts.map((hevyWorkout): IHistoryRecord | undefined => {\n    const startTs = parseHevyDate(hevyWorkout.start_time)!;\n    const endTs = parseHevyDate(hevyWorkout.end_time);\n    if (hevyWorkout.end_time && endTs == null) {\n      warnings.push({\n        row: hevyWorkout.row,\n        column: \"end_time\",\n        value: hevyWorkout.end_time,\n        message: `\"${hevyWorkout.end_time}\" is not a valid date, using the start time instead`,\n      });\n    }\n    const entries = hevyWorkout.exercises.map((record, index) => {\n      let exerciseNameAndEquipment = exerciseMapping[record.exercise_title];\n      let exerciseId: string;\n      if (!exerciseNameAndEquipment) {\n        // Key by the sanitized name so titles differing only in stripped characters\n        // (e.g. \"Cable Row (Wide)\" vs \"Cable Row Wide\") merge into one custom exercise.\n        const sanitizedTitle = Exercise_sanitizeName(record.exercise_title);\n        const maybeExerciseId = backMap[sanitizedTitle];\n        if (!maybeExerciseId) {\n          exerciseId = UidFactory_generateUid(8);\n          backMap[sanitizedTitle] = exerciseId;\n          customExercises[exerciseId] = {\n            vtype: \"custom_exercise\",\n            id: exerciseId,\n            name: sanitizedTitle,\n            isDeleted: false,\n            meta: {\n              bodyParts: [],\n              targetMuscles: [],\n              synergistMuscles: [],\n              sortedEquipment: [],\n            },\n            types: [],\n          };\n        } else {\n          exerciseId = maybeExerciseId;\n        }\n        exerciseNameAndEquipment = [sanitizedTitle, undefined];\n      } else {\n        const [exerciseName] = exerciseNameAndEquipment;\n        const exercise = Exercise_findByName(exerciseName, {})!;\n        exerciseId = exercise.id;\n      }\n      const [, equipment] = exerciseNameAndEquipment;\n      const isUnilateral = Exercise_getIsUnilateral({ id: exerciseId, equipment: equipment }, settings);\n      return {\n        vtype: \"history_entry\" as const,\n        id: Progress_getEntryId({ id: exerciseId, equipment }, UidFactory_generateUid(3)),\n        exercise: { id: exerciseId, equipment: equipment },\n        index,\n        warmupSets: record.warmupSets.map((set, i) => {\n          const weight = buildHevyWeight(set);\n          return {\n            vtype: \"set\" as const,\n            id: UidFactory_generateUid(6),\n            index: i,\n            originalWeight: weight,\n            weight,\n            completedWeight: weight,\n            reps: set.reps ?? 1,\n            completedReps: set.reps ?? 1,\n            completedRepsLeft: isUnilateral ? set.reps : undefined,\n            isUnilateral,\n            isCompleted: true,\n            isAmrap: false,\n            timestamp: startTs,\n          };\n        }),\n        sets: record.sets.map((set, i) => {\n          const weight = buildHevyWeight(set);\n          return {\n            vtype: \"set\" as const,\n            id: UidFactory_generateUid(6),\n            index: i,\n            weight,\n            originalWeight: weight,\n            completedWeight: weight,\n            reps: set.reps ?? 1,\n            completedReps: set.reps ?? 1,\n            completedRepsLeft: isUnilateral ? set.reps : undefined,\n            isAmrap: false,\n            timestamp: startTs,\n            isUnilateral,\n            isCompleted: true,\n          };\n        }),\n        notes: record.exercise_notes,\n      };\n    });\n    const historyRecord: IHistoryRecord = {\n      vtype: \"history_record\",\n      id: History_generateId(endTs ?? startTs),\n      date: new Date(endTs ?? startTs).toISOString(),\n      startTime: startTs,\n      endTime: endTs ?? startTs,\n      dayName: hevyWorkout.title,\n      programName: \"Hevy\",\n      programId: \"hevy\",\n      day: 1,\n      notes: hevyWorkout.description,\n      entries,\n    };\n    const validation = Storage_validate(historyRecord, VHistoryRecord, \"historyRecord\");\n    if (!validation.success) {\n      errors.push({\n        row: hevyWorkout.row,\n        message: `Workout \"${hevyWorkout.start_time}\" failed validation: ${validation.error.join(\"; \")}`,\n      });\n      return undefined;\n    }\n    return historyRecord;\n  });\n\n  return { historyRecords: CollectionUtils_compact(historyRecords), customExercises, errors, warnings };\n}\n","import {\n  IHistoryRecord,\n  ICustomExercise,\n  ISettings,\n  IHistoryEntry,\n  availableMuscles,\n  IMuscle,\n  IExerciseType,\n  VHistoryRecord,\n} from \"../types\";\nimport Papa from \"papaparse\";\nimport { CollectionUtils_groupByKey, CollectionUtils_compact, CollectionUtils_sortBy } from \"./collection\";\nimport { ObjectUtils_values } from \"./object\";\nimport { Exercise_findByNameAndEquipment, Exercise_getIsUnilateral, Exercise_sanitizeName } from \"../models/exercise\";\nimport { Weight_build } from \"../models/weight\";\nimport { StringUtils_dashcase } from \"./string\";\nimport { Progress_getEntryId } from \"../models/progress\";\nimport { UidFactory_generateUid } from \"./generator\";\nimport { History_generateId } from \"../models/history\";\nimport { Storage_validate } from \"../models/storage\";\nimport {\n  IImportResult,\n  IImportRowError,\n  ImportFileError,\n  ImportUtils_detectCsvKind,\n  ImportUtils_isSuspiciousReps,\n  ImportUtils_isSuspiciousTimestamp,\n  ImportUtils_isSuspiciousWeight,\n} from \"./importTypes\";\n\nconst columns = [\n  \"workoutDateTime\",\n  \"program\",\n  \"dayname\",\n  \"exercise\",\n  \"isWarmupSet\",\n  \"requiredReps\",\n  \"completedReps\",\n  \"isAmrap\",\n  \"rpe\",\n  \"completedRpe\",\n  \"logRpe\",\n  \"weightValue\",\n  \"weightUnit\",\n  \"completedWeightValue\",\n  \"completedWeightUnit\",\n  \"askWeight\",\n  \"completedRepsTime\",\n  \"targetMuscles\",\n  \"synergistMuscles\",\n  \"notes\",\n  \"completedRepsLeft\",\n  \"setTimer\",\n  \"isOverflowSetTimer\",\n  \"completedSetTimer\",\n  \"completedSetTimerLeft\",\n] as const;\ntype IColumn = (typeof columns)[number];\n\ninterface ILiftosaurRecord extends Record<IColumn, string> {\n  row: number;\n}\n\nconst numericColumns: IColumn[] = [\n  \"requiredReps\",\n  \"completedReps\",\n  \"rpe\",\n  \"completedRpe\",\n  \"weightValue\",\n  \"completedWeightValue\",\n  \"completedRepsLeft\",\n  \"setTimer\",\n  \"completedSetTimer\",\n  \"completedSetTimerLeft\",\n];\nconst unitColumns: IColumn[] = [\"weightUnit\", \"completedWeightUnit\"];\n\nfunction parseTimestamp(date: string): number | undefined {\n  try {\n    const value = new Date(date).getTime();\n    return isNaN(value) ? undefined : value;\n  } catch (e) {\n    return undefined;\n  }\n}\n\nfunction validateRecord(record: ILiftosaurRecord): IImportRowError | undefined {\n  if (parseTimestamp(record.workoutDateTime) == null) {\n    return {\n      row: record.row,\n      column: \"Workout DateTime\",\n      value: record.workoutDateTime,\n      message: `\"${record.workoutDateTime}\" is not a valid date`,\n    };\n  }\n  for (const column of numericColumns) {\n    const value = record[column];\n    if (value && isNaN(Number(value))) {\n      return { row: record.row, column, value, message: `\"${value}\" is not a number` };\n    }\n  }\n  for (const column of unitColumns) {\n    const value = record[column];\n    if (value && value !== \"kg\" && value !== \"lb\") {\n      return { row: record.row, column, value, message: `\"${value}\" is not a valid unit (expected \"kg\" or \"lb\")` };\n    }\n  }\n  return undefined;\n}\n\nfunction collectWarnings(record: ILiftosaurRecord, warnings: IImportRowError[]): void {\n  const timestamp = parseTimestamp(record.workoutDateTime);\n  if (timestamp != null && ImportUtils_isSuspiciousTimestamp(timestamp)) {\n    warnings.push({\n      row: record.row,\n      column: \"Workout DateTime\",\n      value: record.workoutDateTime,\n      message: `\"${record.workoutDateTime}\" looks like an implausible workout date`,\n    });\n  }\n  for (const [valueColumn, unitColumn] of [\n    [\"weightValue\", \"weightUnit\"],\n    [\"completedWeightValue\", \"completedWeightUnit\"],\n  ] as const) {\n    const value = record[valueColumn];\n    const unit = record[unitColumn];\n    if (value && (unit === \"kg\" || unit === \"lb\") && ImportUtils_isSuspiciousWeight(Number(value), unit)) {\n      warnings.push({\n        row: record.row,\n        column: valueColumn,\n        value,\n        message: `${value} ${unit} looks like an implausible weight`,\n      });\n    }\n  }\n  for (const column of [\"requiredReps\", \"completedReps\"] as const) {\n    const value = record[column];\n    if (value && !isNaN(Number(value)) && ImportUtils_isSuspiciousReps(Number(value))) {\n      warnings.push({ row: record.row, column, value, message: `${value} looks like an implausible rep count` });\n    }\n  }\n  if (record.completedRepsTime && parseTimestamp(record.completedRepsTime) == null) {\n    warnings.push({\n      row: record.row,\n      column: \"Completed Reps Time\",\n      value: record.completedRepsTime,\n      message: `\"${record.completedRepsTime}\" is not a valid time, using the workout date instead`,\n    });\n  }\n}\n\nexport function ImportFromLiftosaur_convertLiftosaurCsvToHistoryRecords(\n  liftosaurCsvRaw: string,\n  settings: ISettings\n): IImportResult {\n  const parsed = Papa.parse<string[]>(liftosaurCsvRaw, { skipEmptyLines: true });\n  const rows = parsed.data;\n  if (rows.length < 2) {\n    throw new ImportFileError(\"The file has no workout rows\");\n  }\n  const kind = ImportUtils_detectCsvKind(rows[0].map((h) => `${h}`));\n  if (kind === \"hevy\") {\n    throw new ImportFileError(\n      'This looks like a Hevy export. Use \"Import history from other apps\" in Settings instead.'\n    );\n  }\n  if (kind !== \"liftosaur\") {\n    throw new ImportFileError(\n      \"This doesn't look like a Liftosaur history CSV - the header row doesn't match the format of \" +\n        '\"Export history to CSV file\".'\n    );\n  }\n\n  const liftosaurRecords = rows.slice(1).map<ILiftosaurRecord>((cells, i) => {\n    const record = { row: i + 2 } as ILiftosaurRecord;\n    columns.forEach((column, columnIndex) => {\n      record[column] = `${cells[columnIndex] ?? \"\"}`;\n    });\n    return record;\n  });\n\n  const errors: IImportRowError[] = [];\n  const warnings: IImportRowError[] = [];\n  const validRecords: ILiftosaurRecord[] = [];\n  for (const record of liftosaurRecords) {\n    const error = validateRecord(record);\n    if (error) {\n      errors.push(error);\n    } else {\n      collectWarnings(record, warnings);\n      validRecords.push(record);\n    }\n  }\n  if (validRecords.length < liftosaurRecords.length / 2) {\n    throw new ImportFileError(\n      `${errors.length} of ${liftosaurRecords.length} rows failed to parse - this doesn't look like a valid Liftosaur history CSV.`\n    );\n  }\n\n  const groupedRecords = CollectionUtils_groupByKey(validRecords, \"workoutDateTime\");\n  const customExercises: Record<string, ICustomExercise> = {};\n  const historyRecords = CollectionUtils_compact(ObjectUtils_values(groupedRecords)).map((records) => {\n    const rawEntries = CollectionUtils_compact(ObjectUtils_values(CollectionUtils_groupByKey(records, \"exercise\")));\n    const entries = rawEntries.map((rawSets, index) => {\n      const firstSet = rawSets[0];\n      const exerciseName = Exercise_sanitizeName(firstSet.exercise || \"Unknown\");\n      const exercise = Exercise_findByNameAndEquipment(exerciseName, settings.exercises);\n      let exerciseId: string;\n      let exerciseEquipment: string | undefined = undefined;\n      if (exercise) {\n        exerciseId = exercise.id;\n        exerciseEquipment = exercise.equipment;\n      } else {\n        const id = StringUtils_dashcase(exerciseName || \"exercise\");\n        customExercises[id] = {\n          vtype: \"custom_exercise\",\n          id,\n          name: exerciseName,\n          isDeleted: false,\n          meta: {\n            bodyParts: [],\n            targetMuscles: ((firstSet.targetMuscles || \"\")\n              .split(\",\")\n              .filter((m) => availableMuscles.indexOf(m as IMuscle) !== -1) || []) as IMuscle[],\n            synergistMuscles: ((firstSet.synergistMuscles || \"\")\n              .split(\",\")\n              .filter((m) => availableMuscles.indexOf(m as IMuscle) !== -1) || []) as IMuscle[],\n            sortedEquipment: [],\n          },\n          types: [],\n        };\n        exerciseId = id;\n      }\n\n      const rawWarmupSets = rawSets.filter((set) => set.isWarmupSet === \"1\");\n      const rawWorkoutSets = rawSets.filter((set) => set.isWarmupSet !== \"1\");\n      const exerciseType: IExerciseType = { id: exerciseId, equipment: exerciseEquipment };\n      const isUnilateral = Exercise_getIsUnilateral(exerciseType, settings);\n\n      const buildSet = (set: ILiftosaurRecord, i: number): IHistoryEntry[\"sets\"][number] => {\n        const weight =\n          set.weightValue && set.weightUnit\n            ? Weight_build(Number(set.weightValue), set.weightUnit as \"kg\" | \"lb\")\n            : undefined;\n        const completedReps = set.completedReps ? Number(set.completedReps) : undefined;\n        const completedWeight =\n          set.completedWeightValue && set.completedWeightUnit\n            ? Weight_build(Number(set.completedWeightValue), set.completedWeightUnit as \"kg\" | \"lb\")\n            : undefined;\n        const completedRpe = set.completedRpe ? Number(set.completedRpe) : undefined;\n        const optionalNumber = (value: string): number | undefined => (value ? Number(value) : undefined);\n        const completedRepsLeft = optionalNumber(set.completedRepsLeft) ?? (isUnilateral ? completedReps : undefined);\n        return {\n          vtype: \"set\",\n          id: UidFactory_generateUid(6),\n          index: i,\n          reps: set.requiredReps ? Number(set.requiredReps) : undefined,\n          completedReps: completedReps,\n          isAmrap: set.isAmrap === \"1\",\n          rpe: set.rpe ? Number(set.rpe) : undefined,\n          completedRpe: completedRpe,\n          completedRepsLeft,\n          setTimer: optionalNumber(set.setTimer),\n          isOverflowSetTimer: set.isOverflowSetTimer === \"1\" || undefined,\n          completedSetTimer: optionalNumber(set.completedSetTimer),\n          completedSetTimerLeft: optionalNumber(set.completedSetTimerLeft),\n          isUnilateral,\n          logRpe: set.logRpe === \"1\",\n          weight: weight,\n          originalWeight: weight,\n          completedWeight: completedWeight,\n          askWeight: set.askWeight === \"1\",\n          label: \"\",\n          timestamp: parseTimestamp(set.completedRepsTime) ?? parseTimestamp(set.workoutDateTime),\n          isCompleted: completedReps != null || completedWeight != null || completedRpe != null,\n        };\n      };\n\n      const entry: IHistoryEntry = {\n        vtype: \"history_entry\",\n        id: Progress_getEntryId(exerciseType, UidFactory_generateUid(3)),\n        exercise: exerciseType,\n        index,\n        warmupSets: rawWarmupSets.map(buildSet),\n        sets: rawWorkoutSets.map(buildSet),\n        notes: firstSet.notes,\n      };\n      return entry;\n    });\n    const firstRecord = records[0];\n    let endTime = CollectionUtils_sortBy(\n      CollectionUtils_compact(entries.flatMap((e) => e.warmupSets.concat(e.sets)).map((s) => s.timestamp)).map((t) => ({\n        t,\n      })),\n      \"t\",\n      true\n    )[0]?.t;\n    const startTime = parseTimestamp(firstRecord.workoutDateTime)!;\n    if (endTime == null || endTime < startTime) {\n      endTime = startTime;\n    }\n    const historyRecord: IHistoryRecord = {\n      vtype: \"history_record\",\n      date: new Date(startTime).toISOString(),\n      day: 1,\n      dayName: `${firstRecord.dayname}` || \"Workout\",\n      programName: `${firstRecord.program}` || \"CSV Import\",\n      intervals: [[startTime, endTime]],\n      entries,\n      id: History_generateId(endTime ?? startTime),\n      programId: StringUtils_dashcase(firstRecord.program || \"csv\"),\n      startTime: startTime,\n      dayInWeek: 1,\n      endTime: endTime,\n      notes: \"\",\n    };\n    const validation = Storage_validate(historyRecord, VHistoryRecord, \"historyRecord\");\n    if (!validation.success) {\n      errors.push({\n        row: firstRecord.row,\n        message: `Workout \"${firstRecord.workoutDateTime}\" failed validation: ${validation.error.join(\"; \")}`,\n      });\n      return undefined;\n    }\n    return historyRecord;\n  });\n\n  return { historyRecords: CollectionUtils_compact(historyRecords), customExercises, errors, warnings };\n}\n","import { IEither } from \"./types\";\nimport { Encoder_decode } from \"./encoder\";\nimport { Service } from \"../api/service\";\nimport { UrlUtils_build } from \"./url\";\n\nexport interface IImportLinkData {\n  decoded: string;\n  source?: string;\n  userid?: string;\n}\n\nexport async function ImportFromLink_importFromLink(\n  link: string,\n  client: Window[\"fetch\"]\n): Promise<IEither<{ decoded: string; source?: string; userid?: string }, string[]>> {\n  let url: URL;\n  try {\n    url = UrlUtils_build(link);\n  } catch (e) {\n    return { success: false, error: [\"Invalid link\"] };\n  }\n  let base64 = url.searchParams.get(\"data\") || undefined;\n  let source = url.searchParams.get(\"s\") || undefined;\n  let userid = url.searchParams.get(\"u\") || undefined;\n  let decoded;\n  if (base64) {\n    decoded = await getDecodedData(base64);\n  } else {\n    const [type, id] = url.pathname.split(\"/\").filter((p) => p);\n    if ((type === \"p\" || type === \"n\") && id) {\n      const service = new Service(client);\n      const result = await service.getDataFromShortUrl(type, id);\n      base64 = result.data;\n      source = source || result.s;\n      userid = userid || result.u;\n      if (base64) {\n        decoded = await getDecodedData(base64);\n      }\n    }\n  }\n  if (decoded) {\n    if (decoded.success) {\n      return { success: true, data: { decoded: decoded.data, source, userid } };\n    } else {\n      return decoded;\n    }\n  } else {\n    return { success: false, error: [\"No data found\"] };\n  }\n}\n\nasync function getDecodedData(base64: string): Promise<IEither<string, string[]>> {\n  try {\n    const decoded = await Encoder_decode(base64);\n    return { success: true, data: decoded };\n  } catch (e) {\n    return { success: false, error: [\"Error decoding the link\"] };\n  }\n}\n","import { ICustomExercise, IHistoryRecord } from \"../types\";\n\nexport interface IImportRowError {\n  row: number;\n  column?: string;\n  value?: string;\n  message: string;\n}\n\nexport interface IImportResult {\n  historyRecords: IHistoryRecord[];\n  customExercises: Record<string, ICustomExercise>;\n  errors: IImportRowError[];\n  warnings: IImportRowError[];\n}\n\nexport class ImportFileError extends Error {}\n\nexport function ImportUtils_customExercisesForRecords(\n  records: IHistoryRecord[],\n  customExercises: Record<string, ICustomExercise>\n): Record<string, ICustomExercise> {\n  const referencedIds = new Set<string>();\n  for (const record of records) {\n    for (const entry of record.entries) {\n      referencedIds.add(entry.exercise.id);\n    }\n  }\n  const result: Record<string, ICustomExercise> = {};\n  for (const id of Object.keys(customExercises)) {\n    if (referencedIds.has(id)) {\n      result[id] = customExercises[id];\n    }\n  }\n  return result;\n}\n\nconst hevySignatureHeaders = [\"start_time\", \"exercise_title\", \"set_type\"];\nconst liftosaurSignatureHeaders = [\"workout datetime\", \"exercise\", \"is warmup set?\"];\n\nexport function ImportUtils_detectCsvKind(headers: string[]): \"hevy\" | \"liftosaur\" | \"unknown\" {\n  const normalized = headers.map((h) => h.trim().toLowerCase());\n  if (hevySignatureHeaders.every((h) => normalized.includes(h))) {\n    return \"hevy\";\n  }\n  if (liftosaurSignatureHeaders.every((h) => normalized.includes(h))) {\n    return \"liftosaur\";\n  }\n  return \"unknown\";\n}\n\nconst maxWeightLb = 3000;\nconst maxReps = 1000;\nconst minTimestamp = Date.UTC(2000, 0, 1);\n\nexport function ImportUtils_isSuspiciousWeight(value: number, unit: \"kg\" | \"lb\"): boolean {\n  const lb = unit === \"kg\" ? value * 2.2046 : value;\n  return lb < 0 || lb > maxWeightLb;\n}\n\nexport function ImportUtils_isSuspiciousReps(value: number): boolean {\n  return value < 0 || value > maxReps;\n}\n\nexport function ImportUtils_isSuspiciousTimestamp(ts: number): boolean {\n  return ts < minTimestamp || ts > Date.now() + 24 * 60 * 60 * 1000;\n}\n\nexport interface IImportSummary {\n  workoutCount: number;\n  minStartTime?: number;\n  maxStartTime?: number;\n  customExerciseNames: string[];\n  duplicateIds: Set<number>;\n}\n\nexport function ImportUtils_summarize(result: IImportResult, existingHistory: IHistoryRecord[]): IImportSummary {\n  let minStartTime: number | undefined;\n  let maxStartTime: number | undefined;\n  for (const record of result.historyRecords) {\n    if (minStartTime == null || record.startTime < minStartTime) {\n      minStartTime = record.startTime;\n    }\n    if (maxStartTime == null || record.startTime > maxStartTime) {\n      maxStartTime = record.startTime;\n    }\n  }\n  return {\n    workoutCount: result.historyRecords.length,\n    minStartTime,\n    maxStartTime,\n    customExerciseNames: Object.values(result.customExercises)\n      .map((e) => e.name)\n      .sort(),\n    duplicateIds: ImportUtils_findDuplicates(result.historyRecords, existingHistory),\n  };\n}\n\nconst duplicateToleranceMs = 60 * 1000;\n\nexport function ImportUtils_findDuplicates(records: IHistoryRecord[], existingHistory: IHistoryRecord[]): Set<number> {\n  const existingStartTimes = existingHistory.map((r) => r.startTime).sort((a, b) => a - b);\n  const duplicates = new Set<number>();\n  for (const record of records) {\n    let lo = 0;\n    let hi = existingStartTimes.length - 1;\n    while (lo <= hi) {\n      const mid = Math.floor((lo + hi) / 2);\n      const diff = existingStartTimes[mid] - record.startTime;\n      if (Math.abs(diff) <= duplicateToleranceMs) {\n        duplicates.add(record.id);\n        break;\n      } else if (diff < 0) {\n        lo = mid + 1;\n      } else {\n        hi = mid - 1;\n      }\n    }\n  }\n  return duplicates;\n}\n","export function InAppReview_request(): Promise<void> {\n  return Promise.resolve();\n}\n","import { lg } from \"./posthog\";\n\ntype ITransactionMode = \"readonly\" | \"readwrite\";\n\nfunction runTransaction<T>(\n  mode: ITransactionMode,\n  operation: (objectStore: IDBObjectStore) => IDBRequest<T>\n): Promise<T> {\n  return new Promise<T>(async (resolve, reject) => {\n    const db = await IndexedDBUtils_initialize();\n    if (db == null) {\n      lg(\"ls-indexeddb-empty\");\n      return;\n    }\n    const transaction = db.transaction(\"keyval\", mode);\n    const objectStore = transaction.objectStore(\"keyval\");\n\n    let result: T;\n\n    try {\n      const request = operation(objectStore);\n\n      request.addEventListener(\"success\", () => {\n        result = request.result;\n      });\n\n      request.addEventListener(\"error\", (e) => {\n        const error = (e.target as IDBRequest)?.error;\n        reject(error || new Error(\"IndexedDB request failed\"));\n      });\n    } catch (e) {\n      db.close();\n      reject(e);\n      return;\n    }\n\n    transaction.addEventListener(\"complete\", () => {\n      db.close();\n      resolve(result);\n    });\n\n    transaction.addEventListener(\"error\", (e) => {\n      db.close();\n      const error = (e.target as IDBTransaction)?.error;\n      reject(error || new Error(\"IndexedDB transaction failed\"));\n    });\n\n    transaction.addEventListener(\"abort\", (e) => {\n      db.close();\n      const error = (e.target as IDBTransaction)?.error;\n      reject(error || new Error(\"IndexedDB transaction aborted\"));\n    });\n  });\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction logIndexedDBError(e: any): void {\n  const errorDetails = {\n    name: e?.name,\n    message: e?.message,\n    stack: e?.stack,\n  };\n  lg(\"ls-indexeddb-error\", { json: JSON.stringify(e), details: JSON.stringify(errorDetails) });\n  console.error(\"IndexedDB error:\", e);\n}\n\nasync function withTransaction<T>(\n  mode: ITransactionMode,\n  operation: (objectStore: IDBObjectStore) => IDBRequest<T>\n): Promise<T | undefined> {\n  try {\n    return await runTransaction(mode, operation);\n  } catch (e) {\n    logIndexedDBError(e);\n    return undefined;\n  }\n}\n\nexport function IndexedDBUtils_initializeForSafari(): Promise<void> {\n  return new Promise((resolve) => {\n    if (!window.indexedDB) {\n      window.location.reload();\n      resolve();\n      return;\n    }\n    const connection = window.indexedDB.open(\"keyval-store\");\n    const handler = (): void => {\n      if (connection.result != null) {\n        connection.result.close();\n      }\n      resolve();\n    };\n    connection.addEventListener(\"success\", handler);\n    connection.addEventListener(\"error\", handler);\n    connection.addEventListener(\"blocked\", handler);\n    connection.addEventListener(\"upgradeneeded\", (event) => {\n      const request = event.target as IDBOpenDBRequest;\n      if (request?.result) {\n        request.result.createObjectStore(\"keyval\");\n      }\n    });\n  });\n}\n\nexport function IndexedDBUtils_initialize(): Promise<IDBDatabase | undefined> {\n  return new Promise((resolve, reject) => {\n    if (!window.indexedDB) {\n      window.location.reload();\n      reject(new Error(\"IndexedDB is not available\"));\n      return;\n    }\n    const connection = window.indexedDB.open(\"keyval-store\");\n    connection.addEventListener(\"success\", (event) => {\n      const request = event.target as IDBOpenDBRequest;\n      resolve(request.result);\n    });\n    connection.addEventListener(\"error\", (event) => {\n      reject(event);\n    });\n    connection.addEventListener(\"blocked\", (event) => {\n      reject(new Error(\"IndexedDB initialization blocked\"));\n    });\n    connection.addEventListener(\"upgradeneeded\", (event) => {\n      const request = event.target as IDBOpenDBRequest;\n      request.result.createObjectStore(\"keyval\");\n    });\n  });\n}\n\nexport async function IndexedDBUtils_getAllKeys(): Promise<string[]> {\n  const result = await withTransaction(\"readonly\", (objectStore) => {\n    const keys = objectStore.getAllKeys();\n    return keys as IDBRequest<string[]>;\n  });\n  if (result != null) {\n    return result;\n  } else {\n    return Promise.resolve([]);\n  }\n}\n\nexport async function IndexedDBUtils_get(key: string): Promise<unknown> {\n  const userid =\n    typeof window !== \"undefined\"\n      ? (window.tempUserId ?? (key.startsWith(\"liftosaur_\") ? key.replace(\"liftosaur_\", \"\") : undefined))\n      : undefined;\n  const result = await withTransaction(\"readonly\", (objectStore) => objectStore.getAll(key)).then(\n    (results: unknown[] | undefined) => {\n      return results?.[0];\n    }\n  );\n  lg(\"ls-indexeddb-get\", { key }, undefined, userid);\n  return result;\n}\n\nexport async function IndexedDBUtils_remove(key: string): Promise<void> {\n  await withTransaction(\"readwrite\", (objectStore) => objectStore.delete(key));\n}\n\nexport async function IndexedDBUtils_set(key: string, value?: string): Promise<void> {\n  await withTransaction(\"readwrite\", (objectStore) => {\n    return objectStore.put(value, key);\n  });\n}\n\n// Unlike IndexedDBUtils_set, REJECTS on transaction failure (e.g. quota abort): the\n// persistence layer's reference-diff cache must only record refs after a confirmed write,\n// otherwise a silently failed shard write would be skipped as \"unchanged\" forever.\nexport async function IndexedDBUtils_setMany(pairs: Array<[string, string | undefined]>): Promise<void> {\n  if (pairs.length === 0) {\n    return;\n  }\n  try {\n    // Single transaction so concurrent tabs always observe a consistent set of shards\n    await runTransaction(\"readwrite\", (objectStore) => {\n      let lastRequest: IDBRequest | undefined;\n      for (const [key, value] of pairs) {\n        lastRequest = value != null ? objectStore.put(value, key) : objectStore.delete(key);\n      }\n      return lastRequest!;\n    });\n  } catch (e) {\n    logIndexedDBError(e);\n    throw e;\n  }\n}\n","import { IAuthToken, IKeychain } from \"./keychain\";\n\nexport type { IAuthToken } from \"./keychain\";\n\nexport class Keychain implements IKeychain {\n  public async setAuthToken(_auth: IAuthToken): Promise<void> {\n    return;\n  }\n\n  public async getAuthToken(): Promise<IAuthToken | undefined> {\n    return undefined;\n  }\n\n  public async clearAuthToken(): Promise<void> {\n    return;\n  }\n}\n","import { Exercise_get, Exercise_getIsUnilateral, Exercise_fullName } from \"../models/exercise\";\nimport { ExerciseImageUtils_url } from \"../models/exerciseImage\";\nimport { Program_evaluate, Program_getProgramExercise } from \"../models/program\";\nimport { ProgramExercise_hasUserPromptedVars } from \"../models/programExercise\";\nimport { Progress_shouldShowAmrapModal, Progress_getNextEntry, Progress_getActiveSetTimer } from \"../models/progress\";\nimport { Reps_setsStatus, Reps_findNextSetIndex } from \"../models/set\";\nimport { Weight_calculatePlates, Weight_print, Weight_formatOneSide } from \"../models/weight\";\nimport { IPlannerProgramExercise } from \"../pages/planner/models/types\";\nimport { IHistoryRecord, IProgram, ISettings, ISubscription } from \"../types\";\nimport { TimedSet_toView } from \"../models/timedSet\";\nimport { n } from \"./math\";\nimport {\n  ILiveActivityEntry,\n  ILiveActivityGetReady,\n  ILiveActivitySetTimer,\n  ILiveActivityState,\n} from \"./liveActivityState\";\nimport { INativeEffect } from \"../models/nativeEffects\";\nimport { Subscriptions_hasSubscription } from \"./subscriptions\";\nimport { UrlUtils_build } from \"./url\";\n\ndeclare const __HOST__: string;\n\nexport type {\n  ILiveActivitySet,\n  ILiveActivityEntry,\n  ILiveActivityRest,\n  ILiveActivitySetTimer,\n  ILiveActivityGetReady,\n  ILiveActivityState,\n} from \"./liveActivityState\";\n\nexport function LiveActivityManager_getLiveActivityEntry(\n  progress: IHistoryRecord,\n  entryIndex: number | undefined,\n  setIndex: number | undefined,\n  programExercise: IPlannerProgramExercise | undefined,\n  settings: ISettings\n): ILiveActivityEntry | undefined {\n  if (entryIndex == null || setIndex == null) {\n    return undefined;\n  }\n  const entry = progress.entries[entryIndex];\n  if (!entry) {\n    return undefined;\n  }\n  const exercise = Exercise_get(entry.exercise, settings.exercises);\n  const allSets = [...entry.warmupSets, ...entry.sets];\n  const set = allSets[setIndex];\n  if (setIndex === -1 || !set) {\n    return undefined;\n  }\n  const isNextSetWarmup = setIndex < entry.warmupSets.length;\n  const weightForPlates = set.completedWeight ?? set.weight;\n  const plates = weightForPlates\n    ? Weight_calculatePlates(weightForPlates, settings, weightForPlates.unit || settings.units, entry.exercise)\n    : undefined;\n  let exerciseImageUrl = ExerciseImageUtils_url(exercise, \"small\", settings);\n  if (exerciseImageUrl) {\n    exerciseImageUrl = UrlUtils_build(exerciseImageUrl, __HOST__)?.toString();\n  }\n  const hasUserPromptedVars = !!(programExercise && ProgramExercise_hasUserPromptedVars(programExercise));\n  const canCompleteFromLiveActivity = !Progress_shouldShowAmrapModal(\n    entry,\n    isNextSetWarmup ? setIndex : setIndex - entry.warmupSets.length,\n    isNextSetWarmup ? \"warmup\" : \"workout\",\n    hasUserPromptedVars,\n    settings\n  );\n\n  const isUnilateral = Exercise_getIsUnilateral(entry.exercise, settings);\n  const currentReps =\n    isUnilateral && set.completedRepsLeft != null\n      ? `${set.completedRepsLeft}/${set.completedReps ?? set.reps ?? 0}`\n      : (set.completedReps ?? set.reps);\n  const currentWeight = set.completedWeight ?? set.weight;\n  const state: ILiveActivityEntry = {\n    exerciseName: Exercise_fullName(exercise, settings),\n    exerciseImageUrl,\n    currentSet: setIndex + 1,\n    totalSets: allSets.length,\n    entryIndex: progress.entries.indexOf(entry),\n    setIndex,\n    completedSets: allSets.map((s, i) => ({\n      status: Reps_setsStatus([s]),\n      isWarmup: i < entry.warmupSets.length,\n    })),\n    targetReps: set.reps\n      ? `${set.minReps != null ? `${n(set.minReps)}-` : \"\"}${n(set.reps)}${set.isAmrap ? \"+\" : \"\"}`\n      : undefined,\n    targetWeight: set.weight ? `${Weight_print(set.weight)}${set.askWeight ? \"+\" : \"\"}` : undefined,\n    targetRPE: set.rpe != null ? `${n(set.rpe)}${set.logRpe ? \"+\" : \"\"}` : undefined,\n    targetTimer: set.timer != null ? set.timer.toString() : undefined,\n    plates:\n      (plates?.plates || []).length > 0 ? Weight_formatOneSide(settings, plates?.plates || [], entry.exercise) : \"None\",\n    currentWeight: currentWeight != null ? Weight_print(currentWeight) : undefined,\n    currentReps: currentReps != null ? currentReps.toString() : undefined,\n    isWarmup: isNextSetWarmup,\n    canCompleteFromLiveActivity,\n    isSetTimer: set.setTimer != null,\n  };\n  return state;\n}\n\nexport function LiveActivityManager_updateProgressLiveActivity(\n  effects: INativeEffect[],\n  program: IProgram | undefined,\n  progress: IHistoryRecord,\n  settings: ISettings,\n  subscription: ISubscription | undefined,\n  entryIndex: number | undefined,\n  setIndex: number | undefined,\n  restTimer: number | undefined,\n  restTimerSince: number | undefined\n): void {\n  const entry = entryIndex != null ? progress.entries[entryIndex] : undefined;\n  const evaluatedProgram = program ? Program_evaluate(program, settings) : undefined;\n  const programExercise =\n    evaluatedProgram && entry\n      ? Program_getProgramExercise(progress.day, evaluatedProgram, entry.programExerciseId)\n      : undefined;\n  LiveActivityManager_updateLiveActivity(\n    effects,\n    progress,\n    entryIndex,\n    setIndex,\n    restTimer,\n    restTimerSince,\n    programExercise,\n    settings,\n    subscription\n  );\n}\n\nexport function LiveActivityManager_updateLiveActivity(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  entryIndex: number | undefined,\n  setIndex: number | undefined,\n  restTimer: number | undefined,\n  restTimerSince: number | undefined,\n  programExercise: IPlannerProgramExercise | undefined,\n  settings: ISettings,\n  subscription?: ISubscription\n): void {\n  if (!subscription || !Subscriptions_hasSubscription(subscription)) {\n    return;\n  }\n  let liveActivityEntry = LiveActivityManager_getLiveActivityEntry(\n    progress,\n    entryIndex,\n    setIndex,\n    programExercise,\n    settings\n  );\n\n  // A running set timer takes over the live activity entirely: it shows the timed set's\n  // count-up clock and \"complete the set\" buttons instead of the next-exercise/rest layout.\n  const view = TimedSet_toView(progress, Progress_getActiveSetTimer(progress), settings);\n  let setTimerState: ILiveActivitySetTimer | undefined;\n  let getReadyState: ILiveActivityGetReady | undefined;\n  if (view != null) {\n    liveActivityEntry =\n      LiveActivityManager_getLiveActivityEntry(\n        progress,\n        view.entryIndex,\n        view.currentSet - 1,\n        programExercise,\n        settings\n      ) ?? liveActivityEntry;\n    if (view.stage === \"work\") {\n      setTimerState = {\n        setTimerSince: view.startedAt,\n        setTimer: view.targetSeconds,\n        isOverflow: view.isOverflow,\n        isCompleted: view.isCompleted,\n        entryIndex: view.entryIndex,\n        setIndex: view.setIndex,\n        restTimer: view.restSeconds,\n        phaseId: view.phaseId,\n        side: view.side,\n        recordedThisSide: view.recordedThisSide,\n      };\n    } else {\n      getReadyState = {\n        getReadySince: view.startedAt,\n        getReady: view.getReadySeconds,\n        entryIndex: view.entryIndex,\n        setIndex: view.setIndex,\n        setTimer: view.targetSeconds,\n        phaseId: view.phaseId,\n        side: view.side,\n      };\n    }\n  }\n\n  const restingSet =\n    progress.timerEntryIndex != null && progress.timerSetIndex != null\n      ? progress.entries[progress.timerEntryIndex]?.sets[progress.timerSetIndex]\n      : undefined;\n  const attributes: ILiveActivityState = {\n    workoutStartTimestamp: progress.startTime,\n    historyEntryState: liveActivityEntry,\n    setTimer: setTimerState,\n    getReady: getReadyState,\n    restTimer:\n      setTimerState == null && getReadyState == null && progress.timerSince != null && progress.timer != null\n        ? {\n            restTimerSince: restTimerSince ?? progress.timerSince,\n            restTimer: restTimer ?? progress.timer,\n            isAuto: !!restingSet?.auto,\n          }\n        : undefined,\n    ignoreDoNotDisturb: !!settings.ignoreDoNotDisturb,\n  };\n  effects.push({ type: \"updateLiveActivity\", state: attributes });\n}\n\nexport function LiveActivityManager_updateLiveActivityForNextEntry(\n  effects: INativeEffect[],\n  progress: IHistoryRecord,\n  entryIndex: number,\n  mode: \"workout\" | \"warmup\",\n  programExercise: IPlannerProgramExercise | undefined,\n  settings: ISettings,\n  subscription?: ISubscription\n): void {\n  const currentEntry = progress.entries[entryIndex];\n  if (!currentEntry) {\n    return;\n  }\n  const nextEntry = Progress_getNextEntry(progress, currentEntry, mode, true);\n  const nextEntryIndex = nextEntry ? progress.entries.indexOf(nextEntry) : undefined;\n  const nextSetIndex = nextEntry ? Reps_findNextSetIndex(nextEntry) : undefined;\n  LiveActivityManager_updateLiveActivity(\n    effects,\n    progress,\n    nextEntryIndex,\n    nextSetIndex,\n    progress.timer,\n    progress.timerSince,\n    programExercise,\n    settings,\n    subscription\n  );\n}\n","import RB from \"rollbar\";\nimport { Platform } from \"react-native\";\nimport { UrlUtils_build } from \"./url\";\nimport { IAffiliateData } from \"../types\";\nimport { IEventPayload } from \"../api/service\";\nimport { EventManager_isAvailable, EventManager_log } from \"./eventManager\";\n\ndeclare let Rollbar: RB;\ndeclare let __API_HOST__: string;\ndeclare let __COMMIT_HASH__: string;\n\nexport function LogUtils_log(\n  user: string,\n  action: string,\n  affiliates: Partial<Record<string, IAffiliateData>>,\n  subscriptions: string[],\n  referrer?: string,\n  landingPage?: string,\n  detail?: string\n): void {\n  const platform = {\n    name: Platform.OS,\n    version: \"RN\",\n  };\n\n  if (EventManager_isAvailable()) {\n    const event: IEventPayload = {\n      type: \"log\",\n      userId: user,\n      timestamp: Date.now(),\n      action,\n      detail,\n      affiliates,\n      subscriptions,\n      referrer,\n      landingPage,\n      platform,\n      commithash: typeof __COMMIT_HASH__ !== \"undefined\" ? __COMMIT_HASH__ : \"unknown\",\n    };\n    EventManager_log(JSON.stringify(event));\n    return;\n  }\n\n  const url = UrlUtils_build(`${__API_HOST__}/api/log`);\n  try {\n    fetch(url.toString(), {\n      method: \"POST\",\n      body: JSON.stringify({ user, action, detail, affiliates, platform, subscriptions, referrer, landingPage }),\n      credentials: \"include\",\n    });\n  } catch (e) {\n    if (Rollbar != null) {\n      Rollbar.error(\"Log failed\");\n    }\n  }\n}\n","export function MathUtils_round(value: number, to: number): number {\n  return MathUtils_roundFloat(Math.round(value / to) * to, 4);\n}\n\nexport function MathUtils_roundTo05(value: number): number {\n  return MathUtils_round(value, 0.5);\n}\n\nexport function MathUtils_roundTo005(value: number): number {\n  return MathUtils_round(value, 0.05);\n}\n\nexport function MathUtils_roundTo0005(value: number): number {\n  return MathUtils_round(value, 0.005);\n}\n\nexport function MathUtils_roundTo00005(value: number): number {\n  return MathUtils_round(value, 0.0005);\n}\n\nexport function MathUtils_roundTo000005(value: number): number {\n  return MathUtils_round(value, 0.00005);\n}\n\nexport function MathUtils_roundFloat(value: number, precision: number): number {\n  if (typeof value !== \"number\" || isNaN(value)) {\n    return 0;\n  }\n  return +value.toFixed(precision);\n}\n\nexport function MathUtils_applyOp(a: number, b: number, opr: \"+=\" | \"-=\" | \"*=\" | \"/=\" | \"=\"): number {\n  if (opr === \"=\") {\n    return b;\n  } else if (opr === \"+=\") {\n    return a + b;\n  } else if (opr === \"-=\") {\n    return a - b;\n  } else if (opr === \"*=\") {\n    return MathUtils_roundTo005(a * b);\n  } else {\n    return MathUtils_roundTo005(a / b);\n  }\n}\n\nexport function MathUtils_clamp(value: number, min?: number, max?: number): number {\n  if (min != null && max != null) {\n    return Math.max(min, Math.min(max, value));\n  } else if (min != null) {\n    return Math.max(min, value);\n  } else if (max != null) {\n    return Math.min(max, value);\n  } else {\n    return value;\n  }\n}\n\nexport function MathUtils_toWord(num?: number): string | undefined {\n  if (num == null) {\n    return undefined;\n  }\n  return [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\", \"eleven\", \"twelve\"][\n    num\n  ];\n}\n\nexport function MathUtils_parse(value?: string): number | undefined {\n  if (value == null) {\n    return undefined;\n  }\n  const num = Number(value);\n  return isNaN(num) ? undefined : num;\n}\n\n// Non-US iOS/Android keyboards use \",\" as the decimal separator, but Number()/parseFloat() only accept \".\"\nexport function MathUtils_normalizeNumStr(value: string): string {\n  return value.replace(/,/g, \".\");\n}\n\nexport function n(value: number, precision: number = 2): string {\n  return `${MathUtils_roundFloat(value, precision)}`;\n}\n\nexport function MathUtils_formatCompact(value: number, fractionDigits: number = 1): string {\n  if (!isFinite(value)) {\n    return `${value}`;\n  }\n  const abs = Math.abs(value);\n  const sign = value < 0 ? \"-\" : \"\";\n  const trim = (num: number): string => {\n    const fixed = num.toFixed(fractionDigits);\n    return fixed.replace(/\\.?0+$/, \"\");\n  };\n  if (abs >= 1e9) {\n    return `${sign}${trim(abs / 1e9)}b`;\n  }\n  if (abs >= 1e6) {\n    return `${sign}${trim(abs / 1e6)}m`;\n  }\n  if (abs >= 1e3) {\n    return `${sign}${trim(abs / 1e3)}k`;\n  }\n  return `${sign}${trim(abs)}`;\n}\n","import type { Service } from \"../api/service\";\nimport { RestTimerAlert_request } from \"../models/restTimerAlert\";\nimport { INativeTimerStartParams, ITimerBridge } from \"./timerBridge\";\nimport { WebPush_subscription } from \"./webPush\";\n\nexport type { INativeTimerStartParams } from \"./timerBridge\";\n\nexport class TimerBridge implements ITimerBridge {\n  private chain: Promise<void> = Promise.resolve();\n\n  constructor(private readonly service?: Service) {}\n\n  public startTimer(params: INativeTimerStartParams): void {\n    this.enqueue(async (service) => {\n      const subscription = await WebPush_subscription();\n      await service.putRestTimerPush(RestTimerAlert_request(params, subscription, Date.now()));\n    });\n  }\n\n  public stopTimer(): void {\n    this.enqueue((service) => service.putRestTimerPush(RestTimerAlert_request(undefined, undefined, Date.now())));\n  }\n\n  public playSound(_volume: number, _vibration: boolean, _sound: string): boolean {\n    return false;\n  }\n\n  public subscribeOnScheduled(_handler: () => void): () => void {\n    return () => {};\n  }\n\n  public scheduleReminder(_duration: number, _title: string, _body: string): void {}\n\n  public cancelReminder(): void {}\n\n  private enqueue(task: (service: Service) => Promise<void>): void {\n    const service = this.service;\n    if (service == null) {\n      return;\n    }\n    this.chain = this.chain.then(() => task(service)).catch(() => undefined);\n  }\n}\n","import { INativeWatchAuth, INativeWatchEvent, IWatchBridge } from \"./watchBridge\";\n\nexport type { INativeWatchAuth, INativeWatchEvent } from \"./watchBridge\";\n\nexport class WatchBridge implements IWatchBridge {\n  public isAvailable(): boolean {\n    return false;\n  }\n\n  public hasWatchApp(): boolean {\n    return false;\n  }\n\n  public subscribeToWatchEvents(_handler: (event: INativeWatchEvent) => void): () => void {\n    return () => {};\n  }\n\n  public sendStorageToWatch(_filteredStorageJson: string): void {}\n\n  public sendAuthToWatch(_auth: INativeWatchAuth): void {}\n\n  public sendStorageAckToWatch(_historyIds: string[]): void {}\n\n  public sendNoAuthToWatch(): void {}\n\n  public sendClearAuthToWatch(): void {}\n\n  public clearWatchStorage(): void {}\n\n  public requestWatchLogs(): Promise<string> {\n    return Promise.resolve(\"\");\n  }\n\n  public isWatchPaired(): boolean {\n    return false;\n  }\n}\n","import { ILiveActivityState } from \"./liveActivityState\";\nimport { INativeWorkoutBridgeLiveActivityAction, IWorkoutBridge } from \"./workoutBridge\";\nimport { ITimerBridge } from \"./timerBridge\";\n\nexport type { INativeWorkoutBridgeLiveActivityAction } from \"./workoutBridge\";\n\nexport class WorkoutBridge implements IWorkoutBridge {\n  constructor(_timer?: ITimerBridge) {}\n\n  public pauseWorkout(): void {}\n\n  public resumeWorkout(_opts: { reminder: number; isStart: boolean; hasSubscription: boolean }): void {}\n\n  public finishWorkout(): void {}\n\n  public discardWorkout(): void {}\n\n  public updateLiveActivity(_state: ILiveActivityState): void {}\n\n  public subscribeToLiveActivityActions(_handler: (event: INativeWorkoutBridgeLiveActivityAction) => void): () => void {\n    return () => {};\n  }\n\n  public dispose(): void {}\n}\n","import { IDesiredWorkout, INativeWorkoutMirroringEvent, IWorkoutMirroring } from \"./workoutMirroring\";\n\nexport type { INativeWorkoutMirroringEvent } from \"./workoutMirroring\";\n\nexport class WorkoutMirroring implements IWorkoutMirroring {\n  public setDesiredWorkout(_desired: IDesiredWorkout): void {}\n\n  public subscribe(_handler: (event: INativeWorkoutMirroringEvent) => void): () => void {\n    return () => {};\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { CollectionUtils_compact, CollectionUtils_remove } from \"./collection\";\nimport { INonNullObject } from \"./types\";\n\nexport function ObjectUtils_keys<T extends {}>(obj: T): Array<keyof T> {\n  return Object.keys(obj) as Array<keyof T>;\n}\n\nexport function ObjectUtils_values<T extends {}>(obj: T): Array<T[keyof T]> {\n  if (\"values\" in Object) {\n    return Object.values(obj);\n  } else {\n    return ObjectUtils_keys(obj).map((key) => obj[key]);\n  }\n}\n\nexport function ObjectUtils_entries<T extends {}>(obj: T): Array<[keyof T, T[keyof T]]> {\n  return ObjectUtils_keys(obj).map((key) => [key, obj[key]]);\n}\n\nexport function ObjectUtils_entriesNonnull<T extends {}>(obj: T): Array<[keyof T, NonNullable<T[keyof T]>]> {\n  return CollectionUtils_compact(ObjectUtils_keys(obj)).map((key) => [key, obj[key] as NonNullable<T[keyof T]>]);\n}\n\nexport function ObjectUtils_isEmpty<T extends {}>(obj: T): boolean {\n  return ObjectUtils_keys(obj).length === 0;\n}\n\nexport function ObjectUtils_isNotEmpty<T extends {}>(obj: T): boolean {\n  return !ObjectUtils_isEmpty(obj);\n}\n\nexport function ObjectUtils_isEqual<T extends Record<string, any>>(\n  obj1: T,\n  obj2: T,\n  ignoreKeys: string[] = []\n): boolean {\n  if (obj1 === obj2) {\n    return true;\n  }\n  // Create a stack for comparing objects\n  const stack: Array<[any, any]> = [[obj1, obj2]];\n\n  while (stack.length > 0) {\n    // Pop a pair of items from the stack\n    const [currentObj1, currentObj2] = stack.pop()!;\n    if (currentObj1 === currentObj2) {\n      continue;\n    }\n\n    // Check if both are objects\n    if (\n      typeof currentObj1 !== \"object\" ||\n      typeof currentObj2 !== \"object\" ||\n      currentObj1 == null ||\n      currentObj2 == null\n    ) {\n      if (currentObj1 !== currentObj2) {\n        return false;\n      }\n      continue;\n    }\n\n    // Get keys of both objects\n    const keys1 = Object.keys(currentObj1);\n    const keys2 = Object.keys(currentObj2);\n\n    // Iterate over keys and add nested objects to the stack\n    for (const key of new Set([...keys1, ...keys2])) {\n      if (ignoreKeys.indexOf(key) !== -1) {\n        continue;\n      }\n      stack.push([currentObj1[key], currentObj2[key]]);\n    }\n  }\n\n  // If all checks pass, the objects are equal\n  return true;\n}\n\nexport function ObjectUtils_diffPaths<T extends object>(obj1original: T, obj2original: T): string[] {\n  const result: string[] = [];\n  const queue: {\n    obj1: any;\n    obj2: any;\n    path: string;\n  }[] = [{ obj1: obj1original, obj2: obj2original, path: \"\" }];\n\n  while (queue.length > 0) {\n    const { obj1, obj2, path } = queue.shift()!;\n\n    if (obj1 === obj2) {\n      continue;\n    }\n\n    if (Object(obj1) !== obj1 || Object(obj2) !== obj2) {\n      if (obj1 !== obj2) {\n        // console.log(\"diffPath\", path, obj1, obj2);\n        result.push(path);\n      }\n      continue;\n    }\n\n    for (const key of new Set([...Object.keys(obj1), ...Object.keys(obj2)])) {\n      const newPath = path ? `${path}.${key}` : key;\n      queue.push({ obj1: obj1[key], obj2: obj2[key], path: newPath });\n    }\n  }\n\n  return result;\n}\n\nexport function ObjectUtils_diff<T extends Record<string, any>>(oldObj: T, newObj: T): T {\n  const chKeys = ObjectUtils_changedKeys(oldObj, newObj);\n  const result: Partial<T> = {};\n  for (const key of ObjectUtils_keys(chKeys)) {\n    const value = chKeys[key];\n    if (value === \"add\" || value === \"update\") {\n      result[key] = newObj[key];\n    }\n  }\n  return result as any;\n}\n\nexport function ObjectUtils_changedKeys<T extends {}>(\n  oldObj: T,\n  newObj: T,\n  eq: (a: any, b: any) => boolean = (a, b) => a === b\n): Partial<Record<keyof T, \"delete\" | \"update\" | \"add\">> {\n  let oldKeys = ObjectUtils_keys(oldObj);\n  const newKeys = ObjectUtils_keys(newObj);\n  const changes: Partial<Record<keyof T, \"delete\" | \"update\" | \"add\">> = {};\n\n  for (const newKey of newKeys) {\n    if (newObj[newKey] != null && oldObj[newKey] == null) {\n      changes[newKey] = \"add\";\n    } else if (newObj[newKey] == null && oldObj[newKey] != null) {\n      changes[newKey] = \"delete\";\n    } else if (newObj[newKey] != null && oldObj[newKey] != null) {\n      if (!eq(newObj[newKey], oldObj[newKey])) {\n        changes[newKey] = \"update\";\n      }\n    }\n    oldKeys = CollectionUtils_remove(oldKeys, newKey);\n  }\n  for (const oldKey of oldKeys) {\n    if (oldObj[oldKey] != null && newObj[oldKey] == null) {\n      changes[oldKey] = \"delete\";\n    }\n  }\n  return changes;\n}\n\nexport function ObjectUtils_mapValues<U, V, T extends Record<any, U>>(\n  obj: T,\n  fn: (x: U, k: keyof T) => V\n): Record<keyof T, V> {\n  return ObjectUtils_keys(obj).reduce<Record<keyof T, V>>(\n    (memo, k) => {\n      memo[k] = fn(obj[k], k);\n      return memo;\n    },\n    {} as Record<keyof T, V>\n  );\n}\n\nexport function ObjectUtils_filter<T extends {}>(obj: T, cb: (key: keyof T, value: T[keyof T]) => boolean): Partial<T> {\n  const filteredKeys = ObjectUtils_keys(obj).filter((key) => {\n    const value = obj[key];\n    return cb(key, value);\n  });\n  return filteredKeys.reduce<Partial<T>>((memo, k) => {\n    memo[k] = obj[k];\n    return memo;\n  }, {});\n}\n\nexport function ObjectUtils_compact<T extends Record<string, any>>(obj: T): INonNullObject<T> {\n  return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== null)) as INonNullObject<T>;\n}\n\nexport function ObjectUtils_sortedByKeys<T extends {}>(\n  obj: T,\n  sortedKeys: Array<keyof T>\n): Array<[keyof T, T[keyof T]]> {\n  const arr: Array<[keyof T, T[keyof T]]> = [];\n  const copyObj = { ...obj };\n  for (const k of sortedKeys) {\n    arr.push([k, copyObj[k]]);\n    delete copyObj[k];\n  }\n  for (const k of ObjectUtils_keys(copyObj)) {\n    arr.push([k, copyObj[k]]);\n  }\n  return arr;\n}\n\nexport function ObjectUtils_pick<T extends {}, K extends keyof T, U extends Pick<T, K>>(obj: T, theKeys: K[]): U {\n  return ObjectUtils_keys(obj).reduce<U>((memo, key: any) => {\n    if (theKeys.indexOf(key) !== -1) {\n      (memo as any)[key] = (obj as any)[key];\n    }\n    return memo;\n  }, {} as any);\n}\n\nexport function ObjectUtils_omit<T extends {}, K extends keyof T, U extends Omit<T, K>>(\n  obj: T,\n  theKeys: readonly K[]\n): U {\n  return ObjectUtils_keys(obj).reduce<U>((memo, key: any) => {\n    if (theKeys.indexOf(key) === -1) {\n      (memo as any)[key] = (obj as any)[key];\n    }\n    return memo;\n  }, {} as any);\n}\n\nexport function ObjectUtils_combinedKeys<T extends Record<string, unknown>, U extends Record<string, unknown>>(\n  obj1: T,\n  obj2: U\n): Array<keyof T | keyof U> {\n  return Array.from(new Set(ObjectUtils_keys(obj1).concat(ObjectUtils_keys(obj2) as any)));\n}\n\nexport function ObjectUtils_findMaxValue<T extends Record<string, number | undefined>>(obj: T): number {\n  return ObjectUtils_keys(obj).reduce<number>((memo, key) => {\n    const v = obj[key];\n    if (v != null && v > memo) {\n      memo = v || 0;\n    }\n    return memo;\n  }, 0);\n}\n\nexport function ObjectUtils_findKeyByExpression<T extends Record<string, any>>(\n  obj: T,\n  expression: (key: keyof T, value: T[keyof T]) => boolean\n): keyof T | undefined {\n  for (const key of ObjectUtils_keys(obj)) {\n    if (expression(key, obj[key])) {\n      return key;\n    }\n  }\n  return undefined;\n}\n\n// A faithful `structuredClone` polyfill. We use it on every platform rather than the native\n// structuredClone because Hermes (React Native) doesn't ship one, and routing everything\n// through a single implementation keeps web and native byte-for-byte identical.\n//\n// It matches structuredClone's two defining properties that JSON.parse(JSON.stringify())\n// gets wrong, and that caused real crashes here:\n//   - Shared references are preserved, not duplicated. An evaluated program inlines the same\n//     reused exercise into hundreds of exercises; JSON.stringify expands that shared graph\n//     into a multi-hundred-MB string and throws \"String length exceeds limit\". Preserving the\n//     sharing keeps the clone the same size as the original.\n//   - Reference cycles are preserved instead of throwing.\n// It also preserves the values structuredClone keeps but JSON drops/mangles: NaN/Infinity,\n// `undefined`, Date/RegExp/Map/Set/ArrayBuffer/typed arrays.\n//\n// One deliberate deviation: native structuredClone THROWS a DataCloneError on functions and\n// symbols; we drop them instead (objects skip the key, arrays/maps/sets get `undefined`), the\n// way the previous JSON-based clone tolerated them. Uncommon container types structuredClone\n// also handles (Error, Blob/File, boxed primitives) are cloned as plain objects, since they\n// never appear in the state we clone.\nexport function ObjectUtils_clone<T>(obj: T): T {\n  return structuredCloneLike(obj, new WeakMap());\n}\n\nfunction structuredCloneLike<T>(obj: T, seen: WeakMap<object, unknown>): T {\n  if (obj === null) {\n    return obj;\n  }\n  const type = typeof obj;\n  if (type !== \"object\") {\n    // strings, numbers (NaN/Infinity/-0 preserved), booleans, bigint and undefined pass through.\n    return (type === \"function\" || type === \"symbol\" ? undefined : obj) as T;\n  }\n\n  const value = obj as object;\n  const existing = seen.get(value);\n  if (existing !== undefined) {\n    return existing as T;\n  }\n\n  if (value instanceof Date) {\n    const result = new Date(value.getTime());\n    seen.set(value, result);\n    return result as unknown as T;\n  }\n  if (value instanceof RegExp) {\n    const result = new RegExp(value.source, value.flags);\n    seen.set(value, result);\n    return result as unknown as T;\n  }\n  if (value instanceof ArrayBuffer) {\n    const result = value.slice(0);\n    seen.set(value, result);\n    return result as unknown as T;\n  }\n  if (ArrayBuffer.isView(value)) {\n    const view = value as ArrayBufferView & { length: number };\n    const buffer = structuredCloneLike(view.buffer, seen) as ArrayBuffer;\n    const result =\n      value instanceof DataView\n        ? new DataView(buffer, view.byteOffset, view.byteLength)\n        : new (value.constructor as new (b: ArrayBuffer, o: number, l: number) => ArrayBufferView)(\n            buffer,\n            view.byteOffset,\n            view.length\n          );\n    seen.set(value, result);\n    return result as unknown as T;\n  }\n  if (value instanceof Map) {\n    const result = new Map();\n    seen.set(value, result);\n    for (const [k, v] of value) {\n      result.set(structuredCloneLike(k, seen), structuredCloneLike(v, seen));\n    }\n    return result as unknown as T;\n  }\n  if (value instanceof Set) {\n    const result = new Set();\n    seen.set(value, result);\n    for (const v of value) {\n      result.add(structuredCloneLike(v, seen));\n    }\n    return result as unknown as T;\n  }\n  if (Array.isArray(value)) {\n    const result = new Array(value.length);\n    seen.set(value, result);\n    for (let i = 0; i < value.length; i += 1) {\n      if (i in value) {\n        result[i] = structuredCloneLike(value[i], seen);\n      }\n    }\n    return result as unknown as T;\n  }\n\n  const result: Record<string, unknown> = {};\n  seen.set(value, result);\n  for (const key of Object.keys(value)) {\n    const item = (value as Record<string, unknown>)[key];\n    if (typeof item === \"function\" || typeof item === \"symbol\") {\n      continue;\n    }\n    result[key] = structuredCloneLike(item, seen);\n  }\n  return result as unknown as T;\n}\n\nexport function ObjectUtils_fromArray<K extends string, V>(arr: Array<[K, V]>): Record<K, V> {\n  return arr.reduce<Record<K, V>>(\n    (memo, [key, value]) => {\n      memo[key] = value;\n      return memo;\n    },\n    {} as Record<K, V>\n  );\n}\n","import { PerfSampling_decide, IPerfSamplingDecision } from \"./perfSampling\";\n\ndeclare let __DEV__: boolean;\ndeclare const __PERF__: boolean | undefined;\n\n// Decided once per session and memoized so a session never flips tier mid-run.\nlet cached: IPerfSamplingDecision | undefined;\n\nfunction decision(): IPerfSamplingDecision {\n  if (cached != null) {\n    return cached;\n  }\n  if (__DEV__ || (typeof __PERF__ !== \"undefined\" && __PERF__ === true)) {\n    cached = { tier1: true, tier2: true };\n  } else {\n    cached = PerfSampling_decide();\n  }\n  return cached;\n}\n\n// Tier 1: always-on scorecard (aggregated in memory, one lg() event per screen visit).\nexport function PerfEnabled_tier1(): boolean {\n  return decision().tier1;\n}\n\n// Tier 2: raw per-event trace streamed to the network. Strict subset of Tier 1.\nexport function PerfEnabled_tier2(): boolean {\n  return decision().tier2;\n}\n\nexport function PerfEnabled_isEnabled(): boolean {\n  const d = decision();\n  return d.tier1 || d.tier2;\n}\n","export function PerfNavTracker_recordTap(_targetScreen: string): void {}\nexport function PerfNavTracker_handleStateChange(_currentScreen: string | undefined): void {}\n","import { JSX, ReactNode, useLayoutEffect, useRef } from \"react\";\nimport { PerfProbe_isTarget, PerfProbe_onCommit } from \"./perfSetCompleteProbe\";\n\n// TEMP DIAGNOSTIC (remove after investigation). Measures each wrapped subtree's render+commit\n// contribution per tap WITHOUT React <Profiler>: the production RN renderer (ReactFabric-prod) strips\n// Profiler onRender/timing entirely, so a Profiler-based probe silently emits nothing for the\n// release-build users we need data from. Instead we bracket render-start → post-commit via\n// useLayoutEffect (runs synchronously after the host tree commits, in every build). Coarser than\n// Profiler's actualDuration, but enough to tell one big commit from a re-render storm from a\n// mount-on-navigation.\nexport function PerfProbeSubtree(props: { id: string; children: ReactNode }): JSX.Element {\n  // isTarget is stable for the whole session, so this branch never flips mid-session (no hook-count\n  // churn) — non-target users render children directly with zero added hooks or overhead.\n  if (!PerfProbe_isTarget()) {\n    return <>{props.children}</>;\n  }\n  return <PerfProbeSubtreeActive id={props.id}>{props.children}</PerfProbeSubtreeActive>;\n}\n\nfunction PerfProbeSubtreeActive(props: { id: string; children: ReactNode }): JSX.Element {\n  const renderStartRef = useRef(0);\n  renderStartRef.current = Date.now();\n  const mountedRef = useRef(false);\n  useLayoutEffect(() => {\n    const durationMs = Date.now() - renderStartRef.current;\n    const phase = mountedRef.current ? \"update\" : \"mount\";\n    mountedRef.current = true;\n    PerfProbe_onCommit(props.id, phase, durationMs);\n  });\n  return <>{props.children}</>;\n}\n","import { JSX, Profiler, ProfilerOnRenderCallback, ReactNode } from \"react\";\nimport { PerfEnabled_tier2 } from \"./perfEnabled\";\n\ninterface IPerfProfilerProps {\n  id: string;\n  onRender: ProfilerOnRenderCallback;\n  children: ReactNode;\n}\n\n// Profiler adds timing overhead to its entire subtree on every commit. Only the Tier-2 raw-trace\n// cohort (~1% + dev) needs it, so for everyone else render the children directly. The tier decision\n// is memoized per session, so this never toggles mid-session (no mount/unmount churn).\nexport function PerfProfiler(props: IPerfProfilerProps): JSX.Element {\n  if (!PerfEnabled_tier2()) {\n    return <>{props.children}</>;\n  }\n  return (\n    <Profiler id={props.id} onRender={props.onRender}>\n      {props.children}\n    </Profiler>\n  );\n}\n","export interface IPerfSamplingDecision {\n  tier1: boolean;\n  tier2: boolean;\n}\n\n// OTA-tunable: these are the single source of truth for how many production sessions report perf\n// data. Changing them ships in a normal JS bundle (no store release). Tier 2 is a strict subset of\n// Tier 1 (same uniform draw), so every raw-trace session also produces a scorecard.\n// Temporarily 1.0 for an initial characterization bake (full long-tail resolution). Drop back to\n// ~0.1–0.25 for steady-state monitoring once the shape of the problem is known.\nconst TIER1_RATE = 1.0;\n// Tier 2 (raw per-event stream to /api/_dev/perf) is deferred until that backend handler exists, so\n// it is disabled in production. Dev still gets it via the __DEV__ override in perfEnabled.ts. Set\n// this to e.g. 0.01 once the endpoint is built.\nconst TIER2_RATE = 0;\nconst KILL_SWITCH = false;\n\nexport function PerfSampling_decideFor(unit: number): IPerfSamplingDecision {\n  if (KILL_SWITCH) {\n    return { tier1: false, tier2: false };\n  }\n  return { tier1: unit < TIER1_RATE, tier2: unit < TIER2_RATE };\n}\n\nexport function PerfSampling_decide(): IPerfSamplingDecision {\n  return PerfSampling_decideFor(Math.random());\n}\n","import type { IPerfFrameWindow, IPerfRecentAction } from \"./perfTracker\";\n\nexport function PerfScorecard_setContextProvider(_provider: () => Record<string, number>): void {}\nexport function PerfScorecard_recordFrameWindow(_window: IPerfFrameWindow): void {}\nexport function PerfScorecard_recordLongTask(\n  _durationMs: number,\n  _screen: string | undefined,\n  _recent?: IPerfRecentAction[]\n): void {}\nexport function PerfScorecard_recordAction(_label: string, _durationMs: number): void {}\nexport function PerfScorecard_flush(): void {}\nexport function PerfScorecard_onScreenChange(_screen: string | undefined): void {}\n","import { lg } from \"./posthog\";\n\n// TEMP DIAGNOSTIC (remove after investigation): attributes the per-tap workout-screen commit cost\n// for two specific users who reported multi-second lag on set completion. Everything here is a no-op\n// unless the running device's tempUserId is in this list, so it's safe to ship in a normal bundle.\nconst TARGET_USER_IDS = [\"wtudhpsaxn\", \"xfuonfcjme\"];\n\n// A tap fires a burst of commits (the completion itself + the sync loading lifecycle). We only record\n// commits while a tap window is open (opened by PerfProbe_onAction) so mount/nav/timer commits that\n// no tap caused don't create noise, then flush once the burst goes quiet.\nconst FLUSH_QUIET_MS = 400;\n// A window with no commits (a tap that caused no render) still flushes so it can't latch onto a later,\n// unrelated commit.\nconst WINDOW_MAX_MS = 2500;\n\ntype IProfilerPhase = \"mount\" | \"update\" | \"nested-update\";\n\ninterface ISubtreeAgg {\n  commits: number;\n  sumMs: number;\n  maxMs: number;\n  mounts: number;\n  updates: number;\n}\n\nlet byId: Record<string, ISubtreeAgg> = {};\n// Which components actually re-rendered this tap (their body ran → memo did NOT bail), and the set of\n// prop keys whose reference changed on that render — i.e. what defeated the memo.\nlet renderCounts: Record<string, number> = {};\nlet renderChanges: Record<string, Set<string>> = {};\nlet triggerLabel: string | undefined;\nlet triggerReducerMs = 0;\nlet windowActive = false;\nlet flushTimer: ReturnType<typeof setTimeout> | undefined;\n\nexport function PerfProbe_isTarget(): boolean {\n  const uid =\n    (typeof globalThis !== \"undefined\" ? (globalThis as { tempUserId?: string }).tempUserId : undefined) ??\n    (typeof window !== \"undefined\" ? window.tempUserId : undefined);\n  return uid != null && TARGET_USER_IDS.indexOf(uid) >= 0;\n}\n\n// True only for a target user AND while a tap window is open — so the (potentially non-trivial) deep\n// prop diffing in usePerfWhyRender never runs for idle/background re-renders.\nexport function PerfProbe_isRecording(): boolean {\n  return windowActive && PerfProbe_isTarget();\n}\n\n// Opens a tap window for user-initiated actions only (not the sync/loading UpdateStates), so the burst\n// is labeled by the tap that started it and pre-tap commits are excluded.\nexport function PerfProbe_onAction(label: string, reducerMs: number): void {\n  if (!PerfProbe_isTarget()) {\n    return;\n  }\n  if (windowActive) {\n    // Two taps before the previous window drained — flush the old one under its own label first.\n    flush();\n  }\n  triggerLabel = label;\n  triggerReducerMs = reducerMs;\n  windowActive = true;\n  scheduleFlush(WINDOW_MAX_MS);\n}\n\nexport function PerfProbe_onCommit(id: string, phase: IProfilerPhase, durationMs: number): void {\n  if (!PerfProbe_isTarget() || !windowActive) {\n    return;\n  }\n  const agg = byId[id] ?? (byId[id] = { commits: 0, sumMs: 0, maxMs: 0, mounts: 0, updates: 0 });\n  agg.commits += 1;\n  agg.sumMs += durationMs;\n  agg.maxMs = Math.max(agg.maxMs, durationMs);\n  if (phase === \"mount\") {\n    agg.mounts += 1;\n  } else {\n    agg.updates += 1;\n  }\n  scheduleFlush(FLUSH_QUIET_MS);\n}\n\n// Called from usePerfWhyRender's post-commit useLayoutEffect inside a memoized component — so it only\n// fires when the memo did NOT bail and the render actually committed. changedKeys names the prop refs\n// that differed from the previous committed render (empty = identical props, i.e. a context/state/\n// forced re-render rather than a prop change).\nexport function PerfProbe_recordRender(component: string, changedKeys: string[]): void {\n  if (!PerfProbe_isTarget() || !windowActive) {\n    return;\n  }\n  renderCounts[component] = (renderCounts[component] ?? 0) + 1;\n  const set = renderChanges[component] ?? (renderChanges[component] = new Set<string>());\n  if (changedKeys.length === 0) {\n    set.add(\"<none>\");\n  } else {\n    for (const k of changedKeys) {\n      set.add(k);\n    }\n  }\n  // No scheduleFlush here on purpose: each instrumented component sits inside a PerfProbeSubtree whose\n  // own post-commit useLayoutEffect already schedules the flush for this same commit.\n}\n\nfunction scheduleFlush(ms: number): void {\n  if (flushTimer != null) {\n    clearTimeout(flushTimer);\n  }\n  flushTimer = setTimeout(flush, ms);\n}\n\nfunction flush(): void {\n  if (flushTimer != null) {\n    clearTimeout(flushTimer);\n  }\n  flushTimer = undefined;\n  windowActive = false;\n  const ids = Object.keys(byId);\n  const renderComps = Object.keys(renderCounts);\n  if (ids.length === 0 && renderComps.length === 0) {\n    triggerLabel = undefined;\n    triggerReducerMs = 0;\n    return;\n  }\n  const extra: Record<string, string | number> = {\n    trigger: triggerLabel ?? \"unknown\",\n    reducer_ms: Math.round(triggerReducerMs),\n  };\n  for (const id of ids) {\n    const a = byId[id];\n    extra[`${id}_commits`] = a.commits;\n    extra[`${id}_sum_ms`] = Math.round(a.sumMs);\n    extra[`${id}_max_ms`] = Math.round(a.maxMs);\n    extra[`${id}_mounts`] = a.mounts;\n    extra[`${id}_updates`] = a.updates;\n  }\n  for (const comp of renderComps) {\n    extra[`${comp}_renders`] = renderCounts[comp];\n    extra[`${comp}_changed`] = Array.from(renderChanges[comp] ?? []).join(\",\");\n  }\n  byId = {};\n  renderCounts = {};\n  renderChanges = {};\n  triggerLabel = undefined;\n  triggerReducerMs = 0;\n  lg(\"perf-set-complete\", extra);\n}\n","export interface IPerfRecentAction {\n  type: string;\n  desc?: string;\n  age_ms: number;\n}\n\nexport interface IPerfFrameWindow {\n  screen?: string;\n  frames_total: number;\n  frames_slow: number;\n  frames_frozen: number;\n  max_gap_ms: number;\n  window_ms: number;\n  ts: number;\n}\n\nexport type IPerfEvent =\n  | { type: \"nav\"; session: string; from?: string; to: string; tap_ts: number }\n  | {\n      type: \"longtask\";\n      session: string;\n      duration: number;\n      start: number;\n      screen?: string;\n      recent?: IPerfRecentAction[];\n    }\n  | {\n      type: \"framedrop\";\n      session: string;\n      thread: \"ui\" | \"js\";\n      gap_ms: number;\n      expected_ms: number;\n      screen?: string;\n      ts: number;\n    }\n  | {\n      type: \"frame_summary\";\n      session: string;\n      screen?: string;\n      frames_total: number;\n      frames_slow: number;\n      frames_frozen: number;\n      max_gap_ms: number;\n      window_ms: number;\n      ts: number;\n    }\n  | { type: \"session_start\"; session: string; ts: number; platform: string; build: string }\n  | {\n      type: \"mark\";\n      session: string;\n      screen: string;\n      phase: \"mount\" | \"commit\" | \"interactive\" | \"loaded\";\n      ts: number;\n      loaded_source?: \"auto\" | \"explicit\";\n    }\n  | {\n      type: \"render_count\";\n      session: string;\n      component: string;\n      delta: number;\n      total: number;\n      window_ms: number;\n      ts: number;\n    }\n  | {\n      type: \"memo_timing\";\n      session: string;\n      label: string;\n      duration_ms: number;\n      ts: number;\n    }\n  | {\n      type: \"scroll_start\" | \"scroll_end\";\n      session: string;\n      screen?: string;\n      label?: string;\n      ts: number;\n    }\n  | {\n      type: \"action\";\n      session: string;\n      action: string;\n      desc?: string;\n      duration_ms?: number;\n      ts: number;\n    }\n  | {\n      type: \"render_trace\";\n      session: string;\n      component: string;\n      ts: number;\n    }\n  | {\n      type: \"profile\";\n      session: string;\n      id: string;\n      phase: \"mount\" | \"update\" | \"nested-update\";\n      actual_ms: number;\n      base_ms: number;\n      ts: number;\n    };\n\nexport function PerfTracker_mark(_name: string, _screen?: string): void {}\nexport function PerfTracker_recordEvent(_event: IPerfEvent): void {}\nexport function PerfTracker_getSessionId(): string {\n  return \"noop\";\n}\nexport function PerfTracker_flush(): Promise<void> {\n  return Promise.resolve();\n}\nexport function PerfTracker_getRecent(_n: number): IPerfEvent[] {\n  return [];\n}\n","import { IndexedDBUtils_get, IndexedDBUtils_getAllKeys, IndexedDBUtils_setMany } from \"./indexeddb\";\nimport type { IStorage, IPartialStorage } from \"../types\";\nimport type { ILastSynced, ILocalStorage } from \"../models/state\";\nimport { lg } from \"./posthog\";\nimport { PerfProbe_isTarget } from \"./perfSetCompleteProbe\";\n\nexport interface IPersistenceStore {\n  get(key: string): Promise<unknown>;\n  setMany(pairs: Array<[string, string | undefined]>): Promise<void>;\n  getAllKeys(): Promise<string[]>;\n}\n\nexport interface IPersistenceAccount {\n  id: string;\n  email?: string;\n  name?: string;\n  numberOfPrograms: number;\n  numberOfWorkouts: number;\n  affiliateEnabled?: boolean;\n}\n\ninterface IPersistenceManifest {\n  formatVersion: number;\n  account: Omit<IPersistenceAccount, \"id\">;\n}\n\nexport interface IPersistenceSaveStats {\n  bytes: number;\n  stringifyMs: number;\n  writeMs: number;\n  shards: string[];\n}\n\ninterface IWriteCacheEntry {\n  storage?: IStorage;\n  lastSynced?: ILastSynced;\n}\n\ninterface IAssembled {\n  storage: IStorage;\n  lastSynced?: ILastSynced;\n  oldBaselineShardsPresent: boolean;\n}\n\n// Rollout ladder: \"legacy\" (single blob, as before) → \"dual\" (shards + legacy blob on\n// every save, so any rollback or stale tab still finds a current blob) → \"sharded\"\n// (shards only; the legacy blob stays frozen as a disaster spare, and is still written\n// once per cold key — see save()). Flipped to \"sharded\" on 2026-07-17 after 5 days of\n// dual-mode bake at ~77% adoption with zero read-path errors. Rolling back to a\n// dual-mode build remains safe: dual reads shards natively and re-freshes the blob.\nexport type IPersistenceMode = \"legacy\" | \"dual\" | \"sharded\";\n\nconst PERSISTENCE_FORMAT_VERSION = 1;\nconst BIG_FIELDS = [\"history\", \"programs\", \"stats\"] as const;\nconst BASELINE_SHARD = \"lastsynced\";\nconst OLD_BASELINE_SHARD_NAMES = [\n  \"lastsynced_storage\",\n  \"lastsynced_history\",\n  \"lastsynced_programs\",\n  \"lastsynced_stats\",\n];\nconst ALL_SHARD_NAMES = [\"storage\", \"history\", \"programs\", \"stats\", BASELINE_SHARD, ...OLD_BASELINE_SHARD_NAMES];\n\nconst indexedDBStore: IPersistenceStore = {\n  get: (key) => IndexedDBUtils_get(key),\n  setMany: (pairs) => IndexedDBUtils_setMany(pairs),\n  getAllKeys: () => IndexedDBUtils_getAllKeys(),\n};\n\nfunction shardKey(baseKey: string, name: string): string {\n  return `liftosaurshard:${baseKey}:${name}`;\n}\n\nfunction manifestKey(baseKey: string): string {\n  return shardKey(baseKey, \"manifest\");\n}\n\nfunction serializeLegacy(data: ILocalStorage): string {\n  return JSON.stringify({ storage: data.storage, lastSynced: data.lastSynced });\n}\n\nfunction parseLegacy(raw: string): ILocalStorage | undefined {\n  try {\n    const {\n      lastSyncedStorage: _old,\n      lastSynced,\n      ...rest\n    } = JSON.parse(raw) as ILocalStorage & {\n      lastSyncedStorage?: unknown;\n    };\n    return { ...rest, lastSynced: asBaseline(lastSynced) };\n  } catch {\n    return undefined;\n  }\n}\n\nfunction asBaseline(value: unknown): ILastSynced | undefined {\n  const candidate = value as Partial<ILastSynced> | null | undefined;\n  if (\n    candidate != null &&\n    typeof candidate.tempUserId === \"string\" &&\n    typeof candidate.serverVersionsFetchedAt === \"number\"\n  ) {\n    return {\n      versions: candidate.versions,\n      tempUserId: candidate.tempUserId,\n      serverVersionsFetchedAt: candidate.serverVersionsFetchedAt,\n    };\n  }\n  return undefined;\n}\n\nfunction parseBaseline(raw: unknown): ILastSynced | undefined {\n  if (typeof raw !== \"string\") {\n    return undefined;\n  }\n  try {\n    return asBaseline(JSON.parse(raw));\n  } catch {\n    return undefined;\n  }\n}\n\nfunction extractPartial(storage: IStorage): IPartialStorage {\n  const { history: _history, programs: _programs, stats: _stats, ...partial } = storage;\n  return partial;\n}\n\nfunction parseManifest(raw: unknown): IPersistenceManifest | undefined {\n  if (typeof raw !== \"string\") {\n    return undefined;\n  }\n  try {\n    const manifest = JSON.parse(raw) as IPersistenceManifest;\n    if (manifest != null && typeof manifest.formatVersion === \"number\") {\n      return manifest;\n    }\n  } catch {\n    return undefined;\n  }\n  return undefined;\n}\n\nfunction buildManifest(storage: IStorage): IPersistenceManifest {\n  return {\n    formatVersion: PERSISTENCE_FORMAT_VERSION,\n    account: {\n      email: storage.email,\n      name: storage.settings.nickname,\n      numberOfPrograms: storage.programs.length,\n      numberOfWorkouts: storage.history.length,\n      affiliateEnabled: storage.settings.affiliateEnabled,\n    },\n  };\n}\n\nfunction assembleStorage(partialRaw: string, historyRaw: string, programsRaw: string, statsRaw: string): IStorage {\n  const partial = JSON.parse(partialRaw) as IPartialStorage;\n  return {\n    ...partial,\n    history: JSON.parse(historyRaw),\n    programs: JSON.parse(programsRaw),\n    stats: JSON.parse(statsRaw),\n  } as IStorage;\n}\n\nexport class Persistence {\n  private writeCache: Partial<Record<string, IWriteCacheEntry>> = {};\n  private readonly oldBaselineShardsToDelete = new Set<string>();\n  private scheduled: { accountId: string; data: ILocalStorage } | undefined = undefined;\n  private scheduledTimer: ReturnType<typeof setTimeout> | undefined = undefined;\n\n  constructor(\n    private readonly store: IPersistenceStore = indexedDBStore,\n    private readonly mode: IPersistenceMode = \"sharded\",\n    private readonly saveDelayMs: number = 100\n  ) {}\n\n  public scheduleSave(accountId: string, data: ILocalStorage): void {\n    this.scheduled = { accountId, data };\n    if (this.scheduledTimer != null) {\n      clearTimeout(this.scheduledTimer);\n    }\n    this.scheduledTimer = setTimeout(() => {\n      this.flushSave().catch(() => undefined);\n    }, this.saveDelayMs);\n  }\n\n  public async flushSave(): Promise<void> {\n    if (this.scheduledTimer != null) {\n      clearTimeout(this.scheduledTimer);\n      this.scheduledTimer = undefined;\n    }\n    const pending = this.scheduled;\n    if (pending == null) {\n      return;\n    }\n    this.scheduled = undefined;\n    try {\n      // The account pointer is best-effort. IndexedDBUtils_setMany rejects on a failed\n      // transaction, and a failed pointer write must not stop the workout data from being saved.\n      await this.store.setMany([[\"current_account\", pending.accountId]]);\n    } catch (e) {\n      lg(\"ls-persistence-account-pointer-error\", { error: String(e) });\n    }\n    try {\n      const stats = await this.save(`liftosaur_${pending.accountId}`, pending.data);\n      if (PerfProbe_isTarget()) {\n        lg(\"perf-persist\", {\n          stringify_ms: stats.stringifyMs,\n          write_ms: stats.writeMs,\n          bytes: stats.bytes,\n          shards: stats.shards.join(\",\"),\n        });\n      }\n    } catch (e) {\n      // Write failed (e.g. quota) — the write cache wasn't updated, so the next\n      // save retries these shards instead of skipping them as \"unchanged\"\n      lg(\"ls-persistence-save-error\", { error: String(e) });\n    }\n  }\n\n  public cancelSave(): void {\n    if (this.scheduledTimer != null) {\n      clearTimeout(this.scheduledTimer);\n      this.scheduledTimer = undefined;\n    }\n    this.scheduled = undefined;\n  }\n\n  public async save(baseKey: string, data: ILocalStorage): Promise<IPersistenceSaveStats> {\n    const t0 = Date.now();\n    if (this.mode === \"legacy\") {\n      const json = serializeLegacy(data);\n      const t1 = Date.now();\n      await this.store.setMany([[baseKey, json]]);\n      return { bytes: json.length, stringifyMs: t1 - t0, writeMs: Date.now() - t1, shards: [\"legacy\"] };\n    }\n    const storage = data.storage;\n    if (storage == null) {\n      return { bytes: 0, stringifyMs: 0, writeMs: 0, shards: [] };\n    }\n    const prev = this.writeCache[baseKey];\n    const pairs: Array<[string, string | undefined]> = [];\n    const written: string[] = [];\n    const removed: string[] = [];\n    let bytes = 0;\n    const pushShard = (name: string, value: unknown): void => {\n      const json = JSON.stringify(value);\n      bytes += json.length;\n      pairs.push([shardKey(baseKey, name), json]);\n      written.push(name);\n    };\n\n    for (const name of BIG_FIELDS) {\n      if (prev?.storage == null || prev.storage[name] !== storage[name]) {\n        pushShard(name, storage[name]);\n      }\n    }\n    if (prev?.storage !== storage) {\n      pushShard(\"storage\", extractPartial(storage));\n    }\n\n    const lastSynced = data.lastSynced;\n    if (lastSynced == null) {\n      if (prev == null || prev.lastSynced != null) {\n        pairs.push([shardKey(baseKey, BASELINE_SHARD), undefined]);\n        removed.push(BASELINE_SHARD);\n      }\n    } else if (prev?.lastSynced !== lastSynced) {\n      pushShard(BASELINE_SHARD, lastSynced);\n    }\n    if (this.oldBaselineShardsToDelete.has(baseKey)) {\n      for (const name of OLD_BASELINE_SHARD_NAMES) {\n        pairs.push([shardKey(baseKey, name), undefined]);\n        removed.push(name);\n      }\n    }\n\n    if (pairs.length === 0) {\n      return { bytes: 0, stringifyMs: Date.now() - t0, writeMs: 0, shards: [] };\n    }\n    // In sharded mode the blob is still (re)written on the first save per key: for\n    // post-cutover installs it bootstraps the disaster spare that preserves tempUserId\n    // continuity (unreadable shards + no blob would mint a fresh tempUserId, orphaning the\n    // user's server storage), and after a corrupt-shard recovery boot (cache unseeded) it\n    // refreshes the spare from live state. Steady-state saves never touch it.\n    if (this.mode === \"dual\" || (this.mode === \"sharded\" && prev == null)) {\n      const legacyJson = serializeLegacy(data);\n      bytes += legacyJson.length;\n      pairs.push([baseKey, legacyJson]);\n      written.push(\"legacy\");\n    }\n    pairs.push([manifestKey(baseKey), JSON.stringify(buildManifest(storage))]);\n    const t1 = Date.now();\n    await this.store.setMany(pairs);\n    this.writeCache[baseKey] = { storage, lastSynced };\n    this.oldBaselineShardsToDelete.delete(baseKey);\n    return {\n      bytes,\n      stringifyMs: t1 - t0,\n      writeMs: Date.now() - t1,\n      shards: written.concat(removed.map((name) => `-${name}`)),\n    };\n  }\n\n  public async saveFull(baseKey: string, data: ILocalStorage): Promise<IPersistenceSaveStats> {\n    delete this.writeCache[baseKey];\n    return this.save(baseKey, data);\n  }\n\n  // Migration is lazy: load never writes. A legacy-only account gets its shards +\n  // manifest created by the first regular save (empty writeCache → full write), which\n  // works from live post-getInitialState state — so ancient blob fields that\n  // getInitialState folds into storage (e.g. top-level `progress`) aren't lost by an\n  // eager parse→reshard at boot.\n  public async load(baseKey: string): Promise<ILocalStorage | undefined> {\n    const [manifestRaw, legacyRaw] = await Promise.all([this.store.get(manifestKey(baseKey)), this.store.get(baseKey)]);\n    const legacy = typeof legacyRaw === \"string\" ? legacyRaw : undefined;\n\n    // Key presence (not parseability) marks a migrated account, so a corrupt manifest\n    // can't hide valid shards behind a stale frozen blob.\n    if (typeof manifestRaw !== \"string\") {\n      // Shards are only ever written together with a manifest, so a complete shard set\n      // without one means the manifest key was lost — the shards are newer than the\n      // (possibly stale or absent) blob and must win.\n      const assembledWithoutManifest = await this.assemble(baseKey);\n      if (assembledWithoutManifest != null) {\n        lg(\"ls-persistence-manifest-missing\");\n        return this.seedCache(baseKey, assembledWithoutManifest);\n      }\n      return legacy != null ? parseLegacy(legacy) : undefined;\n    }\n\n    const assembled = await this.assemble(baseKey);\n    if (assembled == null) {\n      lg(\"ls-persistence-shards-unreadable\");\n      return legacy != null ? parseLegacy(legacy) : undefined;\n    }\n\n    return this.seedCache(baseKey, assembled);\n  }\n\n  private seedCache(baseKey: string, assembled: IAssembled): ILocalStorage {\n    const loaded = { storage: assembled.storage, lastSynced: assembled.lastSynced };\n    this.writeCache[baseKey] = loaded;\n    if (assembled.oldBaselineShardsPresent) {\n      this.oldBaselineShardsToDelete.add(baseKey);\n    }\n    return loaded;\n  }\n\n  public async delete(baseKey: string): Promise<void> {\n    delete this.writeCache[baseKey];\n    // Manifest first: a crash mid-deletion must not leave a manifest that resurrects a\n    // partially-deleted account on the next boot\n    const pairs: Array<[string, string | undefined]> = [[manifestKey(baseKey), undefined]];\n    for (const name of ALL_SHARD_NAMES) {\n      pairs.push([shardKey(baseKey, name), undefined]);\n    }\n    pairs.push([baseKey, undefined]);\n    await this.store.setMany(pairs);\n  }\n\n  public async getAccountSummaries(): Promise<IPersistenceAccount[]> {\n    const allKeys = await this.store.getAllKeys();\n    const ids = new Set<string>();\n    for (const key of allKeys) {\n      if (key.startsWith(\"liftosaur_\")) {\n        ids.add(key.replace(\"liftosaur_\", \"\"));\n      } else {\n        const match = key.match(/^liftosaurshard:liftosaur_(.+):manifest$/);\n        if (match) {\n          ids.add(match[1]);\n        }\n      }\n    }\n    const results: IPersistenceAccount[] = [];\n    for (const id of ids) {\n      const baseKey = `liftosaur_${id}`;\n      const manifest = parseManifest(await this.store.get(manifestKey(baseKey)));\n      if (manifest != null) {\n        results.push({ id, ...manifest.account });\n      } else {\n        const raw = await this.store.get(baseKey);\n        if (typeof raw === \"string\") {\n          try {\n            const storage = (JSON.parse(raw) as ILocalStorage)?.storage;\n            if (storage != null) {\n              results.push({\n                id,\n                email: storage.email,\n                name: storage.settings?.nickname,\n                numberOfPrograms: storage.programs?.length || 0,\n                numberOfWorkouts: storage.history?.length || 0,\n                affiliateEnabled: storage.settings?.affiliateEnabled,\n              });\n            }\n          } catch {\n            continue;\n          }\n        }\n      }\n    }\n    return results;\n  }\n\n  private async assemble(baseKey: string): Promise<IAssembled | undefined> {\n    const [partialRaw, historyRaw, programsRaw, statsRaw, baselineRaw, ...oldBaselineRaws] = await Promise.all([\n      this.store.get(shardKey(baseKey, \"storage\")),\n      this.store.get(shardKey(baseKey, \"history\")),\n      this.store.get(shardKey(baseKey, \"programs\")),\n      this.store.get(shardKey(baseKey, \"stats\")),\n      this.store.get(shardKey(baseKey, BASELINE_SHARD)),\n      ...OLD_BASELINE_SHARD_NAMES.map((name) => this.store.get(shardKey(baseKey, name))),\n    ]);\n    // A manifest is only ever written in the same batch as ALL four storage shards, so a\n    // missing shard means corruption. Refusing to assemble (→ legacy blob fallback) beats\n    // default-filling the gap, which would boot a user with silently empty history.\n    if (\n      typeof partialRaw !== \"string\" ||\n      typeof historyRaw !== \"string\" ||\n      typeof programsRaw !== \"string\" ||\n      typeof statsRaw !== \"string\"\n    ) {\n      return undefined;\n    }\n    try {\n      const storage = assembleStorage(partialRaw, historyRaw, programsRaw, statsRaw);\n      return {\n        storage,\n        lastSynced: parseBaseline(baselineRaw),\n        oldBaselineShardsPresent: oldBaselineRaws.some((raw) => raw != null),\n      };\n    } catch (e) {\n      lg(\"ls-persistence-assemble-error\", { error: String(e) });\n      return undefined;\n    }\n  }\n}\n","import { ILensRecordingPayload, LensBuilder } from \"lens-shmens\";\nimport { IState, updateState } from \"../models/state\";\nimport { IDispatch } from \"../ducks/types\";\nimport { ILensDispatch } from \"./useLensReducer\";\nimport { IUndoRedoState, undoRedoMiddleware } from \"../pages/builder/utils/undoredo\";\nimport { Thunk_log } from \"../ducks/thunks\";\n\n// All program-editor mutations flow through a plannerDispatch with a human-readable `desc`. We map\n// those descs to durable ls-program-* logs in one place so the add/remove/reorder controls scattered\n// across the UI/reorder editors and the exercise-picker modal don't each need instrumenting.\nconst EDIT_ACTION_BY_DESC: Record<string, string> = {\n  \"Add new week\": \"ls-program-add-week\",\n  \"Delete week\": \"ls-program-remove-week\",\n  \"Duplicate week\": \"ls-program-duplicate-week\",\n  \"Reorder weeks\": \"ls-program-reorder-week\",\n  \"Add new day\": \"ls-program-add-day\",\n  \"Delete day\": \"ls-program-remove-day\",\n  \"Clone day\": \"ls-program-duplicate-day\",\n  \"Duplicate day\": \"ls-program-duplicate-day\",\n  \"Reorder days\": \"ls-program-reorder-day\",\n  \"Add exercise to exercise text\": \"ls-program-add-exercise\",\n  \"Replace one exercise in planner\": \"ls-program-swap-exercise\",\n  // \"Replace all\" changes every instance of an EXISTING exercise (a swap-all), not an add.\n  \"Replace all exercises in planner\": \"ls-program-swap-all-exercises\",\n  \"Duplicate exercise in planner\": \"ls-program-duplicate-exercise\",\n  \"Delete exercise instance\": \"ls-program-remove-exercise\",\n  \"Reorder exercise\": \"ls-program-reorder-exercise\",\n};\n\n// These descs fire on every keystroke, so callers pass a per-session Set to log them at most once.\nconst EDIT_TEXT_ACTION_BY_DESC: Record<string, string> = {\n  \"Update full program text\": \"ls-program-edit-text-full\",\n  \"Update exercise text\": \"ls-program-edit-text-perday\",\n};\n\nexport function PlannerDispatch_logEditAction(\n  dispatch: IDispatch,\n  desc: string | undefined,\n  loggedOnce: Set<string>\n): void {\n  if (!desc) {\n    return;\n  }\n  const action = EDIT_ACTION_BY_DESC[desc];\n  if (action) {\n    dispatch(Thunk_log(action));\n  }\n  const onceAction = EDIT_TEXT_ACTION_BY_DESC[desc];\n  if (onceAction && !loggedOnce.has(onceAction)) {\n    loggedOnce.add(onceAction);\n    dispatch(Thunk_log(onceAction));\n  }\n}\n\nexport function buildPlannerDispatch<T, S extends IUndoRedoState<T>, O = never>(\n  dispatch: IDispatch,\n  lensBuilder: LensBuilder<IState, S, {}, O>,\n  plannerStateOrGetter: S | (() => S | undefined)\n): ILensDispatch<S> {\n  const getPlannerState = (): S | undefined =>\n    typeof plannerStateOrGetter === \"function\" ? (plannerStateOrGetter as () => S | undefined)() : plannerStateOrGetter;\n  const loggedOnce = new Set<string>();\n  const plannerDispatch = (\n    lensRecording: ILensRecordingPayload<S> | ILensRecordingPayload<S>[],\n    desc: string\n  ): void => {\n    const lensRecordings = Array.isArray(lensRecording) ? lensRecording : [lensRecording];\n    updateState(\n      dispatch,\n      lensRecordings.map((recording) => recording.prepend(lensBuilder)),\n      desc || \"Update state\"\n    );\n    PlannerDispatch_logEditAction(dispatch, desc, loggedOnce);\n    const changesCurrent = lensRecordings.some((recording) => recording.lens.from.some((f) => f === \"current\"));\n    if (!(desc === \"undo\") && changesCurrent) {\n      const current = getPlannerState();\n      if (current != null) {\n        undoRedoMiddleware(plannerDispatch, current);\n      }\n    }\n  };\n  return plannerDispatch;\n}\n","import { IWeight } from \"../types\";\nimport { Weight_convertTo } from \"../models/weight\";\n\nexport type IPlateColor = \"red\" | \"blue\" | \"yellow\" | \"green\" | \"white\" | \"iron\";\n\nexport interface IPlatesBarRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nexport interface IPlatesBarPlate extends IPlatesBarRect {\n  color: IPlateColor;\n}\n\nexport interface IPlatesBarLayout {\n  width: number;\n  height: number;\n  shaft: IPlatesBarRect;\n  collar: IPlatesBarRect;\n  sleeve: IPlatesBarRect;\n  plates: IPlatesBarPlate[];\n}\n\nconst HEIGHT = 26;\nconst SHAFT = { width: 6, height: 5 };\nconst COLLAR = { width: 3, height: 11 };\nconst SLEEVE = { width: 7, height: 4 };\nconst PLATE_GAP = 1.5;\nconst MAX_DRAWN_PLATES = 12;\n\nconst KG_COLORS: Record<number, IPlateColor> = {\n  25: \"red\",\n  20: \"blue\",\n  15: \"yellow\",\n  10: \"green\",\n  5: \"white\",\n  2.5: \"red\",\n  2: \"blue\",\n  1.5: \"yellow\",\n  1: \"green\",\n  0.5: \"white\",\n};\n\nconst LB_COLORS: Record<number, IPlateColor> = {\n  55: \"red\",\n  45: \"blue\",\n  35: \"yellow\",\n  25: \"green\",\n  10: \"white\",\n};\n\nexport function PlatesBarLayout_color(plate: IWeight): IPlateColor {\n  const table = plate.unit === \"kg\" ? KG_COLORS : LB_COLORS;\n  return table[plate.value] ?? \"iron\";\n}\n\nfunction plateSize(plate: IWeight): { width: number; heightRatio: number } {\n  const kg = Weight_convertTo(plate, \"kg\").value;\n  if (kg >= 10) {\n    return { width: 6, heightRatio: 1 };\n  } else if (kg >= 4) {\n    return { width: 4.5, heightRatio: 0.72 };\n  } else if (kg >= 2) {\n    return { width: 3.5, heightRatio: 0.55 };\n  } else {\n    return { width: 3, heightRatio: 0.42 };\n  }\n}\n\nfunction centered(x: number, width: number, height: number): IPlatesBarRect {\n  return { x, y: (HEIGHT - height) / 2, width, height };\n}\n\nexport function PlatesBarLayout_build(sidePlates: IWeight[]): IPlatesBarLayout {\n  const shaft = centered(0, SHAFT.width, SHAFT.height);\n  const collar = centered(shaft.x + shaft.width, COLLAR.width, COLLAR.height);\n  let x = collar.x + collar.width + PLATE_GAP;\n  const plates: IPlatesBarPlate[] = [];\n  for (const plate of sidePlates.slice(0, MAX_DRAWN_PLATES)) {\n    const size = plateSize(plate);\n    const height = Math.round(HEIGHT * size.heightRatio);\n    plates.push({ ...centered(x, size.width, height), color: PlatesBarLayout_color(plate) });\n    x += size.width + PLATE_GAP;\n  }\n  const sleeve = centered(x - PLATE_GAP, SLEEVE.width, SLEEVE.height);\n  return { width: sleeve.x + sleeve.width, height: HEIGHT, shaft, collar, sleeve, plates };\n}\n","import { IEventPayload, Service } from \"../api/service\";\nimport { WatchHost_isAvailable, WatchHost_send } from \"./watchHost\";\nimport { AppAttribution_get } from \"./appAttribution\";\nimport { EventManager_isAvailable, EventManager_log } from \"./eventManager\";\nimport { AdminDebug_isDebugAccountId } from \"../models/adminDebug\";\n\ndeclare let __COMMIT_HASH__: string;\n\nconst trackedEvents = new Set<string>();\n\nexport function track(args: {\n  name?: string;\n  redditname?: string;\n  googlename?: string;\n  extra?: Record<string, string | number>;\n}): void {\n  if (typeof window === \"undefined\") {\n    return;\n  }\n  const eventName = args.name || args.googlename || args.redditname || \"\";\n  if (trackedEvents.has(eventName)) {\n    return;\n  }\n  trackedEvents.add(eventName);\n  if (window.gtag) {\n    window.gtag(\"event\", args.name || args.googlename, args.extra || {});\n  }\n  if (window.rdt) {\n    window.rdt(\"track\", args.name || args.redditname || \"\", args.extra || {});\n  }\n}\n\nexport function lgDebug(name: string, userId: string, extra?: Record<string, string | number>): void {\n  const currentUserId =\n    (typeof globalThis !== \"undefined\" ? (globalThis as { tempUserId?: string }).tempUserId : undefined) ??\n    (typeof window !== \"undefined\" ? window.tempUserId : undefined);\n  if (currentUserId === userId) {\n    lg(name, extra);\n  }\n}\n\nexport function lg(\n  name: string,\n  extra?: Record<string, string | number>,\n  service?: Service,\n  tempUserId?: string,\n  timestamp?: number\n): void {\n  tempUserId =\n    tempUserId ??\n    (typeof globalThis !== \"undefined\" ? (globalThis as { tempUserId?: string }).tempUserId : undefined) ??\n    (typeof window !== \"undefined\" ? window.tempUserId : undefined);\n\n  if (tempUserId == null) {\n    return;\n  }\n\n  // A debug sandbox must stay analytics-silent so the target-derived id never leaves the device.\n  if (AdminDebug_isDebugAccountId(tempUserId)) {\n    return;\n  }\n\n  const event: IEventPayload = {\n    type: \"event\",\n    timestamp: timestamp ?? Date.now(),\n    commithash: typeof __COMMIT_HASH__ !== \"undefined\" ? __COMMIT_HASH__ : \"unknown\",\n    ...AppAttribution_get(),\n    name,\n    extra,\n    userId: tempUserId,\n  };\n\n  if (WatchHost_isAvailable()) {\n    WatchHost_send({\n      type: \"event\",\n      data: JSON.stringify(event),\n      commithash: event.commithash,\n      userId: event.userId,\n    });\n    return;\n  }\n\n  if (EventManager_isAvailable()) {\n    EventManager_log(JSON.stringify(event));\n    return;\n  }\n\n  service =\n    service ?? (typeof window !== \"undefined\" && window.fetch ? new Service(window.fetch.bind(window)) : undefined);\n  if (service == null) {\n    return;\n  }\n\n  service.postEvent(event).catch((e) => {\n    // do nothing;\n  });\n}\n","import {\n  builtinProgramAgesKeys,\n  builtinProgramDurationsKeys,\n  IBuiltinProgramAge,\n  IBuiltinProgramDuration,\n  IBuiltinProgramFrequency,\n  IBuiltinProgramGoal,\n} from \"../models/builtinPrograms\";\nimport { IProgramIndexEntry } from \"../models/program\";\n\nexport interface IProgramFilter {\n  age?: IBuiltinProgramAge;\n  duration?: IBuiltinProgramDuration;\n  frequency?: IBuiltinProgramFrequency;\n  goal?: IBuiltinProgramGoal;\n}\n\nexport type IProgramSort = \"age\" | \"duration\" | \"frequency\" | undefined;\n\nexport function ProgramFilter_filter(\n  entries: IProgramIndexEntry[],\n  filter: IProgramFilter,\n  search?: string\n): IProgramIndexEntry[] {\n  return entries.filter((entry) => {\n    let result = true;\n    if (filter.age) {\n      result = result && filter.age === entry.age;\n    }\n    if (filter.duration) {\n      result = result && filter.duration === entry.duration;\n    }\n    if (filter.frequency) {\n      result = result && Number(filter.frequency ?? 0) === Number(entry.frequency ?? 0);\n    }\n    if (filter.goal) {\n      result = result && filter.goal === entry.goal;\n    }\n    if (search) {\n      result = result && entry.name.toLowerCase().includes(search.toLowerCase());\n    }\n    return result;\n  });\n}\n\nexport function ProgramFilter_sort(entries: IProgramIndexEntry[], sort: IProgramSort): IProgramIndexEntry[] {\n  if (!sort) {\n    return entries;\n  }\n  const sorted = [...entries];\n  sorted.sort((a, b) => {\n    if (sort === \"age\") {\n      const aIndex = builtinProgramAgesKeys.indexOf((a.age ?? \"less_than_3_months\") as IBuiltinProgramAge);\n      const bIndex = builtinProgramAgesKeys.indexOf((b.age ?? \"less_than_3_months\") as IBuiltinProgramAge);\n      return aIndex - bIndex;\n    } else if (sort === \"duration\") {\n      const aIndex = builtinProgramDurationsKeys.indexOf((a.duration ?? \"30-45\") as IBuiltinProgramDuration);\n      const bIndex = builtinProgramDurationsKeys.indexOf((b.duration ?? \"30-45\") as IBuiltinProgramDuration);\n      return aIndex - bIndex;\n    } else if (sort === \"frequency\") {\n      return (a.frequency ?? 0) - (b.frequency ?? 0);\n    }\n    return 0;\n  });\n  return sorted;\n}\n","export interface IProgressiveRevealInput {\n  count: number;\n  total: number;\n  batchSize: number;\n  threshold: number;\n  rateLimitMs: number;\n  lastBumpAt: number;\n  now: number;\n  offsetY: number;\n  viewportHeight: number;\n  contentHeight: number;\n}\n\nexport type IProgressiveRevealStep =\n  | { kind: \"none\" }\n  | { kind: \"bump\"; count: number }\n  | { kind: \"retry\"; inMs: number };\n\nexport function ProgressiveReveal_onScroll(input: IProgressiveRevealInput): IProgressiveRevealStep {\n  if (input.count >= input.total) {\n    return { kind: \"none\" };\n  }\n  if (input.offsetY + input.viewportHeight <= input.contentHeight - input.threshold) {\n    return { kind: \"none\" };\n  }\n  const elapsed = input.now - input.lastBumpAt;\n  if (elapsed < input.rateLimitMs) {\n    return { kind: \"retry\", inMs: input.rateLimitMs - elapsed };\n  }\n  return { kind: \"bump\", count: Math.min(input.count + input.batchSize, input.total) };\n}\n","import { IState } from \"../models/state\";\nimport { AdminDebug_isDebugAccountId } from \"../models/adminDebug\";\nimport { IPushIdentity } from \"./pushSyncAdapter\";\n\nexport interface IPushPosted {\n  userId: string;\n  deviceId: string;\n  token: string;\n}\n\nexport interface IPushRegistrationState {\n  token?: string;\n  identity?: IPushIdentity;\n  lastPosted?: IPushPosted;\n  syncing: boolean;\n  pendingOriginalId?: number;\n  deliveries: string[];\n}\n\nexport type IPushRegistrationEvent =\n  | { type: \"token\"; token: string }\n  | { type: \"identity\"; identity: IPushIdentity | undefined }\n  | { type: \"posted\"; posted: IPushPosted }\n  | { type: \"push\"; originalId: number; localOriginalId: number | undefined; deliveryId: string }\n  | { type: \"syncDone\"; localOriginalId: number | undefined }\n  | { type: \"signout\" };\n\nexport type IPushRegistrationEffect =\n  | { type: \"post\"; registration: { deviceId: string; token: string } }\n  | { type: \"delete\"; deviceId: string }\n  | { type: \"sync\"; originalId: number }\n  | { type: \"complete\"; deliveryIds: string[]; newData: boolean };\n\nexport function PushRegistration_initial(): IPushRegistrationState {\n  return { syncing: false, deliveries: [] };\n}\n\nexport function PushRegistration_next(\n  state: IPushRegistrationState,\n  event: IPushRegistrationEvent\n): { state: IPushRegistrationState; effects: IPushRegistrationEffect[] } {\n  switch (event.type) {\n    case \"token\":\n      return withPostIfNeeded({ ...state, token: event.token });\n    case \"identity\":\n      return withPostIfNeeded({ ...state, identity: event.identity });\n    case \"posted\": {\n      const stillWanted =\n        state.identity?.userId === event.posted.userId &&\n        state.identity?.deviceId === event.posted.deviceId &&\n        state.token === event.posted.token;\n      return { state: stillWanted ? { ...state, lastPosted: event.posted } : state, effects: [] };\n    }\n    case \"push\":\n      if (event.originalId === event.localOriginalId) {\n        return { state, effects: [{ type: \"complete\", deliveryIds: [event.deliveryId], newData: false }] };\n      }\n      if (state.syncing) {\n        return {\n          state: { ...state, pendingOriginalId: event.originalId, deliveries: [...state.deliveries, event.deliveryId] },\n          effects: [],\n        };\n      }\n      return {\n        state: { ...state, syncing: true, deliveries: [event.deliveryId] },\n        effects: [{ type: \"sync\", originalId: event.originalId }],\n      };\n    case \"syncDone\": {\n      const pending = state.pendingOriginalId;\n      if (pending != null && pending !== event.localOriginalId) {\n        return {\n          state: { ...state, syncing: true, pendingOriginalId: undefined },\n          effects: [{ type: \"sync\", originalId: pending }],\n        };\n      }\n      return {\n        state: { ...state, syncing: false, pendingOriginalId: undefined, deliveries: [] },\n        effects:\n          state.deliveries.length > 0 ? [{ type: \"complete\", deliveryIds: state.deliveries, newData: true }] : [],\n      };\n    }\n    case \"signout\": {\n      const deviceId = state.lastPosted?.deviceId ?? state.identity?.deviceId;\n      const next = { ...state, identity: undefined, lastPosted: undefined };\n      return { state: next, effects: deviceId ? [{ type: \"delete\", deviceId }] : [] };\n    }\n  }\n}\n\nfunction withPostIfNeeded(state: IPushRegistrationState): {\n  state: IPushRegistrationState;\n  effects: IPushRegistrationEffect[];\n} {\n  const { token, identity, lastPosted } = state;\n  if (token == null || identity == null) {\n    return { state, effects: [] };\n  }\n  const alreadyPosted =\n    lastPosted != null &&\n    lastPosted.userId === identity.userId &&\n    lastPosted.deviceId === identity.deviceId &&\n    lastPosted.token === token;\n  if (alreadyPosted) {\n    return { state, effects: [] };\n  }\n  return { state, effects: [{ type: \"post\", registration: { deviceId: identity.deviceId, token } }] };\n}\n\nexport function PushRegistration_identityOf(state: IState): IPushIdentity | undefined {\n  const userId = state.user?.id;\n  if (userId == null || AdminDebug_isDebugAccountId(state.storage.tempUserId)) {\n    return undefined;\n  }\n  return { userId, deviceId: state.deviceId };\n}\n\nexport function PushRegistration_identityChanged(\n  oldState: IState,\n  newState: IState\n): IPushIdentity | undefined | false {\n  const before = PushRegistration_identityOf(oldState);\n  const after = PushRegistration_identityOf(newState);\n  if (before?.userId === after?.userId && before?.deviceId === after?.deviceId) {\n    return false;\n  }\n  return after;\n}\n","import RB, { Dictionary, LogArgument } from \"rollbar\";\nimport { Service } from \"../api/service\";\nimport { IState } from \"../models/state\";\nimport { UidFactory_generateUid } from \"./generator\";\nimport { Encoder_encode } from \"./encoder\";\nimport {\n  Diagnostics_getLastActions,\n  Diagnostics_getLastState,\n  Diagnostics_getLastValidationErrors,\n} from \"./diagnostics\";\n\ndeclare let __ENV__: string;\ndeclare let __FULL_COMMIT_HASH__: string;\n\ninterface IOccurenceResponse {\n  err: number;\n  result: {\n    data: {\n      liftosaur_exception_id: string;\n    };\n  };\n}\n\ndeclare let __API_HOST__: string;\n\nexport const exceptionIgnores = [\n  \"Script error\",\n  \"Failed to fetch\",\n  \"Failed to register a ServiceWorker\",\n  \"The element has no supported sources\",\n  \"The operation was aborted\",\n  \"FetchEvent.respondWith received an error\",\n  \"play() failed because the user\",\n  \"play() request was interrupted\",\n  \"The request is not allowed by the user agent or the platform\",\n  \"Load failed\",\n  \"Function timed out\",\n  \"is out of range for changeset\",\n  \"when attempting to fetch resource\",\n  \"Selection points outside of document\",\n  \"Invalid position\",\n  \"outdated_client_storage\",\n  '{\"isTrusted\":true}',\n  \"Unable to resolve host\",\n  \"connection closed\",\n  \"Invalid change range\",\n  \"Empty response from API\",\n  \"_AutofillCallbackHandler\",\n  \"Incorrect locale information provided\",\n  \"chrome-extension://\",\n];\n\nexport async function RollbarUtils_load(item: string | number, token: string, key: string): Promise<void> {\n  const result = await fetch(`https://api.rollbar.com/api/1/instance/${item}`, {\n    headers: {\n      accept: \"application/json\",\n      \"X-Rollbar-Access-Token\": token,\n    },\n  });\n  const json = (await result.json()) as IOccurenceResponse;\n  if (json.err === 0) {\n    const id = json.result.data.liftosaur_exception_id;\n    const service = new Service(window.fetch.bind(window));\n    const data = await service.getExceptionData(id, key);\n    if (data == null) {\n      console.error(\"No exception info\");\n      return;\n    }\n    const { lastState, lastActions } = JSON.parse(data);\n    if (lastState && lastActions) {\n      const state = JSON.parse(lastState) as IState;\n      state.nosync = true;\n      window.replaceState(state);\n      console.log(\"Last Actions\");\n      console.log(JSON.parse(lastActions));\n    } else {\n      console.error(\"No last state or actions\");\n    }\n  } else {\n    console.error(json);\n  }\n}\n\nexport function RollbarUtils_checkIgnore(isUncaught: boolean, args: LogArgument[], item: Dictionary): boolean {\n  const firstArg = args[0];\n  const message = typeof firstArg === \"object\" && \"message\" in firstArg ? firstArg.message : firstArg;\n  if (message && typeof message === \"string\" && exceptionIgnores.some((i) => message.indexOf(i) !== -1)) {\n    return true;\n  }\n  return false;\n}\n\nexport function RollbarUtils_config(payload?: object): RB.Configuration {\n  return {\n    enabled: __ENV__ === \"production\" || __ENV__ === \"prod-lambda\" || __ENV__ === \"android\",\n    payload: {\n      environment: __ENV__,\n      client: {\n        javascript: {\n          source_map_enabled: true,\n          code_version: __FULL_COMMIT_HASH__,\n          guess_uncaught_frames: true,\n        },\n      },\n      ...(payload || {}),\n    },\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    transform: async (pld: any, item: any) => {\n      const shouldIgnore = RollbarUtils_checkIgnore(false, [item?.err?.message], item);\n      if (shouldIgnore) {\n        return;\n      }\n      const id = UidFactory_generateUid(12);\n      pld.liftosaur_exception_id = id;\n      const state = Diagnostics_getLastState() ?? window.state;\n      const lastActions = Diagnostics_getLastActions();\n      const validationErrors = Diagnostics_getLastValidationErrors();\n      const data = {\n        userid: pld.person?.id ?? window.tempUserId,\n        lastState: state ? JSON.stringify(state) : undefined,\n        lastActions: lastActions.length > 0 ? JSON.stringify(lastActions) : undefined,\n        validationErrors: validationErrors ? JSON.stringify(validationErrors) : undefined,\n      };\n      console.log(\"Sending exception\", data);\n      const compressed = await Encoder_encode(JSON.stringify(data));\n      fetch(`${__API_HOST__}/api/exception`, {\n        method: \"POST\",\n        body: JSON.stringify({ id, data: compressed }),\n        credentials: \"include\",\n      });\n    },\n    checkIgnore: RollbarUtils_checkIgnore,\n  };\n}\n\nif (typeof window !== \"undefined\") {\n  window.loadRollbar = RollbarUtils_load;\n}\n","// Generated by scripts/generate-theme-css.js — do not edit by hand.\nexport const SCALED_SPACINGS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 56, 60, 64, 72, 80, 96];\nexport const SCALED_LEADINGS = [3, 4, 5, 6, 7, 8, 9, 10, 12];\n","import { Platform } from \"react-native\";\nimport ReactNativeHapticFeedback from \"react-native-haptic-feedback\";\n\nexport function SetCompleteHaptic_play(): void {\n  if (Platform.OS === \"web\") {\n    return;\n  }\n  ReactNativeHapticFeedback.trigger(\"impactMedium\", {\n    enableVibrateFallback: false,\n    ignoreAndroidSystemSettings: false,\n  });\n}\n","export function SetUtils_areEqual<T>(a: Set<T>, b: Set<T>): boolean {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const item of a) {\n    if (!b.has(item)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function SetUtils_areAllEqual<T>(sets: Set<T>[]): boolean {\n  if (sets.length < 2) {\n    return true;\n  }\n\n  const [first, ...rest] = sets;\n  for (const set of rest) {\n    if (!SetUtils_areEqual(first, set)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function SetUtils_containsAnyValues<T>(within: Set<T>, from: Set<T>): boolean {\n  for (const item of from) {\n    if (within.has(item)) {\n      return true;\n    }\n  }\n  return false;\n}\n","export function ShareLog_share(): Promise<void> {\n  return Promise.resolve();\n}\n","export interface IGoogleSignInResult {\n  idToken?: string;\n  accessToken?: string;\n}\n\nexport interface IAppleSignInResult {\n  idToken: string;\n  code?: string;\n}\n\nexport async function SignIn_google(): Promise<IGoogleSignInResult | undefined> {\n  throw new Error(\"SignIn_google is only supported on native platforms\");\n}\n\nexport async function SignOut_google(): Promise<void> {\n  // no-op on web\n}\n\nexport async function SignIn_apple(): Promise<IAppleSignInResult | undefined> {\n  throw new Error(\"SignIn_apple is only supported on native platforms\");\n}\n","import { Platform } from \"react-native\";\n\nexport function StoreRuntime_isIos(): boolean {\n  return Platform.OS === \"ios\";\n}\n\nexport function StoreRuntime_isAndroid(): boolean {\n  return Platform.OS === \"android\";\n}\n\nexport function StoreRuntime_isNative(): boolean {\n  return StoreRuntime_isIos() || StoreRuntime_isAndroid();\n}\n\nexport function StoreRuntime_storeName(): string {\n  if (StoreRuntime_isIos()) {\n    return \"App Store\";\n  }\n  return StoreRuntime_isAndroid() ? \"Google Play\" : \"App Store / Play Store\";\n}\n","/* eslint-disable no-bitwise */\nexport function StringUtils_pad(str: string, width: number, fill: string = \"0\"): string {\n  return str.length >= width ? str : new Array(width - str.length + 1).join(fill) + str;\n}\n\nexport function StringUtils_capitalize(string: string): string {\n  return string[0].toUpperCase() + string.slice(1);\n}\n\nexport function StringUtils_pluralize(string: string, count: number): string {\n  return `${string}${count !== 1 ? \"s\" : \"\"}`;\n}\n\nexport function StringUtils_dashcase(string: string): string {\n  return string.replace(/[:,]/g, \"\").replace(/\\s+/g, \"-\").toLowerCase();\n}\n\nexport function StringUtils_undashcase(string: string): string {\n  return string.replace(/-/g, \" \");\n}\n\nexport function StringUtils_uncamelCase(string: string): string {\n  return string.replace(/([a-z])([A-Z])/g, \"$1 $2\");\n}\n\nexport function StringUtils_camelCase(string: string): string {\n  return string\n    .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (letter, index) => (index === 0 ? letter.toLowerCase() : letter.toUpperCase()))\n    .replace(/\\s+/g, \"\");\n}\n\nexport function StringUtils_snakecase(string: string): string {\n  return string.replace(/[:,]/g, \"\").replace(/\\s+/g, \"_\").toLowerCase();\n}\n\nexport function StringUtils_truncate(string: string, length: number): string {\n  if (string.length > length) {\n    return `${string.slice(0, length - 3)}...`;\n  } else {\n    return string;\n  }\n}\n\nexport function StringUtils_unindent(string: string): string {\n  const indent2 = string.split(\"\\n\").reduce<number | undefined>((memo, line) => {\n    const match = line.match(/^(\\s*)\\S/);\n    if (match != null) {\n      const spaces = match[1];\n      if (memo == null || memo > spaces.length) {\n        return spaces.length;\n      }\n    }\n    return memo;\n  }, undefined);\n  if (indent2 != null) {\n    return string\n      .split(\"\\n\")\n      .map((s) => (s.trim() === \"\" ? \"\" : s.slice(indent2, s.length).trimEnd()))\n      .join(\"\\n\");\n  } else {\n    return string;\n  }\n}\n\nexport function StringUtils_indent(string: string, spaces: number): string {\n  const indent2 = new Array(spaces + 1).join(\" \");\n  return string\n    .split(\"\\n\")\n    .map((s) => (s.trim() !== \"\" ? `${indent2}${s}` : s))\n    .join(\"\\n\");\n}\n\nexport function StringUtils_fuzzySearch(needle: string, haystack: string): boolean {\n  if (needle.length > haystack.length) {\n    return false;\n  } else if (needle === haystack) {\n    return true;\n  } else {\n    outer: for (let i = 0, j = 0; i < needle.length; i++) {\n      const nch = needle.charCodeAt(i);\n      while (j < haystack.length) {\n        // eslint-disable-next-line no-plusplus\n        if (haystack.charCodeAt(j++) === nch) {\n          continue outer;\n        }\n      }\n      return false;\n    }\n    return true;\n  }\n}\n\nexport function StringUtils_nextName(name: string): string {\n  const match = name.match(/(\\d+)$/);\n  if (match) {\n    const number = parseInt(match[0], 10);\n    return name.replace(/\\d+$/, (number + 1).toString());\n  }\n  return name + \" 2\";\n}\n\nexport function StringUtils_hashCode(str: string): number {\n  let hash = 0;\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash << 5) - hash + str.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n  return hash;\n}\n\nexport function StringUtils_hashString(str: string): string {\n  return new Uint32Array([StringUtils_hashCode(str)])[0].toString(16);\n}\n\nexport function StringUtils_hashCode0To1(str: string): number {\n  const hash = Math.abs(StringUtils_hashCode(str));\n  return (hash % 10000) / 10000;\n}\n\nexport function StringUtils_cleanJson(str: string): string {\n  return str.trim().replace(/^[\\s\\S]*?(\\{[\\s\\S]*\\})[\\s\\S]*?$/, \"$1\");\n}\n","import type { ColorValue, StyleProp, ViewStyle } from \"react-native\";\nimport { Tailwind_colors, Tailwind_semantic } from \"./tailwindConfig\";\n\n// typeof-guarded: Metro/webpack define __DEV__, but this module also runs under node (tests).\ndeclare let __DEV__: boolean | undefined;\n\nfunction isDev(): boolean {\n  return typeof __DEV__ !== \"undefined\" && __DEV__ === true;\n}\n\n// \"500\" maps to the SemiBold face: Android/web don't bundle Poppins-Medium, and both native\n// renderers already treat 500-699 as SemiBold.\nexport type IFastTextFontWeight = \"400\" | \"500\" | \"600\" | \"700\";\n\nexport type IFastTextFontStyle = \"normal\" | \"italic\";\n\nexport type IFastTextDecoration = \"underline\" | \"line-through\";\n\nexport type IFastTextAlign = \"left\" | \"center\" | \"right\";\n\nexport interface IFastTextStyle {\n  color?: ColorValue;\n  backgroundColor?: ColorValue;\n  fontWeight?: IFastTextFontWeight;\n  fontSize?: number;\n  fontStyle?: IFastTextFontStyle;\n  textDecorationLine?: IFastTextDecoration;\n}\n\nexport interface IFastTextFragment extends IFastTextStyle {\n  start: number;\n  end: number;\n  // Web-only hook for preserving per-span data-testid/data-cy. Ignored natively\n  // (the native view is a single node).\n  testID?: string;\n}\n\nexport interface IFastTextBuild {\n  text: string;\n  fragments: IFastTextFragment[];\n}\n\nexport interface IFastTextSpan {\n  text: string;\n  style?: IFastTextStyle;\n  testID?: string;\n}\n\n// Base style (IFastTextStyle) applies to the whole string; `fragments` are\n// per-range overrides layered on top. The component is a dumb renderer — the\n// caller resolves all colors (ColorValue strings) and sizes (px).\nexport interface IFastTextProps extends IFastTextStyle {\n  text: string;\n  fragments?: IFastTextFragment[];\n  // Overrides the weight-based Poppins face mapping with a verbatim family name (e.g.\n  // \"Iosevka\" for monospace code). Base-level only — fragments differ in color, not font.\n  fontFamily?: string;\n  // Web-only: render with white-space: pre (no soft-wrap, whitespace preserved). Native\n  // achieves the same by being measured at unbounded width inside a horizontal ScrollView.\n  noWrap?: boolean;\n  // Web-only: soft-wrap long lines but keep the newlines and indentation the text already has\n  // (white-space: pre-wrap). Without it the browser collapses both, which turns a multi-line\n  // script into one run of prose. Native preserves them either way.\n  preserveWhitespace?: boolean;\n  paddingHorizontal?: number;\n  lineHeight?: number;\n  numberOfLines?: number;\n  textAlign?: IFastTextAlign;\n  style?: StyleProp<ViewStyle>;\n  // Native FastText draws text rather than using <Text>, so it exposes nothing to screen\n  // readers by default; the wrapper falls back to `text` when this is unset.\n  accessibilityLabel?: string;\n  testID?: string;\n  \"data-testid\"?: string;\n  \"data-cy\"?: string;\n}\n\nfunction hasStyle(style?: IFastTextStyle): style is IFastTextStyle {\n  if (style == null) {\n    return false;\n  }\n  return (\n    style.color != null ||\n    style.backgroundColor != null ||\n    style.fontWeight != null ||\n    style.fontSize != null ||\n    style.fontStyle != null ||\n    style.textDecorationLine != null\n  );\n}\n\nexport class StyledText {\n  private readonly parts: string[] = [];\n  private readonly fragments: IFastTextFragment[] = [];\n  private offset = 0;\n\n  public add(text: string | undefined | null, style?: IFastTextStyle, testID?: string): this {\n    if (text == null || text.length === 0) {\n      return this;\n    }\n    const start = this.offset;\n    const end = start + text.length;\n    this.parts.push(text);\n    this.offset = end;\n    if (hasStyle(style) || testID != null) {\n      this.fragments.push({ start, end, ...style, ...(testID != null ? { testID } : {}) });\n    }\n    return this;\n  }\n\n  public build(): IFastTextBuild {\n    return { text: this.parts.join(\"\"), fragments: this.fragments };\n  }\n}\n\nexport function StyledText_fragmentsToSpans(text: string, fragments?: IFastTextFragment[]): IFastTextSpan[] {\n  const sorted = (fragments ?? [])\n    .filter((f) => f.end > f.start && f.start < text.length)\n    .slice()\n    .sort((a, b) => a.start - b.start);\n  const spans: IFastTextSpan[] = [];\n  let cursor = 0;\n  for (const fragment of sorted) {\n    const start = Math.max(fragment.start, cursor);\n    const end = Math.min(fragment.end, text.length);\n    if (start > cursor) {\n      spans.push({ text: text.slice(cursor, start) });\n    }\n    if (end > start) {\n      const { start: _s, end: _e, testID, ...style } = fragment;\n      spans.push({ text: text.slice(start, end), style, ...(testID != null ? { testID } : {}) });\n      cursor = end;\n    }\n  }\n  if (cursor < text.length) {\n    spans.push({ text: text.slice(cursor) });\n  }\n  return spans;\n}\n\nexport type IFastTextSize = \"2xs\" | \"xs\" | \"sm\" | \"base\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"5xl\";\n\nconst BASE_REM = 16;\n\n// Mirrors the --text-* scale in useRem.ts / useRem.native.ts (px at rem=16).\nconst SIZE_PX: Record<IFastTextSize, number> = {\n  \"2xs\": 10,\n  xs: 12,\n  sm: 14,\n  base: 16,\n  lg: 18,\n  xl: 20,\n  \"2xl\": 24,\n  \"3xl\": 30,\n  \"4xl\": 36,\n  \"5xl\": 48,\n};\n\nexport function StyledText_remToPx(size: IFastTextSize, rem: number): number {\n  return SIZE_PX[size] * (rem / BASE_REM);\n}\n\nconst FONT_WEIGHT_CLASSES: Record<string, IFastTextFontWeight> = {\n  \"font-normal\": \"400\",\n  \"font-medium\": \"500\",\n  \"font-semibold\": \"600\",\n  \"font-bold\": \"700\",\n};\n\n// Resolves a Tailwind-ish class string into FastText styles so conversions from nested\n// <Text className=\"...\"> read like the JSX they replace:\n//   const cls = StyledText_cls(rem);\n//   builder.add(\"Plates: \", cls(\"text-sm text-text-secondary\"));\n// Supports text sizes, font weights, italic, underline/line-through, and text-*/bg-* colors\n// resolved via Tailwind_semantic() (e.g. text-text-secondary, text-syntax-weight, bg-background-subtle)\n// or Tailwind_colors() (e.g. text-yellow-600, bg-white).\nexport function StyledText_cls(rem: number): (className: string) => IFastTextStyle {\n  const semantic = Tailwind_semantic() as unknown as Record<string, Record<string, string> | undefined>;\n  const colors = Tailwind_colors() as unknown as Record<string, string | Record<string, string> | undefined>;\n\n  function resolveColor(rest: string): string | undefined {\n    const direct = colors[rest];\n    if (typeof direct === \"string\") {\n      return direct;\n    }\n    const dashIndex = rest.indexOf(\"-\");\n    if (dashIndex === -1) {\n      return undefined;\n    }\n    const head = rest.slice(0, dashIndex);\n    const tail = rest.slice(dashIndex + 1);\n    const fromSemantic = semantic[head]?.[tail];\n    if (fromSemantic != null) {\n      return fromSemantic;\n    }\n    const palette = colors[head];\n    return typeof palette === \"object\" ? palette?.[tail] : undefined;\n  }\n\n  return (className) => {\n    const style: IFastTextStyle = {};\n    for (const token of className.split(/\\s+/)) {\n      if (token.length === 0) {\n        continue;\n      }\n      const weight = FONT_WEIGHT_CLASSES[token];\n      if (weight != null) {\n        style.fontWeight = weight;\n      } else if (token === \"italic\") {\n        style.fontStyle = \"italic\";\n      } else if (token === \"not-italic\") {\n        style.fontStyle = \"normal\";\n      } else if (token === \"underline\" || token === \"line-through\") {\n        style.textDecorationLine = token;\n      } else if (token.startsWith(\"text-\")) {\n        const rest = token.slice(\"text-\".length);\n        if (rest in SIZE_PX) {\n          style.fontSize = StyledText_remToPx(rest as IFastTextSize, rem);\n        } else {\n          const color = resolveColor(rest);\n          if (color != null) {\n            style.color = color;\n          } else if (isDev()) {\n            console.warn(`StyledText_cls: unknown color class \"${token}\"`);\n          }\n        }\n      } else if (token.startsWith(\"bg-\")) {\n        const color = resolveColor(token.slice(\"bg-\".length));\n        if (color != null) {\n          style.backgroundColor = color;\n        } else if (isDev()) {\n          console.warn(`StyledText_cls: unknown color class \"${token}\"`);\n        }\n      } else if (isDev()) {\n        console.warn(`StyledText_cls: unsupported class \"${token}\"`);\n      }\n    }\n    return style;\n  };\n}\n","import { ISubscription } from \"../types\";\nimport { IIapActiveSubscription } from \"./iapAdapter\";\nimport { Subscriptions_hasSubscription } from \"./subscriptions\";\n\nexport type ISubscriptionPlanState =\n  | \"none\"\n  | \"loading\"\n  | \"subscriber\"\n  | \"cancelled\"\n  | \"lifetime\"\n  | \"freeaccess\"\n  | \"premium\"\n  | \"otherstore\";\n\nexport type ISubscriptionPlanKind = \"monthly\" | \"yearly\";\n\nexport interface IDerivedSubscriptionPlan {\n  state: ISubscriptionPlanState;\n  plan?: ISubscriptionPlanKind;\n  expirationDate?: number;\n  autoRenew?: boolean;\n  // Set when the user has queued a switch to a different plan that takes effect at expirationDate.\n  pendingPlan?: ISubscriptionPlanKind;\n  // For state \"otherstore\": the store the subscription must be managed on (it was bought on the other platform).\n  managedOn?: \"apple\" | \"google\";\n}\n\nexport function SubscriptionPlan_planFromProductId(productId: string): ISubscriptionPlanKind | undefined {\n  if (productId.indexOf(\"year\") !== -1) {\n    return \"yearly\";\n  }\n  if (productId.indexOf(\"mont\") !== -1) {\n    return \"monthly\";\n  }\n  return undefined;\n}\n\nexport function SubscriptionPlan_derive(args: {\n  subscription: ISubscription;\n  status?: IIapActiveSubscription[];\n  ownedLifetime?: boolean;\n  isNative: boolean;\n  isIos?: boolean;\n}): IDerivedSubscriptionPlan {\n  const { subscription, status, ownedLifetime, isNative, isIos } = args;\n\n  if (subscription.key && subscription.key !== \"unclaimed\") {\n    return { state: \"freeaccess\" };\n  }\n\n  if (ownedLifetime) {\n    return { state: \"lifetime\" };\n  }\n\n  const active = (status ?? []).find((s) => s.isActive);\n  if (active) {\n    const currentPlan = SubscriptionPlan_planFromProductId(active.productId);\n    // iOS reads the queued switch live from StoreKit; Android gets it from the server's subscriptionsv2\n    // record patched onto `pendingProductId` in Thunk_iapRefreshActiveSubscriptions. The !== currentPlan\n    // guard makes it disappear once the switch lands (server reports the new product).\n    const pendingProductId = active.pendingProductId;\n    const pendingPlan = pendingProductId ? SubscriptionPlan_planFromProductId(pendingProductId) : undefined;\n    return {\n      state: active.autoRenew ? \"subscriber\" : \"cancelled\",\n      plan: currentPlan,\n      expirationDate: active.expirationDate,\n      autoRenew: active.autoRenew,\n      pendingPlan: pendingPlan && pendingPlan !== currentPlan ? pendingPlan : undefined,\n    };\n  }\n\n  if (Subscriptions_hasSubscription(subscription)) {\n    // On native the store status is authoritative, but `undefined` means it hasn't loaded yet (vs `[]` =\n    // loaded, no active sub). Reporting \"none\" then would flash purchase/free UI to an existing subscriber —\n    // and persist if getActiveSubscriptions() fails — so report \"loading\" until the store status arrives.\n    if (isNative && status === undefined) {\n      return { state: \"loading\" };\n    }\n    if (isNative) {\n      // This device's store reports no live entitlement, but a receipt from the OTHER store means the user\n      // subscribed on the other platform. They keep premium (feature gating reads the synced receipts), but\n      // can only manage/cancel it from a device on that platform — not here.\n      const boughtOnOtherStore = isIos ? subscription.google.length > 0 : subscription.apple.length > 0;\n      if (boughtOnOtherStore) {\n        return { state: \"otherstore\", managedOn: isIos ? \"google\" : \"apple\" };\n      }\n      // Same-store receipt but no live entitlement = expired/cancelled; let them re-subscribe.\n      return { state: \"none\" };\n    }\n    // On web we have no store status at all, so fall back to a generic \"premium\" state from synced receipts.\n    return { state: \"premium\" };\n  }\n\n  return { state: \"none\" };\n}\n","import { ISubscriptionReceipt } from \"../types\";\n\nexport function SubscriptionReceipts_cleanupApple(\n  apple: ISubscriptionReceipt[],\n  verdicts: ReadonlyMap<string, boolean>\n): ISubscriptionReceipt[] {\n  const valid = apple.filter((r) => verdicts.get(r.value) === true);\n  const newestValid = valid.reduce<ISubscriptionReceipt | undefined>(\n    (newest, r) => (newest == null || r.createdAt >= newest.createdAt ? r : newest),\n    undefined\n  );\n  // Receipts without a verdict appeared after verification started (sync merge or store restore) and\n  // must be kept - deciding from a stale snapshot is how valid receipts used to get tombstoned\n  // account-wide. Collapsing valid ones to a single newest receipt is still required: legacy Apple\n  // receipts are tens of KB, differ on every refresh, and all verify true while the account is\n  // active, so per-receipt pruning would let the array grow unboundedly.\n  const result = apple.filter((r) => !verdicts.has(r.value) || r === newestValid);\n  return result.length === apple.length ? apple : result;\n}\n","import { Service } from \"../api/service\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState, updateState } from \"../models/state\";\nimport { lb } from \"lens-shmens\";\nimport { ISubscription } from \"../types\";\nimport { UidFactory_generateUid } from \"./generator\";\nimport { CollectionUtils_removeBy } from \"./collection\";\nimport { SubscriptionReceipts_cleanupApple } from \"./subscriptionReceipts\";\nimport { Thunk_postevent } from \"../ducks/thunks\";\n\n// Personal single-user fork (AGPL-3.0): every premium feature is unlocked.\nconst PERSONAL_FORK_UNLOCKED = true;\n\nexport function Subscriptions_hasSubscription(subscription: ISubscription): boolean {\n  if (PERSONAL_FORK_UNLOCKED) {\n    return true;\n  }\n  if (subscription.key && subscription.key !== \"unclaimed\") {\n    return true;\n  }\n  const hasApple = hasAppleSubscription(subscription);\n  const hasGoogle = hasGoogleSubscription(subscription);\n  return hasApple || hasGoogle;\n}\n\nexport function Subscriptions_listOfSubscriptions(subscription: ISubscription): string[] {\n  const arr: string[] = [];\n  if ((subscription.apple || []).length > 0) {\n    arr.push(\"apple\");\n  }\n  if ((subscription.google || []).length > 0) {\n    arr.push(\"google\");\n  }\n  if (subscription.key === \"unclaimed\") {\n    arr.push(\"unclaimedkey\");\n  } else if (subscription.key) {\n    arr.push(\"key\");\n  }\n  return arr;\n}\n\nfunction hasAppleSubscription(subscription: ISubscription): boolean {\n  return subscription.apple.length > 0;\n}\n\nfunction hasGoogleSubscription(subscription: ISubscription): boolean {\n  return subscription.google.length > 0;\n}\n\nexport function Subscriptions_setAppleReceipt(dispatch: IDispatch, receipt: string): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"subscription\")\n        .p(\"apple\")\n        .recordModify((v) => {\n          if (v.some((s) => s.value === receipt)) {\n            dispatch(Thunk_postevent(\"same-apple-receipt\"));\n            return v;\n          } else {\n            dispatch(Thunk_postevent(\"new-apple-receipt\"));\n            return [\n              ...v,\n              {\n                vtype: \"subscription_receipt\",\n                value: receipt,\n                id: UidFactory_generateUid(6),\n                createdAt: Date.now(),\n              },\n            ];\n          }\n        }),\n    ],\n    \"Set Apple receipt\"\n  );\n}\n\nexport function Subscriptions_setGooglePurchaseToken(dispatch: IDispatch, purchaseToken: string): void {\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"subscription\")\n        .p(\"google\")\n        .recordModify((v) => {\n          if (v.some((s) => s.value === purchaseToken)) {\n            return v;\n          } else {\n            return [\n              ...v,\n              {\n                vtype: \"subscription_receipt\",\n                value: purchaseToken,\n                id: UidFactory_generateUid(6),\n                createdAt: Date.now(),\n              },\n            ];\n          }\n        }),\n    ],\n    \"Set Google purchase token\"\n  );\n}\n\nexport function Subscriptions_cleanupOutdatedAppleReceipts(\n  dispatch: IDispatch,\n  userId: string,\n  service: Service,\n  subscription: ISubscription\n): Promise<void> {\n  return Promise.all(\n    subscription.apple.map<Promise<[string, boolean]>>(async (value) => {\n      return [value.value, await Subscriptions_verifyAppleReceipt(userId, service, value.value)];\n    })\n  ).then((results) => {\n    const verdicts = new Map(results);\n    updateState(\n      dispatch,\n      [\n        lb<IState>()\n          .p(\"storage\")\n          .p(\"subscription\")\n          .p(\"apple\")\n          .recordModify((apple) => SubscriptionReceipts_cleanupApple(apple, verdicts)),\n      ],\n      \"Clean up outdated Apple receipts\"\n    );\n  });\n}\n\nexport function Subscriptions_cleanupOutdatedGooglePurchaseTokens(\n  dispatch: IDispatch,\n  userId: string,\n  service: Service,\n  subscription: ISubscription\n): Promise<void> {\n  return Promise.all(\n    subscription.google.map<Promise<[string, boolean]>>(async (token) => {\n      return [token.id, await Subscriptions_verifyGooglePurchaseToken(service, userId, token.value)];\n    })\n  ).then((results) => {\n    for (const [id, result] of results) {\n      if (!result) {\n        updateState(\n          dispatch,\n          [\n            lb<IState>()\n              .p(\"storage\")\n              .p(\"subscription\")\n              .p(\"google\")\n              .recordModify((r) => {\n                return CollectionUtils_removeBy([...r], \"id\", id);\n              }),\n          ],\n          \"Cleanup outdated Google receipt\"\n        );\n      }\n    }\n  });\n}\n\nexport function Subscriptions_verifyAppleReceipt(userId: string, service: Service, receipt?: string): Promise<boolean> {\n  if (receipt != null) {\n    return service.verifyAppleReceipt(userId, receipt);\n  } else {\n    return Promise.resolve(false);\n  }\n}\n\nexport function Subscriptions_verifyGooglePurchaseToken(\n  service: Service,\n  userId: string,\n  purchaseToken?: string\n): Promise<boolean> {\n  if (purchaseToken != null) {\n    return service.verifyGooglePurchaseToken(userId, purchaseToken);\n  } else {\n    return Promise.resolve(false);\n  }\n}\n","import { IVersions, VersionTracker } from \"../models/versionTracker\";\nimport { IStorage, STORAGE_VERSION_TYPES } from \"../types\";\nimport { CollectionUtils_compact, CollectionUtils_groupByKey } from \"./collection\";\nimport { ObjectUtils_values, ObjectUtils_filter, ObjectUtils_isEqual } from \"./object\";\nimport { lg } from \"./posthog\";\n\nexport interface IStorageUpdate2 {\n  versions?: IVersions<IStorage>;\n  storage?: Partial<IStorage>;\n  version: IStorage[\"version\"];\n  originalId?: IStorage[\"originalId\"];\n}\n\nexport function Sync_getStorageUpdate2(\n  currentStorage: IStorage,\n  lastVersions: IStorage[\"_versions\"],\n  deviceId: string\n): IStorageUpdate2 {\n  const versionTracker = new VersionTracker(STORAGE_VERSION_TYPES, { deviceId });\n  const versionsDiff = versionTracker.diffVersions(lastVersions, currentStorage._versions || {});\n  if (versionsDiff) {\n    const storageDiff = versionTracker.extractByVersions(currentStorage, versionsDiff);\n    const filledVersionsDiff = versionTracker.fillVersions(storageDiff, versionsDiff, Date.now());\n    let programs = storageDiff.programs;\n    const programIds = (storageDiff.programs || []).map((p) => p.id);\n    if (programIds.length !== new Set(programIds).size) {\n      const duplicatedPrograms = CollectionUtils_compact(\n        ObjectUtils_values(\n          ObjectUtils_filter(\n            CollectionUtils_groupByKey(storageDiff.programs || [], \"id\"),\n            (k, v) => v != null && v.length > 1\n          )\n        )\n      );\n      const duplicateInfo = duplicatedPrograms.map((arr) => {\n        const isEqual = arr.every((p) => ObjectUtils_isEqual(arr[0], p));\n        return { id: arr[0].id, name: arr.map((p) => p.name), isEqual };\n      });\n      lg(\"duplicate-programs\", { info: JSON.stringify(duplicateInfo) });\n      programs = CollectionUtils_compact(duplicatedPrograms.map((arr) => arr[arr.length - 1]));\n      storageDiff.programs = programs;\n    }\n    return {\n      version: currentStorage.version,\n      originalId: currentStorage.originalId,\n      versions: filledVersionsDiff,\n      storage: storageDiff,\n    };\n  } else {\n    return {\n      version: currentStorage.version,\n      originalId: currentStorage.originalId,\n    };\n  }\n}\n","import type { IPostSyncResponse } from \"../api/service\";\n\nexport type ISyncAccountMismatch = { userId: string; email: string };\nexport type ISyncAccountMismatchPlan = \"ignore\" | \"load-local\" | \"fetch-server\";\n\nexport function SyncAccountMismatch_fromResponse(result: IPostSyncResponse): ISyncAccountMismatch | undefined {\n  if (result.type === \"error\" && result.error === \"account_mismatch\" && \"user_id\" in result) {\n    return { userId: result.user_id, email: result.email };\n  }\n  return undefined;\n}\n\nexport function SyncAccountMismatch_plan(args: {\n  sentTempUserId: string;\n  currentTempUserId: string;\n  hasLocalCopy: boolean;\n}): ISyncAccountMismatchPlan {\n  if (args.currentTempUserId !== args.sentTempUserId) {\n    return \"ignore\";\n  }\n  return args.hasLocalCopy ? \"load-local\" : \"fetch-server\";\n}\n","import { ILastSynced } from \"../models/state\";\nimport { IStorage } from \"../types\";\n\nexport const SyncBaseline_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport type ISyncBaselineFetchReason = \"missing\" | \"other-user\" | \"stale\";\n\nexport type ISyncBaselineSource = Pick<IStorage, \"_versions\" | \"tempUserId\">;\n\nexport function SyncBaseline_fromServer(serverStorage: ISyncBaselineSource, now: number): ILastSynced {\n  return {\n    versions: serverStorage._versions,\n    tempUserId: serverStorage.tempUserId,\n    serverVersionsFetchedAt: now,\n  };\n}\n\nexport function SyncBaseline_afterClean(baseline: ILastSynced, sentStorage: ISyncBaselineSource): ILastSynced {\n  return {\n    versions: sentStorage._versions,\n    tempUserId: sentStorage.tempUserId,\n    serverVersionsFetchedAt: baseline.serverVersionsFetchedAt,\n  };\n}\n\nexport function SyncBaseline_needsFetch(\n  baseline: ILastSynced | undefined,\n  tempUserId: string,\n  now: number\n): ISyncBaselineFetchReason | undefined {\n  if (baseline == null) {\n    return \"missing\";\n  }\n  if (baseline.tempUserId !== tempUserId) {\n    return \"other-user\";\n  }\n  if (now - baseline.serverVersionsFetchedAt >= SyncBaseline_MAX_AGE_MS) {\n    return \"stale\";\n  }\n  return undefined;\n}\n","import baseColors from \"../../tailwind.colors.json\";\nimport semanticColors from \"../../tailwind.semantic.generated.json\";\n\ntype IBaseColors = typeof baseColors;\ntype ISemanticColors = typeof semanticColors;\ntype IDeepString<T> = { [K in keyof T]: T[K] extends object ? IDeepString<T[K]> : string };\ntype ISemanticVars = IDeepString<ISemanticColors[\"light\"]>;\n\nexport const TAILWIND_PAGE_MARKER_CLASS = \"liftosaur-page\";\n\nlet isPageRenderContext = false;\n\nexport function Tailwind_markPageContext(): void {\n  isPageRenderContext = true;\n}\n\nexport function Tailwind_colors(): IBaseColors {\n  return baseColors;\n}\n\nfunction buildSemanticVars(): ISemanticVars {\n  const shape = semanticColors.light as Record<string, Record<string, string>>;\n  const result: Record<string, Record<string, string>> = {};\n  for (const category of Object.keys(shape)) {\n    const inner: Record<string, string> = {};\n    for (const name of Object.keys(shape[category])) {\n      inner[name] = `var(--color-${category}-${name})`;\n    }\n    result[category] = inner;\n  }\n  return result as unknown as ISemanticVars;\n}\n\nconst semanticVars: ISemanticVars = buildSemanticVars();\n\nexport function Tailwind_semantic(): ISemanticVars {\n  if (isPageRenderContext) {\n    return semanticVars;\n  }\n  if (typeof window === \"undefined\") {\n    return semanticColors.light as unknown as ISemanticVars;\n  }\n  const root = window.document.documentElement;\n  if (root.classList.contains(TAILWIND_PAGE_MARKER_CLASS)) {\n    return semanticVars;\n  }\n  const theme = root.classList.contains(\"dark\") ? \"dark\" : \"light\";\n  return semanticColors[theme] as unknown as ISemanticVars;\n}\n\nexport function Tailwind_isDark(): boolean {\n  return Tailwind_semantic().background.default === baseColors.black;\n}\n\nexport function Tailwind_semanticConcrete(): ISemanticVars {\n  return semanticColors.light as unknown as ISemanticVars;\n}\n","export interface ITextEdit {\n  start: number;\n  end: number;\n  text: string;\n}\n\nexport function TextDiff_minimalEdit(current: string, next: string): ITextEdit | undefined {\n  if (current === next) {\n    return undefined;\n  }\n  let start = 0;\n  while (start < current.length && start < next.length && current[start] === next[start]) {\n    start += 1;\n  }\n  let currentEnd = current.length;\n  let nextEnd = next.length;\n  while (currentEnd > start && nextEnd > start && current[currentEnd - 1] === next[nextEnd - 1]) {\n    currentEnd -= 1;\n    nextEnd -= 1;\n  }\n  return { start, end: currentEnd, text: next.slice(start, nextEnd) };\n}\n","import { useEffect } from \"react\";\nimport { Rem_set } from \"./useRem\";\nimport { useOsFontScale, OsFontScale_get } from \"./fontScale\";\nimport { Settings_getTextSize } from \"../models/settings\";\nimport { ISettings } from \"../types\";\n\nexport function TextSize_apply(size: number): void {\n  Rem_set(size);\n}\n\nexport function TextSize_resolve(settings: ISettings): number {\n  return Settings_getTextSize(settings, OsFontScale_get());\n}\n\n// useOsFontScale re-renders when the device font-size setting changes, so an unset textSize\n// keeps following the OS for the whole session rather than only at boot.\nexport function useAppliedTextSize(settings: ISettings): void {\n  const size = Settings_getTextSize(settings, useOsFontScale());\n  useEffect(() => {\n    TextSize_apply(size);\n  }, [size]);\n}\n","import { useEffect, useState } from \"react\";\n\nfunction darkSchemeQuery(): MediaQueryList | undefined {\n  return typeof window !== \"undefined\" && window.matchMedia\n    ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n    : undefined;\n}\n\nexport function Theme_system(): \"dark\" | \"light\" {\n  return darkSchemeQuery()?.matches ? \"dark\" : \"light\";\n}\n\nexport function useSystemTheme(): \"dark\" | \"light\" {\n  const [theme, setTheme] = useState(Theme_system);\n  useEffect(() => {\n    const query = darkSchemeQuery();\n    if (query == null) {\n      return undefined;\n    }\n    const onChange = (): void => setTheme(Theme_system());\n    query.addEventListener(\"change\", onChange);\n    return () => query.removeEventListener(\"change\", onChange);\n  }, []);\n  return theme;\n}\n\nexport function Theme_apply(theme: \"dark\" | \"light\" | undefined): void {\n  const root = document.documentElement;\n  if ((theme ?? Theme_system()) === \"dark\") {\n    root.classList.add(\"dark\");\n    root.classList.remove(\"light\");\n  } else {\n    root.classList.add(\"light\");\n    root.classList.remove(\"dark\");\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport function throttle<T extends (...args: any[]) => any>(func: T, limit: number): (...args: Parameters<T>) => void {\n  let lastTs: number | undefined;\n  let lastRan: number | undefined;\n\n  return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n    const context = this;\n    const now = Date.now();\n\n    if (!lastRan || now - lastRan >= limit) {\n      if (lastTs) {\n        window.clearTimeout(lastTs);\n        lastTs = undefined;\n      }\n      func.apply(context, args);\n      lastRan = now;\n    } else {\n      if (lastTs) {\n        window.clearTimeout(lastTs);\n      }\n      lastTs = window.setTimeout(\n        () => {\n          func.apply(context, args);\n          lastRan = Date.now();\n        },\n        limit - (now - (lastRan || 0))\n      );\n    }\n  };\n}\n\nexport function delayfn(fn: () => void, ms: number): () => void {\n  let timeoutId: number | undefined;\n\n  return function () {\n    if (timeoutId) {\n      window.clearTimeout(timeoutId);\n    }\n    timeoutId = window.setTimeout(() => {\n      fn();\n      timeoutId = undefined;\n    }, ms);\n  };\n}\n\nexport function debounce<T extends (...args: any[]) => any>(func: T, ms: number): (...args: Parameters<T>) => void {\n  let timeoutId: number | undefined;\n\n  return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n    const context = this;\n    if (timeoutId) {\n      window.clearTimeout(timeoutId);\n    }\n    timeoutId = window.setTimeout(() => {\n      func.apply(context, args);\n      timeoutId = undefined;\n    }, ms);\n  };\n}\n\nexport function wait(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    const timeoutId = window.setTimeout(() => {\n      resolve();\n      window.clearTimeout(timeoutId);\n    }, ms);\n  });\n}\n","import { StringUtils_pad } from \"./string\";\n\nexport function TimeUtils_formatHHMM(ms: number): string {\n  const minutes = Math.floor((ms / 1000 / 60) % 60);\n  const hours = Math.floor(ms / 1000 / 60 / 60);\n\n  const result = [StringUtils_pad(hours.toString(), 2), StringUtils_pad(minutes.toString(), 2)].join(\":\");\n\n  return result;\n}\n\nexport function TimeUtils_formatHOrMin(ms: number): { value: string; unit: \"h\" | \"min\" } {\n  const minutes = Math.floor((ms / 1000 / 60) % 60);\n  const hours = Math.floor(ms / 1000 / 60 / 60);\n  if (hours > 0) {\n    return { value: TimeUtils_formatHHMM(ms), unit: \"h\" };\n  } else {\n    return { value: `${minutes}`, unit: \"min\" };\n  }\n}\n\nexport function TimeUtils_formatHH(ms: number): string {\n  const hours = Math.floor(ms / 1000 / 60 / 60);\n  return StringUtils_pad(hours.toString(), 2);\n}\n\nexport function TimeUtils_formatMM(ms: number): string {\n  const minutes = Math.floor((ms / 1000 / 60) % 60);\n  return StringUtils_pad(minutes.toString(), 2);\n}\n\nexport function TimeUtils_formatSS(ms: number): string {\n  const seconds = Math.floor((ms / 1000) % 60);\n  return StringUtils_pad(seconds.toString(), 2);\n}\n\nexport function TimeUtils_formatMMSS(ms: number): string {\n  const seconds = Math.floor((ms / 1000) % 60);\n  const minutes = Math.floor((ms / 1000 / 60) % 60);\n  return [StringUtils_pad(minutes.toString(), 2), StringUtils_pad(seconds.toString(), 2)].join(\":\");\n}\n\nexport function TimeUtils_formatUTCHHMM(ms: number): string {\n  const date = new Date(ms);\n  const hours = StringUtils_pad(date.getUTCHours().toString(), 2);\n  const minutes = StringUtils_pad(date.getUTCMinutes().toString(), 2);\n  return [hours, minutes].join(\":\");\n}\n","export interface ITooltipRect {\n  left: number;\n  top: number;\n  bottom: number;\n}\n\nexport interface ITooltipSize {\n  width: number;\n  height: number;\n}\n\nconst GAP = 4;\nconst MARGIN = 8;\n\nexport function TooltipPlacement_place(\n  anchor: ITooltipRect,\n  tooltip: ITooltipSize,\n  viewport: ITooltipSize\n): { left: number; top: number } {\n  const left = Math.max(MARGIN, Math.min(anchor.left, viewport.width - tooltip.width - MARGIN));\n  const below = anchor.bottom + GAP;\n  const fitsBelow = below + tooltip.height <= viewport.height - MARGIN;\n  const top = fitsBelow ? below : Math.max(MARGIN, anchor.top - tooltip.height - GAP);\n  return { left, top };\n}\n","let isUndoingRef = false;\n\nexport function UndoingFlag_set(value: boolean): void {\n  isUndoingRef = value;\n  if (typeof window !== \"undefined\") {\n    window.isUndoing = value;\n  }\n}\n\nexport function UndoingFlag_get(): boolean {\n  if (typeof window !== \"undefined\" && window.isUndoing != null) {\n    return window.isUndoing;\n  }\n  return isUndoingRef;\n}\n","import { IEither } from \"./types\";\nimport { URLPolyfill } from \"./urlPolyfill\";\n\n// Check if native URL is available (not available in QuickJS on watchOS)\nconst URLConstructor: typeof URL = typeof URL !== \"undefined\" ? URL : (URLPolyfill as unknown as typeof URL);\n\nexport function UrlUtils_build(url: string, base?: string | URL): URL {\n  if (base != null) {\n    base = base.toString().replace(\"liftosaur://\", \"https://\");\n  }\n  try {\n    return new URLConstructor(url, base);\n  } catch (e) {\n    let json: string | undefined;\n    try {\n      json = JSON.stringify(url);\n    } catch {}\n    throw new TypeError(`Failed to construct URL: ${json || url}`);\n  }\n}\n\nexport function UrlUtils_buildSafe(url: string, base?: string | URL): IEither<URL, string> {\n  try {\n    return { success: true, data: UrlUtils_build(url, base) };\n  } catch (e) {\n    return { success: false, error: e instanceof Error ? e.message : String(e) };\n  }\n}\n","// URL polyfill for environments without native URL support (e.g., QuickJS on watchOS)\n\ninterface IParsedURL {\n  protocol: string;\n  hostname: string;\n  port: string;\n  host: string;\n  pathname: string;\n  search: string;\n  hash: string;\n  username: string;\n  password: string;\n}\n\nfunction parseURL(url: string): IParsedURL | null {\n  const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/);\n  if (!match) {\n    return null;\n  }\n\n  const authority = match[4] || \"\";\n  let userInfo = \"\";\n  let host = authority;\n  const atIndex = authority.indexOf(\"@\");\n  if (atIndex !== -1) {\n    userInfo = authority.substring(0, atIndex);\n    host = authority.substring(atIndex + 1);\n  }\n\n  let username = \"\";\n  let password = \"\";\n  if (userInfo) {\n    const colonIndex = userInfo.indexOf(\":\");\n    if (colonIndex !== -1) {\n      username = userInfo.substring(0, colonIndex);\n      password = userInfo.substring(colonIndex + 1);\n    } else {\n      username = userInfo;\n    }\n  }\n\n  let hostname = host;\n  let port = \"\";\n  const portMatch = host.match(/^(.+):(\\d+)$/);\n  if (portMatch) {\n    hostname = portMatch[1];\n    port = portMatch[2];\n  }\n\n  return {\n    protocol: match[2] ? match[2] + \":\" : \"\",\n    hostname,\n    port,\n    host,\n    pathname: match[5] || \"\",\n    search: match[6] || \"\",\n    hash: match[8] || \"\",\n    username,\n    password,\n  };\n}\n\nexport class URLSearchParamsPolyfill {\n  private params: Map<string, string[]> = new Map();\n\n  constructor(init?: string | URLSearchParamsPolyfill | Record<string, string> | Array<[string, string]>) {\n    if (typeof init === \"string\") {\n      this._parseFromString(init);\n    } else if (init instanceof URLSearchParamsPolyfill) {\n      init.forEach((value, key) => this.append(key, value));\n    } else if (Array.isArray(init)) {\n      for (const [key, value] of init) {\n        this.append(key, value);\n      }\n    } else if (init && typeof init === \"object\") {\n      for (const key of Object.keys(init)) {\n        this.append(key, init[key]);\n      }\n    }\n  }\n\n  private _parseFromString(query: string): void {\n    if (query.startsWith(\"?\")) {\n      query = query.slice(1);\n    }\n    if (!query) {\n      return;\n    }\n    for (const pair of query.split(\"&\")) {\n      const eqIndex = pair.indexOf(\"=\");\n      if (eqIndex === -1) {\n        this.append(decodeURIComponent(pair), \"\");\n      } else {\n        const key = decodeURIComponent(pair.substring(0, eqIndex));\n        const value = decodeURIComponent(pair.substring(eqIndex + 1));\n        this.append(key, value);\n      }\n    }\n  }\n\n  public append(name: string, value: string): void {\n    const values = this.params.get(name) || [];\n    values.push(value);\n    this.params.set(name, values);\n  }\n\n  public delete(name: string, value?: string): void {\n    if (value === undefined) {\n      this.params.delete(name);\n    } else {\n      const values = this.params.get(name);\n      if (values) {\n        const filtered = values.filter((v) => v !== value);\n        if (filtered.length === 0) {\n          this.params.delete(name);\n        } else {\n          this.params.set(name, filtered);\n        }\n      }\n    }\n  }\n\n  public get(name: string): string | null {\n    const values = this.params.get(name);\n    return values ? values[0] : null;\n  }\n\n  public getAll(name: string): string[] {\n    return this.params.get(name) || [];\n  }\n\n  public has(name: string, value?: string): boolean {\n    if (!this.params.has(name)) {\n      return false;\n    }\n    if (value === undefined) {\n      return true;\n    }\n    const values = this.params.get(name)!;\n    return values.includes(value);\n  }\n\n  public set(name: string, value: string): void {\n    this.params.set(name, [value]);\n  }\n\n  public sort(): void {\n    const sorted = new Map([...this.params.entries()].sort((a, b) => a[0].localeCompare(b[0])));\n    this.params = sorted;\n  }\n\n  public toString(): string {\n    const parts: string[] = [];\n    this.params.forEach((values, key) => {\n      for (const value of values) {\n        parts.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(value));\n      }\n    });\n    return parts.join(\"&\");\n  }\n\n  public forEach(\n    callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void,\n    thisArg?: unknown\n  ): void {\n    this.params.forEach((values, key) => {\n      for (const value of values) {\n        callback.call(thisArg, value, key, this);\n      }\n    });\n  }\n\n  public entries(): IterableIterator<[string, string]> {\n    const result: [string, string][] = [];\n    this.params.forEach((values, key) => {\n      for (const value of values) {\n        result.push([key, value]);\n      }\n    });\n    return result[Symbol.iterator]();\n  }\n\n  public keys(): IterableIterator<string> {\n    const result: string[] = [];\n    this.params.forEach((values, key) => {\n      for (let i = 0; i < values.length; i++) {\n        result.push(key);\n      }\n    });\n    return result[Symbol.iterator]();\n  }\n\n  public values(): IterableIterator<string> {\n    const result: string[] = [];\n    this.params.forEach((values) => {\n      for (const value of values) {\n        result.push(value);\n      }\n    });\n    return result[Symbol.iterator]();\n  }\n\n  public [Symbol.iterator](): IterableIterator<[string, string]> {\n    return this.entries();\n  }\n\n  public get size(): number {\n    let count = 0;\n    this.params.forEach((values) => {\n      count += values.length;\n    });\n    return count;\n  }\n}\n\nexport class URLPolyfill {\n  private _protocol: string = \"\";\n  private _hostname: string = \"\";\n  private _port: string = \"\";\n  private _pathname: string = \"\";\n  private _search: string = \"\";\n  private _hash: string = \"\";\n  private _username: string = \"\";\n  private _password: string = \"\";\n  private _searchParams: URLSearchParamsPolyfill;\n\n  constructor(url: string, base?: string | URLPolyfill) {\n    url = String(url);\n    if (base !== undefined) {\n      base = String(base);\n      const baseP = parseURL(base);\n      if (!baseP || !baseP.protocol) {\n        throw new TypeError(\"Invalid base URL\");\n      }\n\n      if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(url)) {\n        // Absolute URL\n        const p = parseURL(url);\n        if (p) {\n          this._protocol = p.protocol;\n          this._hostname = p.hostname;\n          this._port = p.port;\n          this._pathname = p.pathname;\n          this._search = p.search;\n          this._hash = p.hash;\n          this._username = p.username;\n          this._password = p.password;\n        }\n      } else if (url.indexOf(\"//\") === 0) {\n        // Protocol-relative URL\n        const p = parseURL(baseP.protocol + url);\n        if (p) {\n          this._protocol = p.protocol;\n          this._hostname = p.hostname;\n          this._port = p.port;\n          this._pathname = p.pathname;\n          this._search = p.search;\n          this._hash = p.hash;\n          this._username = p.username;\n          this._password = p.password;\n        }\n      } else if (url.indexOf(\"/\") === 0) {\n        // Absolute path\n        this._protocol = baseP.protocol;\n        this._hostname = baseP.hostname;\n        this._port = baseP.port;\n        this._username = baseP.username;\n        this._password = baseP.password;\n\n        let urlPart = url;\n        const hashIndex = urlPart.indexOf(\"#\");\n        if (hashIndex !== -1) {\n          this._hash = urlPart.substring(hashIndex);\n          urlPart = urlPart.substring(0, hashIndex);\n        }\n        const searchIndex = urlPart.indexOf(\"?\");\n        if (searchIndex !== -1) {\n          this._search = urlPart.substring(searchIndex);\n          this._pathname = urlPart.substring(0, searchIndex);\n        } else {\n          this._pathname = urlPart;\n        }\n      } else {\n        // Relative path\n        this._protocol = baseP.protocol;\n        this._hostname = baseP.hostname;\n        this._port = baseP.port;\n        this._username = baseP.username;\n        this._password = baseP.password;\n\n        const basePath = baseP.pathname.substring(0, baseP.pathname.lastIndexOf(\"/\") + 1);\n        let urlPart = url;\n        const hashIndex = urlPart.indexOf(\"#\");\n        if (hashIndex !== -1) {\n          this._hash = urlPart.substring(hashIndex);\n          urlPart = urlPart.substring(0, hashIndex);\n        }\n        const searchIndex = urlPart.indexOf(\"?\");\n        if (searchIndex !== -1) {\n          this._search = urlPart.substring(searchIndex);\n          this._pathname = basePath + urlPart.substring(0, searchIndex);\n        } else {\n          this._pathname = basePath + urlPart;\n        }\n      }\n    } else {\n      // No base URL\n      const p = parseURL(url);\n      if (!p || !p.protocol) {\n        throw new TypeError(\"Invalid URL\");\n      }\n      this._protocol = p.protocol;\n      this._hostname = p.hostname;\n      this._port = p.port;\n      this._pathname = p.pathname;\n      this._search = p.search;\n      this._hash = p.hash;\n      this._username = p.username;\n      this._password = p.password;\n    }\n\n    this._searchParams = new URLSearchParamsPolyfill(this._search);\n  }\n\n  public get protocol(): string {\n    return this._protocol;\n  }\n\n  public set protocol(value: string) {\n    this._protocol = value.endsWith(\":\") ? value : value + \":\";\n  }\n\n  public get hostname(): string {\n    return this._hostname;\n  }\n\n  public set hostname(value: string) {\n    this._hostname = value;\n  }\n\n  public get port(): string {\n    return this._port;\n  }\n\n  public set port(value: string) {\n    this._port = value;\n  }\n\n  public get host(): string {\n    return this._port ? this._hostname + \":\" + this._port : this._hostname;\n  }\n\n  public set host(value: string) {\n    const portMatch = value.match(/^(.+):(\\d+)$/);\n    if (portMatch) {\n      this._hostname = portMatch[1];\n      this._port = portMatch[2];\n    } else {\n      this._hostname = value;\n      this._port = \"\";\n    }\n  }\n\n  public get pathname(): string {\n    return this._pathname;\n  }\n\n  public set pathname(value: string) {\n    this._pathname = value.startsWith(\"/\") ? value : \"/\" + value;\n  }\n\n  public get search(): string {\n    return this._search;\n  }\n\n  public set search(value: string) {\n    this._search = value.startsWith(\"?\") ? value : value ? \"?\" + value : \"\";\n    this._searchParams = new URLSearchParamsPolyfill(this._search);\n  }\n\n  public get searchParams(): URLSearchParamsPolyfill {\n    return this._searchParams;\n  }\n\n  public get hash(): string {\n    return this._hash;\n  }\n\n  public set hash(value: string) {\n    this._hash = value.startsWith(\"#\") ? value : value ? \"#\" + value : \"\";\n  }\n\n  public get username(): string {\n    return this._username;\n  }\n\n  public set username(value: string) {\n    this._username = value;\n  }\n\n  public get password(): string {\n    return this._password;\n  }\n\n  public set password(value: string) {\n    this._password = value;\n  }\n\n  public get origin(): string {\n    return this._protocol + \"//\" + this.host;\n  }\n\n  public get href(): string {\n    let userinfo = \"\";\n    if (this._username) {\n      userinfo = this._username;\n      if (this._password) {\n        userinfo += \":\" + this._password;\n      }\n      userinfo += \"@\";\n    }\n    return this._protocol + \"//\" + userinfo + this.host + this._pathname + this._search + this._hash;\n  }\n\n  public set href(value: string) {\n    const p = parseURL(value);\n    if (!p || !p.protocol) {\n      throw new TypeError(\"Invalid URL\");\n    }\n    this._protocol = p.protocol;\n    this._hostname = p.hostname;\n    this._port = p.port;\n    this._pathname = p.pathname;\n    this._search = p.search;\n    this._hash = p.hash;\n    this._username = p.username;\n    this._password = p.password;\n    this._searchParams = new URLSearchParamsPolyfill(this._search);\n  }\n\n  public toString(): string {\n    return this.href;\n  }\n\n  public toJSON(): string {\n    return this.href;\n  }\n\n  public static canParse(url: string, base?: string): boolean {\n    try {\n      new URLPolyfill(url, base);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n}\n","import { useRef } from \"react\";\nimport { ObjectUtils_isEqual } from \"./object\";\n\nexport function useEqual<T>(value: T): T {\n  const ref = useRef<T>(value);\n  if (\n    ref.current !== value &&\n    !ObjectUtils_isEqual(ref.current as unknown as Record<string, unknown>, value as unknown as Record<string, unknown>)\n  ) {\n    ref.current = value;\n  }\n  return ref.current;\n}\n","import { useCallback } from \"react\";\nimport { IGDispatch, IGThunk } from \"../ducks/types\";\nimport { useThunkReducer } from \"./useThunkReducer\";\nimport { ILensRecordingPayload } from \"lens-shmens\";\nimport { UrlUtils_build } from \"./url\";\n\ntype IAction<TState> = {\n  type: \"Update\";\n  lensRecording: ILensRecordingPayload<TState>[];\n  desc: string;\n};\n\nexport type ILensDispatchSimple<TState> = (lensRecording: ILensRecordingPayload<TState>, desc: string) => void;\n\nexport type ILensDispatch<TState> = (\n  lensRecording: ILensRecordingPayload<TState> | ILensRecordingPayload<TState>[],\n  desc: string\n) => void | Promise<void>;\n\nconst isLoggingEnabled =\n  typeof window !== \"undefined\" && window?.location\n    ? !!UrlUtils_build(window.location.href).searchParams.get(\"log\")\n    : false;\n\nexport function useLensReducer<TState, TEnv>(\n  initialState: TState,\n  env: TEnv,\n  onActions: Array<\n    (\n      action: IAction<TState> | IGThunk<TState, IAction<TState>, TEnv>,\n      oldState: TState,\n      newState: TState\n    ) => void | Promise<void>\n  > = []\n): [TState, ILensDispatch<TState>] {\n  const modifiedOnActions = onActions.map((onAction) => {\n    return (\n      dispatch: IGDispatch<TState, IAction<TState>, TEnv>,\n      action: IAction<TState> | IGThunk<TState, IAction<TState>, TEnv>,\n      oldState: TState,\n      newState: TState\n    ): void => {\n      onAction(action, oldState, newState);\n    };\n  });\n  const [hookState, thunkDispatch] = useThunkReducer<TState, IAction<TState>, TEnv>(\n    (state, action) => {\n      if (isLoggingEnabled) {\n        console.log(`%c-------${action.desc ? ` ${action.desc}` : \"\"}`, \"font-weight:bold\");\n      }\n      return action.lensRecording.reduce((memo, recording) => {\n        if (isLoggingEnabled) {\n          recording.log(\"state\");\n        }\n        const newState = recording.fn(memo);\n        if (isLoggingEnabled && recording.type === \"modify\") {\n          console.log(\"New Value: \", recording.value.v);\n        }\n        return newState;\n      }, state);\n    },\n    initialState,\n    env,\n    modifiedOnActions\n  );\n\n  const dispatch = useCallback(\n    (\n      lensRecording: ILensRecordingPayload<TState>[] | ILensRecordingPayload<TState>,\n      desc: string\n    ): void | Promise<void> => {\n      if (!Array.isArray(lensRecording)) {\n        lensRecording = [lensRecording];\n      }\n      return thunkDispatch({ type: \"Update\", lensRecording, desc });\n    },\n    [thunkDispatch]\n  );\n\n  return [hookState, dispatch];\n}\n","import { useRef } from \"react\";\nimport { DateUtils_formatHHMMSS } from \"./date\";\n\nexport function useLoopCatcher(): void {\n  const counter = useRef<Partial<Record<string, number>>>({});\n  const hhmmss = DateUtils_formatHHMMSS(Date.now());\n  counter.current[hhmmss] = (counter.current[hhmmss] || 0) + 1;\n  if ((counter.current[hhmmss] || 0) > 300) {\n    throw new Error(\"Loop detected\");\n  }\n  const keys = Object.keys(counter.current).sort();\n  for (const key of keys.slice(0, keys.length - 10)) {\n    delete counter.current[key];\n  }\n}\n","export function usePerfRenderCount(_componentName: string): void {}\n","export function usePerfRenderTrace(_componentName: string): void {}\n","export interface IPerfScrollMarkers {\n  onScrollBeginDrag: () => void;\n  onMomentumScrollEnd: () => void;\n  onScrollEndDrag: () => void;\n}\n\nexport function usePerfScrollMarkers(_label?: string): IPerfScrollMarkers {\n  return {\n    onScrollBeginDrag: () => {},\n    onMomentumScrollEnd: () => {},\n    onScrollEndDrag: () => {},\n  };\n}\n","import { useLayoutEffect, useRef } from \"react\";\nimport { PerfProbe_isTarget, PerfProbe_isRecording, PerfProbe_recordRender } from \"./perfSetCompleteProbe\";\nimport { ObjectUtils_diffPaths } from \"./object\";\n\n// Props whose values are large collections: a reference change is all we need to know, and a deep diff\n// of e.g. full history would itself be a multi-second cost. Never descend into these.\nconst SKIP_DEEP = new Set([\"history\", \"programs\", \"stats\", \"children\"]);\nconst MAX_PATHS = 6;\n\n// TEMP DIAGNOSTIC (remove after investigation). Placed in a MEMOIZED component so its useLayoutEffect\n// only runs when React actually re-rendered AND committed it (the memo did not bail, and the render\n// wasn't discarded by a concurrent retry). The diff/record/baseline-update all happen post-commit, so\n// abandoned renders can't emit telemetry or poison the \"previous props\" baseline. On each committed\n// re-render it diffs current vs previous props by reference to name which prop broke the memo, and runs\n// ObjectUtils_diffPaths on object props to report the exact changed value paths — or \"<ref-only>\" when\n// the reference changed but no value did (spurious churn = the memo-killer). No-op unless the device's\n// tempUserId is a target, and the deep diff only runs while a tap window is open.\nexport function usePerfWhyRender(component: string, props: Record<string, unknown>): void {\n  const prevRef = useRef<Record<string, unknown> | undefined>(undefined);\n  useLayoutEffect(() => {\n    if (!PerfProbe_isTarget()) {\n      return;\n    }\n    const prev = prevRef.current;\n    // Skip the mount (no previous props to diff); only report actual re-renders that happen in a window.\n    if (prev !== undefined && PerfProbe_isRecording()) {\n      const changed: string[] = [];\n      const seen = new Set<string>();\n      for (const k of Object.keys(props)) {\n        seen.add(k);\n        const a = prev[k];\n        const b = props[k];\n        if (a === b) {\n          continue;\n        }\n        if (!SKIP_DEEP.has(k) && a != null && b != null && typeof a === \"object\" && typeof b === \"object\") {\n          const paths = ObjectUtils_diffPaths(a as object, b as object);\n          changed.push(paths.length === 0 ? `${k}:<ref-only>` : `${k}:${paths.slice(0, MAX_PATHS).join(\"|\")}`);\n        } else {\n          changed.push(k);\n        }\n      }\n      for (const k of Object.keys(prev)) {\n        if (!seen.has(k)) {\n          changed.push(k);\n        }\n      }\n      PerfProbe_recordRender(component, changed);\n    }\n    prevRef.current = props;\n  });\n}\n","import { useContext, useEffect, useRef, useState } from \"react\";\nimport type { NativeScrollEvent } from \"react-native\";\nimport { NavScreenScrollContext } from \"../navigation/NavScreenScrollContext\";\nimport { ProgressiveReveal_onScroll } from \"./progressiveReveal\";\n\ninterface IIdleGlobal {\n  requestIdleCallback?: (cb: () => void, opts?: { timeout?: number }) => number;\n  cancelIdleCallback?: (handle: number) => void;\n}\n\nconst DEBUG = process.env.NODE_ENV !== \"production\";\n\nfunction dbg(label: string | undefined, message: string): void {\n  if (DEBUG) {\n    console.log(`[progressive${label ? ` ${label}` : \"\"}] ${message}`);\n  }\n}\n\ninterface IProgressiveOptions {\n  initialBatch?: number;\n  batchSize?: number;\n  threshold?: number;\n  rateLimitMs?: number;\n  // When set, idle-time revealing stops at this count for good. Past it, only a scroll near the\n  // bottom reveals the next batch. 0 reveals on scroll only.\n  idleCap?: number;\n  debugLabel?: string;\n  resetKey?: unknown;\n}\n\nexport function useProgressiveCount(total: number, options?: IProgressiveOptions): number {\n  const initialBatch = options?.initialBatch ?? 4;\n  const batchSize = options?.batchSize ?? 4;\n  const threshold = options?.threshold ?? 600;\n  const rateLimitMs = options?.rateLimitMs ?? 200;\n  const idleCap = options?.idleCap;\n  const debugLabel = options?.debugLabel;\n  const resetKey = options?.resetKey;\n\n  const [count, setCount] = useState(() => Math.min(initialBatch, total));\n  const [prevResetKey, setPrevResetKey] = useState<unknown>(resetKey);\n  let effectiveCount = count;\n  if (resetKey !== prevResetKey) {\n    setPrevResetKey(resetKey);\n    effectiveCount = Math.min(initialBatch, total);\n    setCount(effectiveCount);\n    dbg(debugLabel, `reset → ${effectiveCount}/${total} (resetKey changed)`);\n  }\n  const countRef = useRef(effectiveCount);\n  countRef.current = effectiveCount;\n  const lastBumpRef = useRef(0);\n\n  const mountedRef = useRef(false);\n  if (!mountedRef.current) {\n    mountedRef.current = true;\n    dbg(\n      debugLabel,\n      `mounted with ${count}/${total} items visible (initialBatch=${initialBatch}, batchSize=${batchSize})`\n    );\n  }\n\n  const ctx = useContext(NavScreenScrollContext);\n\n  useEffect(() => {\n    if (!ctx) {\n      return undefined;\n    }\n    let retryTimer: ReturnType<typeof setTimeout> | undefined;\n    let lastEvent: NativeScrollEvent | undefined;\n    const check = (): void => {\n      if (lastEvent == null) {\n        return;\n      }\n      const now = Date.now();\n      const step = ProgressiveReveal_onScroll({\n        count: countRef.current,\n        total,\n        batchSize,\n        threshold,\n        rateLimitMs,\n        lastBumpAt: lastBumpRef.current,\n        now,\n        offsetY: lastEvent.contentOffset.y,\n        viewportHeight: lastEvent.layoutMeasurement.height,\n        contentHeight: lastEvent.contentSize.height,\n      });\n      if (step.kind === \"retry\" && retryTimer == null) {\n        retryTimer = setTimeout(() => {\n          retryTimer = undefined;\n          check();\n        }, step.inMs);\n      } else if (step.kind === \"bump\") {\n        lastBumpRef.current = now;\n        countRef.current = step.count;\n        dbg(debugLabel, `scroll bump → ${step.count}/${total}`);\n        setCount(step.count);\n      }\n    };\n    const removeListener = ctx.addScrollListener((e) => {\n      lastEvent = e.nativeEvent;\n      check();\n    });\n    return () => {\n      removeListener();\n      if (retryTimer != null) {\n        clearTimeout(retryTimer);\n      }\n    };\n  }, [ctx, total, batchSize, threshold, rateLimitMs, debugLabel]);\n\n  useEffect(() => {\n    const idleTarget = idleCap == null ? total : Math.min(idleCap, total);\n    if (count >= idleTarget) {\n      if (count > 0 && count === total) {\n        dbg(debugLabel, `complete: all ${total} items revealed`);\n      } else if (count === idleTarget) {\n        dbg(debugLabel, `idle cap reached at ${count}/${total}, waiting for scroll`);\n      }\n      return undefined;\n    }\n    const g = globalThis as unknown as IIdleGlobal;\n    const tick = (): void => {\n      const cap = idleCap == null ? total : Math.min(idleCap, total);\n      const next = Math.min(countRef.current + batchSize, cap);\n      countRef.current = next;\n      dbg(debugLabel, `idle bump → ${next}/${total}`);\n      setCount(next);\n    };\n    if (g.requestIdleCallback) {\n      const handle = g.requestIdleCallback(tick, { timeout: 300 });\n      return () => g.cancelIdleCallback?.(handle);\n    }\n    const handle = setTimeout(tick, 50) as unknown as number;\n    return () => clearTimeout(handle);\n  }, [count, total, batchSize, idleCap, debugLabel]);\n\n  return Math.min(effectiveCount, total);\n}\n\nexport function useProgressiveItems<T>(items: T[], options?: IProgressiveOptions): T[] {\n  const count = useProgressiveCount(items.length, options);\n  return count >= items.length ? items : items.slice(0, count);\n}\n","import { useSyncExternalStore } from \"react\";\nimport { SCALED_SPACINGS, SCALED_LEADINGS } from \"./scaledSpacings.generated\";\n\nconst BASE_REM = 16;\nconst listeners = new Set<() => void>();\nlet currentRem: number | undefined = undefined;\n\nexport function useRem(): number {\n  return useSyncExternalStore(remSubscribe, remGet, remServerGet);\n}\n\nexport function useRemScale(): number {\n  return useRem() / BASE_REM;\n}\n\nexport function Rem_set(size: number): void {\n  if (typeof document !== \"undefined\") {\n    const root = document.documentElement;\n    root.style.fontSize = `${size}px`;\n    const scale = size / BASE_REM;\n    // --spacing is deliberately absent: paddings, margins and gaps are constant at every text\n    // size. Only type, and the boxes that have to keep containing it, grow.\n    const vars: Record<string, string> = {\n      \"--text-2xs\": `${10 * scale}px`,\n      \"--text-xs\": `${12 * scale}px`,\n      \"--text-sm\": `${14 * scale}px`,\n      \"--text-base\": `${16 * scale}px`,\n      \"--text-lg\": `${18 * scale}px`,\n      \"--text-xl\": `${20 * scale}px`,\n      \"--text-2xl\": `${24 * scale}px`,\n      \"--text-3xl\": `${30 * scale}px`,\n      \"--text-4xl\": `${36 * scale}px`,\n      \"--text-5xl\": `${48 * scale}px`,\n    };\n    for (const n of SCALED_SPACINGS) {\n      vars[`--spacing-scaled-${n}`] = `${n * 4 * scale}px`;\n    }\n    for (const n of SCALED_LEADINGS) {\n      vars[`--leading-scaled-${n}`] = `${n * 4 * scale}px`;\n    }\n    for (const [k, v] of Object.entries(vars)) {\n      root.style.setProperty(k, v);\n    }\n  }\n  currentRem = size;\n  for (const l of listeners) {\n    l();\n  }\n}\n\n// getSnapshot runs on every render of every subscriber (and there's one per icon),\n// so it must not call getComputedStyle - that forces a style recalc each time.\nfunction remGet(): number {\n  if (currentRem == null) {\n    if (typeof document === \"undefined\") {\n      return BASE_REM;\n    }\n    const fs = parseFloat(getComputedStyle(document.documentElement).fontSize);\n    currentRem = isNaN(fs) ? BASE_REM : fs;\n  }\n  return currentRem;\n}\n\nfunction remServerGet(): number {\n  return BASE_REM;\n}\n\nfunction remSubscribe(onChange: () => void): () => void {\n  listeners.add(onChange);\n  return () => {\n    listeners.delete(onChange);\n  };\n}\n","export function useScreenPerf(_screenName: string): { markLoaded: () => void } {\n  return { markLoaded: () => undefined };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface IScrollEventLike {\n  nativeEvent: {\n    contentOffset: { y: number };\n    contentSize: { height: number };\n    layoutMeasurement: { height: number };\n  };\n}\n\nexport function useScrollProgressiveList<T>(\n  collection: T[],\n  options?: { batchSize?: number; threshold?: number; rateLimitMs?: number; enabled?: boolean }\n): {\n  visibleRecords: number;\n  visibleItems: T[];\n  onScroll: (e: IScrollEventLike) => void;\n  hasMore: boolean;\n} {\n  const batchSize = options?.batchSize ?? 20;\n  const threshold = options?.threshold ?? 500;\n  const rateLimitMs = options?.rateLimitMs ?? 300;\n  const enabled = options?.enabled ?? true;\n\n  const initial = enabled ? batchSize : collection.length;\n  const [visibleRecords, setVisibleRecords] = useState<number>(initial);\n  const visibleRef = useRef<number>(initial);\n  const lastBumpRef = useRef<number>(0);\n\n  useEffect(() => {\n    const next = enabled ? batchSize : collection.length;\n    visibleRef.current = next;\n    lastBumpRef.current = 0;\n    setVisibleRecords(next);\n  }, [collection, batchSize, enabled]);\n\n  const onScroll = useCallback(\n    (e: IScrollEventLike) => {\n      if (visibleRef.current >= collection.length) {\n        return;\n      }\n      const now = Date.now();\n      if (now - lastBumpRef.current < rateLimitMs) {\n        return;\n      }\n      const { contentOffset, contentSize, layoutMeasurement } = e.nativeEvent;\n      if (contentOffset.y + layoutMeasurement.height > contentSize.height - threshold) {\n        lastBumpRef.current = now;\n        const next = Math.min(visibleRef.current + batchSize, collection.length);\n        visibleRef.current = next;\n        setVisibleRecords(next);\n      }\n    },\n    [collection.length, batchSize, threshold, rateLimitMs]\n  );\n\n  return {\n    visibleRecords,\n    visibleItems: collection.slice(0, visibleRecords),\n    onScroll,\n    hasMore: visibleRecords < collection.length,\n  };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Keyboard, Platform, useWindowDimensions } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\n// Returns how much of the IME the window did NOT absorb. iOS never resizes; Android\n// adjustResize shrinks the window on old versions, but targetSdk 35+ edge-to-edge\n// enforcement (Android 15+) ignores it — so subtract the actual window shrink instead of\n// assuming either behavior.\nexport function useSystemKeyboardHeight(): number {\n  const [height, setHeight] = useState(0);\n  const { height: windowHeight } = useWindowDimensions();\n  const noKeyboardWindowHeight = useRef(windowHeight);\n  if (height === 0) {\n    noKeyboardWindowHeight.current = windowHeight;\n  }\n  useEffect(() => {\n    const showEvent = Platform.OS === \"ios\" ? \"keyboardWillShow\" : \"keyboardDidShow\";\n    const hideEvent = Platform.OS === \"ios\" ? \"keyboardWillHide\" : \"keyboardDidHide\";\n    const showSub = Keyboard.addListener(showEvent, (e) => setHeight(e.endCoordinates.height));\n    const hideSub = Keyboard.addListener(hideEvent, () => setHeight(0));\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, []);\n  return Math.max(0, height - Math.max(0, noKeyboardWindowHeight.current - windowHeight));\n}\n\n// The same height, but measured from the bottom of the screen rather than from the top of the\n// navigation bar. Android's keyboard event reports `imeInsets.bottom - barInsets.bottom`\n// (ReactRootView), so the bar it covers is missing from the number; iOS already reports the\n// raw height. Use this — not the bare hook — whenever the keyboard is being compared against\n// something that pads for the bottom inset itself, like the tab bar.\nexport function useSystemKeyboardHeightFromScreenBottom(): number {\n  const height = useSystemKeyboardHeight();\n  const insets = useSafeAreaInsets();\n  return height > 0 && Platform.OS === \"android\" ? height + insets.bottom : height;\n}\n","import { Reducer, useCallback, useRef, useState } from \"react\";\nimport { IGDispatch, IGThunk, IReducerOnIGAction } from \"../ducks/types\";\n\nexport function useThunkReducer<TState, TAction extends Record<string, unknown>, TEnv>(\n  reducer: Reducer<TState, TAction>,\n  initialState: TState,\n  env: TEnv,\n  onActions: IReducerOnIGAction<TState, TAction, TEnv>[] = []\n): [TState, IGDispatch<TState, TAction, TEnv>] {\n  const [hookState, setHookState] = useState(initialState);\n\n  // State management.\n  const state = useRef(hookState);\n  const getState = useCallback(() => state.current, [state]);\n  const setState = useCallback(\n    (newState: TState): void => {\n      state.current = newState;\n      setHookState(newState);\n    },\n    [state, setHookState]\n  );\n\n  // Reducer.\n  const reduce = useCallback((action: TAction): TState => reducer(getState(), action), [reducer, getState]);\n\n  // Augmented dispatcher.\n  const dispatch = useCallback(\n    (action: IGThunk<TState, TAction, TEnv> | TAction) => {\n      const oldState = state.current;\n      if (typeof action === \"function\") {\n        (action(dispatch, getState, env) as Promise<void>).then(() => {\n          for (const onAction of onActions) {\n            onAction(dispatch, action, oldState, state.current);\n          }\n        });\n      } else {\n        const newState = reduce(action);\n        setState(newState);\n        for (const onAction of onActions) {\n          onAction(dispatch, action, oldState, state.current);\n        }\n      }\n    },\n    [getState, setState, reduce]\n  );\n\n  return [hookState, dispatch];\n}\n","import { useMemo, DependencyList } from \"react\";\nimport { PerfTracker_recordEvent, PerfTracker_getSessionId } from \"./perfTracker\";\nimport { PerfEnabled_tier2 } from \"./perfEnabled\";\n\ndeclare const performance: { now: () => number } | undefined;\n\nconst MIN_REPORT_MS = 1;\n\nexport function useTimedMemo<T>(label: string, fn: () => T, deps: DependencyList): T {\n  return useMemo(() => {\n    if (!PerfEnabled_tier2() || typeof performance === \"undefined\" || !performance.now) {\n      return fn();\n    }\n    const start = performance.now();\n    const result = fn();\n    const duration = performance.now() - start;\n    if (duration >= MIN_REPORT_MS) {\n      PerfTracker_recordEvent({\n        type: \"memo_timing\",\n        session: PerfTracker_getSessionId(),\n        label,\n        duration_ms: duration,\n        ts: Date.now(),\n      });\n    }\n    return result;\n  }, deps);\n}\n","import { MutableRefObject, useCallback, useContext, useEffect, useMemo, useRef } from \"react\";\nimport type { View } from \"react-native\";\nimport { NavScreenScrollContext } from \"../navigation/NavScreenScrollContext\";\nimport { ClickTrackingContext } from \"./clickTracking\";\nimport { Thunk_postevent } from \"../ducks/thunks\";\nimport { WorkoutImpressionVisibility_isSeen } from \"./workoutImpressionVisibility\";\n\nconst RATE_LIMIT_MS = 200;\n\ninterface IWorkoutImpressionArgs {\n  name: string;\n  // Neighbouring pages stay mounted off to the side, and the scroll context reports no horizontal\n  // offset to rule them out with.\n  isCurrentPage: boolean;\n  // Must outlive the card: cards unmount as you swipe away, and a latch inside one would re-arm.\n  seenRef: MutableRefObject<Set<string>>;\n}\n\nexport function useWorkoutImpression(args: IWorkoutImpressionArgs): {\n  ref: (node: View | null) => void;\n  onLayout: () => void;\n} {\n  const { name, isCurrentPage, seenRef } = args;\n  const scrollCtx = useContext(NavScreenScrollContext);\n  const dispatch = useContext(ClickTrackingContext);\n  const nodeRef = useRef<View | null>(null);\n  const lastCheckRef = useRef(0);\n\n  const isCurrentPageRef = useRef(isCurrentPage);\n  isCurrentPageRef.current = isCurrentPage;\n\n  const check = useCallback(\n    (force: boolean) => {\n      if (!isCurrentPageRef.current || dispatch == null || seenRef.current.has(name)) {\n        return;\n      }\n      const viewport = scrollCtx?.viewportRef.current;\n      const node = nodeRef.current;\n      if (viewport == null || node == null) {\n        return;\n      }\n      const now = Date.now();\n      if (!force && now - lastCheckRef.current < RATE_LIMIT_MS) {\n        return;\n      }\n      lastCheckRef.current = now;\n      const stickyHeaderHeight = scrollCtx?.stickyHeaderHeight ?? 0;\n      // Subtracted rather than compared to window height: on Android edge-to-edge the window and\n      // measureInWindow don't share an origin.\n      viewport.measureInWindow((_vx, vy, _vw, vh) => {\n        node.measureInWindow((_x, y, _w, h) => {\n          // Two async round-trips are long enough to swipe away or unmount.\n          if (!isCurrentPageRef.current || nodeRef.current !== node) {\n            return;\n          }\n          if (h <= 0 || vh <= 0 || seenRef.current.has(name)) {\n            return;\n          }\n          const isSeen = WorkoutImpressionVisibility_isSeen({\n            top: y - vy,\n            height: h,\n            viewportHeight: vh,\n            stickyHeaderHeight,\n          });\n          if (isSeen) {\n            seenRef.current.add(name);\n            dispatch(Thunk_postevent(`view-nm-${name}`));\n          }\n        });\n      });\n    },\n    [scrollCtx, dispatch, name, seenRef]\n  );\n\n  // Three triggers, none sufficient alone: a swipe fires no scroll event, and the measured blocks\n  // mount 350ms late, after this listener registered and after addScrollListener replayed.\n  useEffect(() => {\n    return scrollCtx?.addScrollListener(() => check(false));\n  }, [scrollCtx, check]);\n\n  useEffect(() => {\n    if (isCurrentPage) {\n      check(true);\n    }\n  }, [isCurrentPage, check]);\n\n  const ref = useCallback(\n    (node: View | null) => {\n      nodeRef.current = node;\n      if (node != null) {\n        check(true);\n      }\n    },\n    [check]\n  );\n\n  const onLayout = useCallback(() => check(true), [check]);\n\n  // A fresh object each render would defeat the memo on ExerciseHistory.\n  return useMemo(() => ({ ref, onLayout }), [ref, onLayout]);\n}\n","import { IAuthToken } from \"./keychain\";\nimport { IUser } from \"../models/user\";\nimport { IStorage } from \"../types\";\nimport { AdminDebug_isDebugAccountId } from \"../models/adminDebug\";\n\nexport type IWatchAuthSource = \"startup\" | \"request\";\n\nexport type IWatchAuthDecision =\n  | { kind: \"send\"; auth: IAuthToken }\n  | { kind: \"clearWatch\"; storedUserId: string }\n  | { kind: \"sendNoAuth\" }\n  | { kind: \"nothing\" };\n\nexport function WatchAuthHandoff_accountId(\n  user: IUser | undefined,\n  storage: Pick<IStorage, \"email\" | \"tempUserId\">\n): string | undefined {\n  if (AdminDebug_isDebugAccountId(storage.tempUserId)) {\n    return undefined;\n  }\n  if (user != null) {\n    return user.id;\n  }\n  if (storage.email) {\n    return storage.tempUserId;\n  }\n  return undefined;\n}\n\nexport function WatchAuthHandoff_decide(\n  auth: IAuthToken | undefined,\n  accountId: string | undefined,\n  source: IWatchAuthSource\n): IWatchAuthDecision {\n  if (!auth?.token || !accountId) {\n    return source === \"request\" ? { kind: \"sendNoAuth\" } : { kind: \"nothing\" };\n  }\n  return auth.userId === accountId ? { kind: \"send\", auth } : { kind: \"clearWatch\", storedUserId: auth.userId || \"\" };\n}\n","// The watch runs watch-bundle.js in QuickJS. JSContext.swift installs these globals so the bundle can\n// post messages to WatchMessageHandler.swift. They exist nowhere else.\ndeclare global {\n  // eslint-disable-next-line no-var\n  var webkit:\n    | {\n        messageHandlers?: { liftosaurMessage?: { postMessage: (message: Record<string, string | undefined>) => void } };\n      }\n    | undefined;\n  // eslint-disable-next-line no-var\n  var lftIosAppVersion: string | undefined;\n}\n\nexport function WatchHost_isAvailable(): boolean {\n  return globalThis.webkit?.messageHandlers?.liftosaurMessage != null;\n}\n\nexport function WatchHost_appVersion(): number {\n  return parseInt(globalThis.lftIosAppVersion || \"0\", 10);\n}\n\nexport function WatchHost_send(message: Record<string, string | undefined>): void {\n  globalThis.webkit?.messageHandlers?.liftosaurMessage?.postMessage(message);\n}\n","import { IRestTimerAlertBrowserState, IWebPushSubscription } from \"../models/restTimerAlert\";\n\nfunction hasPushManager(): boolean {\n  return typeof window !== \"undefined\" && \"serviceWorker\" in navigator && \"PushManager\" in window;\n}\n\nfunction isStandalone(): boolean {\n  if (typeof window === \"undefined\") {\n    return false;\n  }\n  const iosStandalone = (navigator as Navigator & { standalone?: boolean }).standalone === true;\n  return (\n    iosStandalone ||\n    window.matchMedia?.(\"(display-mode: standalone)\").matches ||\n    window.matchMedia?.(\"(display-mode: fullscreen)\").matches\n  );\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array<ArrayBuffer> {\n  const base64 = (value + \"=\".repeat((4 - (value.length % 4)) % 4)).replace(/-/g, \"+\").replace(/_/g, \"/\");\n  const raw = atob(base64);\n  const bytes = new Uint8Array(new ArrayBuffer(raw.length));\n  for (let i = 0; i < raw.length; i += 1) {\n    bytes[i] = raw.charCodeAt(i);\n  }\n  return bytes;\n}\n\nasync function pushSubscription(): Promise<PushSubscription | undefined> {\n  if (!hasPushManager()) {\n    return undefined;\n  }\n  const registration = await navigator.serviceWorker.getRegistration();\n  return (await registration?.pushManager.getSubscription()) ?? undefined;\n}\n\nexport async function WebPush_subscription(): Promise<IWebPushSubscription | undefined> {\n  const json = (await pushSubscription())?.toJSON();\n  if (json?.endpoint == null || json.keys?.p256dh == null || json.keys.auth == null) {\n    return undefined;\n  }\n  return { endpoint: json.endpoint, keys: { p256dh: json.keys.p256dh, auth: json.keys.auth } };\n}\n\nexport async function WebPush_browserState(): Promise<IRestTimerAlertBrowserState> {\n  const permission = typeof Notification !== \"undefined\" ? Notification.permission : \"default\";\n  return {\n    hasPushManager: hasPushManager(),\n    isStandalone: isStandalone(),\n    permission,\n    hasSubscription: (await pushSubscription()) != null,\n  };\n}\n\nexport async function WebPush_subscribe(vapidPublicKey: string): Promise<void> {\n  // WebKit only shows the prompt from a tap. Asking first, before any await, keeps it inside the tap.\n  if ((await Notification.requestPermission()) !== \"granted\") {\n    return;\n  }\n  const registration = await navigator.serviceWorker.getRegistration();\n  await registration?.pushManager.subscribe({\n    userVisibleOnly: true,\n    applicationServerKey: base64UrlToBytes(vapidPublicKey),\n  });\n}\n\nexport async function WebPush_unsubscribe(): Promise<void> {\n  await (await pushSubscription())?.unsubscribe();\n}\n","import {\n  IExercise,\n  Exercise_get,\n  Exercise_getVolumeMultiplier,\n  Exercise_targetMusclesGroups,\n  Exercise_synergistMusclesGroupMultipliers,\n  Exercise_synergistMusclesGroups,\n} from \"../models/exercise\";\nimport { Reps_setVolume } from \"../models/set\";\nimport { Weight_build, Weight_add, Weight_multiply } from \"../models/weight\";\nimport { ISetResults, ISetSplit } from \"../pages/planner/models/types\";\nimport { IHistoryRecord, IScreenMuscle, ISettings } from \"../types\";\n\ntype IResultsSetSplit = Omit<ISetResults, \"total\" | \"strength\" | \"hypertrophy\" | \"muscleGroup\" | \"volume\">;\n\nexport function WeekInsightsUtils_calculateSetResults(\n  historyRecords: IHistoryRecord[],\n  settings: ISettings\n): ISetResults {\n  const results: ISetResults = {\n    volume: Weight_build(0, settings.units),\n    total: 0,\n    strength: 0,\n    hypertrophy: 0,\n    upper: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    lower: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    core: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    push: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    pull: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    legs: { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] },\n    muscleGroup: {},\n  };\n\n  for (const record of historyRecords) {\n    const dayIndex = new Date(record.startTime).getDay();\n    for (const entry of record.entries) {\n      const exercise = Exercise_get(entry.exercise, settings.exercises);\n      if (exercise == null) {\n        continue;\n      }\n      const volumeMultiplier = Exercise_getVolumeMultiplier(entry.exercise, settings);\n      for (const set of entry.sets) {\n        const completedReps = set.completedReps || 0;\n        if (completedReps > 0) {\n          results.volume = Weight_add(\n            results.volume,\n            Weight_multiply(Reps_setVolume(set, settings.units), volumeMultiplier)\n          );\n          results.total += 1;\n          if (completedReps < 8) {\n            results.strength += 1;\n          } else {\n            results.hypertrophy += 1;\n          }\n          if (exercise.types.indexOf(\"core\") !== -1) {\n            add(results, \"core\", completedReps, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"push\") !== -1) {\n            add(results, \"push\", completedReps, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"pull\") !== -1) {\n            add(results, \"pull\", completedReps, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"legs\") !== -1) {\n            add(results, \"legs\", completedReps, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"upper\") !== -1) {\n            add(results, \"upper\", completedReps, dayIndex, exercise);\n          }\n          if (exercise.types.indexOf(\"lower\") !== -1) {\n            add(results, \"lower\", completedReps, dayIndex, exercise);\n          }\n          const targetMuscleGroups = Exercise_targetMusclesGroups(exercise, settings);\n          const synergistMusclesGroupMultipliers = Exercise_synergistMusclesGroupMultipliers(exercise, settings);\n          for (const muscle of targetMuscleGroups) {\n            const synergistMultiplier =\n              synergistMusclesGroupMultipliers[muscle] ?? settings.planner.synergistMultiplier;\n            addMuscleGroup(results.muscleGroup, muscle, completedReps, dayIndex, true, synergistMultiplier, exercise);\n          }\n          for (const muscle of Exercise_synergistMusclesGroups(exercise, settings)) {\n            if (targetMuscleGroups.indexOf(muscle) === -1) {\n              const synergistMultiplier =\n                synergistMusclesGroupMultipliers[muscle] ?? settings.planner.synergistMultiplier;\n              addMuscleGroup(\n                results.muscleGroup,\n                muscle,\n                completedReps,\n                dayIndex,\n                false,\n                synergistMultiplier,\n                exercise\n              );\n            }\n          }\n        }\n      }\n    }\n  }\n  return results;\n}\n\nfunction add(\n  results: IResultsSetSplit,\n  key: keyof IResultsSetSplit,\n  completedReps: number,\n  dayIndex: number,\n  exercise: IExercise\n): void {\n  let isStrength = false;\n  if (completedReps < 8) {\n    isStrength = true;\n    results[key].strength += 1;\n  } else {\n    results[key].hypertrophy += 1;\n  }\n  results[key].frequency[dayIndex] = true;\n  if (results[key].exercises.every((e) => e.exerciseName !== exercise.name)) {\n    results[key].exercises.push({\n      exerciseName: exercise.name,\n      dayIndex: dayIndex,\n      isSynergist: false,\n      strengthSets: 0,\n      hypertrophySets: 0,\n    });\n  }\n  const ex = results[key].exercises.find((e) => e.exerciseName === exercise.name);\n  if (ex) {\n    if (isStrength) {\n      ex.strengthSets += 1;\n    } else {\n      ex.hypertrophySets += 1;\n    }\n  }\n}\n\nfunction addMuscleGroup(\n  results: { [k in IScreenMuscle]: ISetSplit },\n  key: IScreenMuscle,\n  completedReps: number,\n  dayIndex: number,\n  isTarget: boolean,\n  synergistMultiplier: number,\n  exercise: IExercise\n): void {\n  synergistMultiplier = synergistMultiplier ?? 0.5;\n  let isStrength = false;\n  results[key] = results[key] || { strength: 0, hypertrophy: 0, frequency: {}, exercises: [] };\n  if (completedReps < 8) {\n    isStrength = true;\n    results[key].strength += isTarget ? 1 : 1 * synergistMultiplier;\n  } else {\n    results[key].hypertrophy += isTarget ? 1 : 1 * synergistMultiplier;\n  }\n  results[key].frequency[dayIndex] = true;\n  if (results[key].exercises.every((e) => e.exerciseName !== exercise.name)) {\n    results[key].exercises.push({\n      exerciseName: exercise.name,\n      dayIndex: dayIndex,\n      isSynergist: !isTarget,\n      strengthSets: 0,\n      hypertrophySets: 0,\n    });\n  }\n  const ex = results[key].exercises.find((e) => e.exerciseName === exercise.name);\n  if (ex) {\n    if (isStrength) {\n      ex.strengthSets += isTarget ? 1 : 1 * synergistMultiplier;\n    } else {\n      ex.hypertrophySets += isTarget ? 1 : 1 * synergistMultiplier;\n    }\n  }\n}\n","export interface IWorkoutCenterScrollInput {\n  scrollY: number;\n  rowTop: number;\n  rowHeight: number;\n  viewportTop: number;\n  viewportHeight: number;\n  stickyHeaderHeight: number;\n  footerHeight: number;\n  contentHeight: number;\n}\n\nexport function WorkoutCenterScroll_targetY(input: IWorkoutCenterScrollInput): number {\n  const visibleHeight = input.viewportHeight - input.stickyHeaderHeight - input.footerHeight;\n  const visibleCenter = input.stickyHeaderHeight + visibleHeight / 2;\n  const rowCenter = input.rowTop - input.viewportTop + input.rowHeight / 2;\n  const maxY = Math.max(0, input.contentHeight - input.viewportHeight);\n  return Math.round(Math.min(maxY, Math.max(0, input.scrollY + rowCenter - visibleCenter)));\n}\n","import { ISetsStatus, Reps_isFinished, Reps_isCompleted, Reps_isInRangeCompleted } from \"../models/set\";\nimport { ISet } from \"../types\";\nimport { Tailwind_semantic, Tailwind_colors } from \"./tailwindConfig\";\n\nexport function WorkoutExerciseUtils_getColor(sets: ISet[], isWarmup: boolean): string {\n  if (sets.length === 0) {\n    return \"purple\";\n  }\n  if (Reps_isFinished(sets)) {\n    if (isWarmup) {\n      return \"green\";\n    } else {\n      if (Reps_isCompleted(sets)) {\n        return \"green\";\n      } else if (Reps_isInRangeCompleted(sets)) {\n        return \"yellow\";\n      } else {\n        return \"red\";\n      }\n    }\n  } else {\n    return \"purple\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getBgColor50(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"bg-color-green50\";\n  } else if (color === \"red\") {\n    return \"bg-color-red50\";\n  } else if (color === \"yellow\") {\n    return \"bg-color-yellow50\";\n  } else {\n    return \"bg-color-purple50\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getBgColor100(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"bg-color-green100\";\n  } else if (color === \"red\") {\n    return \"bg-color-red100\";\n  } else if (color === \"yellow\") {\n    return \"bg-color-yellow100\";\n  } else {\n    return \"bg-color-purple100\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getBgColor200(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"bg-color-green200\";\n  } else if (color === \"red\") {\n    return \"bg-color-red200\";\n  } else if (color === \"yellow\") {\n    return \"bg-color-yellow200\";\n  } else {\n    return \"bg-color-purple200\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getIconColor(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return Tailwind_semantic().icon.green;\n  } else if (color === \"red\") {\n    return Tailwind_semantic().icon.red;\n  } else if (color === \"yellow\") {\n    return Tailwind_semantic().icon.yellow;\n  } else {\n    return Tailwind_semantic().icon.light;\n  }\n}\n\nexport function WorkoutExerciseUtils_getBorderColor100(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"border-color-green100\";\n  } else if (color === \"red\") {\n    return \"border-color-red100\";\n  } else if (color === \"yellow\") {\n    return \"border-color-yellow100\";\n  } else {\n    return \"border-color-purple100\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getBorderColor150(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"border-color-green150\";\n  } else if (color === \"red\") {\n    return \"border-color-red150\";\n  } else if (color === \"yellow\") {\n    return \"border-color-yellow150\";\n  } else {\n    return \"border-color-purple150\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getBorderColor200(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"border-color-green200\";\n  } else if (color === \"red\") {\n    return \"border-color-red200\";\n  } else if (color === \"yellow\") {\n    return \"border-color-yellow200\";\n  } else {\n    return \"border-color-purple200\";\n  }\n}\n\nexport function WorkoutExerciseUtils_getBorderColor300(sets: ISet[], isWarmup: boolean): string {\n  const color = WorkoutExerciseUtils_getColor(sets, isWarmup);\n  if (color === \"green\") {\n    return \"border-color-green300\";\n  } else if (color === \"red\") {\n    return \"border-color-red300\";\n  } else if (color === \"yellow\") {\n    return \"border-color-yellow300\";\n  } else {\n    return \"border-color-purple300\";\n  }\n}\n\nexport function WorkoutExerciseUtils_setsStatusToColor(status: ISetsStatus): string {\n  switch (status) {\n    case \"success\":\n      return Tailwind_colors().green[600];\n    case \"in-range\":\n      return Tailwind_colors().yellow[600];\n    case \"failed\":\n      return Tailwind_colors().red[500];\n    case \"not-finished\":\n      return Tailwind_colors().lightgray[400];\n  }\n}\n\nexport function WorkoutExerciseUtils_setsStatusToBorderColor(status: ISetsStatus): string {\n  switch (status) {\n    case \"success\":\n      return \"border-green-700\";\n    case \"in-range\":\n      return \"border-yellow-700\";\n    case \"failed\":\n      return \"border-red-700\";\n    case \"not-finished\":\n      return \"border-gray-300\";\n  }\n}\n\nexport function WorkoutExerciseUtils_setsStatusToTextColor(status: ISetsStatus): string {\n  switch (status) {\n    case \"success\":\n      return \"text-green-600\";\n    case \"in-range\":\n      return \"text-yellow-600\";\n    case \"failed\":\n      return \"text-red-600\";\n    case \"not-finished\":\n      return \"text-gray-300\";\n  }\n}\n\n// Concrete-color twin of setsStatusToTextColor for FastText (which takes resolved colors,\n// not classNames). setsStatusToColor above is NOT it — that's the icon palette.\nexport function WorkoutExerciseUtils_setsStatusToTextColorValue(status: ISetsStatus): string {\n  switch (status) {\n    case \"success\":\n      return Tailwind_colors().green[600];\n    case \"in-range\":\n      return Tailwind_colors().yellow[600];\n    case \"failed\":\n      return Tailwind_colors().red[600];\n    case \"not-finished\":\n      // Closest custom-palette match to text-gray-300 (Tailwind default palette, #d1d5db).\n      return Tailwind_colors().lightgray[200];\n  }\n}\n","import { Platform } from \"react-native\";\nimport { IDispatch } from \"../ducks/types\";\nimport { Thunk_finishProgramDay } from \"../ducks/thunks\";\nimport { Progress_isFullyEmptyOrFinishedSet } from \"../models/progress\";\nimport { IHistoryRecord, ISettings } from \"../types\";\nimport { HealthSync_eligibleForAppleHealth, HealthSync_eligibleForGoogleHealth } from \"../lib/healthSync\";\nimport { Dialog_confirm } from \"./dialog\";\n\nexport interface IWorkoutFinishArgs {\n  progress: IHistoryRecord;\n  settings: ISettings;\n  dispatch: IDispatch;\n  isCurrent: boolean;\n  setIsFinishing: (value: boolean) => void;\n}\n\nfunction nextPaint(): Promise<void> {\n  return new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n}\n\nasync function askHealthSync(settings: ISettings): Promise<boolean> {\n  const isEligible =\n    (HealthSync_eligibleForAppleHealth() && settings.appleHealthSyncWorkout) ||\n    (HealthSync_eligibleForGoogleHealth() && settings.googleHealthSyncWorkout);\n  if (!isEligible) {\n    return false;\n  }\n  const healthName = Platform.OS === \"ios\" ? \"Apple Health\" : \"Google Health\";\n  return !settings.healthConfirmation || Dialog_confirm(`Do you want to sync this workout to ${healthName}?`);\n}\n\nexport async function WorkoutFinish_run(args: IWorkoutFinishArgs): Promise<void> {\n  const { progress, settings, dispatch, isCurrent, setIsFinishing } = args;\n  const isFullyFinished = isCurrent && Progress_isFullyEmptyOrFinishedSet(progress);\n  if (!isFullyFinished) {\n    const confirmed = await Dialog_confirm(\n      isCurrent\n        ? \"Are you sure you want to FINISH this workout? Some sets are not marked as completed.\"\n        : \"Are you sure you want to SAVE this PAST workout?\"\n    );\n    if (!confirmed) {\n      return;\n    }\n  }\n  const healthSync = isCurrent && (await askHealthSync(settings));\n  setIsFinishing(true);\n  try {\n    await nextPaint();\n    dispatch(\n      Thunk_finishProgramDay({\n        id: progress.id,\n        startTime: progress.startTime,\n        healthSync,\n        onStale: () => setIsFinishing(false),\n      })\n    );\n    // isFinishing stays true on success: Thunk_finishProgramDay defers the 1-2s blocking commit past\n    // `await getNavigationService()` and navigates away first, so clearing here would drop the\n    // spinner right before the freeze it masks.\n  } catch (error) {\n    setIsFinishing(false);\n    throw error;\n  }\n}\n","export type IWorkoutHintId = \"workout-reorder\" | \"workout-target-switch\" | \"workout-set-expand\";\n\nconst usesToLearn: Record<IWorkoutHintId, number> = {\n  \"workout-reorder\": 2,\n  \"workout-target-switch\": 1,\n  \"workout-set-expand\": 2,\n};\n\nexport function WorkoutHints_isLearned(helps: string[], id: IWorkoutHintId): boolean {\n  return helps.indexOf(id) !== -1;\n}\n\nexport function WorkoutHints_recordUse(helps: string[], id: IWorkoutHintId, stamp: string): string[] {\n  const token = `${id}.${stamp}`;\n  if (WorkoutHints_isLearned(helps, id) || helps.indexOf(token) !== -1) {\n    return helps;\n  }\n  const uses = helps.filter((h) => h.startsWith(`${id}.`)).length + 1;\n  const next = [...helps, token];\n  return uses >= usesToLearn[id] ? [...next, id] : next;\n}\n","import { lb } from \"lens-shmens\";\nimport { IDispatch } from \"../ducks/types\";\nimport { IState, updateState } from \"../models/state\";\nimport { IWorkoutHintId, WorkoutHints_isLearned, WorkoutHints_recordUse } from \"./workoutHints\";\n\nexport function WorkoutHints_recordUseInState(dispatch: IDispatch, helps: string[], id: IWorkoutHintId): void {\n  if (WorkoutHints_isLearned(helps, id)) {\n    return;\n  }\n  const stamp = String(Date.now());\n  updateState(\n    dispatch,\n    [\n      lb<IState>()\n        .p(\"storage\")\n        .p(\"helps\")\n        .recordModify((hs) => WorkoutHints_recordUse(hs, id, stamp)),\n    ],\n    `Record hint use ${id}`\n  );\n}\n","export interface IWorkoutImpressionVisibilityArgs {\n  // Relative to the scroll viewport, not the window.\n  top: number;\n  height: number;\n  viewportHeight: number;\n  stickyHeaderHeight: number;\n}\n\n// Seen means the whole block, not a sliver: an exercise with few sets leaves the graph's top edge\n// right at the fold.\nexport function WorkoutImpressionVisibility_isSeen(args: IWorkoutImpressionVisibilityArgs): boolean {\n  const { top, height, viewportHeight, stickyHeaderHeight } = args;\n  if (height <= 0 || viewportHeight <= 0) {\n    return false;\n  }\n  const available = Math.max(0, viewportHeight - stickyHeaderHeight);\n  const shownTop = Math.max(top, stickyHeaderHeight);\n  const shownBottom = Math.min(top + height, viewportHeight);\n  const shown = Math.max(0, shownBottom - shownTop);\n  // A block taller than the viewport can never fit, so for those, filling it counts.\n  return shown >= Math.min(height, available) - 1;\n}\n","export type IWorkoutMenuAction = \"editDay\" | \"muscles\" | \"notes\" | \"share\" | \"createProgramDay\" | \"tour\" | \"delete\";\n\nexport interface IWorkoutMenuActionsArgs {\n  isCurrent: boolean;\n  hasNonEmptyProgram: boolean;\n  hasNonEmptyCurrentProgram: boolean;\n  isInAnyProgram: boolean;\n}\n\nexport function WorkoutMenuActions_list(args: IWorkoutMenuActionsArgs): IWorkoutMenuAction[] {\n  const actions: IWorkoutMenuAction[] = [];\n  if (args.hasNonEmptyProgram && args.hasNonEmptyCurrentProgram) {\n    actions.push(\"editDay\");\n  }\n  if (args.hasNonEmptyProgram) {\n    actions.push(\"muscles\");\n  }\n  actions.push(\"notes\");\n  if (!args.isCurrent) {\n    actions.push(\"share\");\n  }\n  if (!args.isCurrent && !args.isInAnyProgram) {\n    actions.push(\"createProgramDay\");\n  }\n  actions.push(\"tour\");\n  actions.push(\"delete\");\n  return actions;\n}\n","import { IHistoryEntry, IHistoryRecord } from \"../types\";\n\nexport interface IWorkoutProgressView {\n  id: number;\n  entries: IHistoryEntry[];\n  currentEntryIndex: number;\n  day: number;\n  week: number | undefined;\n  dayInWeek: number | undefined;\n  dayName: string;\n  programName: string;\n  programId: string;\n  startTime: number;\n  notes: string | undefined;\n  userPromptedStateVars: IHistoryRecord[\"userPromptedStateVars\"];\n  forceUpdateEntryIndex: boolean;\n  isExternal: boolean;\n}\n\nexport function WorkoutProgressView_next(\n  prev: IWorkoutProgressView | undefined,\n  progress: IHistoryRecord\n): IWorkoutProgressView {\n  const next: IWorkoutProgressView = {\n    id: progress.id,\n    entries: progress.entries,\n    currentEntryIndex: progress.currentEntryIndex ?? 0,\n    day: progress.day,\n    week: progress.week,\n    dayInWeek: progress.dayInWeek,\n    dayName: progress.dayName,\n    programName: progress.programName,\n    programId: progress.programId,\n    startTime: progress.startTime,\n    notes: progress.notes,\n    userPromptedStateVars: progress.userPromptedStateVars,\n    forceUpdateEntryIndex: !!progress.ui?.forceUpdateEntryIndex,\n    isExternal: !!progress.ui?.isExternal,\n  };\n  if (prev != null && WorkoutProgressView_isSame(prev, next)) {\n    return prev;\n  }\n  return next;\n}\n\nfunction WorkoutProgressView_isSame(a: IWorkoutProgressView, b: IWorkoutProgressView): boolean {\n  for (const key of Object.keys(b) as Array<keyof IWorkoutProgressView>) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n  return true;\n}\n","import { IHistoryEntry, IProgressMode, ISet } from \"../types\";\nimport { Reps_findNextSetIndex } from \"../models/set\";\n\nexport type IWorkoutSetExpansionOverride =\n  | { kind: \"expanded\"; setId: string; wasCompleted: boolean }\n  | { kind: \"collapsed\"; completedCount: number }\n  | undefined;\n\nfunction completedCount(entry: IHistoryEntry): number {\n  return [...entry.warmupSets, ...entry.sets].filter((s) => s.isCompleted).length;\n}\n\nexport interface IWorkoutExpandedSet {\n  mode: IProgressMode;\n  setIndex: number;\n}\n\nfunction setAt(entry: IHistoryEntry, mode: IProgressMode, setIndex: number): ISet | undefined {\n  return mode === \"warmup\" ? entry.warmupSets[setIndex] : entry.sets[setIndex];\n}\n\nfunction findById(entry: IHistoryEntry, setId: string): IWorkoutExpandedSet | undefined {\n  const warmupIndex = entry.warmupSets.findIndex((s) => s.id === setId);\n  if (warmupIndex !== -1) {\n    return { mode: \"warmup\", setIndex: warmupIndex };\n  }\n  const setIndex = entry.sets.findIndex((s) => s.id === setId);\n  return setIndex !== -1 ? { mode: \"workout\", setIndex } : undefined;\n}\n\nfunction nextUnfinished(entry: IHistoryEntry): IWorkoutExpandedSet | undefined {\n  const flatIndex = Reps_findNextSetIndex(entry);\n  if (flatIndex === -1) {\n    return undefined;\n  }\n  return flatIndex < entry.warmupSets.length\n    ? { mode: \"warmup\", setIndex: flatIndex }\n    : { mode: \"workout\", setIndex: flatIndex - entry.warmupSets.length };\n}\n\nexport function WorkoutSetExpansion_expanded(\n  entry: IHistoryEntry,\n  override: IWorkoutSetExpansionOverride,\n  shouldCollapseSets: boolean\n): IWorkoutExpandedSet | undefined {\n  if (override?.kind === \"collapsed\" && override.completedCount === completedCount(entry)) {\n    return undefined;\n  }\n  if (override?.kind === \"expanded\") {\n    const found = findById(entry, override.setId);\n    const set = found ? setAt(entry, found.mode, found.setIndex) : undefined;\n    if (found && set && !!set.isCompleted === override.wasCompleted) {\n      return found;\n    }\n  }\n  return shouldCollapseSets ? undefined : nextUnfinished(entry);\n}\n\nexport function WorkoutSetExpansion_shouldCollapseSetsAfterComplete(\n  entry: IHistoryEntry,\n  expanded: IWorkoutExpandedSet | undefined,\n  shouldCollapseSets: boolean,\n  mode: IProgressMode,\n  setIndex: number\n): boolean {\n  const set = setAt(entry, mode, setIndex);\n  if (set == null || set.isCompleted) {\n    return shouldCollapseSets;\n  }\n  if (expanded == null) {\n    return true;\n  }\n  if (expanded.mode === mode && expanded.setIndex === setIndex) {\n    return false;\n  }\n  return shouldCollapseSets;\n}\n\nexport function WorkoutSetExpansion_toggle(\n  entry: IHistoryEntry,\n  override: IWorkoutSetExpansionOverride,\n  shouldCollapseSets: boolean,\n  mode: IProgressMode,\n  setIndex: number\n): IWorkoutSetExpansionOverride {\n  const expanded = WorkoutSetExpansion_expanded(entry, override, shouldCollapseSets);\n  if (expanded && expanded.mode === mode && expanded.setIndex === setIndex) {\n    return { kind: \"collapsed\", completedCount: completedCount(entry) };\n  }\n  const set = setAt(entry, mode, setIndex);\n  if (set == null) {\n    return override;\n  }\n  return { kind: \"expanded\", setId: set.id, wasCompleted: !!set.isCompleted };\n}\n","import { IExerciseType, ISet, ISettings, IWeight } from \"../types\";\nimport { Equipment_getEquipmentNameForExerciseType } from \"../models/equipment\";\nimport { Exercise_get } from \"../models/exercise\";\nimport { Weight_calculatePlates, Weight_eq, Weight_formatOneSide, Weight_oneSidePlates } from \"../models/weight\";\n\nexport interface IWorkoutSetPlatesLine {\n  plates: string;\n  sidePlates: IWeight[];\n  isMatch: boolean;\n}\n\nexport function WorkoutSetPlates_line(\n  set: ISet,\n  settings: ISettings,\n  exerciseType: IExerciseType\n): IWorkoutSetPlatesLine | undefined {\n  const target = set.completedWeight ?? set.weight;\n  if (target == null) {\n    return undefined;\n  }\n  const exercise = Exercise_get(exerciseType, settings.exercises);\n  if (Equipment_getEquipmentNameForExerciseType(settings, exercise) == null) {\n    return undefined;\n  }\n  const { plates, totalWeight } = Weight_calculatePlates(target, settings, target.unit, exerciseType);\n  if (plates.length === 0) {\n    return undefined;\n  }\n  return {\n    plates: Weight_formatOneSide(settings, plates, exerciseType),\n    sidePlates: Weight_oneSidePlates(settings, plates, exerciseType),\n    isMatch: Weight_eq(totalWeight, target),\n  };\n}\n","import { IHistoryEntry, IProgressMode, ISet } from \"../types\";\nimport { IPrevBestSet, IPrevExerciseData } from \"../models/history\";\nimport { Weight_eq } from \"../models/weight\";\n\nexport interface IWorkoutSetPreviousLine {\n  label: \"Last\" | \"Best\" | \"Best AMRAP\" | \"Same day\";\n  set: ISet;\n  timestamp: number;\n}\n\nfunction setAt(entry: IHistoryEntry | undefined, mode: IProgressMode, setIndex: number): ISet | undefined {\n  if (entry == null) {\n    return undefined;\n  }\n  return mode === \"warmup\" ? entry.warmupSets[setIndex] : entry.sets[setIndex];\n}\n\nfunction sameResult(a: ISet, b: ISet): boolean {\n  const sameWeight =\n    a.completedWeight == null || b.completedWeight == null\n      ? a.completedWeight == null && b.completedWeight == null\n      : Weight_eq(a.completedWeight, b.completedWeight);\n  return a.completedReps === b.completedReps && a.completedRepsLeft === b.completedRepsLeft && sameWeight;\n}\n\nfunction bestFor(set: ISet, prevData: IPrevExerciseData | undefined): IPrevBestSet | undefined {\n  if (prevData == null) {\n    return undefined;\n  }\n  if (set.isAmrap) {\n    return prevData.bestAmrap;\n  }\n  return set.reps != null ? prevData.bestByReps[set.reps] : undefined;\n}\n\nexport function WorkoutSetPrevious_lines(\n  mode: IProgressMode,\n  setIndex: number,\n  set: ISet,\n  prevData: IPrevExerciseData | undefined,\n  isMultiweek: boolean,\n  isLastInColumn: boolean\n): IWorkoutSetPreviousLine[] {\n  const lines: IWorkoutSetPreviousLine[] = [];\n  const best = mode === \"workout\" ? bestFor(set, prevData) : undefined;\n  const sameDaySet = setAt(prevData?.sameDayEntry, mode, setIndex);\n  const sameDay =\n    isMultiweek &&\n    sameDaySet != null &&\n    prevData?.sameDayTimestamp != null &&\n    sameDaySet !== best?.set &&\n    (best == null || !sameResult(best.set, sameDaySet))\n      ? sameDaySet\n      : undefined;\n  const lastEntry = mode === \"warmup\" ? prevData?.lastWarmupEntry : prevData?.lastEntry;\n  const lastTimestamp = mode === \"warmup\" ? prevData?.lastWarmupEntryTimestamp : prevData?.lastEntryTimestamp;\n  const last = setAt(lastEntry, mode, setIndex);\n  if (last != null && lastTimestamp != null && !(isLastInColumn && mode === \"workout\")) {\n    lines.push({ label: \"Last\", set: last, timestamp: lastTimestamp });\n  }\n  if (best != null) {\n    lines.push({ label: set.isAmrap ? \"Best AMRAP\" : \"Best\", set: best.set, timestamp: best.timestamp });\n  }\n  if (sameDay != null && prevData?.sameDayTimestamp != null) {\n    lines.push({ label: \"Same day\", set: sameDay, timestamp: prevData.sameDayTimestamp });\n  }\n  return lines;\n}\n","export interface IWorkoutStripLabelMeasure {\n  titleWindowTop: number;\n  titleHeight: number;\n  viewportWindowTop: number;\n  scrollY: number;\n  stripHeight: number;\n}\n\nexport interface IWorkoutStripLabelFadeRange {\n  start: number;\n  end: number;\n}\n\nexport function WorkoutStripLabel_shadowRange(\n  pagerContainerTop: number,\n  stripHeight: number\n): IWorkoutStripLabelFadeRange {\n  const stuckAt = Math.max(0, pagerContainerTop - stripHeight);\n  return { start: stuckAt, end: stuckAt + 8 };\n}\n\nexport function WorkoutStripLabel_fadeRange(m: IWorkoutStripLabelMeasure): IWorkoutStripLabelFadeRange {\n  const titleTop = m.titleWindowTop - m.viewportWindowTop + m.scrollY;\n  const start = Math.max(0, titleTop - m.stripHeight);\n  const end = Math.max(start + 1, titleTop + m.titleHeight - m.stripHeight);\n  return { start, end };\n}\n","export function WorkoutStripReorder_dropIndex(\n  fromIndex: number,\n  translation: number,\n  tileWidth: number,\n  count: number\n): number {\n  if (count === 0 || tileWidth <= 0) {\n    return fromIndex;\n  }\n  const moved = Math.round(translation / tileWidth);\n  return Math.max(0, Math.min(count - 1, fromIndex + moved));\n}\n\nexport function WorkoutStripReorder_slots(ids: string[], fromIndex?: number, toIndex?: number): Record<string, number> {\n  const ordered = [...ids];\n  if (fromIndex != null && toIndex != null && fromIndex !== toIndex && ordered[fromIndex] != null) {\n    const [moved] = ordered.splice(fromIndex, 1);\n    ordered.splice(toIndex, 0, moved);\n  }\n  const slots: Record<string, number> = {};\n  ordered.forEach((id, slot) => {\n    slots[id] = slot;\n  });\n  return slots;\n}\n\nexport interface IWorkoutStripReorderResult<T> {\n  entries: T[];\n  currentEntryIndex: number;\n}\n\nexport function WorkoutStripReorder_apply<T extends { index: number }>(\n  entries: T[],\n  currentEntryIndex: number,\n  fromIndex: number,\n  toIndex: number\n): IWorkoutStripReorderResult<T> | undefined {\n  if (\n    fromIndex < 0 ||\n    fromIndex >= entries.length ||\n    toIndex < 0 ||\n    toIndex >= entries.length ||\n    fromIndex === toIndex\n  ) {\n    return undefined;\n  }\n  const moved = [...entries];\n  const [entry] = moved.splice(fromIndex, 1);\n  moved.splice(toIndex, 0, entry);\n  return {\n    entries: moved.map((e, i) => ({ ...e, index: i })),\n    currentEntryIndex: WorkoutStripReorder_currentAfterMove(currentEntryIndex, fromIndex, toIndex),\n  };\n}\n\nexport function WorkoutStripReorder_currentAfterMove(currentIndex: number, fromIndex: number, toIndex: number): number {\n  if (currentIndex === fromIndex) {\n    return toIndex;\n  }\n  if (fromIndex < currentIndex && currentIndex <= toIndex) {\n    return currentIndex - 1;\n  }\n  if (toIndex <= currentIndex && currentIndex < fromIndex) {\n    return currentIndex + 1;\n  }\n  return currentIndex;\n}\n\nexport function WorkoutStripReorder_shift(\n  index: number,\n  fromIndex: number,\n  dropIndex: number,\n  tileWidth: number\n): number {\n  \"worklet\";\n  if (fromIndex < 0 || index === fromIndex) {\n    return 0;\n  }\n  if (fromIndex < dropIndex && index > fromIndex && index <= dropIndex) {\n    return -tileWidth;\n  }\n  if (fromIndex > dropIndex && index >= dropIndex && index < fromIndex) {\n    return tileWidth;\n  }\n  return 0;\n}\n","export interface IWorkoutStripRevealMeasure {\n  index: number;\n  count: number;\n  pitch: number;\n  gap: number;\n  padding: number;\n  offset: number;\n  viewportWidth: number;\n  contentWidth: number;\n}\n\nexport function WorkoutStripReveal_offset(m: IWorkoutStripRevealMeasure): number | undefined {\n  if (m.viewportWidth <= 0) {\n    return undefined;\n  }\n  const left = m.padding + m.index * m.pitch;\n  const right = left + m.pitch - m.gap;\n  const maxOffset = Math.max(0, m.contentWidth - m.viewportWidth);\n  let target: number;\n  if (m.index === m.count - 1) {\n    return Math.abs(maxOffset - m.offset) >= 1 ? maxOffset : undefined;\n  } else if (left < m.offset) {\n    target = left - m.padding;\n  } else if (right > m.offset + m.viewportWidth) {\n    target = right + m.padding - m.viewportWidth;\n  } else {\n    return undefined;\n  }\n  return Math.min(maxOffset, Math.max(0, target));\n}\n","const FOCUSABLE = \"[tabindex], a[href], button, input, textarea, select\";\n\nfunction isLiveStop(el: Element): boolean {\n  return el.hasAttribute(\"data-tab-stop\") && el.closest(\"[data-leaving]\") == null;\n}\n\nfunction prune(el: Element): void {\n  if (!isLiveStop(el) && el.getAttribute(\"tabindex\") !== \"-1\") {\n    el.setAttribute(\"tabindex\", \"-1\");\n  }\n}\n\nfunction pruneTree(root: Element): void {\n  if (root.matches(FOCUSABLE)) {\n    prune(root);\n  }\n  root.querySelectorAll(FOCUSABLE).forEach(prune);\n}\n\n// Inside the pager only the set fields and the check answer to Tab. Doing it here instead of at\n// every Pressable keeps a row remount, a leaving-animation copy, or a control added later out of\n// the order without anyone remembering to pass tabIndex -1.\nexport function WorkoutTabPrune_observe(root: HTMLElement): () => void {\n  pruneTree(root);\n  const observer = new MutationObserver((mutations) => {\n    for (const mutation of mutations) {\n      if (mutation.type === \"attributes\" && mutation.target instanceof Element) {\n        prune(mutation.target);\n      }\n      mutation.addedNodes.forEach((node) => {\n        if (node instanceof Element) {\n          pruneTree(node);\n        }\n      });\n    }\n  });\n  observer.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: [\"tabindex\"] });\n  return () => observer.disconnect();\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"chunks/\" + chunkId + \".\" + {\"179\":\"3fb2505b5a48f8de07b6\",\"477\":\"197d656deb53b6034154\",\"482\":\"91edc9033a6f1e8b3b8c\",\"498\":\"c15c7d394e8aec238b40\",\"634\":\"3650d42f405a57cd0356\",\"692\":\"09f48cd140a0d82d83a8\",\"700\":\"0e653a1176a19985bc5d\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t498: 0,\n\t524: 0,\n\t666: 0,\n\t692: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"482\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t498: 0,\n\t524: 0,\n\t666: 0,\n\t692: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkliftosaur\"] = self[\"webpackChunkliftosaur\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [96], () => (__webpack_require__(58788)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [96], () => (__webpack_require__(79496)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","Mobile_isMobile","userAgent","test","Mobile_isPlaywright","includes","window","navigator","adminKey","userId","undefined","_reactNative","require","_url","_collection","_encoder","_historyDelta","_historyIds","Service_nativeClientHeaders","Platform","OS","cachePromises","Service_withAdminTarget","rawUrl","admin","url","UrlUtils_build","searchParams","set","toString","_deleteApiKey","_createApiKey","_deletePushToken","_postPushToken","_getApiKeys","_putRestTimerPush","_getRestTimerPushKey","_getUsdaFood","_getFoodByBarcode","_searchFood","_getUserContext","_getMuscles","_programDetail","_programsIndex","_getDataFromShortUrl","_postShortUrl","_deleteAccount","_verifySubscriptionKey","_verifyGooglePurchaseToken","_verifyAppleReceipt","_postImageUploadUrl","_getUploadedImages","_postEvent","_cacheVerdict","_getExceptionData","_getDebugSnapshotStorage","_getDebugSnapshotList","_getStorage","_postClaimCoupon","_deleteProgram","_postSaveSettings","_postSaveProgram","_postAddFreeUser","_checkAdminKey","_postClaimKey","_postDebug","_postSetupTestAccount","_createDebugSession","_completeSyncHistory","_postSync","_getProgramRevision","_getProgramRevisions","_refreshGoogleSubscription","_signout","_changePassword","_verifyEmail","_resetPassword","_forgotPassword","_emailAuth","_emailSignIn","_emailSignUp","_appleSignIn","_getHistoryByIds","_getHistory","_getAllHistoryRecords","_googleSignIn","exports","_createClass2","default","Service","client","_classCallCheck2","this","key","value","_asyncToGenerator2","token","id","args","body","JSON","stringify","forceuseremail","forcedUserEmail","historylimit","response","method","credentials","headers","json","storage","history","getAllHistoryRecords","alreadyFetchedHistory","historyLimit","email","user_id","is_new_user","session","_x","_x2","_x3","apply","arguments","historyResponse","length","getHistory","after","limit","CollectionUtils_uniqBy","_x4","_x5","ids","_ref","_this","chunks","CollectionUtils_inGroupsOf","HistoryIds_MAX","pages","Promise","all","map","chunk","join","status","Error","_x7","flat","_x6","code","idToken","_x8","_x9","_x0","password","emailAuth","_x1","_x10","_x11","_x12","_x13","_x14","e","type","error","ok","providers","_x15","_x16","catch","_x17","_x18","_x19","_x20","currentPassword","newPassword","_x21","_x22","googlePurchaseToken","result","subscription","_x23","_x24","programId","success","data","text","message","slice","String","_x25","_x26","revision","_x27","_x28","_x29","tempUserId","storageUpdate","timestamp","Date","now","deviceId","compressedBody","Encoder_encode","payload","signal","completeSyncHistory","mode","_x30","missingIds","HistoryDelta_missingIds","local","_versions","fetched","getHistoryByIds","HistoryDelta_unresolvedIds","full","HistoryDelta_apply","_x31","_x32","_x33","_x34","apiKey","authorization","_x35","_x36","state","meta","compressed","_x37","_x38","_x39","userid","claim","_x40","_","_x41","_x42","_x43","program","source","_x44","_x45","_x46","_x47","_x48","platform","_ref2","expires","appleOffer","googleOffer","affiliate","_x49","_x50","storageId","_x51","_x52","_x53","_x54","list","_x55","_x56","parse","Encoder_decode","_x57","_x58","_x59","apiUrl","_x60","_x61","fn","_x62","_x63","event","location","href","get","_x64","images","fileName","contentType","_x65","_x66","appleReceipt","_this2","cacheVerdict","_x67","_x68","_this3","_x69","_x70","enforce","user","clear","_x71","_x72","urlToShorten","src","__HOST__","_x73","_x74","_x75","_x76","_x77","category","_x78","exercise","_x79","account","units","query","results","_x80","_x81","encodeURIComponent","_x82","fdcId","_x83","request","_x84","keys","_x85","_x86","name","_x87","_x88","props","service","_jsxRuntime","jsx","View","style","minWidth","maxWidth","alignSelf","width","children","AccountLoggedInView","dispatch","AccountLoggedOutView","redirectUrl","onSignIn","onOpenEmailAuth","_react","_text","_service","_generator","_googleAccessToken","_button","_input","_linkButton","_iconApple","_iconDoc","_iconDumbbell","_iconGoogle","_iconSpinner","_thunks","_posthog","_tailwindConfig","_appleAuth","_dialog","isWeb","changePasswordErrorMessages","invalid_credentials","invalid_password","password_too_long","not_authorized","network_error","ChangePasswordForm","_useState","useState","_useState2","_slicedToArray2","isSubmitting","setIsSubmitting","_useState3","_useState4","setError","_useState5","_useState6","done","setDone","currentRef","useRef","newRef","repeatRef","_submit","current","err","changePassword","jsxs","className","Text","Button","kind","onClick","onDone","Input","label","identifier","changeType","autoCapitalize","autoCorrect","changeHandler","r","testID","disabled","submit","IconSpinner","height","color","Tailwind_semantic","alwayswhite","_useState7","_useState8","isLoading","setIsLoading","_useState9","_useState0","showChangePassword","setShowChangePassword","LinkButton","onPress","Fragment","numberOfPrograms","IconDoc","numberOfWorkouts","IconDumbbell","signout","reload","Thunk_logOut","_useState1","_useState10","_useState11","_useState12","showEmailForm","setShowEmailForm","useEffect","AppleAuth_init","EmailAuthForm","Pressable","select","ios","shadowColor","shadowOffset","shadowOpacity","shadowRadius","android","elevation","boxShadow","track","Thunk_googleSignIn","newState","accessToken","getGoogleAccessToken","UidFactory_generateUid","googleSignIn","IconGoogle","Thunk_appleSignIn","appleResult","AppleAuth_signIn","Dialog_alert","appleSignIn","id_token","marginTop","IconApple","EmailAuthButton","emailAuthErrorMessages","invalid_email","account_exists","account_not_found","wrong_password","too_many_attempts","email_send_failed","_useState13","_useState14","setMode","_useState15","_useState16","_useState17","_useState18","_useState19","_useState20","info","setInfo","emailRef","passwordRef","switchMode","newMode","onModeChange","handleResult","confirmationSent","_submit2","trim","Thunk_emailAuth","emailSignUp","emailSignIn","onSent","Thunk_forgotPassword","forgotPassword","isOpen","setIsOpen","onOpenChange","open","useCallback","actions","labels","a","concat","destructiveIndex","findIndex","destructive","ActionSheetIOS","showActionSheetWithOptions","title","options","cancelButtonIndex","destructiveButtonIndex","buttonIndex","close","renderTrigger","_dropdownMenu","DropdownMenu","rightOffset","onClose","i","DropdownMenuItem","isTop","Modal","transparent","visible","animationType","onRequestClose","backgroundColor","stopPropagation","useContext","ActiveGraphContext","createContext","activeId","setActive","audio","queue","persistence","timerBridge","timer","env","useMemo","mirroring","WorkoutMirroring","navigationRef","getCurrentScreenData","workout","WorkoutBridge","watch","WatchBridge","keychain","Keychain","heartRate","HeartRateStore","reducer","reducerWrapper","effects","NativeEffects_apply","onActions","defaultOnActions","_useThunkReducer","useThunkReducer","initialState","_useThunkReducer2","stateRef","ScreenRemovalCleanup_subscribe","useAppliedTextSize","settings","useAppliedTheme","useLoopCatcher","isNavReady","setIsNavReady","useOnloadModals","showCorruptedState","errors","corruptedstorage","prevShowCorruptedState","navigateToModal","prevShowSignupRequest","showSignupRequest","tour","checkToursRef","tourId","TourConfigs_findTourId","updateState","lb","p","record","enforced","screenData","urlUserId","Thunk_fetchStorage","Thunk_sync2","force","addEventListener","button","el","target","getAttribute","classes","split","some","cl","startsWith","parentNode","lsName","s","filter","c","nsName","Thunk_postevent","Thunk_log","Subscriptions_cleanupOutdatedAppleReceipts","Subscriptions_cleanupOutdatedGooglePurchaseTokens","Thunk_fetchInitial","onerror","console","log","Rollbar","_err","uuid","exceptionIgnores","every","ignore","postEvent","commithash","__COMMIT_HASH__","stack","rollbar_id","onunhandledexception","reason","replaceState","currentProgram","currentProgramId","Program_getProgram","planner","removeEventListener","onNavigationStateChange","navState","screenName","rootRoute","routes","index","onboardingState","mainTabsState","tabStackState","getScreenNameFromNavState","document","setAttribute","scroll","shouldSkipIntro","initialScreen","progress","Progress_getCurrentProgress","currentScreenName","isReady","getCurrentRoute","_reactNativeGestureHandler","GestureHandlerRootView","flex","_reactNativeSafeAreaContext","SafeAreaProvider","_StateContext","StateContext","Provider","_TrackedStateContext","TrackedStateProvider","_clickTracking","ClickTrackingContext","_ModalStateContext","ModalStateProvider","_ActiveSheetHeightContext","ActiveSheetHeightProvider","_appContext","AppContext","isApp","_native","NavigationContainer","ref","onReady","onStateChange","documentTitle","enabled","theme","DefaultTheme","colors","background","_AppNavigator","AppNavigator","indexOf","_restTimer","RestTimer","_notification","Notification","notification","_toast","Toast","toast","_reducer","_program","_useThunkReducer3","_nativeEffects","_nativeWorkoutBridge","_nativeWatchBridge","_keychainStore","_nativeWorkoutMirroringBridge","_heartRateStore","_progress","_state","_useOnloadModals","_subscriptions","_lensShmens","_useLoopCatcher","_rollbar","_textSize","_appliedTheme","_tourConfigs","_navigationRef","_screenRemovalCleanup","_navigationService","ctx","bottomShift","setBottomShift","bottomSheetRef","containerRef","setContainerRef","getElementById","isHidden","setTimeout","classList","remove","add","bottomSheet","clientHeight","element","zIndex","transition","transform","borderRadius","shouldShowClose","_iconCloseCircleOutline","IconCloseCircleOutline","size","maxHeight","createPortal","_reactDom","_useLensReducer","useLensReducer","_useLensReducer2","_exercisePickerCustomExercise","ExercisePickerCustomExercise","screenStack","useInlineModals","showMuscles","isLoggedIn","originalExercise","onChange","action","notes","onGoBack","_useLensReducer3","_bottomSheetItem","BottomSheetItem","isFirst","icon","_iconLink","IconLink","description","isAffiliateEnabled","onShareProgramToLink","_iconPicture","IconPicture","onGenerateProgramImage","onExportProgramToLink","isLoadingRevisions","IconDoc2","onLoadRevisions","_switch","_bottomSheet","_menuItem","_inputNumber","_inputWeight","_menuItemEditable","_iconTrash","_weight","_focusedInputFlush","BottomSheetEditTargetContent","editSetModal","rpe","enableRpe","setEnableRpe","setTimer","enableSetTimer","setEnableSetTimer","enableTimer","setEnableTimer","lbSet","pi","savedRef","MenuItemWrapper","InputNumber2","onBlur","updateProgress","onInput","isNaN","minReps","min","max","step","reps","Switch","isAmrap","onValueChange","InputWeight2","exerciseType","inputCommitMode","Weight_build","originalWeight","unit","askWeight","allowDot","logRpe","marginRight","IconTrash","MenuItemEditable","isOverflowSetTimer","keyboardAddon","FocusedInputFlush_flush","entryIndex","setIndex","recordModify","freshSet","ui","entries","sets","evaluatedWeight","Weight_evaluateWeight","weight","Weight_roundConvertTo","newSet","newEntries","entry","newSets","j","BottomSheet","outline","monthCalendarRef","dayNames","startWeekFromMonday","selectedIndex","firstDayOfWeeks","date","selectedFirstDayOfWeek","_TransparentModal","SheetDragHandle","collapsable","scrollToSelected","day","_monthCalendar","MonthCalendar","visibleRecords","selectedFirstDayOfWeekIndex","prs","muscles","Muscle_getMusclesFromScreenMuscle","muscleGroup","_bottomSheetOrModal","BottomSheetOrModal","_exercisePickerOptionsMuscles","ExercisePickerOptionsMuscles","dontGroup","selectedValues","onSelect","buttonSize","_muscle","BottomSheetMusclesOverrideContent","helps","onNewExerciseData","_textInput","_exercise","_nux","_string","_muscleImage","_iconClose","_math","_object","getMultiplierValue","multiplier","parsed","parseFloat","MathUtils_clamp","MathUtils_roundTo005","getDefaultMusclesAndMultipliers","targets","Exercise_defaultTargetMuscles","m","muscle","synergists","Exercise_defaultSynergistMuscleMultipliers","CollectionUtils_sort","b","localeCompare","getDefaultMusclesAndMultipliersAsObject","mm","getInitialMusclesAndMultipliers","muscleMultipliers","exerciseData","Exercise_toKey","ObjectUtils_keys","Exercise_get","exercises","musclesAndMultipliers","setMusclesAndMultipliers","openMusclePicker","useModal","selectedMuscles","mms","existing","Map","next","hitSlop","IconClose2","handleSave","newExerciseData","ObjectUtils_clone","ObjectUtils_isEqual","ed","pointerEvents","ScrollView","keyboardShouldPersistTaps","keyboardDismissMode","automaticallyAdjustKeyboardInsets","MusclesOverrideList","Nux","Muscle_getScreenMusclesFromMuscle","StringUtils_dashcase","MuscleImage","Muscle_getMuscleGroupName","TextInput","keyboardType","onChangeText","x","finalValue","insets","useSafeAreaInsets","evaluatedProgram","Program_evaluate","programDay","Program_getProgramDay","nextDay","nextHistoryRecord","Program_nextHistoryRecord","stats","doesProgressNotMatchProgram","Program_isEmpty","_historyRecord","HistoryRecordView","historyRecord","isOngoing","paddingBottom","bottom","_iconSwap","IconSwap","Tailwind_colors","blue","Thunk_startProgramDay","emptyProgramId","_iconPlus","IconPlus2","_modal","supersetGroups","Progress_getSupersetGroups","openTextInput","superset","minHeight","justifyContent","ObjectUtils_entriesNonnull","isSelected","Exercise_fullName","equipment","inputLabel","placeholder","submitLabel","dataCyPrefix","pattern","PlannerNames_supersetNamePattern","patternMessage","PlannerNames_supersetNameMessage","_plannerNames","setFilter","sort","setSort","searchLower","search","toLowerCase","filtered","useTimedMemo","ProgramFilter_sort","ProgramFilter_filter","programsIndex","hasCustomPrograms","renderItem","item","BuiltInProgram","keyExtractor","listHeader","_selectLink","SelectLink","values","builtinProgramAges","age","emptyLabel","builtinProgramFrequencies","frequency","builtinProgramDurations","duration","builtinProgramGoals","goal","v","listEmpty","scrollMarkers","usePerfScrollMarkers","remScale","useRemScale","_list","LegendList","ListHeaderComponent","ListEmptyComponent","estimatedItemSize","contentContainerStyle","paddingHorizontal","onScrollBeginDrag","onScrollEndDrag","onMomentumScrollEnd","_useTimedMemo","_usePerfScrollMarkers","_builtinPrograms","_programFilter","_exerciseImage","_exerciseImage2","_iconCalendarSmall","_iconKettlebellSmall","_iconWatch","_equipment","_simpleMarkdown","_useRem","memo","allEquipment","Equipment_currentEquipment","equipmentName","exercisesRange","numberOfWeeks","weeksCount","visibleExercises","ExerciseImageUtils_exists","accessibilityRole","accessibilityLabel","IconWatch","shortDescription","SimpleMarkdown","ExerciseImage","IconCalendarSmall","lightgray","StringUtils_pluralize","Program_exerciseRangeFormat","IconKettlebellSmall","textSize","containerCn","textCn","trackClick","useTrackClick","userOnPress","PressableComponent","sticky","StickyPressable","containsString","_pressable","Array","isArray","setSearch","selectedTab","setSelectedTab","customPrograms","useNavOptions","navTitle","navRightButtons","_iconMagnifyingGlass","IconMagnifyingGlass","neutralsubtle","fontSize","placeholderTextColor","secondarysubtle","defaultValue","returnKeyType","borderBottomWidth","borderBottomColor","yellow","_customProgramsList","CustomProgramsList","programs","_builtinProgramsList","BuiltinProgramsList","Footer","hasBottomNav","onCreate","onEmpty","Program_selectProgramAndGoHome","_useNavOptions","_useWindowDimensions","useWindowDimensions","particles","from","startX","Math","random","startY","endY","CONFETTI_COLORS","floor","swayAmplitude","swayFrequency","initialRotation","rotationSpeed","StyleSheet","absoluteFillObject","Particle","_reactNativeReanimated","t","WeakMap","n","__esModule","o","f","__proto__","has","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_interopRequireWildcard","_worklet_16740113831009_init_data","useSharedValue","withTiming","easing","Easing","linear","animatedStyle","useAnimatedStyle","confettiTsx1","y","translateX","sin","PI","translateY","rotate","opacity","__closure","__workletHash","__initData","position","textareaRef","mirrorRef","localValue","setLocalValue","dimensions","setDimensions","useLayoutEffect","textContent","rect","getBoundingClientRect","whiteSpace","val","replace","onKeyDown","preventDefault","handleBlur","sortedPrograms","CustomProgram","_time","_iconEditSquare","_editProgram","aggregates","exerciseObj","equipmentSet","Set","allExercises","Program_getAllUsedProgramExercises","ex","Exercise_find","CollectionUtils_nonnull","ObjectUtils_values","time","Program_dayAverageTimeMs","formattedTime","TimeUtils_formatHHMM","right","top","editProgramId","Program_editAction","IconEditSquare","Dialog_confirm","EditProgram_deleteProgram","weeks","Program_daysRange","Program_exerciseRange","DateUtils_formatYYYYMMDD","ts","currentTarget","_date","sizesRef","activeIndex","setActiveIndex","targetIndex","setTargetIndex","activeSize","setActiveSize","onItemLayout","computeTargetIndex","fromIndex","translation","sizes","acc","items","h","containerStyle","flexDirection","DraggableItem","isDisabled","onLayoutSize","onDragStart","onDragUpdate","onDragEnd","delayMs","_worklet_1979068689960_init_data","_worklet_10152539509589_init_data","_worklet_9756929708445_init_data","_worklet_14648802944118_init_data","_worklet_7225397864741_init_data","translate","shift","isDragging","isHorizontal","callbacksRef","handleDragStart","handleDragUpdate","handleDragEnd","onLayout","nativeEvent","layout","effectiveTarget","pan","Gesture","Pan","activateAfterLongPress","onStart","runOnJS","draggableList2Tsx4","onUpdate","draggableList2Tsx3","translationX","translationY","onEnd","draggableList2Tsx2","onFinalize","draggableList2Tsx1","draggableList2Tsx5","isActive","handleRender","GestureDetector","gesture","cursor","content","bgColor","subtle","align","textAlign","positionStyle","topOffset","leftOffset","left","hideTip","tipClassName","rest","_objectWithoutProperties2","_excluded","_interopRequireDefault","typedNameResult","setTypedNameResult","descriptionRef","inputHandle","_groupHeader","GroupHeader","nameLabel","required","requiredMessage","namePlaceholder","handleRef","_markdownEditorBorderless","MarkdownEditorBorderless","descriptionPlaceholder","onCancel","onSubmit","touch","_iconUndo","_undoredo","_iconUiMode","_iconDayTextMode","_iconFullTextMode","_editProgramUiWeek","_iconReorder","_editProgramV2Full","_editProgramGrid","_useAppGridHost","_plannerMode","_plannerProgram","_scrollableTabs","_usePerfRenderCount","usePerfRenderCount","EditProgram_mode","evaluatedWeeks","exerciseFullNames","plannerDispatch","weekIndex","gridHost","useAppGridHost","onWeekTabChange","newWeekIndex","hideNavbar","EditProgramNavbar","originalProgram","EditProgramGrid","host","scale","gridScale","EditProgramV2Full","plannerProgram","lbUi","hideWeekTabBar","EditProgramUiWeekView","ScrollableTabs","topPadding","nonSticky","shouldNotExpand","defaultIndex","tabs","week","wi","isInvalid","isValidFull","fullTextError","isValidPerDay","PlannerProgram_evaluate","isValid","_useToolbarPadding","padding","setPadding","paddingRef","rowWidthRef","groupWidthsRef","fit","groupWidths","rowWidth","w","overflow","reduce","ceil","onRowLayout","onGroupLayout","useToolbarPadding","canUndo","undo","IconUndo","neutral","light","canRedo","redo","scaleX","EditProgramModeSwitchButton","IconReorder","IconUiMode","PlannerMode_isStructureError","IconDayTextMode","IconFullTextMode","newProgram","Program_cleanPlannerProgram","CollectionUtils_setBy","Thunk_pushScreen","tab","purple","details","customExerciseName","filters","selectedExercises","editCustomExercise","Exercise_createCustomExercise","change","dayData","isInvertedColors","fetchFn","fetch","bind","input","init","_migrationBanner","MigrationBanner","editProgram","MenuItem","expandValue","shouldShowRightArrow","_programGrid","_programGridGeometry","_gridSelectionContext","_useGridReuseLocator","_gridReusePill","_gridPinch","_useGridActions","_useGridSelectionState","_gridDragAutoScroll","_useGridDrags","_gridWeekHeaderRow","_gridRow","_gridDragGhost","_gridAddButton","_useGridStickyHeader","_gridStickyHeader","_useGridEditDetails","rem","useRem","grid","ProgramGrid_build","windowWidth","containerWidth","setContainerWidth","previewScale","setPreviewScale","requestedScale","weekCount","columns","_useMemo","ProgramGridGeometry_metrics","columnWidth","totalWidth","lanes","showScheme","fittedScale","onCommitScale","newScale","_useGridPinch","useGridPinch","isFitted","onScalePreview","onScaleCommit","Wrap","scrollAnimatedProps","canPinch","zoomControl","_useGridSelectionStat","useGridSelectionState","selectedDayRows","selectedWeek","selection","selectedLanes","onSelectDay","onSelectWeek","onClear","navigation","createNavigation","useGridActions","onStructuralChange","editDetails","useGridEditDetails","openEditDetails","onSetWeekDetails","onSetDayDetails","collapsedRows","setCollapsedRows","onToggleCollapsed","rowIndex","geometry","ProgramGridGeometry_build","horizontalScrollRef","horizontalViewportRef","horizontalOffsetRef","horizontalListenersRef","onHorizontalScroll","contentOffset","forEach","listener","subscribeHorizontalOffset","delete","contentWidthRef","GRID_ADD_WEEK_WIDTH","containerWidthRef","maxHorizontalScroll","autoScroll","useGridDragAutoScroll","horizontalRef","useGridStickyHeader","isHeaderInContainer","GridStickyHeader_isCss","activeGhost","setActiveGhost","drags","useGridDrags","onGhostActive","onReorderExercisesInDay","onMoveExercisesToDay","publishSelection","useGridSelectionPublish","reuse","useGridReuseLocator","rowsTop","headerHeight","weekColumn","rowIndexes","rows","namePerWeek","find","descriptionPerWeek","d","placements","onEdit","onEditPlacement","onDuplicate","onDuplicatePlacement","onSwap","onSwapPlacement","onDelete","onDeletePlacements","onDuplicateDays","onDeleteDays","onDuplicateWeek","onDeleteWeek","onEditWeek","onEditDay","onShowWeekStats","onShowDayStats","onShowExerciseStats","weekHeader","WeekHeaderRow","onMoveWeek","column","GridWeekGhost","draggedWeek","ghostX","reusePill","direction","GridReusePillFloat","GridStickyHeader","pinTop","onHeightChange","onHeaderHeight","below","horizontal","showsHorizontalScrollIndicator","onScroll","scrollEventThrottle","animatedProps","onContainerLayout","Animated","onHeaderLayout","row","GridRow","laneTops","onAddExercise","onSetRepeatRange","isCollapsed","isDaySelected","isDayDimmed","laneNames","rowHeight","onMoveDayRows","GridDragGhost","labelHeight","contentTop","draggedRows","draggedLanes","ghostY","GRID_DAY_BOX_INSET","AddButton","onAddDay","VerticalAddButton","onAddWeek","_iconEdit","_iconKebab","_actionSheet","_gridBadge","_gridSelectionSummary","live","useGridSelection","liveTarget","shown","setShown","anim","Value","timing","toValue","useNativeDriver","start","finished","isTextLarge","summary","GridSelectionSummary_build","interpolate","inputRange","outputRange","DockDetails","badges","detail","detailsKey","edit","DockButton","IconEdit2","DockOverflow","isExpanded","setIsExpanded","firstLine","hasMore","numberOfLines","badge","GridBadge","ActionSheet_show","isDestructive","IconKebab","isVertical","borderStyle","borderColor","border","cardpurple","link","setHeight","round","context","placement","Thunk_pushToEditProgramExercise","ProgramGrid_dayDataAt","colStart","Program_getProgramExerciseForKeyAndShortDayData","pickerStateFromPlannerExercise","hideLabel","exerciseKey","Program_getNumberOfExerciseInstances","plannerExercise","dayInWeek","ProgramGrid_hasDay","dayIndex","exerciseLine","line","_editProgramUtils","isInverse","borderWidth","primaryinverse","_fastText","_styledText","buildScheme","tokens","builder","StyledText","fontWeight","isCurrent","build","colorByKind","setPart","syntax","atom","literal","keyword","auto","secondary","separator","scheme","selectedIds","isReached","linkedIds","sameExerciseIds","isResizing","family","isOverride","notused","fills","override","gridoverride","gridoverridereached","gridoverrideactive","gridnotused","gridnotusedreached","gridnotusedactive","gridexercise","gridexercisereached","gridexerciseactive","cardyellowsubtle","built","builtResolved","ProgramGrid_hasResolvedLine","resolved","section","nameColor","primary","nameParts","part","GRID_CELL_INSET_X","paddingVertical","GRID_CELL_INSET_Y","fullName","supersetColor","FastText","fragments","StyledText_remToPx","flexShrink","order","ProgramGrid_orderSuffix","isTemplate","colEnd","paddingRight","pagePosition","pageScroll","scrollCtx","NavScreenScrollContext","axisRef","applyRef","lastTranslationRef","absoluteRef","scrollAtStartRef","targetRef","boundsRef","maxVerticalRef","timerRef","addScrollListener","contentSize","layoutMeasurement","scrollNow","scrollYRef","stop","clearInterval","tick","bounds","node","scrollRef","GridDragAutoScroll_step","zone","maxStep","reported","knownMax","to","scrollTo","animated","begin","axis","absolute","viewportRef","measureInWindow","_width","stickyHeaderHeight","end","footerHeight","_y","setInterval","move","_NavScreenScrollContext","overStart","overEnd","depth","abs","sign","Number","MAX_SAFE_INTEGER","GHOST_OPACITY","_worklet_6413467945992_init_data","_worklet_12294385394008_init_data","_worklet_9207810197683_init_data","dayStyle","gridDragGhostTsx1","laneStyle","gridDragGhostTsx2","lane","showDay","movedLanes","laneStrip","laneName","laneIndex","cardpurpleselected","lift","card","cardyellow","gridDragGhostTsx3","show","setDocumentCursor","onDragMove","onTap","startRef","isDraggingRef","isMouseRef","cancelTimer","clearTimeout","positionOf","GridDragAutoScroll_toViewport","pageX","scrollX","pageY","scrollY","onPointerDown","pointerType","beginDrag","onGrant","onMove","delta","onMoveShouldSetResponder","onRelease","commit","onResponderRelease","onResponderTerminate","onResponderTerminationRequest","userSelect","onStartShouldSetResponder","onResponderGrant","onResponderMove","_gridDragHandle","_gridResizeHandle","_gridCell","_worklet_13324320959577_init_data","onLaneDragStart","onLaneDragMove","onDragStartLane","onDragMoveLane","dy","resizePreviewEnd","resizeHandleOffset","webResize","setWebResize","segments","ProgramGridGeometry_laneSegments","resizablePlacement","withPlacement","ProgramGridGeometry_canResize","resizeRef","onResizeStart","deltaWeeks","ProgramGridGeometry_clampWeek","onResizeEnd","previewColStart","previewInset","previewStyle","gridLaneRowTsx1","resizeLeft","ProgramGridGeometry_resizeHitLeft","GridDragHandle","onLaneDragEnd","segment","GridCell","span","laneHeight","GridResizeHandle","ProgramGridGeometry_resizeHitWidth","onResize","offsetX","accentColor","GRID_SCALE_MIN","GRID_SCALE_MAX","onPointerUp","onKeyUp","startXRef","isResizingRef","onTerminate","onTerminationRequest","GridReusePill","_iconArrowUp","_iconArrowDown","onGoTo","IconArrowUp","green","IconArrowDown2","_iconArrowRight","_useGridDayDrag","_gridLaneRow","_worklet_8354016543896_init_data","_worklet_17572207432293_init_data","_worklet_1283806232754_init_data","_worklet_13878617011664_init_data","_worklet_15880677544717_init_data","addHeight","GRID_ADD_ROW_HEIGHT","showsDuration","ProgramGridGeometry_dayLabelHeight","dropBoundary","dropLaneRow","dropLaneGap","onTapDay","dayDrag","useGridDayDrag","rowOverlayStyle","gridRowTsx1","dropLineStyle","gridRowTsx2","isLastRow","dropLineBottomStyle","gridRowTsx3","draggedLaneStyle","gridRowTsx4","dragged","first","dropLaneStyle","gridRowTsx5","marginBottom","GRID_MARGIN_BETWEEN_ROWS","ProgramGrid_errorAt","exists","prominent","durationMs","durationMsPerWeek","TimeUtils_formatHOrMin","IconArrowRight","LaneRow","laneCount","graph","orange","setPayload","publish","GridSelectionContext","includeStats","single","push","tags","singleRow","progression","rowRef","frameRef","frame","observer","ResizeObserver","observe","disconnect","_useGridWeekDrag","WeekHeaderCell","isDimmed","isLast","_worklet_1748094918701_init_data","_worklet_16333817361382_init_data","_worklet_4316934958799_init_data","_props$drags","dropWeekGap","drag","useGridWeekDrag","liftStyle","gridWeekHeaderRowTsx1","dropLeftStyle","gridWeekHeaderRowTsx2","dropRightStyle","gridWeekHeaderRowTsx3","pendingRef","openEditDetailsModal","onResult","GridAppNavigation_create","_gridAppNavigation","plannerRef","applyTransform","check","warnings","insertAt","PlannerStructure_moveDayRows","flatMap","sourceWeeks","PlannerStructure_deleteExercises","PlannerStructure_addDay","toWeekIndex","PlannerStructure_setRepeatRange","repeatSpan","PlannerStructure_addWeek","eachRow","PlannerStructure_duplicateDayRow","PlannerStructure_deleteDayRow","PlannerStructure_duplicateWeek","PlannerStructure_deleteWeek","PlannerStructure_setDayDetails","PlannerStructure_setWeekDetails","PlannerStructure_moveWeek","PlannerStructure_reorderExercisesInDay","moves","toRow","before","PlannerStructure_moveExercisesToDay","_plannerStructure","getGeometry","getSelectedDayRows","onMoveRef","movedRef","useGridDragSession","resolve","ProgramGridGeometry_dayBlockDropAt","gap","ProgramGridGeometry_isBlockDropNoop","moved","ProgramGridGeometry_insertAtForGap","onActive","active","selected","_useGridDragSession","optionsRef","geometryRef","gridRef","selectedDayRowsRef","selectedLanesRef","getGrid","getSelectedLanes","useGridLaneDrag","_useGridLaneDrag","originRef","argsRef","isNoop","drop","origin","leading","ProgramGridGeometry_laneDropAt","noop","targetNames","ProgramGrid_laneNames","ProgramGridGeometry_moveBlock","fromRowIndex","l","_rowIndex","_laneIndex","occludedTop","names","reuseOf","laneTop","rowTop","rowBottom","ProgramGridGeometry_laneHeight","setDirection","viewportHeightRef","verdict","viewport","_w","prev","setSelectedIds","setSelectedDayRows","setSelectedWeek","ProgramGrid_select","placementId","headerHeightRef","range","anchor","setAnchor","remeasure","container","_vx","vy","contentHeightRef","contentHeight","scrollAnimatedY","pinnedAt","extrapolate","ProgramGridGeometry_weekDropAt","ProgramGridGeometry_gapForMove","isSmall","shouldValidate","cb","plannerOrAlert","ProgramRewrite_instances","evaluated","PP_iterate2","validate","isRepeat","EditProgramUiHelpers_getWeeks2","_loop","dayInWeekIndex","toIndex","Program_evaluateCachedPlanner","Program_create","reorder","PlannerStructure_normalizeOrdersInDay","ProgramToPlanner","convertToPlanner","daySets","daySet","setVariationIndex","evaluatedSetVariations","setVariation","allowDeleteEverywhere","targetDay","days","splice","newPlanner","EditProgramUiHelpers_validate","newEvaluatedProgram","Program_getFirstProgramExercise","newExerciseType","resolvedLabel","takenKeys","keyFor","candidate","candidateFullName","PlannerKey_fromFullName","attempt","uniqueDuplicateLabel","newFullName","previousExercise","newExercise","shortName","collapsedOrder","dayUi","collapsed","newCollapsed","_pp","_programRewrite","_plannerKey","_programToPlanner","oldPlanner","ProgramRewrite_validate","ignoreRepeats","ProgramRewrite_repeatWeeks","_iconMusclesD","_iconTimerSmall","_plannerStatsUtils","_editProgramUiExercise","_editProgramV2TextExercises","_contentGrowingTextarea","_useProgressiveItems","EditProgramUiDayContentView","lbPlannerDay","lbPlannerWeek","ContentGrowingTextarea","newValue","IconMusclesD","isValidProgram","evaluatedDay","PlannerStatsUtils_dayApproxTimeMs","timers","lbPlanner","allExercisesCollapsed","exerciseUi","usedExercises","notUsedExercises","visibleUsedExercises","useProgressiveItems","initialBatch","batchSize","debugLabel","resetKey","debounceMs","IconTimerSmall","exerciseIndex","exCollapseKey","EditProgramUiExerciseView","showNumber","EditProgramV2TextExercises","plannerDay","lbProgram","_perfTracker","_perfEnabled","_perfProfiler","_editProgramSets","_plannerProgramExercise","_historyRecordSets","_iconDuplicate","_editProgramUiHelpers","_iconGraphsE","_editProgramUiProgress","_editProgramUiUpdate","_editProgramUiExerciseSetVariations","_editProgramUiExerciseDescriptions","onExerciseProfile","phase","actualDuration","baseDuration","PerfEnabled_tier2","PerfTracker_recordEvent","PerfTracker_getSessionId","actual_ms","base_ms","Exercise_findByName","repeatStr","PlannerProgramExercise_repeatToRangeStr","orderAndRepeat","PerfProfiler","onRender","SetNumber","ExerciseNameLine","defaultEquipment","ExerciseVariationsLine","IconGraphsE","exKey","EditProgramUiExerciseContentView","warmupSets","PlannerProgramExercise_warmups","PlannerProgramExercise_defaultWarmups","displayWarmupSets","PlannerProgramExercise_warmupSetsToDisplaySets","reusingSets","supersetGroup","supersetExercises","Program_getSupersetExercises","descriptions","EditProgramUiExerciseDescriptions","g","gi","HistoryRecordSet","isNext","EditProgramUiExerciseSetVariations","SupersetLine","group","exerciseNames","EditProgramUiProgress","update","EditProgramUiUpdate","IconDuplicate2","EditProgramUiHelpers_deleteCurrentInstance","cls","StyledText_cls","variations","exerciseVariations","currentIndex","PlannerProgramExercise_currentExerciseVariationIndex","otherNames","PlannerProgramExercise_currentDescriptionIndex","highlighted","nameAddOn","IconArrowDown3","_markdown","Markdown","truncate","setVariations","PlannerProgramExercise_setVariations","PlannerProgramExercise_sets","hasCurrentSets","globals","displayGroups","PlannerProgramExercise_setsToDisplaySets","isCurrentIndicatorNearby","rightAddOn","reusingLine","reusedByLine","progressExercise","ReusingLine","reusingProgressExercises","Program_getReusingProgressExercises","ReusedByLine","Progression","bold","base","PlannerProgramExercise_progressionType","Weight_print","increase","successesRequired","decrease","failuresRequired","maxReps","PlannerProgramExercise_getState","reusingUpdateExercises","Program_getReusingUpdateExercises","CustomUpdateLabel","_iconMusclesW","_editProgramUiDay","currentWeekIndex","currentWeek","visibleDays","evaluatedCurrentWeek","dayIndexOffset","Program_getDayNumber","allDaysCollapsed","IconMusclesW","EditProgramUiDayView","UndoingFlag_set","templateName","workoutSettings","pickerSort","_undoingFlag","PlannerProgram_generateFullText","fulltext","setFulltext","expectedRegenRef","PlannerProgram_evaluateFull","settingsRef","regen","regenEvaluation","regenError","evaluatedWeeks2","newError","offset","_plannerEditorView","PlannerEditorView","AppliedTheme_get","autoHeight","customExercises","onCustomErrorCta","_editProgramCustomErrorCta","EditProgramCustomErrorCta","_PlannerMode_commitFu","PlannerMode_commitFullText","lineNumbers","_e","onLineChange","_line","approxDayTime","focusedExercise","repeats","exerciseText","CollectionUtils_findIndexReverse","_text2","_plannerCodeBlock","PlannerCodeBlock","script","_editProgram2","_programPreviewPlayground","_plannerDispatch","_programPreviewTab","_programPreviewWeeks","_programTourConfig","_NavScreenContent","_liftoEditorFocus","_liftoEditorDock","_gridActionDock","_usePerfRenderTrace","_hermesProfile","onProfile","TAB_LABELS","EditProgram_tabLabels","EDIT_TAB_INDEX","EMPTY_EVAL","TAB_LABELS_RO","PLAYGROUND_TABS_PROPS","STICKY_INDICES","usePerfRenderTrace","plannerState","plannerStateRef","loggedOnceRef","lbBuilder","lensRecording","desc","recordings","prepend","PlannerDispatch_logEditAction","changesCurrent","lens","undoRedoMiddleware","useUndoRedo","exercisePickerUi","exercisePicker","openPickerIfNeeded","picker","getCurrentRouteName","navigatedPickerRef","isFocused","useIsFocused","navOptions","navHelpTourId","programTourConfig","hasEvalErrors","tabIndex","activeTabLabel","tabContent","plannerEval","onChangeTab","newTabIndex","tabLabel","HermesProfile_captureOnce","previewWeekIndex","setPreviewWeekIndex","playgroundWeekIndex","setPlaygroundWeekIndex","editWeekIndex","setEditWeekIndex","newIndex","previewWeekLabels","safePreviewWeekIndex","previewWeek","ProgramPreviewWeeks_build","navCommon","playgroundWeekNames","safePlaygroundWeekIndex","showEditWeekTabBar","onChangeProgram","onChangeDay","onChangeName","EditProgram_setName","ProgramPreviewWeekContent","totalWeeks","EditProgramView","ProgramPreviewPlayground","scrollableTabsProps","isPlayground","useNavModals","externalWeekIndex","perTabStickyHeader","editWeekLabels","editWeekInvalidIndices","WeekTabBar","invalidIndices","showEditorDock","showGridDock","LiftoEditorFocusProvider","GridSelectionProvider","NavScreenContent","stickyHeaderIndices","footer","LiftoEditorDock","GridActionDock","avoidSystemKeyboard","EditProgramHeader","OuterTabBar","pinnedIndex","activeColor","secondarystroke","isPinned","nameClass","Program_getDayName","setData","changeFn","EditProgramUiHelpers_changeSets","Tab","getKey","minrep","maxrep","getRightSide","RepsValue","WeightsValue","RpeValue","TimerValue","onChangeTabIndex","_setUtils","InputNumberAddOn","groups","groupsValues","allWeeks","allDays","setVariationsPerWeekDay","setsPerWeekDaySetVariation","allWeeksEqual","SetUtils_areAllEqual","allDaysEqual","Program_getProgramExerciseFromDay","GroupLabel","groupSetVariationsPerWeekDay","groupSetsPerWeekDaySetVariation","allSetVariationsEqual","ObjectUtils_entries","allSetVariationsForWeekDay","SetUtils_areEqual","setKey","groupSets","allSets","allSetsEqual","allSetsForWeekDaySetVariation","parts","areSetsEqual","CollectionUtils_compact","collapsedParts","currentGroup","curr","prevLast","currLast","sameDepth","sameLastKey","samePrefix","isSamePrefix","isConsecutive","buildCollapsedGroup","collapseLastElementRange","uniqueParts","showUnitInside","addOn","firstEntry","lastEntry","prefix","k","lastKey","firstVal","lastVal","ModalCreateStateVariableContent","_inputSelect","_liftoEditorStateVars","setName","setType","showTypeError","setShowTypeError","showNameError","setShowNameError","isUserPrompted","setIsUserPrompted","nameError","LiftoEditorStateVars_nameError","existingNames","InputSelect","nextLine","lensDispatch","originalDispatch","hiddenEquipment","eq","isDeleted","bar","equipmentData","expandedEquipment","expandedItemRef","EquipmentSettingsContent","lensPrefix","then","_iconEyeClosed","_stats","_iconEquipmentBarbell","_iconEquipmentCable","_iconEquipmentDumbbell","_iconEquipmentEzBar","_iconEquipmentKettlebell","_iconEquipmentLeverageMachine","_iconEquipmentSmith","_iconEquipmentTrapbar","equipmentToIcon","barbell","IconEquipmentBarbell","trapbar","IconEquipmentTrapbar","leverageMachine","IconEquipmentLeverageMachine","smith","IconEquipmentSmith","dumbbell","IconEquipmentDumbbell","ezbar","IconEquipmentEzBar","cable","IconEquipmentCable","kettlebell","IconEquipmentKettlebell","EquipmentRowHeader","headerRef","onToggle","EquipmentSummary","doDelete","LayoutAnimation","configureNext","Presets","easeInEaseOut","_confirmDelete","confirmDelete","IconEyeClosed","EquipmentRowBody","EquipmentSettingsValues","isFixed","fixedWeights","fixed","Weight_compare","display","barWeight","plates","num","plateStrs","onConfirm","toggleWithAnimation","setter","EquipmentSettingsFixed","EquipmentSettingsPlates","Weight_display","newFixedWeights","Weight_eqeq","currentBodyweight","useBodyweightForBar","Stats_getCurrentMovingAverageBodyweight","valueUnits","underName","isAssisting","parseInt","pl","plate","marginLeft","hasClear","newPlates","clampedV","UIManager","setLayoutAnimationEnabledExperimental","maxWeight","max1RM","expandName","Thunk_editHistoryRecord","Weight_convertTo","DateUtils_format","startTime","isBorderless","completedReps","completedWeight","_exerciseRm","_editEquipment","fullExercise","InputNumber","Exercise_defaultRounding","EditEquipment_setDefaultRoundingForExercise","gyms","gym","Equipment_getEquipmentIdForExerciseType","currentGymId","EditEquipment_setEquipmentForExercise","programExerciseIds","Exercise_getIsUnilateral","isUnilateral","updateSettings","Exercise_getVolumeMultiplier","volumeMultiplier","show1RM","ExerciseRM","rmKey","onEditVariable","rm1","_usePerfWhyRender","_set","_history","_iconFilter","WORKOUT_HISTORY_LOADING","idleCap","threshold","STATS_HISTORY_LOADING","ExerciseHistoryRecord","usePerfWhyRender","allPrs","History_getPersonalRecords","showFilters","setShowFilters","_props$settings$exerc","exerciseStatsSettings","hideWithoutExerciseNotes","hideWithoutWorkoutNotes","ascendingSort","hr","visibleHistory","onToggleFilters","onToggleAscending","onToggleHideExerciseNotes","onToggleHideWorkoutNotes","headerName","IconFilter","firstRecordProbe","xs","exerciseEntries","Exercise_eq","exerciseNotes","programName","dayName","ei","entryPrs","vars","volume","Weight_multiply","Reps_volume","HistoryRecordSetsView","showPrDetails","stateKey","si","displayValue","Weight_is","Weight_isPct","ni","_iconDefaultExercise","_hostConfig","_imageCache","rawSrc","ExerciseImageUtils_url","remoteSrc","HostConfig_resolveUrl","initialUri","ImageCache_initialUri","prevRemote","setPrevRemote","isError","setIsError","aspectRatio","setAspectRatio","setSrc","usingRemote","setUsingRemote","doesExist","ExerciseImageUtils_existsCustom","suppressCustom","onCachedError","ImageCache_markMissing","onCachedLoad","ImageCache_download","imgStyle","Image","uri","onLoad","onError","Exercise_nameWithEquipment","useTextForCustomExercise","customClassName","lineHeight","IconDefaultExercise","resizeMode","ExerciseImageAuxiliary","ExerciseNoImage","useBorderForCustomExercise","ExerciseCloneLibraryContent","_exercisePickerExerciseItem","trimmedSearch","Exercise_allExpanded","StringUtils_fuzzySearch","ExercisePickerExerciseItem","isEnabled","header","includeFontPadding","bare","ExerciseImageLibraryContent","getExerciseIdFromImageUrl","pop","uploadedImages","setUploadedImages","getUploadedImages","imgs","filteredUploadedImages","img","exerciseId","customExercise","renderBuiltinItem","smallImageUrl","largeImageUrl","ListHeader","ExercisePickerContent","_exercisePickerMain","_exercisePickerFilter","_exercisePickerSettings","_types","currentScreen","ExercisePickerMain","onStar","usedExerciseTypes","onChoose","ExercisePickerSettings","onChangeSettings","ExercisePickerFilter","buildCustomLensDispatch","onChangeCustomExercise","isEdited","Exercise_nameError","Exercise_getNotes","setNotes","_iconBack","IconBack","_exercisePickerCustomExerciseContent","ExercisePickerCustomExerciseContent","hideNotes","hideDeleteButton","_systemKeyboardSpacer","SystemKeyboardSpacer","isAutofilling","setIsAutofilling","showCloneBottomSheet","setShowCloneBottomSheet","showImageBottomSheet","setShowImageBottomSheet","showPicturePickerBottomSheet","setShowPicturePickerBottomSheet","showImageLibrary","setShowImageLibrary","isUploading","setIsUploading","openImageSource","openCloneLibraryModal","targetMuscles","synergistMuscles","types","typeValues","exerciseKinds","StringUtils_capitalize","openImageSourceAction","openCloneLibrary","getMuscles","_iconAi","IconAi","ExercisePickerCustomExerciseMuscles","bottomSheetTitle","muscleKey","onMusclesSelected","ExercisePickerCustomExerciseTypes","selectedTypes","onNewTypes","newTypes","onTypesSelected","_markdownEditor","MarkdownEditor","_confirmAsync","confirmAsync","_importer","Importer","onRawFile","_ref3","file","imageUploader","ImageUploader","uploadImage","_iconCamera","IconCamera","uploadAndUpdateImage","_bottomSheetExerciseImageLibrary","BottomSheetExerciseImageLibrary","_bottomSheetExerciseCloneLibrary","BottomSheetExerciseCloneLibrary","Exercise_targetMuscles","Exercise_synergistMuscles","_exercisePickerOptions","_imageUploader","_imagePicker","_uploadAndUpdateImage","ImagePicker_pick","uploadBase64Image","isOpened","setIsOpened","openTypesModal","openPicker","ExercisePickerCustomExercise2SelectInput","ExercisePickerOptions","ObjectUtils_mapValues","openMusclesModal","_iconStar","_iconCheckCircle","isStarred","starredExercises","IconStar","MuscleView","currentExerciseType","MuscleGroupsView","isMultiselect","IconCheckCircle","isChecked","RadioIndicator","checked","LabeledItemsLine","semantic","semibold","isMatch","tms","sms","targetMuscleGroups","Exercise_targetMusclesGroups","synergistMuscleGroups","Exercise_synergistMusclesGroups","sortValues","name_asc","exercisePickerSortNames","similar_muscles","disabledReason","gymEquipment","Equipment_getCurrentGym","equipmentValues","equipments","shouldShowInvisibleEquipment","Filter","CollectionUtils_remove","FilterMuscles","_exercisePickerUtils","_muscleGroupImage","selectedMuscleGroups","ExercisePickerUtils_getSelectedMuscleGroupNames","muscleGroups","Muscle_getAvailableMuscleGroups","customMuscleGroup","screenMuscles","musclesOfMuscleGroup","MuscleGroupImage","mscls","hideTemplate","setCurrentWeekIndex","isRecentCollapsed","setIsRecentCollapsed","isCustomCollapsed","setIsCustomCollapsed","isBuiltinCollapsed","setIsBuiltinCollapsed","ExercisePickerUtils_getIsMultiselect","useRankOrdering","builtinExercises","ExercisePickerUtils_filterExercises","Exercise_filterAndRankByQuery","Exercise_matchesQuery","ExercisePickerUtils_sortExercises","ExercisePickerUtils_filterCustomExercises","Exercise_filterAndRankCustomByQuery","ExercisePickerUtils_sortCustomExercises","raw","recentExercises","isNarrowed","ExercisePickerUtils_getAllFilters","Exercise_fromKey","recentKeys","programGroups","grouped","exs","usedKeys","et","selectedAdhocKeys","selectedProgramKeys","selectedAnyKeys","chooseCtxRef","onChooseAdhoc","ExercisePickerUtils_chooseAdhocExercise","onChooseProgram","ExercisePickerUtils_chooseProgramExercise","onSettingsPress","getNavigationService","onToggleMuscles","onToggleStarred","onLabelChange","onTabChange","onCreateCustom","onBottomClick","isAdhocTab","isFromProgramTab","isTemplateTab","showTabs","sub","showWeeks","shownRecentKeys","stickyIndices","idx","it","getItemType","getEstimatedItemSize","_index","titleHeight","currentExHeight","tabsHeight","onAnimatedScroll","useAnimatedScrollHandler","_worklet_15954627406805_init_data","exercisePickerMainTsx1","captureHeight","sv","onTitleLayout","onLabelLayout","onCurrentExLayout","onTabsLayout","stickyShadowStyle","_worklet_14603236235991_init_data","Extrapolation","exercisePickerMainTsx2","CLAMP","stickyLabelStyle","_worklet_16364281082070_init_data","exercisePickerMainTsx3","cardTop","cardBottom","currentExerciseName","_iconMuscles","IconMuscles2","isLabelOutside","inputSize","labelSize","_exercisePickerCurrentExercise","ExercisePickerCurrentExercise","TabsRow","WeekTabsRow","SearchAndFilter","SearchInput","leftExpandIcon","headerClassName","isSelectedAlready","isUsedForDay","CustomExerciseRow","rawExercise","testId","ProgramExerciseGroupCard","_exercisePickerTemplate","ExercisePickerTemplate","bottomShadowStyle","listExtraData","_reanimated","AnimatedLegendList","extraData","bounces","overScrollMode","BottomButton","_fitText","_iconFilter2","_navUtils","_scroller","setRowWidth","baseFontSize","availableWidth","FitText_fontSize","flexGrow","flexBasis","Scroller","localSearch","setLocalSearch","timeoutRef","filterNames","ExercisePickerUtils_getAllFilterNames","isFiltered","onFilterPress","onClearFilters","IconFilter2","isAllDisabled","selKey","isItemDisabled","rowKey","ProgramExerciseRow","choose","currentSetVariation","PlannerProgramExercise_currentEvaluatedSetVariation","PlannerProgramExercise_evaluatedSetsToDisplaySets","rowClassName","dayContent","ExercisePickerUtils_getProgramExercisefullName","labelWidth","groupedMuscles","availableMuscles","sortedGroupedMuscles","sortedMuscles","longestWord","word","shouldKeepProgramExerciseId","setNameError","rawValue","isInProgramExercises","isInExercises","ExercisePickerUtils_getCustomFilters","ObjectUtils_filter","_id","typesSet","musclesSet","SetUtils_containsAnyValues","typeSet","count","isMultipleInstances","suffix","aE","bE","ExercisePickerUtils_getSortRating","currentGroups","currentMuscles","ExercisePickerUtils_getSelectedMuscleGroups","aRating","Exercise_similarRating","filterMuscleGroups","aTargetMuscleGroups","bTargetMuscleGroups","rm","Exercise_onerm","openCalculator","weightValue","_iconCalculator","IconCalculator","setShow","pinned","setPinned","nudge","setNudge","wrapperRef","tooltipRef","handleOutsideClick","contains","viewportWidth","documentElement","clientWidth","onMouseEnter","onMouseLeave","borderBottom","borderRight","filterTypes","setFilterTypes","allBuilt","programExs","buildExercises","CollectionUtils_uniqByExpr","programKeys","historyExs","Exercise_isCustom","customExs","Settings_activeCustomExercises","filterOptions","mg","Exercise_filterExercises","Exercise_filterExercisesByType","programExercises","historyExercises","visibleCustom","visibleProgram","visibleHistoryEx","_multiselect","Multiselect","initialSelectedValues","ft","ExerciseItem","_settings","exerciseTypes","Equipment_getEquipmentNameForExerciseType","defaultRounding","Thunk_pushExerciseStatsScreen","gradientId","useId","fadeWidth","alwaysBounceVertical","contentInsetAdjustmentBehavior","contentClassName","_svg","Svg","preserveAspectRatio","viewBox","Defs","LinearGradient","x1","y1","x2","y2","gradientUnits","Stop","stopColor","stopOpacity","Rect","fill","hasAnyNulls","videoRef","onDetectedRef","onDetected","controls","cancelled","_yield$Promise$all","_yield$Promise$all2","BrowserMultiFormatReader","_yield$Promise$all2$","BarcodeFormat","DecodeHintType","reader","POSSIBLE_FORMATS","EAN_13","EAN_8","UPC_A","UPC_E","decodeFromConstraints","video","facingMode","ctrl","getText","playsInline","muted","objectFit","androidInputStyle","numeric","autoFocus","selectTextOnFocus","foodMeals","meal","Chip","Food_mealNames","nutrients","Food_formatAmount","calories","protein","carbs","fat","_food","form","per100","FoodLabel_per100","field","_foodFields","FoodTextField","testIDPrefix","NutrientLine","_foodLabel","setTab","setQuery","setResults","setStatus","q","controller","AbortController","found","searchFood","aborted","abort","selectSearchResult","getUsdaFood","sourceId","Food_selectionFromSearch","onBarcode","saved","library","FoodSearch_sameBarcode","barcode","Food_selectionFromItem","getFoodByBarcode","onBarcodeNotFound","libraryMatches","Food_searchLibrary","Row","tag","_barcodeScanner","BarcodeScanner","recent","ingredients","Food_selectionForEntry","_foodSearch","brand","servings","isGram","FoodSearch_gramLabel","kcal","perServing","FoodSearch_formatServing","Boolean","choice","option","optionIndex","amount","Food_parseNumber","amountText","Food_scaleNutrients","inactiveColor","currentTab","isUserLoading","loading","endTime","hasErrorsInProgram","getHasErrorsInProgram","nativeShadow","getNativeShadowStyle","_footerButton","FooterButton","_iconHome","IconHome","hasDot","Thunk_pushToEditProgram","isOngoingProgress","CreateButton","_iconGraphs","IconGraphs","_iconFood","IconFood","red","_iconMe","IconMe","_iconBarbell","offsetY","blurRadius","spreadDistance","black","IconBarbell2","dataCy","_select","_lineChart","_graphLegendOverlay","initialType","selectedType","setSelectedType","eqName","getData","isWithOneRm","bodyweightData","changeProgramTimes","historyRecords","normalizedData","getTime","maxSet","History_getMaxWeightSetFromEntry","maxe1RMSet","History_getMax1RMSetFromEntry","convertedWeight","onerm","Weight_getOneRepMax","completedRpe","normalizedBodyweightData","lastIdx","series","xMin","isSameXAxis","minX","maxX","xMax","_useGraphActiveCursor","useGraphActiveCursor","cursorIdx","chartRef","handleCursorChange","onCloseOverlay","overlayVisible","propsOnInteract","onInteract","onChartInteract","timestamps","cursorTimestamp","cursorRecord","subtitle","Select","LineChart","programLines","isWithProgramLines","onCursorChange","yAxisFormatter","isInteractive","GraphLegendOverlay","GraphExerciseLegend","bodyweight","entryNotes","stateVars","Weight_isOrPct","onWorkoutPress","toFixed","dataSet","graphLegend","_iconCloseCircle","IconCloseCircle","_useActiveGraph","useActiveGraph","otherIsActive","setCursorIdx","clearCursor","_activeGraphContext","programChangeTimes","MathUtils_formatCompact","_nutritionGraph","NutritionGraph_data","graphId","Food_localDate","isCalories","NutritionGraph_units","weightSeries","dataMin","dataMax","NutritionGraph_name","avg","tdee","coll","sortedCollection","divisor","Length_convertTo","lengthUnits","_length","movingAverageWindowSize","collection","sum","movingAvg","out","statsKey","Stats_name","isControlled","internalExpanded","setInternalExpanded","hasToggle","isHelpShown","setIsHelpShown","wrapperClassName","inner","expandOnIconClick","help","_iconHelp","IconHelp","StoreRuntime_storeName","HEAR_ABOUT_US_OPTIONS","_storeRuntime","eyebrow","drill","chips","variant","freeformPlaceholder","initialAnswer","setStep","setSource","freeformRef","freeform","HearAboutUs_option","complete","onComplete","skipPress","onSkip","isScreen","stepTwoTitle","navOnBack","navHidden","Mascot","SkipButton","opt","onSelectSource","selectSource","sourceIcon","HearAboutUs_label","onMaybeLater","letterSpacing","chip","ChipView","FreeformInput","onEndEditing","BackButton","_imagePreloader","_iconReddit","_iconUser","_iconGooglePlay","_iconYoutube","_iconSpeaker","_hearAboutUsConfig","IconReddit","secondaryColor","IconUser","IconGooglePlay","IconYoutube","IconSpeaker","ImagePreloader_uri","isCoral","baseCn","iconColor","_link","Link","_iconCog","IconCog2","fontFamily","_helpAccount","_helpChooseProgram","_helpChooseProgramFirstTime","_helpEditProgramDaysList","_helpEditProgramV","_helpExercises","_helpExerciseStats","_helpGraphs","_helpMeasurements","_helpMuscles","_helpMusclesDay","_helpPlates","_helpSettings","_helpStats","_helpTimers","_helpWorkout","HelpAccount","chooseProgram","HelpChooseProgram","chooseProgramFirstTime","HelpChooseProgramFirstTime","editProgramDaysList","HelpEditProgramDaysList","editProgramV2","HelpEditProgramV2","HelpExercises","exerciseStats","HelpExerciseStats","graphs","HelpGraphs","measurements","HelpMeasurements","HelpMuscles","musclesDay","HelpMusclesDay","HelpPlates","HelpSettings","HelpStats","HelpTimers","HelpWorkout","showNotes","exerciseUnit","Equipment_getUnitOrDefaultForExerciseType","isPr","_comparer","_historyEntry","Progress_isCurrent","supersetToColor","Progress_getSupersetToColor","handleCardPress","editHistoryRecord","Progress_isFullyEmptySet","showTitle","pr","HistoryEntryView","HistoryRecordStats","ComparerUtils_noFns","_TimeUtils_formatHOrM","History_workoutTime","timeUnit","totalWeight","History_totalRecordWeight","totalReps","History_totalRecordReps","totalSets","History_totalRecordSets","setsUnit","repsUnit","HistoryRecordProperty","hasPadding","addRecordedDuration","seconds","timerColor","TimeUtils_formatMMSS","Reps_group","Reps_setToDisplaySet","alignItems","prTypes","prset","displayPrSet","setTimerLeft","sem","repsColor","isCompleted","isInRange","rpeColor","isRpeFailed","autoColor","sm","yellow150","SvgUri","SvgXml","xml","BundledImages_svgXml","_bundledImages","_iconSvg","IconSvg","Path","stroke","strokeWidth","strokeLinecap","strokeLinejoin","fillRule","clipRule","IconBarbell2Selected","IconBarbell2Unselected","white","strokeMiterlimit","checkColor","scaledSize","Circle","cx","cy","rx","noRemScale","G","clipPath","ClipPath","IconDoc2Selected","IconDoc2Unselected","Line","IconHomeSelected","IconHomeUnselected","gradientTransform","along","IconMeSelected","IconMeUnselected","playColor","spinValue","animation","loop","IconSvg_scale","fileInput","files","onFileSelect","FileReader","readAsText","click","showHelp","setShowHelp","contents","FileImport_pickFile","Thunk_importCsvData","_internalLink","InternalLink","_fileImport","FileImport_confirm","Thunk_importProgram","decoded","Thunk_importStorage","selectInputOnFocus","HTMLInputElement","handleNumber","setSelectionRange","forwardRef","errorMessage","changeTypeProp","labelSizeProp","identifierProp","multiline","valueProp","otherProps","autoCorrectStr","validationErrors","setValidationErrors","touched","setTouched","internalInputRef","setInputRef","useImperativeHandle","validateTarget","displayMode","normalized","MathUtils_normalizeNumStr","validity","patternMismatch","valueMissing","onInputHandler","errorMessages","containerClassName","labelSizeVal","onFocus","_props$value","_props$step","isLarge","buttonCn","signCn","setText","getNumericValue","_iconKeyboardClose","_mobile","_iconBackspace","clamp","nextPadOwnerId","activePadOwnerId","remValue","initialValue","setValue","setIsFocused","isTyping","setIsTyping","inputRef","valueRef","keyboardRef","switchRef","onClickTarget","isFocusedRef","isTypingRef","allowDotRef","allowNegativeRef","allowNegative","isMobile","setIsMobile","isCalculatorOpen","setIsCalculatorOpen","isCalculatorOpenRef","debounceTimerRef","hasPendingInputRef","pendingInputRef","onPreviewRef","onBlurRef","onInputRef","onPreview","onNextRef","onNext","onPrevRef","onPrev","onChangeUnitsRef","onChangeUnits","minRef","maxRef","stepRef","selectedUnitRef","selectedUnit","initialValueRef","commitMode","inputDebounceMs","commitModeRef","debounceMsRef","flushPendingInput","pending","cancelPendingInput","newValueNum","paddedScrollerRef","padOwnerIdRef","debugSessionRef","outsideTouchCountRef","resetKeyboardStyles","querySelectorAll","HTMLElement","blurRef","openCalculatorRef","handleInput","dynMaxLength","endsWith","blur","debugCaller","lg","caller","sid","outsideTaps","onKeyboardClose","onPlus","onMinus","onShowCalculator","flush","FocusedInputFlush_register","FocusedInputFlush_unregister","isTargetOutside","cur","parentElement","keyboardHeight","scrollableContainer","overflowY","getComputedStyle","contentEl","firstElementChild","insideShiftedSheet","closest","inputRect","scrollerRect","innerHeight","visibleTop","visibleBottom","scrollBy","behavior","keyboardHandler","maybeBlur","foundCurrentInput","foundOtherInput","reachedBody","nextInput","querySelector","isFocusFree","activeElement","focus","armedFinish","armDeferredBlur","finish","viaFallback","fallbackTimer","tagName","requestAnimationFrame","touchHandler","mouseHandler","availableTextWidth","autowidth","valueFontSize","placeholderFontSize","paddingLeft","tabStop","relatedTarget","stopImmediatePropagation","cornerLabel","CustomKeyboard","enableCalculator","enableUnits","KeyboardButton","CustomKeyboardInner","handleBackspace","IconKeyboardClose","IconBackspace","InputSelectValue","selectedLabel","openModal","hint","selectedValue","setUnit","availableUnits","buildWeight","u","Weight_buildPct","getValue","newWeight","Weight_decrement","_inputWeightUnit","InputWeightUnit","Weight_increment","_iconBarbellSide","unitRef","onInputPropRef","onBlurPropRef","exerciseTypeRef","draftValueRef","newUnit","draft","Weight_buildAny","showPlates","Subscriptions_hasSubscription","PlatesCalculator","fillFlex","showUnitInCorner","_Weight_calculatePlat","Weight_calculatePlates","IconBarbellSide","Weight_eq","Weight_formatOneSide","levels","level","activeLevelIndex","selectLevel","textDecorationLine","textDecorationStyle","textDecorationColor","nodeName","iconScale","expanded","setExpanded","collapsedHeight","expandedHeight","_worklet_12312514679856_init_data","liftoEditorChromeTsx1","collapsedStyle","_worklet_6722785042681_init_data","liftoEditorChromeTsx2","expandedStyle","_worklet_14365894414500_init_data","liftoEditorChromeTsx3","toggle","inOut","ease","onTouchEnd","short","onDismiss","pillRailRef","activeLevel","pillRailResetKey","_fadeScrollView","FadeScrollView","pills","pill","hue","pillHue","bg","bd","pressPill","fg","_iconPreview","IconPreview","isPreviewing","canRemove","removeFocused","completions","hasKeyboard","useSystemKeyboardHeight","completionHue","applyCompletion","hideKeyboard","_useAppState","useAppState","LiftoEditorHints_helpId","_useSystemKeyboardHeight","_liftoEditorHints","editorpill","weightfg","weightbd","weightbg","timerfg","timerbd","timerbg","logicfg","logicbd","logicbg","setsfg","setsbd","setsbg","progressfg","progressbd","progressbg","neutralfg","neutralbd","neutralbg","useLiftoEditorFocusEntry","freeformEntry","useLiftoEditorFreeformEntry","_useLiftoEditorHintDi","useLiftoEditorHintDismissed","_useLiftoEditorHintDi2","hintDismissed","setHintDismissed","blurFocused","useLiftoEditorBlurFocused","keypadHeight","useCustomKeyboardAnimatedHeight","tabBarHeight","BottomTabBarHeightContext","isKeypadOpen","useCustomKeyboardHeight","imeHeight","useSystemKeyboardHeightFromScreenBottom","systemKeyboardHeight","keypadLift","subtract","extrapolateLeft","extrapolateRight","_liftoEditorChrome","LiftoEditorSuggestBar","LiftoEditorHints_forContext","LiftoEditorHints_gestures","LiftoEditorCrumbs","LiftoEditorHintBar","LiftoEditorPillRail","_bottomTabs","_CustomKeyboardContext","storeRef","LiftoEditorFocusStore","LiftoEditorFocusContext","store","evictRef","evict","hasFocus","isFreeform","occupy","release","useSyncExternalStore","subscribe","noopSubscribe","getEntry","noopEntry","getFreeformEntry","listeners","takeOver","emit","occupant","hadFreeform","previous","reuseSetsSelections","Program_getScriptReuseCandidates","candidates","Program_getReuseSetsCandidates","currentWeekDays","weekAndDays","LiftoEditorStateVars_fromEntries","setVars","LiftoEditorStateVars_rows","defaults","defaultsMetadata","openCreate","created","LiftoEditorStateVars_set","userPrompted","sourceName","hasUnparsed","StateVarRow","isUsedInScript","LiftoEditorStateVars_isUsed","onReset","LiftoEditorStateVars_remove","LiftoEditorStateVars_print","isInherited","isOverridden","isDeclared","_lineChartGestures","IS_WEB","YEAR_SECONDS","niceTicks","targetCount","roughStep","magnitude","pow","log10","ticks","setWidth","rawTimestamps","isFinite","xMode","finiteTimestamps","dataMaxX","dataMinX","initialMin","initialMax","userViewport","setUserViewport","setViewport","vp","axisText","titleText","padLeft","yAxisWidth","plotWidth","plotHeight","xRange","clippedSeries","pts","interpAt","xAt","p1","p2","clipSeriesToViewport","lo","Infinity","hi","points","yMin","yMax","pad","yRange","xToPx","yToPx","pxToX","px","yTicks","xTicks","xAxisTicks","minSec","maxSec","rangeSec","yearApprox","yearSteps","approxYears","yearStep","ys","minDate","maxDate","startYear","getFullYear","endYear","intervals","timeTicks","setCursorAtPx","xPx","xVal","visibleMin","visibleMax","bestIdx","bestDist","findNearestIdx","resetViewport","_useLineChartGestures","useLineChartGestures","frozen","clearFrozen","cursorX","programLinePositions","renderSvg","clipId","innerStyle","outlineOffset","py","SvgText","textAnchor","xAxisFormatter","showYear","labelX","padTop","started","_points$i","buildPath","strokeDasharray","setNode","setFrozen","frozenRef","dragStart","updateCursorAtClient","clientX","onMouseDown","onMouseMove","dx","pw","deltaSec","onMouseUp","onWheel","focalX","focalPct","xAtFocal","newRange","deltaY","newXMin","onDocMouseDown","targetIsInsideGraphLegend","onDblClick","twoTouch","singleTap","lastTapTime","lastTapX","scrub","cancelScrubTimer","touchDistance","hypot","clientY","onTouchStart","touches","centerX","startDist","startCenterX","onTouchMove","startRange","onTouchCancel","onDocTouchStart","passive","WebkitUserSelect","WebkitTouchCallout","dataset","Linking","openURL","ClipboardUtils_copy","Alert","alert","_clipboard","isFontNormal","isNoUnderline","backdropFilter","WebkitBackdropFilter","topic","shouldTruncate","setShouldTruncate","isTruncated","setIsTruncated","preprocessed","directivesData","_match","exerciseExample","attrsStr","attrs","matchAll","weekLabels","preprocessDirectives","md","render","scrollHeight","codeEls","mod","codeEl","pre","wrapper","createElement","replaceChild","createRoot","hydrateLiftoscriptCodeBlocks","Exercise_findByNameAndEquipment","_exerciseTooltip","ExerciseTooltip","hydrateExerciseDirectives","weekSetup","weeksStr","weekLabelsStr","onermStr","_weeksStr$split$map","_weeksStr$split$map2","ProgramDetailsExerciseExample","programExerciseKey","defaultOnerm","hydrateExerciseExampleDirectives","dangerouslySetInnerHTML","__html","_client","_markdownIt","MarkdownIt","html","linkify","divRef","codeEditor","updateFacet","EditorView","updateListener","of","docChanged","isUndoing","doc","eventHandlers","domEventHandlers","view","hasHistory","minimalSetup","highlightSpecialChars","drawSelection","syntaxHighlighting","defaultHighlightStyle","fallback","keymap","defaultKeymap","historyKeymap","editorState","EditorState","create","extensions","markdown","parent","destroy","ce","TextDiff_minimalEdit","changes","insert","scrollIntoView","borderless","_langMarkdown","_view","_language","_commands","_textDiff","debouncedOnChange","debounce","onChangeRef","isTransparent","_throttler","valueNode","dragHandle","_iconHandle","IconHandle","addons","patternError","setPatternError","numberOfVisibleItems","isNameHtml","isNameBold","MenuItemValue","maxLength","_scrollBarrell","ScrollBarrell","itemHeight","defaultSelectedValue","handleChange","keyValue","_props","modalRef","prevProps","preautofocus","callback","autofocusInputRef","noPaddings","isFullWidth","isFullHeight","overflowHidden","innerClassName","Bullet","amrapModal","ModalAmrapContent","programExercise","otherStates","_props$amrapModal","initialReps","initialRepsLeft","completedRepsLeft","initialRpe","initialWeight","userVars","repsInputValue","setRepsInputValue","repsLeftInputValue","setRepsLeftInputValue","weightInputValue","setWeightInputValue","rpeInputValue","setRpeInputValue","stateMetadata","PlannerProgramExercise_getStateMetadata","stateMetadataKeys","initialUserVarInputValues","userVarInputValues","setUserVarInputValues","amrapValue","amrapLeftValue","rpeValue","userVarValues","MathUtils_round","InputWeight","UserPromptedStateVars","previousValue","typedValue","weightOrPctValue","UserPromptedStateVar","allPrograms","initialCurrentProgramId","setCurrentProgramId","CollectionUtils_findBy","programsValues","Program_getListOfDays","visibleMuscleCount","useProgressiveCount","contentSizeRef","scrollListenersRef","handleSelect","handleEmptyProgram","handleProgramChange","highlightedDay","dayId","_nextDayPicker","NextDayPickerDay","renderMuscles","setResult","Thunk_redeemCoupon","ModalCreateProgramContent","initialDate","hoursStr","padStart","minutesStr","dateTimestamp","setDateTimestamp","hoursValue","setHoursValue","minutesValue","setMinutesValue","_datePicker","DatePicker","progressId","newHoursValue","newMinutesValue","newTime","onCreateProgram","NextDayPicker","_Program_addDayFromHi","Program_addDayFromHistoryRecord","EditProgram_updateProgram","ModalEquipmentContent","_equipmentSettings","availableEquipment","currentEquipment","programExerciseId","findBy","trackedState","useTrackedState","useTrackedDispatch","untrack","maxSets","History_findAllMaxSetsPerId","usedStats","hasBodyweight","statsWeightKeys","statsLengthKeys","statsPercentageKeys","percentage","availableMuscleGroups","nutritionKeys","food","nutritionGraphDef","hasAvailableStats","graphsSettings","defaultType","graphExerciseSelectedTypes","defaultMuscleGroupType","graphMuscleGroupSelectedTypes","isWithBodyweight","_draggableList","DraggableList2","handle","ExercisePreview","MuscleGroupPreview","StatsPreview","EditGraphs_removeGraph","startIndex","endIndex","EditGraphs_reorderGraphs","EditGraphs_addExerciseGraph","EditGraphs_addMuscleGroupGraph","EditGraphs_addNutritionGraph","EditGraphs_addStatsWeightGraph","EditGraphs_addStatsPercentageGraph","EditGraphs_addStatsLengthGraph","_editGraphs","onUploadHevy","Thunk_importHevyData","numValue","author","paddingTop","ModalProgramNextDayContent","statsEnabled","saveLength","EditStats_toggleLengthStats","EditStats_toggleWeightStats","EditStats_togglePercentageStats","savePercentage","bodyfat","neck","shoulders","bicepLeft","bicepRight","forearmLeft","forearmRight","chest","waist","hips","thighLeft","thighRight","calfLeft","calfRight","_editStats","MonthItem","flatListRef","setDate","getDate","monthToHistoryRecords","monthKey","dayToHistoryRecords","month","numberOfPersonalRecords","History_getNumberOfPersonalRecords","setMonth","getMonth","selectedIdx","selectedFirstDayOfWeekTs","selectedDate","selectedMonthKey","months","selectedMonthIndex","scrollToIndex","viewPosition","today","renderMonth","initialScrollIndex","year","monthIndex","daysInMonth","firstDayOfWeek","getDay","toLocaleString","yyyymmdd","isWorkout","thisFirstDayOfWeek","DateUtils_firstDayOfWeekTimestamp","isSelectedWeek","setSelectedValues","showValuesList","setShowValuesList","valuesSet","filteredValues","nestedScrollEnabled","newValues","muscleColors","xmlns","visibleMuscleGroups","hiddenMuscleGroups","Muscle_getHiddenMuscleGroups","showMusclePicker","setShowMusclePicker","showNewGroupInput","setShowNewGroupInput","trimmed","newGroupInputData","muscleGroupName","muscleGroupSlug","isBuiltin","Muscle_isBuiltInMuscleGroup","getNavigationRef","navigate","handleAddMuscleGroup","onRestore","_bottomSheetMuscleGroupMusclePicker","BottomSheetMuscleGroupMusclePicker","existingMuscles","newMuscles","_textInputModalContent","TextInputModalContent","getOpacity","defaultOpacity","getFill","contour","_tabs","Tabs2","MusclesTypeView","hideListOfExercises","_backMusclesSvg","_frontMusclesSvg","muscleData","screenMusclePoints","exercisePoints","BackMusclesSvg","FrontMusclesSvg","muscleName","targetScreenMuscles","CollectionUtils_flat","synergistScreenMuscles","targetScreenMusclesWithPercentage","synergistScreenMusclesWithPercentage","navSubtitle","navHelpKey","helpKey","_musclesView","MusclesView","Muscle_normalizePoints","Muscle_getPointsForDay","_screenMuscles","ScreenMuscles","Muscle_getPointsForProgram","_reactNativeHapticFeedback","KEY_ROWS","keyboardShadowStyle","HAPTIC_OPTIONS","enableVibrateFallback","ignoreAndroidSystemSettings","KeyButton","bottomPadding","applySafeAreaBottom","setKeyboardHeight","useSetCustomKeyboardHeight","measuredHeightRef","useMeasuredKeyboardHeightRef","useCustomKeyboardActiveId","activeIdRef","keyboardTopBorderStyle","borderTopWidth","hairlineWidth","borderTopColor","cardPressedStyle","pressed","lastRow","noShadow","KeyboardRestTimer","UnitButton","keyButtonStyle","ReactNativeHapticFeedback","trigger","pressedStyle","NavbarCenterView","onTitleClick","showDebug","setShowDebug","showBackButton","showBack","loadingItems","loadingKeys","numberOfLeftButtons","numberOfRightButtons","rightButtons","helpTourId","numberOfButtons","rightRailWidth","setRightRailWidth","railMinWidth","onBack","Thunk_pullScreen","newCount","Tour_start","IconClose","MUSCLE_CONTOUR","MUSCLE_COLUMN_STYLE","MUSCLE_SVG_ASPECT","MusclesColumn","Muscle_normalizeUnifiedPoints","Muscle_getUnifiedPointsForDay","_props$renderMuscles","Program_getProgramDayUsedExercises","handlePress","maxWeightSet","prevMaxWeightSet","max1RMSet","prevMax1RMSet","estimated1RM","Reps_avgUnilateralCompletedReps","previous1RM","setRpe","prevRpe","PlatesBarLayout_build","shaft","collar","sleeve","whiteoutline","_platesBarLayout","_programPreviewPlaygroundDay","_programPreviewPlaygroundInner","_deepmerge","_webWorkoutModals","buildDayDispatch","playgroundDispatch","newProgress","buildCardsReducer","onProgressChange","playgroundOnProgramChange","progresses","wk","Progress_applyProgramDay","Progress_runInitialUpdateScripts","playgroundOnSettingsChange","newSettings","buildInitialState","initialEvaluatedProgram","dayNumber","dayExercises","exerciseTags","states","PlaygroundWeekContent","handleProgressChange","handleFinish","programWeekDescription","ProgramPreviewPlaygroundDay","weekName","onFinish","WebWorkoutModals","onProgramChange","onSettingsChange","ProgramPreviewPlaygroundInner","propsRef","pp","_Program_runAllFinish","Program_runAllFinishDayScripts","deepmerge","showAllWeeks","ProgramPreviewAllWeeks","ProgramPreviewPlaygroundInnerRenderer","headerContent","weekNames","singleWeek","renderWeekContent","hasNavbar","scrollTabZIndex","ProgramPreviewPlaygroundLocal","onEngage","ProgramPreviewPlaygroundNav","globalState","globalDispatch","playgroundState","lensRecordings","lr","buildGlobalPlaygroundDispatch","numWeeks","cssRules","rules","breakpoint","allFitBreakpoint","buildAllWeeksCss","gridColumn","gridRow","scrollSnapAlign","_programPreviewPlaygroundExercise","_workoutExerciseThumbnail","currentEntryIndex","PreviewListOfExercises","anEntry","ProgramPreviewPlaygroundExercise","colorToSupersetGroup","Progress_getColorToSupersetGroup","currentIdx","currentSuperset","WorkoutExerciseThumbnail","shouldShowProgress","_workoutExerciseAllSets","_workoutExerciseUtils","getBgColor100","Reps_isFinished","Reps_isCompleted","getColor","staticState","ProgramPreviewHistoryRecordSets","PlannerProgramExercise_currentDescription","PlaygroundExerciseTopBar","Program_getDayData","currentEquipmentName","supersetEntry","Progress_getNextSupersetEntry","supersetExercise","WorkoutExerciseUtils_getBgColor50","xOffset","WorkoutExerciseAllSets","isCurrentProgress","userPromptedStateVars","lbSets","lbWarmupSets","ProgramPreviewPlaygroundExerciseEditContent","hasStateVariables","pendingStateVarsRef","pendingRm","setPendingRm","hideVariables","ProgramStateVariables","onEditStateVariable","_programPreviewTabDay","ProgramPreviewTabDay","_programPreviewTabExercise","ProgramPreviewTabExercise","_programExercise","currentEquipmentNotes","Equipment_getEquipmentDataForExerciseType","ProgramPreviewTabExerciseTopBar","ProgramExercise_doesUse1RM","daysBefore","editModalProgramExerciseId","editModal","editModalProgramExercise","Program_getProgramExercise","setTimerModal","Progress_getActiveSetTimer","showSetTimerModal","closeSetTimerModal","setTimerEditModal","setTimerEditSet","roundingModal","roundingEntry","roundingSet","_setTimerBanner","SetTimerBannerContent","closeSetTimerEditModal","_setTimerEdit","SetTimerEditContent","closeRoundingModal","_weightRoundingInfo","WeightRoundingInfoContent","_modalAmrap","ModalAmrap","_bottomSheetEditTarget","BottomSheetEditTarget","_programPreviewPlaygroundExerciseEditModal","ProgramPreviewPlaygroundExerciseEditModal","EditProgramLenses_properlyUpdateStateVariable","Program_stateValue","variableKey","_editProgramLenses","spans","StyledText_fragmentsToSpans","baseStyle","normalizeFontWeight","fontStyle","noWrap","preserveWhitespace","numberOfLinesCss","topTestId","topDataCy","fragmentCss","textOverflow","WebkitLineClamp","WebkitBoxOrient","tree","own","pillBuilders","setGroup","PlannerNodeName","ExerciseSet","enclosingSetGroup","groupPills","setGroupPills","acrossField","LiftoEditorActions_acrossField","ownsRail","def","acrossPillDefs","nodeText","newLabel","sanitized","LiftoEditorStateVars_sanitizeName","isStateVar","weekDay","pickedName","existingLabel","getChildren","WarmupExerciseSet","warmupSetGroupPills","warmupSetsPills","_plannerExerciseStyles","_plannerDocument","defs","table","stamped","stampKinds","addWeight","template","addRpe","addSetTimer","addRestTimer","splitTimer","backToRestTimer","addAuto","addStateVar","require2Successes","addDeload","makeWeight","makeNumber","addSetGroup","addSetVariation","addSets","makeRepRange","makeFixedReps","addWarmupSetGroup","addWarmupWeight","addWarmups","removeWarmups","overrideSets","addProgress","addUpdate","addSetLabel","addGlobals","addUsedNone","addLabel","addIdTags","reuseScript","fromWeekDay","repeat","forcedOrder","enableSuperset","insertPill","at","replacePill","renamePill","renameKind","LiftoEditorActions_endOfExerciseLine","trimmedEnd","LiftoEditorActions_enclosingExercise","ExerciseExpression","LiftoEditorActions_setVariationSections","ExerciseSection","getChild","ExerciseSets","SetPart","makeCurrentPill","siblings","markedIndex","CurrentVariation","markerRemoval","marker","extraEdits","WeightWithPlus","PercentageWithPlus","AskWeight","Rpe","SetTimer","Timer","isSetGroup","Auto","SetLabel","warmupSet","Weight","Percentage","progressionDefaults","lp","dp","custom","none","enclosingPropertyName","ExerciseProperty","nameNode","ExercisePropertyName","stateVarEntries","FunctionArgument","arg","KeyValue","Keyword","Plus","stray","propertyScript","property","FunctionExpression","propertyFunction","Liftoscript","ReuseLiftoscript","ReuseSection","ExerciseName","LiftoEditorActions_stateVarsPill","FunctionName","skipSpace","argListRange","progressScript","progressReuse","updateScript","updateReuse","fnPills","reuseTemplate","bodyEnd","customFnPills","last","lpPills","progressSwitchPills","LiftoEditorActions_labelRenamePill","nameText","colonIdx","ExerciseVariation","variation","properties","exercisePropertyNames","lineEnd","sections","setNodes","hasSetGroups","hasGlobals","hasReuse","ReuseSectionWithWeekDay","hasSuperset","Superset","ExerciseVariations","setGroupSections","lastSetGroupSection","Repeat","WarmupExerciseSets","None","fnNameNode","fnName","numberNode","weightNode","numericPart","match","unshift","repRange","RepRange","maxRep","Rep","repNode","rep","isScriptReuse","WeekDay","changeEnd","targetName","hasRepeat","LineComment","PlannerDocument_descriptionAt","marked","markerAt","acrossFields","blocks","block","cache","resolveInner","_loop2","isGlobals","makeLevel","variationIndex","exerciseName","afterColon","propertyName","charAt","toUpperCase","breadcrumbLabels","LiftoEditorActions_warmupSetsPillsAt","functionName","isHeader","Week","Day","breadcrumb","daysInWeek","editedSpan","maxPrefix","styledRangesEqual","windowStart","windowEnd","maxSuffix","extend","rangeStart","ranges","finalStart","finalEnd","inside","rects","middle","groupName","WarmupSetPart","isOnlyGroup","usedNone","iterate","enter","trimmedSpan","readVariations","defaultColor","alpha","fade","LiftoEditorBrain_computeStyledRanges","boundaries","byStart","inputIndex","nextToEnter","merged","LiftoEditorBrain_exerciseBlocks","low","high","pieces","editStart","editEnd","insertedLength","stepByKind","plainStopStack","plainSpan","walkStop","descriptionStarts","PlannerDocument_descriptions","insidePlainStop","parseLiftoscript","liftoscriptNumericSpans","inFunctionArgs","whole","wholeNumericTokenKinds","isInFunctionArgs","Int","Float","plainFocusNames","timerMatch","timerRe","exec","leave","_common","_plannerExerciseParser","_liftoscript","_liftoEditorActions","LiftoEditorParseCache","liftoscriptTrees","lastParse","parser","old","minLength","charCodeAt","toA","toB","TreeFragment","applyChanges","addTree","fromA","fromB","liftoscriptParser","pushLiftoscriptRanges","styles","StateVariable","variable","Unit","comment","TripleLineComment","blockComment","SupersetKeyword","SectionSeparator","attributeName","attributeValue","annotation","docComment","number","PlannerDocument_blockSpans","exerciseStart","exerciseFrom","italic","trimStart","overrides","rail","LiftoEditorActions_railForNode","editorFallbackHints","functionHint","editorProgressFunctionHints","editorPropertyHints","warmupPercentage","warmup","isValueContext","valueWeight","editorNodeHints","used","LiftoEditorStateVars_findExercise","sourceContext","LiftoEditorStateVars_context","updateSource","PlannerProgramExercise_getUpdateScript","PlannerStateVars_fromArgs","ScriptRunner","hasStateVariable","nameRegex","declared","_plannerStateVars","_parser","progressSource","PlannerProgramExercise_getProgressScript","React","alt","textColorPattern","textSizePattern","effectiveClassName","resolveFontFamily","dataTestid","allowFontScaling","isBold","isSemiBold","isItalic","Text_hasSizeClass","Text_resolveFontFamily","History_getHomeAggregates","sortedHistoryDesc","weeksData","historyRecordDateToFirstDayOfWeek","firstDayOfWeekToHistoryRecord","sortedHistory","arr","setSelectedWeekFirstDay","previousWeekFirstDayDate","previousWeekFirstDay","selectedWeekCalendarFirstDayOfWeek","setSelectedWeekCalendarFirstDayOfWeek","thisWeekHistory","getWeekHistory","lastWeekHistory","historyRecordDateToFirstDayOfWeekRef","selectedFirstDayOfWeekRef","onViewableItemsChanged","viewableItems","firstVisibleRecord","initialHistoryRecordId","setInitialScrollIndex","listRemountKey","setListRemountKey","scrollToRecordId","scrollToHistoryRecordId","stickyHeader","_weekCalendar","WeekCalendar","onSelectFirstDayOfWeek","_weekInsights","WeekInsights","_historyRecordsNullState","HistoryRecordsNullState","waitForInitialLayout","History_getHistoryRecordsForTimerange","musclesModal","setMusclesModal","previewHeader","_programPreviewOrPlayground","ProgramPreviewOrPlayground","ProgramPreviewMusclesModal","_locker","Locker","setIsPlayground","onChangeUnit","unitsValue","playgroundHeader","svg","setSvg","QRCode","margin","_qrcode","_plannerExerciseEvaluator","_programQrCode","Card","minDays","maxDays","contentWidth","setContentWidth","showInfo","showQRCode","ProgramQrCode","daysToShow","groupedDays","showWeekDescription","currentDayIndex","findDayInEvaluatedWeeks","Workout","isMultiweek","setsNumber","numberOfSets","plannerProgramExercise","_PlannerExerciseEvalu","PlannerExerciseEvaluator","extractNameParts","nameAndEquipment","firstDescription","strikeThrough","showEndOfDay","forceShow","Program_computeProgressStateChanges","ProgressStateChangesView","diffState","diffVars","prints","updatePrints","isSuppressed","onSuppressProgress","hasDiffState","ObjectUtils_isNotEmpty","hasDiffVars","ExerciseChanges","StateVariablesChanges","Prints","strike","print","knownReps","setKnownReps","knownRpe","setKnownRpe","knownWeight","setKnownWeight","targetReps","setTargetReps","targetRpe","setTargetRpe","parseAndClamp","Weight_calculateRepMax","backLabel","timerSince","useRestTimerTick","_RestTimerProgress_at2","RestTimerProgress_at","elapsedMs","isTimeOut","RestTimer_formatCompact","sentNotification","keyboardActiveId","windowHeight","activeSheet","useActiveSheet","expandedSpacing","TEXT_SIZE_MAX","activeSheetHeight","hideTimer","hidesFloatingUi","baseBottom","targetBottom","animatedTargetBottom","animatedOpacity","wasHiddenRef","progressStyle","fraction","remainingMs","_worklet_16510454362617_init_data","restTimerTsx1","useRestTimerProgressStyle","timeDifference","timerMs","nativeNotificationScheduled","Thunk_playAudioNotification","Thunk_checkSetTimer","pointerEventsMode","_RestTimerProgress_at","elapsedText","bgClass","totalColorClass","nextEntryAndSetIndex","timerEntryIndex","timerMode","Reps_findNextEntryAndSetIndex","Thunk_updateTimer","RestTimerWidth_em","RestTimerLayoutTransition","shadowStyle","marginHorizontal","transformOrigin","entering","RestTimerContentEntering","exiting","RestTimerContentExiting","_restTimerProgress","_restTimerWidth","LinearTransition","quad","FadeIn","FadeOut","TRANSITION_MS","setTick","intervalId","ms","StringUtils_pad","useAppContext","vapidKey","setVapidKey","refresh","WebPush_browserState","RestTimerAlert_status","getRestTimerPushKey","RestTimerAlert_label","RestTimerAlert_tapAction","WebPush_subscribe","finally","WebPush_unsubscribe","_restTimerAlert","_webPush","Settings_getExercisesWithUnset1RMs","Settings_setOneRM","getFooterShadowStyle","otherAccounts","setOtherAccounts","isOtherAccountsEditMode","setIsOtherAccountsEditMode","currentAccountId","currentAccount","nickname","affiliateEnabled","refetchAccounts","Thunk_fetchAccounts","accounts","Thunk_iapRefreshActiveSubscriptions","AppState","isNative","plan","SubscriptionPlan_derive","subscriptionStatus","ownedLifetime","isIos","isLoadingSubscription","AppleID","auth","clientId","scope","redirectURI","usePopup","premiumCard","planKindLabel","dateStr","expirationDate","actionLabel","showCancel","managedOn","StoreRuntime_isIos","buildPremiumCard","googleShadow","AdminDebug_isDebugAccountId","nosync","_account","Thunk_openManageSubscriptions","Thunk_switchAccount","answer","Dialog_prompt","toLocaleLowerCase","Thunk_deleteAccount","Thunk_createAccount","Thunk_deleteAccountRemote","_adminDebug","_subscriptionPlan","setKeys","newKeyNameRef","copiedKey","setCopiedKey","isCreating","setIsCreating","createError","setCreateError","isSubscribed","getApiKeys","handleCreate","createApiKey","handleDelete","deleteApiKey","createdAt","toLocaleDateString","handleCopy","appleHealthSyncWorkout","healthConfirmation","appleHealthSyncMeasurements","appleHealthSyncSleepNutrition","Thunk_syncHealthKit","_editProgramDaysList","_screenProgram","ScreenProgram","revisions","EditProgramDaysList","expandedMap","setExpandedMap","scrollNode","itemNode","findNodeHandle","measureLayout","selectedGym","selectedGymId","buildLensDispatch","visibleKeys","headerIndex","assignRef","toggleExpanded","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","prototype","valueOf","_Component","ScreenErrorBoundary","hasError","setState","goBack","_inherits2","componentStack","screen","canGoBack","safeCanGoBack","TextRaw","Component","rawHistory","Program_getProgramExercisesFromExerciseType","pe","collectorResult","Collector","addFn","History_collectMinAndMaxTime","History_collectAllUsedExerciseTypes","History_collectAllHistoryRecordsOfExerciseType","History_collectWeightPersonalRecord","History_collect1RMPersonalRecord","run","_collectorResult","_collectorResult$","maxTime","minTime","unsortedHistory","_collectorResult$2","maxWeightHistoryRecord","_collectorResult$3","max1RMHistoryRecord","showPrs","onOverrideMuscles","onEditCustomExercise","onDeleteCustomExercise","onNotesChange","notesValue","isCustom","maxWeightProp","max1RMProp","onOverride","_exerciseDataSettings","ExerciseDataSettings","_graphExercise","GraphExercise","_exerciseAllTimePRs","ExerciseAllTimePRs","_exerciseHistory","ExerciseHistory","_collector","Exercise_synergistMuscleMultipliers","synergistMultiplier","setShowMuscles","_exercisesList","ExercisesList","Program_fullProgram","historyRecordId","startedEntries","History_getStartedEntries","_historyCollector$run","History_collectMuscleGroups","muscleGroupsData","muscleGroupsGrouped","CollectionUtils_splitIntoNGroups","eligibleForCreateProgramDay","_reactNativeSvg","ImagePreloader_dynohappy","_personalRecords","PersonalRecords","MobileShare","WebappShare","Thunk_maybeRequestReview","Thunk_maybeRequestSignup","_confetti","Confetti","_iconInstagram","_workoutShareButton","_share","_iconTiktok","_liftohistorySerializer","IconInstagram","IconTiktok","LiftohistorySerializer_serialize","WorkoutShareButton","Share_generateLink","copiedLink","setCopiedLink","onboardingImages","ImagePreloader_preload","_storySlider","slides","FirstSlide","RestSlide","bgColorHexFrom","_iconKettlebell","IconKettlebell","bodyText","image","_iconWorkoutProgress","IconWorkoutProgress","_iconEditor","IconEditor","_iconTracker","IconTracker","AnimatedArrow","sequence","BundledImages_resolve","Food_daySummary","remaining","Food_remaining","goals","totals","calorieGoal","prevDate","Food_shiftDate","prevSummary","prevEntries","meals","isDayEmpty","expenditure","Expenditure_current","copyFromPrev","EditFood_addEntries","Food_copyValues","dateLabel","ProgressBar","fiber","ExpenditureCard","WaterCard","goalMl","waterMl","inlineDateLabel","Food_sumNutrients","Food_entryTotals","addFood","Food_defaultMeal","getHours","editTimestamp","servingLabel","MealLinks","prevLabel","prevCount","canCopy","onCopy","onTemplates","hasTemplates","templates","_expenditure","_editFood","waterAmounts","macroNames","shortDate","_date$split$map","_date$split$map2","weekday","showCopy","ratio","eaten","isOver","estimate","missing","loggedDays","Expenditure_minLoggedDays","weighIns","Expenditure_minWeighIns","weighInSpanDays","Expenditure_minWeighInSpanDays","perWeek","Expenditure_fromKg","weightChangeKgPerWeek","trend","diff","averageIntake","startDate","Food_waterEntries","total","ml","Food_formatWater","EditFood_deleteWater","EditFood_addWater","editing","Food_entries","setMeal","picked","setPicked","setChoice","saveToLibrary","setSaveToLibrary","labelForm","setLabelForm","FoodLabel_emptyForm","quick","setQuick","eatenText","setEatenText","quickSave","setQuickSave","FoodPick_view","Food_defaultAmount","EditFood_updateEntry","quickLabel","FoodLabel_parse","EditFood_deleteEntry","MealPicker","_servingPicker","ServingPicker","warning","startFix","FoodLabel_formFromSelection","_foodLabelFields","FoodLabelFields","canSave","canAdd","onConfirmSelection","FoodPick_confirm","saveId","EditFood_saveItem","_foodPicker","FoodPicker","Food_recentEntries","prefill","servingGrams","onConfirmQuick","FoodLabel_quickAdd","eatenGrams","_foodPick","texts","setTexts","macroCalories","EditFood_setGoals","isRecipe","FoodLabel_formFromItem","setForm","setIngredients","recipeServings","yieldText","setYieldText","picking","setPicking","setSelection","recipeYield","Food_recipeItem","FoodLabel_itemFromForm","EditFood_deleteItem","recipePerServing","Food_recipePerServing","ing","addIngredient","Food_ingredientFromSelection","save","mealEntries","isSaved","setIsSaved","Food_sortTemplates","EditFood_deleteTemplate","Food_templateFromEntries","EditFood_saveTemplate","Food_entriesFromTemplate","Food_templateTotals","googleHealthSyncWorkout","Thunk_requestHealthPermissions","googleHealthSyncMeasurements","googleHealthSyncSleepNutrition","_settings$graphsSetti","History_getGraphsAggregates","getWeightDataForGraph","_useTimedMemo2","setActiveId","activeGraphValue","visibleGraphs","roundedMinX","roundedMaxX","bodyweightForGraphs","programChangeTimesForGraphs","preparedGraphs","getLengthDataForGraph","getPercentageDataForGraph","_graphStats","GraphStats","_graphMuscleGroup","GraphMuscleGroup","_graphNutrition","GraphNutrition","_useTimedMemo3","StringUtils_nextName","newGyms","CollectionUtils_removeBy","aGym","HearAboutUs_logShown","_hearAboutUsSurvey","HearAboutUsSurvey","HearAboutUs_selectSource","HearAboutUs_updatePartial","HearAboutUs_finalize","HearAboutUs_skip","HearAboutUs_markDone","_hearAboutUs","_props$preview","preview","ImportUtils_summarize","previewSettings","shouldSkipDuplicates","setShouldSkipDuplicates","sortedRecords","CollectionUtils_sortBy","recordsToImport","duplicateIds","importSummary","ImportUtils_customExercisesForRecords","onImport","Thunk_applyImport","workoutCount","minStartTime","maxStartTime","customExerciseNames","ExpandableSection","formatRowError","_importTypes","initialKey","_statsList","StatsList","_muscleGroupsContent","MuscleGroupsContent","Muscle_createMuscleGroup","Muscle_deleteMuscleGroup","Muscle_updateMuscleGroup","Muscle_restoreMuscleGroup","selectedProgramId","programValues","topHeader","_programPreview","ProgramPreview","importSessions","reverse","customExerciseIds","Thunk_undoImport","_whatsnewUtils","_importerStorage","_importerProgram","_iconDiscord","_importerLiftosaurCsv","_healthSync","_fontScale","_features","_slider","openExternal","isCopied","setIsCopied","osFontScale","useOsFontScale","setTheme","Stats_getCurrentBodyweight","currentBodyfat","Stats_getCurrentBodyfat","currentProgramName","StringUtils_truncate","isPublicProfile","Share_generateProfileLink","alwaysOnDisplay","vibration","Slider","ignoreDoNotDisturb","HealthSync_eligibleForAppleHealth","HealthSync_eligibleForGoogleHealth","Settings_getTextSize","TEXT_SIZE_MIN","TEXT_SIZE_STEP","TextSize_apply","newTheme","Features_isEnabled","Thunk_exportStorage","Thunk_exportHistoryToCSV","Thunk_exportProgramsToText","ImporterLiftosaurCsv","ImporterStorage","ImporterProgram","WhatsNew_showWhatsNew","IconDiscord","currentGym","Equipment_getEquipmentOfGym","contentContainerClassName","eqid","Equipment_getEquipmentData","keysWithData","statsHealthDef","health","HealthMetricList","formatHealthValue","hours","minutes","showHidden","setShowHidden","byTimestampDesc","hidden","graphPoints","getHealthDataForGraph","HealthMetricRow","EditStats_setHealthStatHidden","_props$settings","cleared","setCleared","lastWeightStats","lastLengthStats","lastPercentageStats","syncToAppleHealth","setSyncToAppleHealth","syncToGoogleHealth","setSyncToGoogleHealth","clearKey","setClearKey","pickedTimestamp","setPickedTimestamp","initialValues","valuesRef","saveWeight","stringValue","EditStats_addWeightStats","Length_build","EditStats_addLengthStats","EditStats_addPercentageStats","SingleLine","StatInput","DoubleLine","second","updates","Thunk_saveMeasurementsToHealth","testName","StoreRuntime_isNative","path","SubscriptionInfoImages_allPaths","Thunk_iapClearStuckLoadingOnForeground","monthlyPrice","prices","yearlyPrice","lifetimePrice","monthlyOffer","yearlyOffer","productId","offers","offerId","monthly","yearly","hasOffer","supportsLifetime","isUnclaimed","SubscriptionHero","isPitch","showManagement","hasFullAccess","PitchHeader","StatusHeader","FeatureList","ClaimFreeAccess","PurchaseCards","subscriptionLoading","ManagementActions","Thunk_redeemCouponIOS","Thunk_restorePurchases","interactive","_iconBell","_iconDinoSunglasses","_subscriptionInfoImages","_iconFire","planLabel","IconDinoSunglasses","features","IconBarbell","infoType","IconBell","IconFire","iosOnly","Feature","Thunk_claimkey","trialNote","PlanCard","price","formattedPrice","oldPrice","period","Thunk_subscribeYearly","applePromo","googlePromo","webAlert","Thunk_subscribeMonthly","lifetime","Thunk_buyLifetime","isAndroid","currentPlan","targetPlan","switchLoading","keepLoading","switchSubtext","lifetimeDisabledReason","pendingPlan","Thunk_switchSubscription","titleColor","subColor","Lens","buildLensRecording","_restTimerAlertRow","RestTimerAlertRow","getReady","reminder","selectedButtonCls","unselectedButtonCls","_timer","_workoutHeartRate","_workout","_workoutFinishButton","_workoutMenu","_workoutProgressView","Progress_lbProgress","prevAmrapNonce","nonce","exercisePickerState","navigatedExercisePickerState","changed","InteractionManager","runAfterInteractions","cancel","prevEditSetModal","prevSetTimerNonce","prevSetTimerEditModal","prevRoundingModal","onDeletePress","Thunk_deleteProgress","onDeletePressHandler","onPauseResume","History_isPaused","hasSubscription","currentEntry","Reps_findNextSetIndex","Thunk_updateLiveActivity","Thunk_pauseWorkout","progressStartTime","progressEndTime","progressIntervals","WorkoutHeartRate","onShare","onConvertToProgram","progressRef","WorkoutFinishButton","renderHeaderMenu","WorkoutMenu","progressViewRef","progressView","WorkoutProgressView_next","navOnTitleClick","isTimerShown","numberOfDummyItems","barrelRef","isDefaultSet","isTurnedOn","barrel","defaultSelectedIndex","scrollTop","setDefaultIndex","visibility","WebkitOverflowScrolling","scrollSnapType","setSelectedIndex","barWidth","setBarWidth","tabsRow","activeTextColor","tabBar","fillHeight","stickyStyle","_horizontalScroll","ownScrollRef","scrollViewRef","scrollProps","onContentSizeChange","scrollToEnd","scrollableNode","getScrollableNode","updateFade","edges","HorizontalScroll_edges","scrollLeft","scrollWidth","mask","HorizontalScroll_fadeMask","maskImage","webkitMaskImage","HorizontalScroll_wheelDelta","deltaX","deltaMode","maxOffset","removeClippedSubviews","selectedOption","hasModal","useIsModalAvailable","showOptions","setShowOptions","keyMap","startedAt","sideLabel","side","isGetReady","onTick","Progress_isSetTimerCheckDue","onTickRef","getReadyTotal","getReadyLeft","lastCueRef","MAX_HAPTIC_CUE_SECONDS","Thunk_playGetReadyCue","pct","elapsedLabel","recordSetTimer","keepTiming","forceUpdateEntryIndex","isExternal","keepSetTimerRunning","Thunk_recordSetTimer","isLeft","recordedThisSide","completedSetTimerLeft","completedSetTimer","stopLabel","onStartNow","Thunk_startSetTimerWork","BannerHeader","GetReadyRing","secondsLeft","_workoutExerciseSetFields","WorkoutExerciseSetTarget","RING_SIZE","polar","center","radius","angle","radians","cos","arcPath","fromAngle","toAngle","largeArc","paths","segAngle","RING_VISIBLE_GAP_PX","isSpent","sweep","orangebackground","initialSeconds","initialLeftSeconds","secondsValue","setSecondsValue","leftMinutesValue","setLeftMinutesValue","leftSecondsValue","setLeftSecondsValue","lbModal","toSeconds","durationRow","onMinutes","onSeconds","identifierPrefix","onSave","newSeconds","rendered","renderBlocks","elements","ICON_RE","inline","renderInline","sizeClass","ordered","closeType","listEnd","findMatchingClose","renderListItems","orderIndex","itemEnd","bullet","openType","pushTextWithIcons","collectInlineUntil","attrGet","internalHref","keyPrefix","lastIndex","renderIcon","collected","statsKeys","selectedKey","setSelectedKey","graphOptions","getValues","stat","_useScrollProgressive","useScrollProgressiveList","visibleValues","visibleItems","onProgressiveScroll","navScrollCtx","ImagePreloader_dynoflex","graphUnit","opts","MeasurementRow","_useScrollProgressiveList","reactMemo","convertedValue","Length_is","onChangeTimestamp","EditStats_changeStatWeightTimestamp","EditStats_changeStatPercentageTimestamp","EditStats_changeStatLengthTimestamp","onChangeValue","str","EditStats_changeStatWeightValue","EditStats_changeStatPercentageValue","EditStats_changeStatLengthValue","EditStats_deleteWeightStat","EditStats_deletePercentageStat","EditStats_deleteLengthStat","StatValueInput","setCurrentIndex","progressAnim","animationRef","goToNext","animatedWidth","fillWidth","goToPrevious","SubscriptionInfoImages_get","aspect","scrollView","State","currentlyFocusedInput","getNativeScrollRef","statusBarHeight","StatusBar","currentHeight","viewportY","getScrollResponder","scrollResponderScrollNativeHandleToKeyboard","revealFocusedInput","debouncedOnChangeText","blinkOpacity","workoutTime","isPaused","_iconPlay","IconPlay","_iconPause","IconPause","TimeUtils_formatHH","TimeUtils_formatMM","dismiss","paraCn","isProgramEmpty","params","editProgramState","editProgramStates","getPlannerFromState","shouldStart","steps","dino","condition","tourConfigs","_tourTypes","_workoutTourConfig","workoutTourConfig","checkSeen","config","helpId","Tour_stepHelpFlag","alreadySeen","onStepSeen","_props$stateTour","stateTour","activeSteps","conditionMet","isStepActive","setIsPaused","seenRef","currentStep","isFirstStep","isLastStep","canProceed","waitFor","flag","handleClose","DinoImage","filename","handlePrev","handleNext","waitForNextTrigger","bundledXml","configId","stepId","Program_getEvaluatedProgramFromState","Program_uses1RM","Program_usesRPE","Weight_eqNull","Program_getProgramExerciseForKeyAndDay","Program_runExerciseFinishDayScript","_result$data","bindings","Program_getDiffState","Program_getDiffVars","pagerRef","dateToHistory","History_getDateToHistory","selectedWeekCalendarIndex","firstDayOfWeeksRef","onSelectFirstDayOfWeekRef","handlePageChange","renderPage","getWeekDays","isToday","_weekCalendarPager","WeekCalendarPager","initialIndex","onPageChange","formatted","overflowX","pageWrapperBaseStyle","scrollSnapStop","pageWidth","setPageWidth","pageWidthRef","lastEmittedIndexRef","initialIndexRef","onPageChangeRef","programmaticScrollUntilRef","performScroll","handleLayout","isCurrentWeek","WeekInsightsUtils_calculateSetResults","lastSetResults","numberOfPrs","_iconCrown","IconCrown","startTs","endRange","formattedRange","DateUtils_formatRange","WeekInsightsProperty","increment","hasPersonalRecords","colorPctValue","strength","strengthSetsPct","hypertrophy","hypertrophySetsPct","_plannerStats","PlannerSetSplit","upper","shouldIncludeFrequency","lower","core","pull","legs","_plannerWeekMuscles","PlannerWeekMuscles","onOpenPlannerSettings","_weekInsightsUtils","WeightRoundingEquipmentExplanation","targetWeight","rounding","usesBodyweight","platesResult","_textareaAutogrow","_workoutStripLabel","_workoutExercise","_workoutExercisePager","_workoutStripReveal","_workoutStripReorder","_workoutHints","_workoutHintsDispatch","_useEqual","_perfProbeSubtree","_workoutTabStopContext","_workoutPagerHeightContext","_workoutCenterExpandedRow","selectedEntry","renderedIndices","setRenderedIndices","onPagerIndexChange","isUserDriven","onClickThumbnail","onPagerSettled","settledIndex","impressionsSeenRef","expandedRows","focusExpandedSet","useFocusExpandedSet","progressEntries","supersetByEntryId","_props$progress","sameDay","exerciseKeysJoined","exerciseKeys","prevExerciseData","History_buildPrevExerciseData","titleNodeRef","titleLayoutNonce","setTitleLayoutNonce","pagerContainerTop","setPagerContainerTop","pagerContainerTopRef","onPagerContainerLayout","selectedExerciseName","progressUserPromptedStateVars","progressDay","showReorderHint","WorkoutHints_isLearned","WorkoutExpandedRowsContext","WorkoutFocusExpandedSetContext","WorkoutHeader","showWorkoutNotes","renderMenu","WorkoutThumbnailsStrip","WorkoutCenterExpandedRow","pageChangeToggle","entryId","PerfProbeSubtree","WorkoutExercisePager","currentEntryId","entryCount","onIndexChange","onSettledIndex","WorkoutExercisePage","isCurrentPage","tabStopIndex","shouldRender","prevData","reportPageHeight","WorkoutPagerHeightContext","pageStyle","WorkoutTabStopContext","WorkoutExercise","isMenuOpen","setIsMenuOpen","menu","TextareaAutogrow","Progress_editNotes","_worklet_9779927911941_init_data","_worklet_3411606402282_init_data","WorkoutStripTile","slots","dragId","originSlot","dropSlot","dragTranslation","pitch","isSettling","WorkoutStripReorder_shift","TILE_MOVE_MS","DRAGGING_TILE_SCALE","workoutTsx1","slot","isMoving","workoutTsx2","onMeasure","currentEntryIndexForLabel","labelFadeRange","setLabelFadeRange","_tx","titleWindowTop","_tw","viewportWindowTop","WorkoutStripLabel_fadeRange","stripHeight","labelOpacity","shadowRange","WorkoutStripLabel_shadowRange","useEqual","thumbScrollerRef","viewportWidthRef","draggingIndex","setDraggingIndex","tileBox","setTileBox","pitchRef","entryIds","entryIdsRef","entryOrderKey","WorkoutStripReorder_slots","countRef","onMeasureTile","_e$nativeEvent$layout","prevEntriesLengthRef","WorkoutStripReveal_offset","commitReorder","WorkoutStripReorder_apply","WorkoutHints_recordUseInState","WorkoutStripReorder_dropIndex","entryIndexRef","previousEntryIdRef","centerOnceLaidOut","viewportTop","_vw","viewportHeight","_rx","_rw","WorkoutCenterScroll_targetY","cancelAnimationFrame","currentEntryIndexRef","matches","_workoutCenterScroll","_workoutLayoutTransition","_useWorkoutImpression","_workoutExerciseCard","fallbackSeenRef","graphImpression","useWorkoutImpression","historyImpression","isCurrentPageRef","onGraphInteract","isHeavyContentReady","setIsHeavyContentReady","_useMemo2","_useMemo2$","_useMemo3","zero","_useMemo4","_useMemo4$","_useMemo4$2","Reps_setsStatus","activeGraphId","setActiveGraphId","shouldHideGraphs","onToggleGraphs","WorkoutExerciseCard","WorkoutLayoutTransition","_workoutSetPrevious","_workoutExerciseSet","_iconSwapSmall","_progressStateChanges","buttonBgColor","WorkoutExerciseUtils_getBgColor100","nextSetIndex","Reps_isFinishedSet","targetLabel","targetType","getTargetColumnLabel","lbEntry","rpeLabel","longest","rpeColumnLabel","hasRpe","hasTime","rpeColumnWidthLabel","columnWidths","widths","computeSetColumnWidths","lbWarmupSetByIndex","lbSetByIndex","lastSets","expansion","showTargetHint","showExpandHint","expandedSet","isLastInColumn","previousLines","WorkoutSetPrevious_lines","onAddWarmupSet","unilateral","Reps_addSet","onAddSet","onTargetClick","IconSwapSmall","WorkoutExerciseSet","onToggleExpand","onCompleteExpansion","onMenuOpenChange","lastSet","ProgressStateChanges","progressSnapshot","_workoutSetExpansion","_iconNotebook","descriptionSnapshot","lastHistoryEntry","lastNote","lastNoteTimestamp","isKebabMenuOpen","setIsKebabMenuOpen","entryExercise","openEquipmentModal","openSupersetPicker","openRm1Modal","swapExercise","showExerciseNotes","toggleExerciseNotes","editSuperset","removeExercise","CollectionUtils_removeAt","programIdForEdit","editProgramExercise","workoutProgramId","runKebabAction","kebabActions","expansionOverride","setExpansionOverride","isSetMenuOpen","setIsSetMenuOpen","shouldCollapseSets","expandedSetValue","WorkoutSetExpansion_expanded","toggleInputRef","WorkoutSetExpansion_toggle","onCompleteSet","WorkoutSetExpansion_shouldCollapseSetsAfterComplete","Settings_getNextTargetType","onKebabPress","titleRef","onTitleLayoutProp","onPressExerciseStats","onChangeNotes","Progress_editExerciseNotes","onCloseKebabMenu","onKebabEdit","onKebabSwap","onKebabSuperset","onKebabNotes","onKebabRemove","kebabMenuZIndex","WorkoutExerciseUtils_getBorderColor100","Progress_doesUse1RM","IconNotebook","borderLeftWidth","scrollerRef","isUserScrollingRef","dragStartIndexRef","idleTimerRef","root","WorkoutTabPrune_observe","pointerActiveRef","lastWheelAtRef","onPointerStart","onPointerStop","settle","WorkoutPagerSettle_index","dragStartIndex","onPointerCancel","Children","child","_workoutPagerSettle","_workoutTabPrune","labelW","ch","computeRpeColumnWidth","iconWidth","_editProgressEntry","_workoutSetPlates","_workoutExerciseSetCompact","_workoutExerciseSetExpanded","_setCompleteHaptic","placeholderReps","placeholderWeight","completedRpeValue","hasEdit","repsInputWidth","weightInputWidth","onToggleExpandProp","onInputLeftReps","onBlurLeftReps","onInputReps","Reps_enforceCompletedSet","onBlurReps","onBlurWeight","onInputWeight","refocus","useRefocusAfterKeyboardComplete","SetCompleteHaptic_play","onEditSetTimer","onOpenRoundingInfo","onOpenSubscription","platesLine","WorkoutSetPlates_line","onEditTarget","EditProgressEntry_showEditSetModal","onLongPressSet","onDeleteSet","isRoundedWeight","useExpandedRowRegistration","WorkoutLayoutClip","LayoutAnimationConfig","skipEntering","skipExiting","WorkoutBodyEntering","WorkoutBodyExiting","WorkoutExerciseSetExpanded","WorkoutExerciseSetCompact","onTargetPress","WorkoutExerciseSet_dataCy","onLongPress","primarybackground","WorkoutExerciseSetTargetField","underlineRounded","RpeWeightHint","WorkoutExerciseSetRpeTime","WorkoutExerciseUtils_getIconColor","_iconPlayCircle","IconPlayCircle","menuZIndex","dimIncomplete","_actionMenu","ActionMenu","_platesBar","PlatesBar","sidePlates","_iconBarbellPlates","IconBarbellPlates","WorkoutExerciseLastSet","DateUtils_formatDayMonth","Weight_rpeMultiplier","WorkoutExercisePlatesCalculator","WorkoutExerciseE1RMSet","aSet","isDiffWeight","hasTarget","underline","statusColor","WorkoutExerciseUtils_setsStatusToTextColorValue","Reps_displayCompletedReps","setWeight","formattedPlates","e1RM","SetsProgressBadge","counter","completed","hasSupersets","colorAndSupersetGroup","setsStatus","isCurrentSuperset","WorkoutExerciseUtils_setsStatusToBorderColor","cornerInset","totalSetsCount","completedSetsCount","tile","currentoutline","WorkoutExerciseUtils_setsStatusToColor","_workoutFinish","isFinishing","setIsFinishing","WorkoutFinish_run","WorkoutHeartRateValue","_iconHeart","bpm","getBpm","IconHeart","_workoutMenuActions","editDay","share","createProgramDay","actionIds","WorkoutMenuActions_list","hasNonEmptyProgram","hasNonEmptyCurrentProgram","isInAnyProgram","handlers","Thunk_pushToEditProgramDay","workoutShareRef","dataUrl","ImageShareUtils","generateImageDataUrl","imageShare","shareOrDownload","_workoutShareOutput","WorkoutShareOutput","_imageshare","recordPrs","numberOfRecordPrs","Property","hasPrs","setMultiplier","backgroundImage","workoutHeight","newMultiplier","setBackgroundImage","selectedFrameIndex","setSelectedFrameIndex","Dimensions","frameWidth","sidePadding","carouselHeight","openPhotoPicker","snapToInterval","decelerationRate","selectedFrame","WorkoutShareImage","isCustomBg","onPickCustomBg","shareToSocial","_workoutShareOutputWithBg","WorkoutShareOutputWithBg","_geometry","parentSize","setParentSize","setWorkoutHeight","Geometry_fitRectIntoRect","newRatio","isFeed","defaultBgUri","effectiveBgUri","oldState","isFinishDayAction","isExternalStorageMerge","Storage_isChanged","identity","PushRegistration_identityChanged","setIdentity","newProgramIds","programIds","lastReducerActions","Diagnostics_getLastActions","newPrograms","oldProgram","oldDayKeys","Program_getDayExerciseKeys","oldBodyweight","newBodyweight","Progress_getProgress","oldExerciseData","ObjectUtils_changedKeys","changedExercises","affectedEntries","oldEquipment","newEquipment","changedEquipmentIds","equipmentId","google","workoutOutcomes","isOwnFinish","isMerge","payloads","WorkoutOutcome_healthSaves","Thunk_saveWorkoutToHealth","_getIdbKey","_getInitialState","_program2","_progress0","_storage","_indexeddb","_basicBeginnerProgram","_log","_runner","_pushRegistration","_diagnostics","_workoutOutcome","_perfSetCompleteProbe","_perfScorecard","isLoggingEnabled","isAdmin","IndexedDBUtils_get","messageerror","messagesuccess","localStorage","rawStorage","finalStorage","hasUnrunMigrations","unrunMigrations","maybeStorage","Storage_get","serverStorage","getStorage","maybeServerStorage","backup","postDebug","confirmed","Storage_getDefault","lastSynced","oldProgress","migratedProgress","Storage_getHistoryRecord","vtype","basicBeginnerProgram","freshMigrations","buildState","LogUtils_log","Progress_completeSetAction","Progress_changeAmrapAction","Progress_checkSetTimer","Progress_closeTimedSet","Progress_startSetTimerWork","recording","storeToLocalStorage","applyEffects","Diagnostics_setLastState","Diagnostics_recordAction","DateUtils_formatHHMMSS","perfOn","PerfEnabled_isEnabled","perfActionType","perfActionDesc","perfSyncStart","NativeEffects_withoutWatchWorkout","oldHistoryLen","newHistoryLen","actionDesc","oldLen","newLen","versions","Storage_updateVersions","scheduleSave","perfDurationMs","PerfScorecard_recordAction","PerfProbe_onAction","duration_ms","Progress_setProgress","Progress_getProgressById","newStorage","Progress_finishWorkout","healthSync","Progress_stop","Progress_showUpdateDate","Progress_changeDate","WorkoutOutcome_add","outcome","History_deleteRecords","Progress_stopTimer","History_resumeWorkout","_ref72","getState","load","checkAdminKey","_x181","_x182","_x183","_ref75","createDebugSession","_x190","_x191","_x192","_ref73","snapshots","getDebugSnapshotList","_x184","_x185","_x186","debugTimestamp","_ref74","AdminDebug_fetchDebugSnapshotStorage","AdminDebug_fetchStorage","debugStorage","unregisterBeforeSignout","IndexedDBUtils_set","saveFull","getInitialState","navigateTo","_x187","_x188","_x189","_ref7","signInResult","SignIn_apple","_response$authorizati","signIn","handleLogin","_ref60","applied","ImportSession_apply","_x154","_x155","_ref85","IapHelpers_setLoading","iap","getAvailablePurchases","IapHelpers_alertAlreadySubscribed","IapHelpers_clearLoading","requestInAppProduct","sku","IapHelpers_getSkus","warn","_x227","_x228","_x229","_ref24","Progress_getProgressId","hadSetTimer","hadGetReady","setTimerGetReady","_resolveTimedSetProgr2","resolveTimedSetProgramContext","setTimerClosed","workStarted","play","Thunk_refreshLiveActivity","_ref77","postClaimKey","finishFreeAccess","_x196","_x197","_x198","screens","_ref41","cleanupScreenEditState","_x110","_x111","restTimer","restTimerSince","_ref22","isWarmup","adjustedSetIndex","Program_getFullProgram","_ref43","confirmation","Screen_shouldConfirmNavigation","_x112","_x113","_x114","_ref64","_x165","_x166","_x167","_ref76","setup","postSetupTestAccount","apiKeyBound","_x193","_x194","_x195","_ref66","_x168","_x169","_x170","_ref68","_ref69","deleteAccount","_x177","_x174","_x175","_x176","_ref47","_x122","_ref44","_x115","_ref4","_ref54","csv","CSV_toString","History_exportAsCSV","Exporter_toFile","_x138","_x139","_x140","_ref52","Program_exportProgramToFile","version","_x132","_x133","_x134","_ref53","Program_exportProgramToLink","_x135","_x136","_x137","_ref55","_x141","_x142","_x143","_ref51","ImportExporter_exportStorage","_x129","_x130","_x131","_ref67","Account_getAll","_x171","_x172","_x173","_ref50","programRevisions","getProgramRevisions","Service_adminTarget","_x126","_x127","_x128","_ref30","_ref45","pauseWorkout","finishWorkout","_yield$getNavigationS6","onStale","_x116","_x117","_x118","_ref5","_ref62","getLatestMigrationVersion","postShortUrl","_x159","_x160","_x161","SignIn_google","loginResult","storageJson","isLiveActivity","_ref29","watchStorage","runMigrations","WatchStorageAccount_isOtherAccount","phoneUserId","watchUserId","phoneHistoryLen","watchHistoryLen","wasOnProgressScreen","hadProgress","mergedStorage","Storage_mergeStorage","prevEntryIndex","mergedHistoryLen","beforeProgress","afterProgress","timerEffects","Progress_scheduleTimerNotification","stopTimer","liveActivityEffects","LiveActivityManager_updateLiveActivityForNextEntry","progressIsNowEmpty","discardWorkout","mergedIds","ackedIds","sendStorageAckToWatch","_ref89","_x237","_x238","_ref91","skus","subs","fetchSubscriptions","inApp","fetchInAppProducts","newPrices","newOffers","displayPrice","mapped","subscriptionOffers","product","storedPrices","subscriptionPrices","_x242","_x243","_x244","purchase","_ref87","_getState","keepScreen","keepSubscriptionScreenOpen","renewsAsProductId","receipt","IapHelpers_readReceiptOrJwsIOS","Thunk_setAppleReceipt","purchaseToken","Thunk_setGooglePurchaseToken","currency","getProductPrice","Analytics_trackPurchase","transactionId","transactionDate","finishTransaction","_x233","_x234","_x235","_ref88","_x236","_ref79","apple","_x202","_x203","_x204","rawCsv","_ref57","importWithSpinner","ImportFromLiftosaur_convertLiftosaurCsvToHistoryRecords","ImportFileError","_x147","_x148","_x149","_ref61","ImportFromLink_importFromLink","Storage_setAffiliate","_x156","_x157","_x158","_ref58","ImportFromHevy_convertHevyCsvToHistoryRecords","_x150","_x151","_ref56","parsedMaybeStorage","_x144","_ref37","reviewRequests","lastReviewRequest","InAppReview_request","_x102","_x103","_ref38","signupRequests","lastsignupRequest","_x104","_x105","_ref39","OnloadModal_getNext","Thunk_maybeRequestHearAboutUs","_x106","_x107","_ref94","_dispatch","openManageSubscriptions","_x251","_x252","_x253","_ref46","History_pauseWorkoutState","_x119","_x120","_x121","_ref28","_ref26","_ref10","_ref82","_x211","_x212","_x213","_ref31","_x89","_x90","_ref34","isFromWorkout","editProgramIds","fromWorkout","_x95","_x96","_ref33","_x93","_x94","recordedSeconds","phaseId","_ref23","_resolveTimedSetProgr","_ref80","StoreRuntime_isAndroid","postClaimCoupon","_result$data2","_x205","_x206","_x207","_ref90","presentCodeRedemptionSheetIOS","_x239","_x240","_x241","_ref14","requestPermissions","_ref13","saveMeasurements","_ref12","intervalsCount","saveWorkout","successAlert","_ref32","_x91","_x92","queuedTap","_ref27","countdownStartedAt","tappedAt","buildSubscribeThunk","_ref70","_x178","_x179","_x180","_ref93","requestSubscription","getActiveSubscriptions","purchaseTokenAndroid","isDeferred","androidOldPurchaseToken","androidOldProductId","androidReplacementMode","until","_x248","_x249","_x250","_ref15","appleSyncEnabled","googleSyncEnabled","enqueue","_syncHealthKit2","_syncHealthKit","sessionId","_ref59","editedCount","ImportSession_findEditedRecordIds","editedWarning","undone","ImportSession_undo","_x152","_x153","_ref36","setParams","_x99","_x100","_x101","newTimer","skipLiveActivityUpdate","_ref20","Progress_updateTimer","_signIn","_inAppReview","_state3","_importexporter","_importSession","_csv","_exporter","_watchAuthHandoff","_onloadModal","_screen","_iapHelpers","_importFromLink","_migrations","_watchStorageAccount","_importFromLiftosaur","_importFromHevy","_sync3","_syncBaseline","_syncAccountMismatch","_deviceId","_liveActivityManager","_analytics","NoRetryError","_Error","noretry","_wrapNativeSuper2","extra","_ref6","_ref9","affiliates","Subscriptions_listOfSubscriptions","referrer","landingPage","Thunk_verifySubscriptionKey","_ref0","verifySubscriptionKey","_ref1","isDebugAccount","clearAuthToken","SignOut_google","sendClearAuthToWatch","_sync2","_sync","handleResponse","baseline","SyncBaseline_afterClean","sent","new_original_id","SyncBaseline_fromServer","currentStorage","currentHistoryLen","serverHistoryLen","historyVersions","serverDeletedHistory","deleted","probeMergeTarget","PerfProbe_isTarget","probeMergeT0","HistoryDelta_sortNewestFirst","merge_ms","history_len","oldPrograms","oldVersions","newVersions","switchedAccount","_x254","_switchedAccount","mismatch","SyncAccountMismatch_fromResponse","_switchToSyncAccount","switchToSyncAccount","fetchReason","SyncBaseline_needsFetch","lastUserId","newUserId","postSync","probeSyncTarget","probeSyncT0","Sync_getStorageUpdate2","build_ms","has_update","sentStorage","sentTempUserId","localUserId","serverUserId","flushSave","localCopy","localStorageResult","SyncAccountMismatch_plan","currentTempUserId","hasLocalCopy","syncMeasurements","syncSleepNutrition","appleHealthAnchor","googleHealthAnchor","weightUnit","lengthUnit","EditStats_uploadHealthStats","versionStats","statType","getDeletedStats","windowDays","daily","syncDailyMetrics","metrics","EditStats_uploadDailyMetrics","_ref17","isProcessing","getIsProcessing","queueLength","_ref18","args2","_ref21","LiveActivityManager_updateProgressLiveActivity","_ref25","timerSetIndex","Progress_getFirstIncompleteWorkoutSet","absoluteSetIndex","_ref35","_x97","_x98","_ref40","OnloadModal_shouldShowHearAboutUs","_x108","_x109","ObjectUtils_omit","Thunk_fetchPrograms","_ref48","programDetail","_x123","_x124","_x125","_x145","_x146","_importWithSpinner","importLinkData","_ref63","maybeProgram","ImportExporter_getExportedProgram","existingCustomExerciseNames","newCustomExercises","authorid","clonedAt","PlannerProgram_hasNonSelectedWeightUnit","fromUnit","Weight_oppositeUnit","toUnit","PlannerProgram_switchToUnit","CollectionUtils_setAt","_x162","_x163","_x164","_ref78","whatsNew","WhatsNew_updateStorage","Subscriptions_verifyAppleReceipt","Subscriptions_setAppleReceipt","_x199","_x200","_x201","_ref81","_x208","_x209","_x210","_ref83","Subscriptions_verifyGooglePurchaseToken","Subscriptions_setGooglePurchaseToken","_x214","_x215","_x216","_x217","_x218","_x219","_load2","reject","_load","_x220","_x221","_x222","_x223","_handleLogin","oldUserId","configure","RollbarUtils_config","person","storageResult","Analytics_trackSignUp","new_userid","DeviceId_get","expiresAt","setAuthToken","WatchAuthHandoff_accountId","sendAuthToWatch","loadingKey","_ref84","IapHelpers_applePromoToAdapter","googleOfferId","_x224","_x225","_x226","_ref86","purchases","_x230","_x231","_x232","_ref92","serverPending","owned","lifetimeSku","patchedSubs","activeStoreSub","refreshGoogleSubscription","pendingProduct","subscriptionPendingHint","hintValid","keepHint","effectivePending","pendingProductId","_x245","_x246","_x247","_app","_audioInterface","_nativeTimerBridge","_persistence","_asyncQueue","IndexedDBUtils_initializeForSafari","protocol","serviceWorker","register","DateUtils_formatYYYYMMDDHHMM","TimerBridge","AudioInterface","Persistence","initialize","_initialize","loadedData","uid","AsyncQueue","AppView","_main","getIdbKey","IndexedDBUtils_getAllKeys","main","appEl","childElementCount","storeData","clearData","standalone","MockAudioInterface","sound","audios","Audio","playSound","getAudio","Version","_ImportExporter_getExportedProgram","_ImportExporter_handleUniversalLink","parsedMaybeProgram","exportedProgram","isPlanProgram","PlannerProgram_convertExportedPlannerToProgram","Settings_build","ObjectUtils_pick","pathname","lines","formatNotes","isAdhoc","isMultiWeek","isoDate","getTimezoneOffset","absOff","hh","mins","getMinutes","secs","getSeconds","serializeEntry","serializeWorkoutRecord","indent","Exercise_sanitizeName","completedStr","serializeCompletedSets","warmupStr","targetStr","withTargets","Reps_groupConsecutive","Reps_targetSetKey","formatSeconds","formatTargetSet","serializeTargetSets","Reps_completedSetKey","formatCompletedSet","_lr","spec_Keyword","if","else","for","LRParser","deserialize","stateData","goto","nodeNames","maxTerm","skippedNodes","repeatNodeCount","tokenData","tokenizers","topRules","Program","specialized","term","tokenPrec","liftosaurCompletion","liftoscriptLanguage","autocomplete","PlannerCompletions_codemirrorLiftoscript","pos","syntaxTree","validFor","LanguageSupport","_liftoscriptLanguage","_plannerCompletions","_liftoscriptFns","_arrayLikeToArray","NodeName","LiftoscriptSyntaxError","_SyntaxError","SyntaxError","firstChild","nextSibling","comparing","operator","comparator","Weight_gt","Weight_lt","Weight_gte","Weight_lte","assert","LiftoscriptEvaluator","fns","fnContext","_this$getLineAndOffse","getLineAndOffset","_this$getLineAndOffse2","NumberExpression","WeightExpression","VariableExpression","VariableIndex","LiftoscriptFns_bindingStaticType","LiftoscriptFns_isValidArg","LiftoscriptFns_acceptsTypeAt","argText","argSignature","LiftoscriptFns_argSignature","printedValue","argName","got","linesLengths","lineLength","expr","unitNode","evaluate","programNode","getWeight","oldWeightStr","newWeightStr","Weight_smartConvert","substring","stateKeys","getStateKey","StateVariableIndex","stateKeyNode","BuiltinFunctionExpression","_getChildren","_getChildren2","_toArray2","fnArgs","LiftoscriptFns_isFnName","arity","LiftoscriptFns_arity","expected","fnArg","staticType","staticTypeOfNode","ForExpression","variableNode","Variable","AssignmentExpression","_getChildren3","indexExprs","_getChildren5","_getChildren6","indexExpr","v1","expression","op","oldNumberOfSets","weights","evaluatedValue","MathUtils_applyOp","evaluateToNumber","originalWeights","RPE","mr","setTime","amraps","logrpes","askweights","cr","cw","completedWeights","completedRPE","ns","indexes","ie","indexValues","calculateIndexValues","normalizedIndexValues","normalizeTarget","evalutedValue","evaluateToNumberOrWeightOrPercentage","Weight_applyOp","Weight_convertToWeight","roundWeight","maxTargetLength","_normalizedIndexValue2","_normalizedIndexValue3","exerciseVariationIndex","_normalizedIndexValue4","descriptionIndex","_normalizedIndexValue5","Wildcard","newTarget","toNumber","BlockExpression","isSkipped","BinaryExpression","_getChildren7","_getChildren8","evalLeft","evalRight","multiply","divide","modulo","plusNode","MathUtils_roundFloat","Ternary","_getChildren9","_getChildren0","or","forInExpression","ForInExpression","blockNode","forIn","varKey","IfExpression","parenthesisNodes","ParenthesisExpression","blockNodes","parenthesisNode","lastBlock","_getChildren1","_getChildren11","_getChildren13","_getChildren14","indexNode","indexEval","recordVariableUpdate","changeNumberOfSets","changeBinding","IncAssignmentExpression","_getChildren15","_getChildren16","stateVar","incAssignmentExpr","currentValue","_getChildren17","_getChildren18","argValues","validateFnArg","UnaryExpression","_getChildren19","_getChildren21","_getChildren22","Current","binding","one","two","operation","Weight_op","getValueRaw","oldScript","LiftoscriptParser","keywordNode","array","sample","signature","liftoscriptFnSignatures","optional","schema","VScriptBindings","is","optionalNumbers","optionalWeights","VWeight","object","union","VPercentage","completedSetTime","completedSetTimeLeft","picklist","programNumberOfSets","completedNumberOfSets","scalar","numberOrWeight","numberOrWeightArray","nullish","aggregatable","boolean","returns","roundConvertWeight","calculateTrainingMax","calculate1RM","rpeMultiplier","variadic","zeroOrGte","any","decrement","_highlight","liftoscriptParserWithMetadata","styleTags","variableName","lineComment","indentNodeProp","foldNodeProp","foldInside","LRLanguage","define","latestMigrationVersion","migrations","aStorage","deletedGyms","customExerciseKey","updatedAt","newExerciseStr","changeWeightsToCompletedWeights","progressUi","oldMultipliers","newMultipliers","Progress_getEntryId","legacyUi","renames","escapeRegExp","rename","RegExp","records","maxVersion","Storage_partialStorageToStorage","currentVersion","maxVersionInt","versionStr","_Account_getAll","getAccountSummaries","_AdminDebug_fetchDebugSnapshotStorage","_AdminDebug_fetchStorage","adminDebugPrefix","AdminDebug_scrambledTempUserId","snapshotStorage","getDebugSnapshotStorage","less_than_3_months","more_than_year","strength_and_hypertrophy","gymId","currentUnit","modifyEntries","added","Food_newTimestamp","water","Food_freeTimestamp","newExercises","_newExercises$splice","exercisesToMove","pgms","Program_createFromHistoryRecord","past","future","ObjectUtils_diff","newEvalutedProgram","updateStateVariable","oldExerciseType","oldExercise","startingWeightKg","startingWeightLb","oldName","removeStateVariableMetadata","editStateVariable","Reps_newSet","sharedTime","st","Stats_insertByTimestamp","byKey","sleep","upsert","incoming","existingByTimestamp","incomingByTimestamp","inc","prevUuid","appleUuid","googleUuid","kept","upserted","dataAny","deletedStatsArr","deletedStats","weightValues","bodyfatValues","waistValues","Weight_roundTo005","applyValues","kg","equipmentSettings","Equipment_isBuiltIn","builtInEquipmentKey","builtInEquipmentName","firstEquipment","equipmentUnit","newEquipmentData","oldEquipmentData","CollectionUtils_concatBy","Equipment_getGymByIdOrCurrent","exerciseEquipment","tMuscles","sMuscles","Exercise_editCustomExercise","deletedExerciseKey","deletedExercise","bodyParts","Exercise_getById","sortedEquipment","Exercise_getMetadata","band","medicineball","eqp","Exercise_defaultSynergistMuscles","allMuscleGroups","allExercisesList","tokenizeQuery","scored","score","scoreExerciseAgainstTokens","byName","isSubstitute","Exercise_sortExercises","maybeGetExercise","Exercise_findIdByName","Exercise_findById","foundEquipment","bareNameCustom","getCustomExercisesNameIndex","fullNameKey","normalizeExerciseName","fullNameExerciseId","fullNameExercise","_type$split","_type$split2","slug","possibleEquipments","equipmentKey","StringUtils_camelCase","StringUtils_undashcase","Exercise_buildName","getExercise","programExerciseWarmupSets","defaultWarmup","warmupValues","warmup10","warmup45","warmup95","Exercise_applyCustomExerciseChange","forbiddenExerciseNameChars","forbiddenExerciseNameCharsAll","tm","rated","Exercise_all","rating","Exercise_toUrlSlug","_muscle4","abWheel","arnoldPress","aroundTheWorld","backExtension","ballSlams","battleRopes","behindTheNeckPress","benchDip","benchPress","benchPressCloseGrip","benchPressWideGrip","bentOverOneArmRow","bentOverRow","bicepCurl","bicycleCrunch","boxJump","boxSquat","bulgarianSplitSquat","burpee","cableCrossover","cableCrunch","cableKickback","cablePullThrough","cableTwist","calfPressOnLegPress","calfPressOnSeatedLegPress","chestDip","chestFly","chestPress","chestSupportedRow","chinUp","clean","cleanandJerk","concentrationCurl","crossBodyCrunch","crunch","cycling","deadlift","deadliftHighPull","declineBenchPress","declineCrunch","deficitDeadlift","ellipticalMachine","facePull","flatKneeRaise","flatLegRaise","frontRaise","frontSquat","gobletSquat","goodMorning","gluteBridge","gluteBridgeMarch","gluteKickback","hackSquat","hammerCurl","handstandPushUp","hangClean","hangSnatch","hangingLegRaise","highKneeSkips","highRow","hipAbductor","hipAdductor","hipThrust","inclineBenchPress","inclineBenchPressWideGrip","inclineChestFly","inclineChestPress","inclineCurl","inclineRow","invertedRow","isoLateralChestPress","isoLateralRow","jackknifeSitUp","jumpRope","jumpSquat","jumpingJack","kettlebellSwing","kettlebellTurkishGetUp","kippingPullUp","kneeRaise","kneelingPulldown","kneestoElbows","latPulldown","lateralBoxJump","lateralRaise","legsUpBenchPress","legCurl","legExtension","legPress","lunge","lyingBicepCurl","lyingLegCurl","mountainClimber","muscleUp","obliqueCrunch","overheadPress","overheadSquat","pecDeck","pendlayRow","pistolSquat","plank","powerClean","powerSnatch","preacherCurl","pressUnder","pullUp","pullover","pushPress","pushUp","reverseCrunch","reverseCurl","reverseFly","reverseGripConcentrationCurl","reversePlank","reverseLatPulldown","reverseLunge","reverseWristCurl","romanianDeadlift","reverseHyperextension","rowing","russianTwist","safetySquatBarSquat","seatedCalfRaise","seatedFrontRaise","seatedLegCurl","seatedLegPress","seatedOverheadPress","seatedPalmsUpWristCurl","seatedRow","seatedWideGripRow","shoulderPress","shoulderPressParallelGrip","shrug","sideBend","sideCrunch","sideHipAbductor","sideLyingClam","sidePlank","singleLegBridge","singleLegCalfRaise","singleLegDeadlift","singleLegGluteBridgeBench","singleLegGluteBridgeStraight","singleLegGluteBridgeBentKnee","singleLegHipThrust","sissySquat","sitUp","skullcrusher","slingShotBenchPress","snatch","snatchPull","splitSquat","splitJerk","squat","squatRow","standingCalfRaise","standingRow","standingRowCloseGrip","standingRowRearDeltWithRope","standingRowRearHorizontalDeltWithRope","standingRowVBar","stepUp","stiffLegDeadlift","straightLegDeadlift","sumoDeadlift","sumoDeadliftHighPull","superman","tBarRow","thruster","toesToBar","torsoRotation","trapBarDeadlift","tricepsDip","tricepsExtension","tricepsPushdown","uprightRow","vUp","widePullUp","wristCurl","wristRoller","zercherSquat","wallPushup","inclinePushup","kneePushup","diamondPushup","pseudoPlanchePushup","pikePushup","ringDip","negativeDip","verticalRow","wideRow","ringRow","tuckFrontLeverRow","frontLeverRow","scapularPullUp","deadHang","negativePullup","assistedSquat","shrimpSquat","nordicCurl","handstand","wallHandstand","crowPose","dragonFlag","copenhagenPlank","hangingKneeRaise","archHang","supportHold","pallofPress","renegadeRow","ringAbRollout","kneelingRingAbRollout","archerPullUp","skinTheCat","hollowBodyHold","deadBug","shoulderPassThrough","nameToIdMapping","metadata","shouldSkipThreshold","programExerciseWarmupSet","warmupWeight","roundedWeight","customExercisesNameIndexCache","StringUtils_uncamelCase","etm","esm","Exercise_deleteCustomExercise","existingExercise","Exercise_upsertCustomExercise","sameNameDeletedExercise","Program_changeExerciseName","scoreTokenAgainstWords","words","fullText","isDefaultEquipment","normalizedQuery","nameWords","equipmentWords","normalizedFullName","totalScore","nameScore","equipmentScore","best","lowercaseFilterTypes","snapshot","withPreview","ExerciseDraftToProgram_apply","notFound","ProgramExerciseText_rebaseError","ProgramExercisePreview_materialize","tappedDayData","keyAfterSwap","instances","Program_getAllProgramExercises","declarationDayData","ProgramExerciseText_findDeclaration","activeDayData","selectedDayData","currentExercise","declaration","sharedSections","ProgramExerciseText_sharedSections","blurb","ProgramExerciseText_blurb","ProgramExercisePreview_target","panelText","folded","localBlurb","ProgramExercisePreview_apply","unchanged","written","writtenDeclaration","ExerciseLiftoEditorDraft_create","_exerciseLiftoEditorDraft","_programExerciseText","_programExercisePreview","ExerciseLiftoEditorDraft_pendingChange","ExerciseLiftoEditorDraft_fromEditor","swap","detectSwap","ProgramExerciseText_apply","sharedEdits","swapScope","ProgramRewrite_changedKeys","ExerciseImageUtils_id","availableSmallImages","availableLargeImages","checkDomain","imageUrl","originalLocalBlurb","ProgramExerciseText_split","original","isSharedVisible","ProgramExerciseText_compose","trimEnd","shared","edited","owners","ExerciseLiftoEditorDraft_isDirty","hasPendingPlanner","closes","ExerciseDraftToProgram_snapshot","saveEvaluated","prepared","hasEditorDraft","ExerciseLiftoEditorSave_withScope","declarations","ProgramExerciseSwap_scope","isLadder","cachedScope","remapAccepted","updatedProgram","editorDraftLens","destination","lenses","mirrorToEditorDraft","remap","Progress_remapProgramExerciseId","oldKey","newKey","_programExerciseSwap","_exerciseDraftToProgram","updatedExercises","staysDraft","ProgramExerciseSwap_workoutRemap","question","labelNotice","Expenditure_estimate","Expenditure_inputs","kgPerLb","inputs","endDate","Expenditure_kcalPerKg","Expenditure_windowDays","Expenditure_toKg","intake","sums","weightsKg","UTC","dates","firstLogged","logged","kgPerDay","meanX","meanY","den","slope","dayEntries","hour","grams","foodId","seen","sorted","recentKey","terms","haystack","sameUnit","otherUnits","issues","am","bm","templateItem","Food_emptyNutrients","breakfast","lunch","dinner","snack","factor","taken","FoodSearch_labelServings","macroKeys","formFromServings","FoodLabel_selection","toLog","gramIndex","Food_entryFromSelection","toText","serving","labelled","perGram","labelServing","macro","kilojoules","Food_itemFromSelection","FoodLabel_applyToSelection","Food_clampChoice","labelDone","FoodSearch_dataWarning","nutriments","product_name","brands","pick","NaN","macros","macroGaps","serving_quantity","serving_size","weightServings","nested","foodNutrients","FoodSearch_fromUsda","nutrientId","nutrient","unitName","portionOptions","foodPortions","portion","portionDescription","measureUnit","modifier","usdaPortionLabel","gramWeight","nutrientsPer","per100FromPerGram","canada","global","off","usda","usdaIds","_ret","hit","energy","servingSizeUnit","servingSize","household","householdServingFullText","brandName","brandOwner","gtinUpc","ensure","requests","buildResult","detailJson","partial","obj","measuredAt","parseSource","reading","HeartRateReading_expiresAt","HeartRateReading_staleAfterMs","beforeTime","onlyKeys","twoMonthsAgo","isBefore","isSameDay","History_isSameProgramDay","seenKeys","bestByReps","Reps_isStarted","lastEntryTimestamp","lastWarmupEntryTimestamp","lastWarmupEntry","sameDayTimestamp","sameDayEntry","History_recordBestSets","timeMs","all1RMs","initial","lastHistoryRecord","History_getMaxWeightSet","idSet","setsWithWarmupFlag","toISOString","entryMaxSet","History_findPersonalRecord","excludeRecordId","resultTime","forceEndTime","deletedProgramExercises","originalUpdatePrints","_entry","_excluded2","useRm1","ProgramExercise_isUsingVariable","History_compactDiff","History_buildProgressSnapshot","History_pauseWorkout","nextSet","setHours","recordDate","lensGetters","lbu","getters","isStart","newIntervals","History_totalEntryReps","History_totalEntrySets","Weight_add","History_totalEntryWeight","_microMemoize","History_getMax1RMSet","History_maxSetBy","weightOf","bestWeight","weightDiff","History_collectProgramChangeTimes","synergistMuscleGroupToMultiplier","Exercise_synergistMusclesGroupMultipliers","muscleGroupAcc","lastTs","finishedSets","lastDate","History_amrapScore","History_bothSidesReps","byReps","byRepsWeight","amrap","bestAmrap","amrapWeight","amrapReps","amrapScore","isMax","Reps_setVolume","History_getFinishedSets","lastInterval","interval","memoize","maxSize","CollectionUtils_sortByExpr","max1RMSets","maxWeightSets","thisMaxWeightSet","thisMaxWeight","lastMaxWeight","thisMax1RMSet","thisMax1RM","lastMax1RMSet","lastMax1RM","_Collector$build$addF","_Collector$build$addF2","firstDayOfWeeksSet","buildHomeWeekData","existingIds","addedHistoryIds","addedCustomExerciseIds","historyRecordIds","importedIds","isExerciseReferenced","Length_operation","comparison","objLen","Length_printUnit","prebuiltLengths","prebuiltLength","muscleGroupSettings","newMuscleGroups","triceps","back","glutes","hamstrings","quadriceps","biceps","calves","forearms","screenMuscleToMuscleMapping","mergePoints","oldPoints","newPoints","Muscle_getUnifiedPointsForExercise","Muscle_mergeScreenMusclePoints","mergeExercisePoints","maxValues","ObjectUtils_findMaxValue","normalize","isDefault","Muscle_isDefaultMuscles","maxValue","defaultMuscles","Muscle_getPointsForExercise","historyEntry","Program_nextHistoryEntry","screenTargetMuscles","screenSynergistMuscles","ObjectUtils_combinedKeys","screenMuscle","oldValue","points1","points2","exhausted","effect","bridges","startTimer","updateLiveActivity","resumeWorkout","byDate","Expenditure_series","NutritionGraph_avgDays","noonSeconds","r1","OnloadModal_shouldShowWhatsNew","_whatsnew","WhatsNew_doesHaveNewUpdates","hearAboutUs","lastRequest","groupedTopLines","afterDay","newDayData","newDay","PlannerProgramExercise_createExerciseFromEntry","PlannerEvaluator_changeExerciseName","newProgramId","Program_createVariation","finishDayExpr","variationExpr","reuseLogic","dayApproxTimes","Program_dayApproxTimeMs","EditProgram_initPlannerState","minExs","maxExs","Program_exportProgram","_Program_exportProgramToLink","exportedPlannerProgram","aNextDay","plannerSettings","Program_evaluatePlannerWeeks","Program_getDayExercisesInOrder","Program_getCurrentProgram","exType","isReallyMultiweek","Program_getWeekFromDay","reuseSetCandidate","reusingCustomProgressExercises","Program_getReusingCustomProgressExercises","reusingSetProgressExercises","Program_getReusingSetProgressExercises","evalutedProgram","excludeExercise","aProgram","bProgram","cleanedAProgram","assign","_objectDestructuringEmpty2","cleanedBProgram","ObjectUtils_diffPaths","Program_nextHistoryRecordFromEvaluated","showCustomPrograms","Program_forceEvaluate","Progress_getDayData","newStateResult","Program_runFinishDayScript","_newStateResult$data","ProgramExercise_applyVariables","theNextDay","Program_nextDay","Program_selectProgram","_Program_toUrl","isEvaluatedProgram","_workoutTimeEstimate","_plannerEvaluator","_programSet","encodedProgramHashToShortUrl","Program_createEmptyProgram","ProgramExercise_doesUseRPE","programSets","PlannerProgramExercise_programWarmups","programSet","ProgramSet_getEvaluatedWeight","programSetIndex","Exercise_getWarmupSets","Progress_runUpdateScriptForEntry","Program_numberOfDays","fullDayName","PlannerProgramExercise_currentEvaluatedSetVariationIndex","Progress_createScriptBindings","Progress_createScriptFunctions","runner","execute","getUpdates","diffOtherStates","memo2","key2","WorkoutTimeEstimate_dayMs","Program_getAllProgramExercisesWithType","useStateWeight","repsExpr","weightExpr","Program_emptyEvaluatedProgram","Program_buildWeeks","dayNum","evaluatedWeek","evaluatedExercises","PlannerEvaluator_evaluate","Program_buildEvaluatedProgram","_Program_buildWeeks","PP_iterate","PlannerEvaluator_forceEvaluate","daysTotal","Program_getDayInWeek","aDay","nd","Encoder_encodeIntoUrl","baseUrl","hash","StringUtils_hashString","encodedProgramUrl","shortUrl","oldValueStr","newValueStr","oldOnerm","Weight_printOrNumber","newText","evaluateWeeks","spliced","withDayText","ProgramExerciseText_cleanErrorMessage","PlannerProgram_thrownErrorMessage","ownError","errorAt","final","detected","detectIdentityChange","exercisesAt","removed","reverted","withOldName","PlannerProgram_replaceExercise","settled","brokeElsewhere","was","introducedError","newName","beforeKeys","afterKeys","_target","programWeek","Program_getProgramDayExercises","defaultSet","isQuickAddSet","indexValue","currentSetVariationIndex","currentExerciseVariationIndex","nextVariation","currentDescriptionIndex","usesPercentageWeights","ProgramSet_isEligibleForInferredWeight","usesRM1Var","warmupSetToKey","currentVariationIndex","hasKeyword","selectedExercise","dayInProgram","newLines","isAdd","addExercises","withNewKey","EditProgramUiHelpers_changeAllInstances","EditProgramUiHelpers_duplicateCurrentInstance","PlannerEvaluator_evaluateDay","instanceAt","tapped","tappedResolution","resolvedProgress","progressUnchanged","sameValue","resolvedUpdate","updateUnchanged","warmups","usedCleared","sharedChanges","instance","applySharedChanges","PlannerEvaluator_fillEvaluatedSetVariations","applyOwn","writtenTapped","materializeExercise","isTappedRepeat","repeating","keepsOwnCurrent","_resolveVariations2","resolveVariations","oldFullName","_resolveVariations","cached","exercisesBeforeSwap","exercisesAfterSwap","onWorkoutDay","replacedOnWorkoutDay","hasRemappableEntry","needsConfirmation","Progress_hasCompletedSetsForProgramExerciseId","PlannerProgramExercise_shortNameFromFullName","splicedText","ProgramExerciseSwap_revertedText","withShared","edits","_loop3","owner","isSameDeclaration","groupByOwner","newOwnerText","rewriteSharedSections","replacedOwner","ProgramExerciseText_replaceInPlanner","replaced","spliceError","evaluatePlannerSafely","dayTextOffset","ProgramExerciseSwap_rebaseRange","ProgramExerciseSwap_apply","evalError","declarationSpan","dayText","exerciseSections","isSharedDeclaration","separatorStart","ProgramExerciseText_sharedProperties","sibling","cuts","cut","cutSection","PlannerEvaluator_hoistedProperties","isNone","plannerExerciseParser","topNode","isContinued","textEnd","ownerText","newExerciseText","newWeeks","di","firstOutside","findEvalError","oldEvaluatedWeeks","newEvaluatedWeeks","changedKeys","oldWeek","newWeek","oldDay","newKeys","oldKeys","mutate","rewritten","PlannerEvaluator_getFirstError","Weight_rpePct","lastGroup","rpeExpr","lastWeekExercise","getCurrentDescriptionExercise","dereuseDecisions","reuseExercise","getGlobals","reusedGlobals","PlannerProgramExercise_getOnlyChangedState","programVariation","reuseVariation","reuseSet","Weight_zero","groupedTopLine","reorders","groupedDay","indexMap","adds","renamedValue","renameMapping","addedCurrentDescription","getCurrentDescriptionIndex","reusedExercise","reusedDayData","currentWeekReusedExercisesCount","groupedTopLineMap","PP_iterateTopLineExercises","getRenamedValue","shouldReuseSets","getDereuseDecisions","addPropertyCandidate","isOrigin","progressPoint","updatePoint","warmupPoint","idPoint","plannerWeeks","msg","topLineMap","PlannerProgram_topLineItems","PlannerProgram_groupedTopLines","reorderGroupedTopLine","addGroupedTopLine","propertyTargets","getPropertyTargets","addedProgressMap","addedUpdateMap","addedWarmupsMap","addedIdMap","plannerWeek","finishedToAddDescription","groupTextArr","groupLoop","groupIndex","exerciseTextArr","lineIndex","addExerciseDescriptions","evalExercise","isInheritedDescription","getExerciseName","reuseToStr","variationToString","overriddenGlobals","weightExprToStr","setTimerGlobalToStr","globalsStr","warmupSource","getPropertySource","getWarmupSets","idSource","idToStr","updateStr","getUpdate","progressStr","getProgress","repeatingExercises","PlannerKey_fromPlannerExercise","PlannerProgram_compact","warmupSetsToStr","firstWeight","firstRpe","firstLogRpe","firstAskWeight","firstTimer","hasAnySetTimer","firstSetTimer","firstIsOverflowSetTimer","setTimerIsGlobal","originalSets","setToKey","groupWarmupsSets","strs","restPart","groupedVariationSets","groupVariationSets","setStr","resultStr","Weight_printNull","hideScript","resolveReuse","argsState","successes","successCounter","failures","failureCounter","resolvedScript","numberOfEntries","History_createCustomEntry","structural","newDayKeys","Progress_hasCompletedWork","predecessor","commonBefore","commonAfter","inherited","sortKeys","sortKey","reconcileStructure","Stats_getEmpty","reindexed","Progress_reindexEntries","Progress_applyProgramExercise","Progress_updateAmrapRepsInExercise","Progress_updateAmrapRepsLeftInExercise","Progress_updateRpeInExercise","Progress_updateWeightInExercise","Progress_updateUserPromptedStateVars","Progress_completeAmrapSet","Progress_runUpdateScript","Progress_isFullyEmptyOrFinishedSet","amrapSetTimerModal","Progress_maybeApplySuperset","Progress_startTimer","startTimeDate","DateUtils_fromYYYYMMDD","DateUtils_fromYYYYMMDDStr","dateModal","prevEntry","History_findLastEntryForExerciseType","programWarmups","Progress_programWarmupsForExerciseType","Progress_updateSetWeights","nowArg","Progress_reconcileTimedSet","stm","TimedSet_recordedFor","restSet","Progress_getNextTimedSet","Progress_advanceTimedSet","Progress_getAutoGetReadySeconds","programIndex","newHistory","History_finishProgramDay","lf","newSettingsExerciseData","Progress_supersetColors","supersetIndex","aProgress","bProgress","Progress_isCompletedSet","Reps_isEmpty","durations","pass","setsKey","liveActivityEntryIndex","liveActivitySetIndex","_weight2","_timedSet","applyRounding","rounder","isScriptValue","flattenScriptArgs","Progress_createEmptyScriptBindings","toWeight","Equipment_getUnitForExerciseType","Weight_round","Weight_getTrainingMax","repsRaw","rpeRaw","vals","aVal","bVal","flatArgs","timerSinceMs","timerSeconds","subtitleHeader","bodyHeader","nextEntryAndSet","Reps_findNextEntryAndSet","nextEntry","isAdjusting","timerForPush","Progress_getNextEntry","shouldGoToNextEntry","visitedAndFinished","isInitial","Reps_isEmptyOrFinished","Progress_getNextEntryIndex","nextEntryIndex","Progress_stopTimerPure","Progress_isEmptyOrFinishedSet","Progress_hasLastUnfinishedSet","editIds","newEntry","Progress_applyBindings","oldEntry","lastCompletedIndex","modify","progressSet","Progress_shouldShowAmrapModal","hasUserPromptedVars","shouldLogRpe","shouldPromptUserVars","shouldAskWeight","Progress_completeSet","hasOpenSetTimer","opened","TimedSet_open","getReadySeconds","Progress_resolveTimedSetPhase","setId","Progress_getNextTimedSetInSuperset","freshNonce","phaseStartedAt","prevNonce","entryChanged","Progress_handOffToOtherSide","endedAt","Progress_proceedAfterTimedSet","clockStartedAt","endedOffsetSeconds","timedSetEndedAt","autoGetReady","_progress$amrapModal","_progress$amrapModal2","_progress$amrapModal3","_progress$amrapModal4","Progress_isEligibleForInferredWeight","swapDerivedWeight","bestOnerm","bestDistance","distance","findSwapSourceSet","sourceWeight","sourceReps","sourceRpe","newIndexOf","keepAt","pickerState","exerciseBottomSheet","entryIndexEditMode","progressEntry","forceWarmupSets","PlannerProgramExercise_currentSetVariationIndex","newSetsNum","newWarmupSets","ws","wasSetTimerOpen","countdown","oldSet","timedSide","recorded","banked","handedOff","stopped","ProgramExercise_hasUserPromptedVars","didFinish","startedTimer","alreadyFlipped","RestTimerAlert_text","issuedAtMs","endsAtMs","hasPushManager","isStandalone","permission","totalMs","em","char","Screen_tab","oldHistoryRecord","progressWithoutUi","dequal","oldCleanedProgram","newCleanedProgram","_dequal","previousWorkoutSet","convertSetWeightsTo","maxIndex","repsLeft","Reps_areSameReps","Reps_displayReps","Reps_findNextSet","keyFn","displaySets","CollectionUtils_groupBy","set1","set2","completedOrRequiredWeight","Reps_isCompletedSet","Reps_isInRangeCompleted","firstRep","Reps_isInRangeCompletedSet","Settings_withRecentSwap","mergeWithDeletions","exerciseDataKeys","starredExerciseKeys","skipPlatesCalculator","nextTargetType","targetTypes","clampTextSize","scaled","starred","Settings_toggleStarred","stored","programCustomExercises","changedEntries","pickerSettings","pickerSettingsKeys","deletedExerciseDataKeys","deletedKeys","deletedStarredExerciseKeys","bound","Settings_programContentBuild","weeklyRangeSets","weeklyFrequency","Settings_defaultEquipment","Settings_buildPlannerSettings","settingsRecentExercisesLimit","fromKey","toKey","plannerExercises","recentWeights","Weight_divide","versionTracker","VersionTracker","STORAGE_VERSION_TYPES","filledVersions","fillVersions","shouldReportError","Storage_validate","VStorage","Storage_validateAndReport","migratedRecord","VHistoryRecord","bStorage","cleanedAStorage","originalId","cleanedBStorage","oldStorage","migratedOldStorage","migratedNewStorage","oldId","oldOriginalId","oldCleanedStorage","_excluded5","newId","newOriginalId","newCleanedStorage","_excluded6","updatedVersions","mergeVersions","updatedStorage","mergeByVersions","sortedProgress","head","byIndex","entriesWithSortedSets","sortedSets","CollectionUtils_immutableSort","sortedEntries","sortProgressByIndex","partialStorage","_excluded3","_excluded4","updateVersions","_versionTracker","safeParse","abortEarly","issue","formatIssuePath","lastActions","Diagnostics_setLastValidationErrors","dateNow","deletedHistory","deletedPrograms","TimedSet_sideToTime","stage","targetSeconds","restSeconds","isOverflow","exerciseShortName","currentSet","_versionTrackerDiffVersions","_versionTrackerExtractByVersions","_versionTrackerFillVersions","_versionTrackerMergeByVersions","_versionTrackerMergeVersions","_versionTrackerUpdateVersions","_exportNames","enumerable","versionTypes","oldObj","newObj","currentVersions","VersionTrackerUpdateVersions","fullObj","VersionTrackerFillVersions","VersionTrackerDiffVersions","versionsDiff","VersionTrackerExtractByVersions","fullVersions","versionDiff","extractedObj","VersionTrackerMergeByVersions","VersionTrackerMergeVersions","isVectorClock","isFieldVersion","isCollectionVersions","currentTimestamp","compactionThresholds","deletionTimestamp","VersionTrackerUtils_SERVER_DEVICE_ID","newClock","vc","VersionTrackerUtils_normalizeVersion","isVersionsObject","VersionTrackerUtils_isTypedObject","idField","typeIdMapping","VersionTrackerUtils_isControlledType","idVersion","isIdVersion","nukedeleted","VersionTrackerUtils_NUKEDELETED_THRESHOLD","atomicTypes","VersionTrackerUtils_compareVersions","aNorm","bNorm","allDevices","mergedVc","controlledTypes","aDevices","bDevices","aHasVc","bHasVc","aHasHigher","bHasHigher","aCount","bCount","_utils","hasChanges","oldVersion","newVersion","fieldDiff","diffFieldVersion","oldCollection","diffCollection","oldDeletedKeys","newDeletedKeys","oldItemVersion","newItemVersion","itemDiff","diffObj","extractedValue","extractFieldByVersion","extractCollectionByVersion","VersionTrackerUtils_isRecord","extractControlledTypeByVersion","controlledFields","excludedFields","excludedFieldsSet","collectionVersion","hasItemChanges","hasDeletions","itemId","VersionTrackerUtils_getId","itemVersion","extracted","itemValue","resultObj","VersionTrackerUtils_asVersionsObject","fieldStr","filledVersion","fillFieldVersion","hasTrackableItems","collectionVersions","VersionTrackerUtils_ensureCollectionVersions","itemPath","getInitialItemVersion","filledItemVersion","fillControlledObjectVersion","VersionTrackerUtils_createVersion","dictionaryFields","dictValue","VersionTrackerUtils_isAtomicType","fillNestedVersions","VersionTrackerUtils_ensureVersionsObject","VersionTrackerUtils_getIdFieldName","idValue","VersionTrackerUtils_getIdValue","VersionTrackerUtils_createIdVersion","controlledField","fieldValue","fieldPath","fillControlledFieldVersion","parentPath","hasAnyVersion","currentPath","writeKey","deleteKey","diffVersion","fullVersion","mergedValue","mergeFieldByVersion","diffNorm","fullNorm","fullValue","mergeCollectionByVersion","fullCollection","fullVersionObj","diffVersionObj","fullIdVersion","VersionTrackerUtils_getIdVersionFromVersions","diffIdVersion","VersionTrackerUtils_pickWinningIdVersion","controlledFieldSet","fullIsRecord","fullRecord","mergedItem","writeField","fullFieldVersion","fullFieldValue","extractedFieldValue","validator","typeValidators","dedupedFull","dedupedExtracted","dedupedFullById","processedIds","allSame","pushItem","extractedItem","diffItemVersion","fullItemVersion","fullItem","shouldTakeExtractedItem","ensureResult","dk","mergedVersion","mergeVersionField","VersionTrackerUtils_mergeFieldVersions","mergeCollectionVersions","findIdVersion","mergedField","mergedItemVersion","fullDeletedTime","diffDeletedTime","versionsObj","newVersionsObj","VersionTrackerUtils_areEqual","updatedVersion","updateFieldVersion","oldFull","newFull","oldFullVersion","newFullVersion","oldHasTrackableItems","updateArrayCollectionVersion","fieldVersion","updateDictionaryCollectionVersion","updateControlledObjectVersion","oldObjValue","updateNestedVersions","VersionTrackerUtils_incrementNukedeleted","newIds","deletedInThisUpdate","oldItemsById","oldItem","oldItemId","deletedCount","newCollectionVersion","getItemVersion","compactedCollection","VersionTrackerUtils_applyCompaction","oldDict","newItem","currentItemVersion","fieldVersions","currentIdVersion","oldFieldValue","newFieldValue","currentFieldVersion","updateControlledFieldVersion","opr","knownRpeMultiplier","targetRpeMultiplier","Weight_compareReverse","smallestPlate","Equipment_smallestPlate","Weight_subtract","withUnit","platesArr","Weight_oneSidePlates","CollectionUtils_compressArray","oneRepMax","objWeight","Weight_parse","prebuiltWeights","prebuiltWeight","Weight_roundTo000005","MathUtils_roundTo000005","allWeight","platesWeight","originalUnit","weightInUnits","absAllWeight","Weight_abs","inverted","Weight_invert","availablePlatesArr","availablePlates","targetValue","plateTypes","unitWeight","maxUnits","allValues","maxDecimals","dot","precision","intTarget","intWeights","maxFrom","bestRemaining","iterations","newRemaining","calculatePlatesInternalFast","weightToAdd","totalInUnits","Weight_operation","lastDateStr","WhatsNew_newUpdates","_whatsnewParser","WhatsNew_all","WhatsNewParser_parseAll","bodyLines","isFrontmatterStart","changelogMarkdown","latestDateStr","outcomes","oldOutcomes","newOutcomes","nowMs","oldIds","WorkoutOutcome_healthPayload","WorkoutOutcome_syncId","closed","startMs","endMs","History_calories","syncId","visitedSupersets","straightSetsMs","rounds","roundMembers","setWorkMs","supersetMs","setEntries","unregister","ActiveSheetHeightContext","_useContext2","rootScreenOptions","useThemeRerender","headerShown","animationEnabled","freezeOnBlur","cardStyle","stackScreenOptions","useStackScreenOptions","isOnboarding","onboardingScreens","InitialScreenContext","RootStack","Navigator","screenOptions","screenLayout","renderScreenWithErrorBoundary","initialRouteName","Screen","component","OnboardingStackScreen","MainTabsScreen","NavScreenSubscription","Group","presentation","cardOverlayEnabled","NavModalAmrap","NavModalExercisePicker","NavModalEditProgramExercisePicker","NavModalEditTarget","NavModalSetTimer","NavModalSetTimerEdit","NavModalRoundingInfo","NavModalDate","NavModal1RM","NavModalEquipment","NavModalWorkoutSuperset","NavModalPlaygroundEditExercise","NavModalCoupon","NavModalNewGym","NavModalNewEquipment","NavModalPlates","NavModalNewFixedWeight","NavModalCreateProgram","NavModalImportFromLink","NavModalAffiliate","NavModalImportFromOtherApps","NavModalDayFromAdhoc","NavModalNextWorkout","NavModalWhatsnew","NavModalSignupRequest","NavModalHearAboutUs","NavModalCorruptedState","NavModalDebug","NavModalWorkoutShare","NavModalSocialShare","NavModalCustomExercise","NavModalMusclesOverride","NavModalTour","NavModalEditProgramMenu","NavModalProgramNextDay","NavModalProgramImageExport","NavModalProgramRevisions","NavModalMonthCalendar","NavModalAccount","NavModalEmailAuth","NavModalChangePassword","NavModalSubscriptionInfo","NavModalWeekInsightsDetails","NavModalSetSplit","NavModalPlannerSettings","NavModalEditMuscleGroups","NavModalWeekStats","NavModalDayStats","NavModalExerciseStats","NavModalEditExerciseChange","NavModalGraphs","NavModalStatsSettings","NavModalProgramInfo","NavModalChangeNextDay","NavModalInputSelect","NavModalStateVars","NavModalAcrossProgram","NavModalCreateStateVar","NavModalTextInput","NavModalEditDetails","NavModalRepMaxCalculator","NavModalMuscleGroupMusclePicker","NavModalPhotoPicker","NavModalExerciseImageSource","NavModalExerciseImageLibrary","NavModalExerciseCloneLibrary","NavModalExerciseTypesPicker","NavModalExerciseMusclesPicker","NavModalHelp","NavModalExerciseLiftoEditor","NavModalDayLiftoEditor","_stack","_NavHeader","_screenErrorBoundary","_theme","_NavScreenHome","_NavScreenProgram","_NavScreenOnboarding","_NavScreenWorkout","_NavScreenGraphs","_NavScreenMe","_NavScreenFood","_NavScreenFooter","_NavModalAmrap","_NavModalExercisePicker","_NavModalEditProgramExercisePicker","_NavModalEditTarget","_NavModalSetTimer","_NavModalSetTimerEdit","_NavModalRoundingInfo","_NavModalDate","_NavModal1RM","_NavModalEquipment","_NavModalWorkoutSuperset","_NavModalPlaygroundEditExercise","_NavModalCoupon","_NavModalNewGym","_NavModalNewEquipment","_NavModalPlates","_NavModalNewFixedWeight","_NavModalCreateProgram","_NavModalImportFromLink","_NavModalAffiliate","_NavModalImportFromOtherApps","_NavModalDayFromAdhoc","_NavModalNextWorkout","_NavModalWhatsnew","_NavModalSignupRequest","_NavModalHearAboutUs","_NavModalCorruptedState","_NavModalDebug","_NavModalWorkoutShare","_NavModalSocialShare","_NavModalCustomExercise","_NavModalMusclesOverride","_NavModalTour","_NavModalEditProgramMenu","_NavModalProgramNextDay","_NavModalProgramImageExport","_NavModalProgramRevisions","_NavModalMonthCalendar","_NavModalAccount","_NavModalEmailAuth","_NavModalChangePassword","_NavModalSubscriptionInfo","_NavModalWeekInsightsDetails","_NavModalSetSplit","_NavModalPlannerSettings","_NavModalEditMuscleGroups","_NavModalWeekStats","_NavModalDayStats","_NavModalExerciseStats","_NavModalEditExerciseChange","_NavModalGraphs","_NavModalStatsSettings","_NavModalProgramInfo","_NavModalChangeNextDay","_NavModalInputSelect","_NavModalStateVars","_NavModalAcrossProgram","_NavModalCreateStateVar","_NavModalTextInput","_NavModalEditDetails","_NavModalRepMaxCalculator","_NavModalMuscleGroupMusclePicker","_NavModalPhotoPicker","_NavModalExerciseImageSource","_NavModalExerciseImageLibrary","_NavModalExerciseCloneLibrary","_NavModalExerciseTypesPicker","_NavModalExerciseMusclesPicker","_NavModalHelp","_NavModalExerciseLiftoEditor","_NavModalDayLiftoEditor","route","OnboardingStack","createStackNavigator","HomeStack","ProgramStack","WorkoutStack","GraphsStack","MeStack","FoodStack","createBottomTabNavigator","useSystemTheme","NavHeader","NavScreenFirst","NavScreenUnits","NavScreenSetupEquipment","NavScreenSetupPlates","NavScreenHearAboutUs","NavScreenProgramSelectOnboarding","NavScreenProgramsOnboarding","NavScreenProgramPreviewOnboarding","NavScreenOnerms","HomeStackScreen","NavScreenMain","NavScreenProgress","getId","NavScreenExerciseStats","ProgramStackScreen","NavScreenPrograms","NavScreenEditProgram","NavScreenProgramSelect","NavScreenProgramPreview","WorkoutStackScreen","NavScreenFinishDay","NavScreenMuscles","GraphsStackScreen","NavScreenGraphs","MeStackScreen","NavScreenSettings","NavScreenAccount","NavScreenTimers","NavScreenPlates","NavScreenGyms","NavScreenExercises","NavScreenAppleHealth","NavScreenGoogleHealth","NavScreenMuscleGroups","NavScreenStats","NavScreenMeasurements","NavScreenSleepNutrition","NavScreenApiKeys","NavScreenRecentImports","NavScreenImportPreview","FoodStackScreen","NavScreenFood","NavScreenFoodAdd","NavScreenFoodLibrary","NavScreenFoodItem","NavScreenFoodGoals","NavScreenFoodTemplates","tabScreenOptions","sceneStyle","tabProps","Footer2Wrapper","animatedHeight","activeConfig","setActiveConfig","renderedConfig","setRenderedConfig","shouldMount","setShouldMount","slideY","prevActiveRef","touchStartRef","openGenRef","bottomOverflow","startVal","endVal","openKeyboard","KeyboardActiveId_set","closeKeyboard","isKeyboardOpen","BackHandler","KeyboardActiveId_setHeight","KeyboardActiveId_subscribe","KeyboardActiveId_get","inlineLayout","fitContent","keyboardNode","_nativeCustomKeyboard","NativeCustomKeyboard","isNegative","withDot","CustomKeyboardContext","openGen","changedTouches","absoluteFill","_keyboardActiveId","defaultAnimatedHeight","hasHeader","scrollPadding","noPadding","headerNode","handleScroll","_useNavScreenScroll","useNavScreenScroll","contextValue","_SheetScreenContainer","SheetScreenContainer","TransparentModal","CustomKeyboardProvider","_useNavScreenScroll2","_useReducer","useReducer","modalReducer","initialModalState","_useReducer2","ModalDispatchContext","ModalStateContext","noopModalDispatch","useModalState","useModalDispatch","callbackRef","isOpenRef","idRef","isOwner","Modal_open","modals","_toPropertyKey","Symbol","toPrimitive","TypeError","_toPrimitive","_action$key","_action$key2","buildNavCommon","navIsScrolled","_navbar","NavbarView","isStatic","useNavigation","animatedKeyboardHeight","setFooterHeight","setStickyHeaderHeight","onScrolledChange","isScrolled","setOptions","onScrollViewLayout","onFooterLayout","onStickyHeaderLayout","lastStickyIndex","overscrollBehavior","FooterHeightReport","reportHeight","useReportSheetHeight","isVisible","setIsVisible","sheetRef","onCloseRef","shouldCloseRef","shouldClose","getUntrackedObject","_reactTracked","createContainer","useUpdate","initialText","headerLabel","redError","onTextChange","liveError","setLiveError","analyzeTextRef","analyzeText","analysisRevision","PlannerSyntaxError","accent","railRef","hasAutoScrolledRail","scrollSelectedIntoView","onSelectInstance","selectInstance","useRoute","NavModal1RMPreview","NavModal1RMWorkout","_ModalScreenContainer","_FormSheet","useCommitRm1","rawOrValue","_useAppState2","rm1Modal","commitRm1","shouldGoBack","ModalScreenContainer","FormSheet","_useAppState3","buildPlannerDispatch","previewOneRepMaxModal","userEmail","Account_getFromStorage","Account","navigateHomeOnSignIn","_account2","modalDispatch","useModalData","setPlanner","tabForField","setTabIndex","_KeyboardSheet","KeyboardSheet","exerciseFullName","Modal_clear","_editProgramExerciseAcrossAllWeeks","EditProgramExerciseAcrossAllWeeks","Modal_setResult","_modalAffiliate","ModalAffiliateContent","_route$params","getPlaygroundProgress","buildPlaygroundDispatch","playgroundProgram","didGoBackRef","goBackOnce","cancelAmrap","Progress_forceUpdateEntryIndex","useClearOnModalRemove","_navModalPlaygroundUtils","_useClearOnModalRemove","EditProgram_setNextDay","_modalChangeNextDay","ModalChangeNextDayContent","isResettingRef","addListener","_modalCoupon","ModalCouponContent","resolveAdhocRecord","adhocProgressId","adhocHistoryRecordId","_modalCreateProgram","EditProgram_createFromHistoryRecord","StackActions","EditProgram_create","_modalCreateStateVariable","_bottomSheetCustomExercise","BottomSheetCustomExerciseContent","Exercise_handleCustomExerciseChange","_modalDate","ModalDateContent","_modalDayFromAdhoc","ModalDayFromAdhocContent","LiftoEditorSheetProgram_resolve","withPlanner","dayDataFor","editorMode","setEditorMode","liveTextRef","analyzedText","setAnalyzedText","analyzeTimerRef","analysis","ProgramDayText_replace","isDirty","isDirtyRef","allowCloseRef","identityChange","ProgramDayText_identityChange","Dialog_choice","ProgramDayText_apply","lensUpdates","oldExercises","safeAreaContent","_DayLiftoEditorSheet","DayLiftoEditorSheet","exerciseTypeFor","_programDayText","_liftoEditorSheetProgram","totalDays","showDayStats","_plannerDayStats","PlannerDayStats","setAdminKey","isKeyValid","setIsKeyValid","keyError","setKeyError","setUserId","setStorageId","snapshotTimestamp","setSnapshotTimestamp","setSnapshots","Thunk_postDebug","ShareLog_share","Thunk_adminEnableServerSync","Thunk_adminListDebugSnapshots","Thunk_adminLoginAsUser","Thunk_adminCheckKey","_shareLog","_editDetailsForm","EditDetailsForm","editExerciseModal","onNewSettings","plannerBase","programPlannerDispatch","pickerDispatch","stopIsUndoing","programRef","plannerExerciseRef","clearExercisePicker","currentPlanner","onStopIsUndoing","ProgramExercisePickerChange_apply","onChangeExercise","Settings_toggleStarredExercise","Settings_changePickerSettings","Program_getExerciseTypesForWeekDay","_bottomSheetExercisePicker","_programExercisePickerChange","_bottomSheetEditProgramV","BottomSheetEditProgramV2Content","Thunk_generateAndCopyLink","Thunk_fetchRevisions","modalTitles","signin","signup","forgot","NavModalEquipmentPreview","NavModalEquipmentWorkout","_modalEquipment","equipmentModal","previewEquipmentModal","openImageLibrary","upload","onCloseSheet","pendingPlanner","setPendingPlanner","setExerciseKey","setSelectedDayData","setIsSharedVisible","setBodyText","remountKey","setRemountKey","editTarget","currentDeclaration","currentBlurbText","editRef","setPending","onDraftText","nextShared","needsReprojectRef","foldedKeyRef","openAcrossProgram","onEditAcrossProgram","requestSwapScope","foldOptions","Program_findPlannerExercise","setAnalysisRevision","parseCacheRef","parseName","LiftoEditorBrain_exerciseFullName","ProgramExerciseSwap_detect","swapScopeRef","askSwapScope","onBeforeChangeExercise","onBeforeApply","liveProgram","decision","ExerciseLiftoEditorSave_decide","ExerciseLiftoEditorSave_lenses","panelPendingRef","_ref8","instanceLabel","instanceOptions","reuseCandidates","LiftoEditorReuse_candidates","pickerData","excludeUsedExerciseTypes","_ExerciseLiftoEditorSheet","ExerciseLiftoEditorSheet","sharedProperties","ownerLabel","ownerDayData","onToggleShared","ExerciseLiftoEditorDraft_mountText","onSharedHidden","exerciseFor","ProgramExerciseSwap_identity","onEditReuse","stateVarsFor","LiftoEditorStateVars_contextFor","ExerciseDraftToProgram_analyze","applyPreview","ExerciseDraftToProgram_writePreview","onPanelPendingChange","isPending","_liftoEditorReuse","_liftoEditorBrain","_exerciseLiftoEditorSave","setSelectedMuscles","evaluatedCurrentProgram","buildCustomDispatch","statsRef","historyRef","evaluatedCurrentProgramRef","exercisePickerStateRef","currentProgress","currentPickerState","currentSettings","currentEvaluatedProgram","Progress_addExercise","Settings_addRecentSwap","Progress_changeExercise","Program_getProgramExerciseByTypeWeekAndDay","newEntryIndex","nextHistoryEntry","showExerciseStats","_plannerExerciseStats","PlannerExerciseStats","hideSwap","onEditMuscleGroupsOverride","onEditMuscleGroups","initialTypes","setTypeValues","_modalGraphs","ModalGraphsContent","resolutionRef","hasResultRef","resolution","HearAboutUs_appendRequest","HelpComponents","_helpRegistry","_modalImportFromLink","ModalImportFromLinkContent","Thunk_importFromLink","_modalImportFromOtherApps","ModalImportFromOtherAppsContent","_bottomSheetMonthCalendar","BottomSheetMonthCalendarContent","_bottomSheetMusclesOverride","_modalNewEquipment","ModalNewEquipmentContent","Equipment_build","_modalNewFixedWeight","ModalNewFixedWeightContent","_modalNewGym","ModalNewGymContent","oldGyms","_bottomSheetNextWorkout","BottomSheetNextWorkoutContent","pickPhoto","settingsDispatch","stateRecordings","_modalPlannerSettings","ModalPlannerSettingsContent","onShowEditMuscleGroups","_modalPlates","ModalPlatesContent","NavModalPlaygroundEditExercisePreview","NavModalPlaygroundEditExercisePlayground","daySetup","clearEditModal","newEvalProgram","previewExerciseModal","NavModalPreviewExerciseEditContent","_modalPlannerPictureExport","ModalPlannerPictureExportContent","isChanged","_modalProgramInfo","ModalProgramInfoContent","Program_previewProgram","Program_cloneProgram","Settings_doesProgramHaveUnset1RMs","_modalProgramNextDay","_modalPlannerProgramRevisions","ModalPlannerProgramRevisionsContent","PlannerProgram_evaluateText","_repMaxCalculator","RepMaxCalculator","strengthSets","hypertrophySets","isSynergist","timedSet","imageAspect","setImageAspect","lbSaveSignupRequestDate","_workoutSocialShareSheet","WorkoutSocialShareSheet","_liftoEditorStateVarsSheet","LiftoEditorStateVarsSheet","_modalStats","ModalStatsContent","Section","imageUri","imageAlt","_tourModal","TourModalContent","hlps","WeekInsightsDetails","_programHistory","showWeekStats","_plannerWeekStats","PlannerWeekStats","onEditSettings","evaluatedDays","sortedWhatsnewRecords","whatsNewRecord","replaceWithSocialShare","healthName","shouldShowHealthSync","_workoutShareBottomSheetItem","WorkoutShareBottomSheetItem","exerciseSuperset","showSupersetPicker","_bottomSheetWorkoutSuperset","BottomSheetWorkoutSupersetContent","lbProgress","cardActionTypes","isCardsAction","prevKeys","nextKeys","NavigationContext","createNavigationContainerRef","PerfNavTracker_recordTap","CommonActions","resetState","reset","currentRoot","getRootState","getCurrentRoot","getCurrentTab","_perfNavTracker","tabsState","prevScreens","rootState","collectScreens","currentIdentities","screenStateIdentity","Thunk_cleanupRemovedScreens","into","screensWithEditState","_screenFood","ScreenFood","nutritionGoals","foodLibrary","mealTemplates","_screenFoodAdd","ScreenFoodAdd","_useAppState5","_screenFoodGoals","ScreenFoodGoals","_useAppState4","_screenFoodItem","ScreenFoodItem","_screenFoodLibrary","ScreenFoodLibrary","_useAppState6","_screenFoodTemplates","ScreenFoodTemplates","setTabBarHeight","BottomTabBarHeightCallbackContext","topRoute","tabState","getTopRouteOfActiveTab","screensWithoutFooter","_footer","Footer2View","useScreenPerf","_screenGraphs","ScreenGraphs","_useScreenPerf","subscriptionImages","ongoingProgress","_chooseProgram","ChooseProgramView","ProgramHistoryView","_screenAccount","ScreenAccount","subscriptionStatusLoading","_useAppState12","_screenApiKeys","ScreenApiKeys","_useAppState7","_screenAppleHealthSettings","ScreenAppleHealthSettings","_useAppState11","viewExerciseType","_screenExerciseStats","ScreenExerciseStats","_screenExercises","ScreenExercises","_useAppState8","_screenGoogleHealthSettings","ScreenGoogleHealthSettings","_screenGyms","ScreenGyms","defaultEquipmentExpanded","_useAppState14","importPreview","_screenImportPreview","ScreenImportPreview","_useAppState1","_screenMeasurements","ScreenMeasurements","_useAppState9","_screenMuscleGroups","ScreenMuscleGroups","_screenEquipment","ScreenEquipment","_useAppState13","_screenRecentImports","ScreenRecentImports","_screenSettings","ScreenSettings","_useAppState10","_screenSleepNutrition","ScreenSleepNutrition","_useAppState0","_screenStats","ScreenStats","_screenTimers","ScreenTimers","_screenFirst","ScreenFirst","_screenHearAboutUs","ScreenHearAboutUs","usePlaygroundModalBridges","previewProgram","_screenProgramPreview","ScreenProgramPreview","_screenProgramSelect","ScreenProgramSelect","_screenSetupEquipment","ScreenSetupEquipment","ScreenSetupPlates","_screenUnitSelector","ScreenUnitSelector","_usePlaygroundModalBridges","useConfirmScreenLeave","_fallbackScreen","FallbackScreen","plannerState2","editProgram2","_screenEditProgram","ScreenEditProgram","muscleView","_screenMusclesProgram","ScreenMusclesProgram","_screenMusclesDay","ScreenMusclesDay","_screen1RM","Screen1RM","_useConfirmScreenLeave","_screenFinishDay","ScreenFinishDay","progress2","_screenWorkout","ScreenWorkout","_screenSubscription","ScreenSubscription","clearRef","shouldConfirm","screenRef","gestureEnabled","Thunk_confirmScreenLeave","usePreventRemove","prevRef","NavOptionsChanged_isChanged","_navOptionsChanged","layoutSizeRef","isScrolledRef","onScrolledChangeRef","onScrollEvent","notifyListeners","syntheticEvent","useEdgeEffect","showWhatsNew","showHearAboutUs","fnRef","didRun","useRunOnceWhenReady","Thunk_maybeShowOnloadModal","onEdge","onEdgeRef","setTimerNonce","modal","findActivePlaygroundModal","prevAmrapModal","prevEditModal","lastHistoryTsGetter","lastHistoryTs","additionalDeps","shouldEnable","onKeyPress","HTMLTextAreaElement","ctrlKey","metaKey","shiftKey","previousState","nextState","_programShareOutput","sourceRef","sourceSizeRef","layoutResolveRef","setUrl","isCapturing","setIsCapturing","initialDaysToShow","getInitialDaysToShow","showDayDescription","setConfig","Program_toUrl","url2","isWide","offscreenSource","ProgramShareOutput","settingsTab","SettingsTab","waitForSourceLayout","borderTopLeftRadius","borderBottomLeftRadius","_save","pixelRatio","PixelRatio","pixelW","pixelH","captureWidth","t0","imageShareUtils","weekDayMapping","dayIndexes","allDaysSelected","CollectionUtils_removeAll","daySelected","SaveStatus","isInt","clamped","allWeeklySetsMin","allWeeklySetsMax","allWeeklyFrequency","onUnits","onSynergistMultiplier","onRestTimer","onSetsSplitPreset","onStrengthPct","onHypertrophyPct","onMuscleGroupsPreset","preset","novice","intermediate","advanced","_preset","freq","ObjectUtils_fromArray","onChangeAllMin","onChangeAllMax","onChangeAllFreq","saveStatus","MuscleGroupRow","onMin","Settings_withWeeklyRangeSetsBound","onMax","onFreq","PlannerHighlighter_segments","colorForClass","clazz","_builder$build","MONO_FONT_FAMILY","wrap","_plannerHighlighter","web","PlannerStatsUtils_calculateSetResults","hideTitle","PlannerStats","colorize","PlannerEditor","attach","setCustomExercises","setExerciseFullNames","EvalResult","redTheme","_plannerEditor","customErrorCta","PlannerSidePanelStats_findExercise","evaluatedExercise","synergeticMuscles","synergeticMuscleGroups","intensityGraphData","getIntensityPerWeeks","volumeGraphData","getVolumePerWeeks","intensityKey","volumeKey","graphIdBase","Exercise_toExternalUrl","_iconExternalLink","IconExternalLink","PlannerExerciseSwap_openByKey","PlannerProgramExercise_numberOfSets","PlannerProgramExercise_numberOfSetsThisWeek","_plannerGraph","PlannerGraph","yAxisLabel","_plannerSidePanelStats","_plannerExerciseSwap","StatLabel","editSettingsLabel","_iconMuscleSettings","IconMuscleSettings","_tooltipPlacement","isDesktopWeb","tooltipAnchor","setTooltipAnchor","setColor","colorRangeValue","directionValue","frequencyColor","totalNode","trailingNode","hasExercises","PlannerStatsTooltip","setPosition","offsetWidth","offsetHeight","TooltipPlacement_place","strengthPct","setNumber","initialCurrentRevision","currentRevision","setCurrentRevision","loadRevision","getProgramRevision","prevState","promise","programRevision","isPickerExpanded","setIsPickerExpanded","revisionLabels","DateUtils_parseYYYYMMDDHHMM","DateUtils_formatWithTime","currentLabel","counted","attachedRuns","topLevelNodes","runs","startOfLine","endOfExercise","exerciseTo","nodes","attached","EmptyExpression","described","describeRuns","markerPosition","markers","markerOf","joined","lineValue","rawIndex","lineStart","blankLinesAfter","blankLinesBefore","hasRunAbove","takesAfter","endOfLine","removeFrom","removeTo","PlannerExerciseSwap_open","PlannerProgram_parseText","PlannerMode_current","fullEvaluation","PlannerMode_canSwitch","PlannerProgram_usedExercises","Program_exportedPlannerProgramToExportedProgram","oldPlannerProgram","additionalRepeatingExercises","ev","declaringWeekIndexes","oldKeyFor","ObjectUtils_findKeyByExpression","declaringKey","lastDescriptions","mapping","evaluator","declaringPass","declaringWeeks","claimWeek","repeatWeekIndex","repeatDay","repeatedExercises","sectionsToReuse","firstWeek","lastWeek","repeatRanges","ongoingDescriptions","repeatParts","fullProgramText","PlannerEvaluator_evaluateFull","textWeeksToPlanner","PlannerExerciseEvaluatorText","fullResult","_PlannerProgram_getExportedPlannerProgram","topLine","topLineWeek","topLineDay","group1","group2","ex1","ex2","PlannerEvaluator_compareExerciseOrder","hasWeightInUnit","aPlannerProgram","firstPass","newLine","PlannerProgram_topLineItemToText","isStrict","toExerciseType","weightChanges","wc","weightChange","newPlannerProgram","switchWeightsToUnit","_loop4","reuseDay","_plannerExerciseEvaluatorText","PlannerDayDataError","labelSuffix","noConflicts","getLabel","PlannerKey_fromLabelNameAndEquipment","PlannerKey_fromExerciseType","newLabel2","evaluatedSetVariation","lastEvaluatedSet","Weight_parsePct","fnArgsToStateVars","reuseFullname","_PlannerExerciseEvalu3","groupedWarmupSets","CollectionUtils_groupByExpr","PlannerProgramExercise_evaluateSetVariations","ProgramExercise_groupWarmupsSets","dimReps","dimRpe","dimWeight","dimTimer","Reps_groupDisplaySets","visited","acc2","exerciseWarmups","MathUtils_roundTo0005","successesCounter","failuresCounter","originalSetVariations","reuseSetVariations","evaluatedSets","reusedSets","currentSets","currentGlobals","originalState","originalStateMetadata","_PlannerExerciseEvalu2","PlannerSidePanelStats_cursorFromSelection","PlannerSidePanelStats_cursor","isReorder","hasErrors","cursorInFullText","currentLine","focused","_value$split$map","_value$split$map2","fnArgKey","fnArgValStr","fnArgVal","synergistMusclesGroupMultipliers","addMuscleGroup","totalMinutes","daysPerWeek","PlannerStatsUtils_summary","totalA","capitalizedMuscle","frequencyDays","synergistNote","_muscle2","estimateExercises","validDays","exercisesPerDay","approxTimeMs","isStrength","isTarget","withWeek","deletedDay","blockers","reference","dayReferences","renumberDayReferences","refuseIfWorse","sources","_PlannerProgram_evalu7","reusedNames","blocked","_loop6","exerciseBlocks","sameExercise","joinBlocks","withoutBlock","relocated","doomed","exerciseRepeats","nextWeek","withBlockAt","oldOrder","_week","reordered","reorderWeeks","copies","copy","authored","uniqueWeekName","stripRepeats","toRowIndex","beforeFullName","reorderDayText","trimmedDescription","runStart","runEnd","toWeek","declares","findExerciseLine","findAuthoringWeek","resized","declaredText","stranded","weeksDeclaring","droppedByShrink","repeatNode","orderOf","variationsEnd","gained","dayless","withWarnings","newDescription","WeekOrDay","dayNode","hasWeek","commentReferences","StringUtils_unindent","dots","directive","bracket","rawName","nameFrom","innerStart","daySpan","commentWeek","rangeNode","exerciseOrderSlots","repeatToken","keepSingleWeek","rewriteWeekNumbersInDay","newForOld","newWeekOfText","where","weekReferences","oldIndex","preferred","references","beforeDays","dayOutcomes","afterDays","wasFine","failure","broken","describeBreak","brokenBefore","brokenAfter","messages","placeName","placeOf","_details$data","subject","between","originalText","orderKeys","rank","movableSlots","withRowOrders","orderFor","reduceRight","wanted","rowOrderFromText","stripped","wantedKeys","rowReadsInTextOrder","numbers","variationsSpan","withLabel","colon","keysPresentInDay","otherIndex","labelApart","freeLabel","hoistedSummary","summaryForKey","crossing","homeless","weeksShowing","relabels","keysShownInDay","landing","relabeled","retargetDayReferences","toDay","_loop5","_move","fromDay","_ret2","relabel","_ret3","lost","strandedByLabelling","fromIndexes","survivorsPerWeek","mapPerWeek","survivors","newDayForOldInWeek","remapDayReferences","containingWeek","numberOfRows","reuseSources","collectReuseSources","seenInDay","ordinal","laneId","buildLanes","byWeek","exercisesByLane","supersetColorByLane","groupByLane","supersetColors","lanePlacements","definingText","isReuseSource","progressionText","schemeTokens","addSourceWeek","addResolvedWeek","claimedSpans","_placement","earlier","ProgramGrid_weekDayCount","placementIds","PART_KINDS","displaySetsToGroups","variationsToTokens","common","commonParts","present","joinVariations","joinGroups","groupToTokens","trailing","withTrailing","overrideTokens","globalsToTokens","evaluatedTokens","tokensKey","other","ProgramGrid_laneResolved","plain","GRID_BOTTOM_GAP","outerHeight","fromRow","fromLane","GRID_BASE_COLUMN_WIDTH","fitted","autoColumnWidth","GRID_WEEKS_THAT_FIT","GRID_SCHEME_MIN_WIDTH","GRID_LANE_HEIGHT_WITH_SCHEME","GRID_LANE_HEIGHT_NAME_ONLY","GRID_LANE_HEIGHT_WITH_RESOLVED","ProgramGridGeometry_resizeHandleLeft","GRID_RESIZE_HANDLE_WIDTH","fromWeek","GRID_DAY_LABEL_HEIGHT","GRID_DAY_DURATION_HEIGHT","GRID_RESIZE_HANDLE_HIT_WIDTH","GRID_RESIZE_HANDLE_MAX_HIT_SHARE","liftoscriptBlockAt","liftoscriptCandidates","findStateInScope","plannerCandidates","candidatesAt","needle","matchScore","ranked","bindingAliases","matchBefore","re","lastIndexOf","flags","anchorAtEnd","nodeEndAt","tokenEnd","PlannerCompletionsIndex","builtinNames","customNames","builtinLabels","Exercise_searchNames","exerciseMatch","comma","variants","equipmentQuery","exerciseVariants","customs","customExerciseMatches","searchLabels","searchNames","reuseMatch","sectionMatch","prop","propertyMatch","argNode","_autocomplete","_search","_lint","_plannerExerciseCodemirror","ErrorGutterMarker","_GutterMarker","elementClass","GutterMarker","buildInfoLine","infoContainer","labelNode","dataNode","appendChild","getEditorSetup","plannerEditor","errorGutterCompartment","Compartment","highlightStyle","HighlightStyle","inserted","autocompletion","closeOnBlur","addToOptions","completion","div","createElementNS","targetMusclesNode","synergistMusclesNode","targetMuscleGroupsNode","synergistMuscleGroupsNode","innerHTML","highlightActiveLine","highlightActiveLineGutter","highlightSelectionMatches","linter","severity","needsRefresh","requireLint","allowMultipleSelections","completionKeymap","searchKeymap","indentWithTab","codeMirror","relint","compartments","forceLinting","lineAt","rangeSet","RangeSet","reconfigure","gutterLineClass","onCaretChange","coords","coordsAtPos","language","buildPlannerExerciseLanguageSupport","_getEditorSetup","_getEditorSetup2","codemirror","changeExerciseName","_PlannerEvaluator_get","PlannerEvaluator_getFullEvaluatedWeeks","perDayEvaluatedWeeks","PlannerProgram_fullToWeekEvalResult","PlannerEvaluator_postProcess","fullNames","_liftoscriptEvaluator","PlannerEvaluator_fillInMetadata","PlannerProgramExercise_buildDpRangeScript","byWeekDayExercise","fromPoint","tagsProp","existingTags","point","progressProp","existingProgress","isEqualProgress","updateProp","existingUpdate","isEqualUpdate","PlannerEvaluator_setByWeekDayExercise","PlannerEvaluator_setByExerciseWeekDay","byExerciseWeekDay","PlannerEvaluator_getPerDayEvaluatedWeeks","PlannerEvaluator_getDayIndexFromWeekAndDayInWeekIndex","PlannerEvaluator_fillRepeats","repeatWeek","repeatedExercise","PlannerEvaluator_checkSelfReuse","PlannerEvaluator_fillSetReuses","reuseSetPoint","originalExercises","PlannerEvaluator_findOriginalExercisesAtWeekDay","sharedProgressReuse","originalProgress","PlannerEvaluator_forEachSiblingInstance","sharedUpdateReuse","originalUpdate","weekKey","weekEntry","dayKey","PlannerEvaluator_fillDescriptions","PlannerEvaluator_findLastWeekExercise","PlannerEvaluator_fillDescriptionReuses","PlannerEvaluator_findReusedDescriptions","PlannerEvaluator_isDescriptionReuse","PlannerEvaluator_fillSingleProperties","PlannerEvaluator_fillProgressReuses","originalProperty","originalReuseKey","Weight_type","PlannerEvaluator_checkUpdateScript","liftoscriptNode","PlannerProgramExercise_getExercise","liftoscriptEvaluator","PlannerEvaluator_fillUpdateReuses","PlannerEvaluator_checkReuseLoops","PlannerEvaluator_checkReusesResolve","PlannerEvaluator_iterateOverExercises","PlannerEvaluator_checkUnknownExercises","_weekIndex","_dayInWeekIndex","_dayIndex","reusingName","weekDayMatch","_weekDayMatch$1$split","_weekDayMatch$1$split2","dayOrWeekStr","dayStr","weekExercises","weekDescriptions","atWeek","atDay","candidateDays","originalKey","cond","lastWeekDay","_PlannerEvaluator_get2","isEqual","PlannerCompletions_codemirrorPlanner","buildLiftoscriptLanguageSupport","support","_liftoscriptCodemirror","parserWithMetadata","plannerExerciseStyles","parseMixed","W","latestDescriptions","getValueTrim","getPoint","setParts","_setParts$split","_setParts$split2","numberOfSetsStr","repsStr","_setParts$split3","_setParts$split4","reprange","minrepStr","maxrepStr","setPartNode","_this$getWarmupReps","getWarmupReps","percentageNode","getRepRange","rpeNode","timerNode","setTimerNode","autoNode","_this$getValue$split","_this$getValue$split2","leftRaw","rightRaw","reuseLiftoscriptNode","getStateVariableKeys","evaluateProgressImpl","PlannerProgramExercise_buildProgress","validateProgress","_this$getLineAndOffse3","setsNode","evaluateWarmupSet","exerciseNameNode","evaluateProgress","evaluateUpdate","evaluateWarmup","evaluateId","weekDayNode","_this$getReuseWeekDay","getReuseWeekDay","reuseNode","evaluateReuseNode","evaluateSet","evaluateSuperset","evaluateProperty","childNode","_getChildren$map","_getChildren$map2","rangeEnd","_this$getLineAndOffse5","_this$getLineAndOffse7","addDescription","variationsNode","variationNodes","variationNode","variationNameNode","variationFullName","variationShortName","variationExerciseType","allWarmupSets","activeVariation","PlannerKey_fromExerciseVariations","getIsNotUsed","sectionNodes","getRepeat","getOrder","sectionNode","evaluateSection","_this$getLineAndOffse9","rawDescriptions","fullNamePoint","reuseSetsNode","progressNode","updateNode","idNode","warmupNode","supersetNode","supersetPoint","evaluateExercise","evaluateProgram","oldLiftoscript","newLiftoscript","fromNode","toNode","getRepeatRanges","isUsed","sectionsNode","propertyNameNode","replacement","pickA","pickB","changeWeightsToCompleteWeights","_str$split","_str$split2","nameEquipmentItems","nameEquipment","matchingExercise","fullTextLineToWeekdayDescription","ongoingLines","anyCommentStarted","commentStarted","linesToPreviousExercise","nextLines","_this$getWeekDayOngoi","getWeekDayOngoingLines","lastDay","getLastDay","getWeekDayDescriptionAndFillLastDay","evaluateLine","parseHeight","buildRanges","highlightTree","classHighlighter","keyParts","cleaned","segmentLabel","Exercise_findByNameEquipment","lastAlertDisplayedTs","validateLiftoscript","_script","_mode","_stateKeys","_bindingKeys","transformKey","hasOnlyOwnKeys","getPrototypeOf","hasKeywordMemoized","liftoscriptTree","_this$parse","_this$parse2","rawResult","output","convertResult","errorMsg","lastAlertTs","reportError","availableBodyParts","percentageUnits","historyRecordChange","exercisePickerSorts","statsWeightDef","statsLengthDef","statsPercentageDef","VUnit","VPercentageUnit","VLengthUnit","VExerciseKind","VMuscle","VBodyPart","VBuiltinEquipment","VExercisePickerSort","VExercisePickerScreen","VHistoryRecordChange","VTargetType","VProgressMode","VTimedSetSide","VProgramTag","VGraphExerciseSelectedType","VGraphMuscleGroupSelectedType","VScreenMuscle","string","VEquipment","VExerciseId","_VWeight","_VPercentage","_VLength","VLength","_VPlate","_VMetaExercises","VMetaExercises","_VExerciseType","VExerciseType","_VCustomExercise","clonedFrom","reuseImageFrom","VCustomExercise","_VSet","VSet","VProgramState","_VHistoryEntryProgressSnapshot","VHistoryEntryProgressSnapshot","_VHistoryEntry","VHistoryEntry","_VProgramStateMetadataValue","VProgramStateMetadataValue","VProgramStateMetadata","_VProgramSet","minRepsExpr","timerExpr","VProgramSet","_VProgramExerciseVariation","quickAddSets","VProgramExerciseVariation","_VProgramExerciseWarmupSet","VProgramExerciseWarmupSet","_VProgramExerciseReuseLogic","VProgramExerciseReuseLogic","_VProgramExercise","updateDayExpr","diffPaths","descriptionExpr","enableRepRanges","reuseFinishDayScript","reuseUpdateDayScript","VProgramExercise","_VExercisePickerFilters","VExercisePickerFilters","_VExercisePickerProgramExercise","VExercisePickerProgramExercise","_VExercisePickerAdhocExercise","VExercisePickerAdhocExercise","_VExercisePickerTemplate","VExercisePickerTemplate","VExercisePickerSelectedExercise","_VExercisePickerState","VExercisePickerState","_VProgressUi","lazy","VProgressUi","VIntervals","tuple","null","_VHistoryRecord","_VProgramDayEntry","_VProgramWeek","VProgramWeek","_VProgramDay","VProgramDay","_VPlannerProgramDay","VPlannerProgramDay","_VPlannerProgramWeek","VPlannerProgramWeek","_VPlannerProgram","VPlannerProgram","_VProgram","VProgram","_VStatsWeightValue","VStatsWeightValue","VStatsWeight","_VStatsLengthValue","VStatsLengthValue","VStatsLength","_VStatsPercentageValue","VStatsPercentageValue","VStatsPercentage","_VStatsHealthValue","VStatsHealthValue","VStatsHealth","_VNutrients","VNutrients","VFoodMeal","foodSources","VFoodSource","_VFoodEntryValue","VFoodEntryValue","_VStatsFoodEntry","VStatsFoodEntry","_VStatsWaterEntry","VStatsWaterEntry","VStatsFood","_VMealTemplateItem","_VMealTemplate","VMealTemplate","_VFoodIngredient","_VFoodItem","VFoodItem","_VNutritionGoals","buildBoolPartial","VStatsWeightEnabled","VStatsLengthEnabled","VStatsPercentageEnabled","_VStatsEnabled","VStatsEnabled","_VSettingsTimers","VSettingsTimers","VGraph","_VEquipmentData","similarTo","VEquipmentData","_VGraphOptions","VGraphOptions","_VMuscleMultiplier","_VExerciseDataValue","VExerciseDataValue","_VPlannerSettings","VPlannerSettings","_VGym","VGym","_VWorkoutSettings","VWorkoutSettings","_VGraphs","VGraphs","_VMuscleGroupsSettings","VMuscleGroupsSettings","_VSettings","VSettings","_VStats","VStats","_VSubscriptionReceipt","VSubscriptionReceipt","_VSubscription","VSubscription","_VAffiliateData","VAffiliateData","_VImportSession","VImportSession","_VWorkoutOutcome","VWorkoutOutcome","_VHearAboutUs","_VStorage","attribution","unknown","_VMuscleGeneratorResponse","vIs","_VWebEditorSettings","ATOMIC_TYPES","CONTROLLED_TYPES","CONTROLLED_FIELDS","history_entry","TYPE_ID_MAPPING","history_record","progress_ui","custom_exercise","equipment_data","subscription_receipt","muscle_groups_settings","import_session","workout_outcome","food_item","meal_template","DICTIONARY_FIELDS","EXCLUDED_FIELDS","_options","_callback","_opts","_userId","_event","isWatch","WatchHost_isAvailable","iOSVersion","WatchHost_appVersion","_watchHost","_AppleAuth_signIn","cancelErrorCodes","_waitForSdk","timeoutMs","deadline","_AppleAuth_init","waitForSdk","Theme_system","systemTheme","Theme_apply","_processQueue","AsyncQueueTimeoutError","defaultTimeoutMs","currentItem","logs","_processingGeneration","deps","enqueuedAt","processQueue","generation","addLog","timeoutId","timeoutPromise","timeout","operationPromise","race","currentTime","elapsed","staleIndices","_path","lsClass","eventName","_ClipboardUtils_canReadTextFromClipboard","_ClipboardUtils_copy","_ClipboardUtils_paste","clipboard","fallbackReadTextFromClipboard","_readTextFromClipboard","readTextFromClipboard","permissions","writeText","copyTextToClipboard","fallbackCopyTextToClipboard","disableCopying","textArea","execCommand","removeChild","queryResult","readText","contentEditableElement","contentEditable","innerText","coll1","coll2","areEqual","transformer","keyOf","previousByKey","removedKeys","compare","shouldFill","lastColl","newDays","_newDays$splice","daysToMove","compareFn","arrCopy","isReverse","aIndex","bIndex","numberOfGroups","callbacks","shouldWrapIntoQuotes","getUTCFullYear","getUTCMonth","beginningOfWeekDay","isThisYear","withMs","getMilliseconds","getUTCDate","getUTCMinutes","getUTCHours","minute","endOfWeekDay","meridiem","monthIndexFromName","_time2","rawHour","_time2$","hideWeekday","hideYear","monthNames","regexp","regexpMatchArray","_regexpMatchArray","_DeviceId_get","DeviceId_cachedId","DeviceId_getDeviceType","storageKey","DeviceId_STORAGE_KEY","DeviceId_generate","webeditor","lastState","lastValidationErrors","MAX_ACTIONS","_Dialog_choice","_Dialog_confirm","_Dialog_prompt","confirm","spelled","prompt","uintarray","atob","isBrowser","blob","Uint8Array","arrayBuffer","b64","binary","gunzip","gunzipSync","TextDecoder","decode","str2","fromCharCode","decodeURIComponent","escape","_Encoder_encodeIntoUrlAndSetUrl","_fflate","Worker","_Encoder_encodeIntoUrl","base64data","urlParams","URLSearchParams","TextEncoder","encode","gzipSync","btoa","gzip","onload","readAsDataURL","Blob","_handler","_data","objectUrl","URL","createObjectURL","feature","Features_features","StringUtils_hashCode0To1","rollout","userids","_FileImport_confirm","_FileImport_pickFile","_fileType","onchange","currentFlushCallback","domain","useBrowserCallback","callbackPath","urlBuilder","append","receiveMessage","windowOpts","windowRef","windowUrl","exUrl","_heartRateReading","visibleBpm","expiryTimer","HeartRateReading_apply","scheduleExpiry","HeartRateReading_visibleBpm","_label","_sampleMs","serverVersions","server","localItems","localIds","presentIds","localVersion","isSameVersion","requestedIds","fetchedIds","isSafeInteger","hasMoreLeft","hasMoreRight","fadePx","baseHost","globalThis","promo","keyIdentifier","_IapHelpers_readReceiptOrJwsIOS","unref","jws","getReceiptDataIOS","refreshed","getReceiptIOS","_ImageCache_download","remoteUrl","_remoteUrl","_ImagePicker_pick","accept","capture","outputType","_downscaleDataUrl","downscaleDataUrl","maxDim","quality","canvas","getContext","drawImage","toDataURL","ImagePreloader_images","_uploadToS","_resizeImage","_uploadBase64Image","_uploadImage","MAX_WIDTH","MAX_HEIGHT","resizedFile","resizeImage","presignedUrlResponse","postImageUploadUrl","uploadToS3","uploadUrl","base64Data","extension","File","canvasWidth","canvasHeight","imageWidth","imageHeight","currentAspectRatio","targetAspectRatio","imageSmoothingEnabled","imageSmoothingQuality","yOffset","tempCanvas","tempCtx","tempWidth","tempHeight","isPng","toBlob","lastModified","fileType","statusText","htmlToImage","_shareToSocial","_generateImageDataUrl","_shareDataURL","_shareOrDownload","dataURL","canShareDataUrl","shareDataURL","saveDataURLToFile","dataURLToBlob","canShare","download","_this$dataURL$split","_this$dataURL$split2","mimeTypeMatch","mimeType","binaryString","binaryLength","bytes","toPng","_workoutImage","hevyCsvRaw","Papa","skipEmptyLines","ImportUtils_detectCsvKind","fields","hevyRecords","validRecords","validateHevyRecord","collectHevyWarnings","hevyWorkouts","CollectionUtils_groupByKey","hevyExercises","set_type","set_index","exercise_title","exercise_notes","weight_lbs","parseHevyNumber","weight_kg","start_time","end_time","backMap","hevyWorkout","parseHevyDate","endTs","exerciseNameAndEquipment","exerciseMapping","_exerciseNameAndEquip","sanitizedTitle","maybeExerciseId","_exerciseNameAndEquip3","buildHevyWeight","History_generateId","validation","_papaparse","_exercise2","Burpee","Clamshell","Clean","Crunch","Lunge","Plank","Snatch","Superman","Cycling","DateUtils_parseNamedMonthDateTime","ImportUtils_isSuspiciousTimestamp","ImportUtils_isSuspiciousWeight","ImportUtils_isSuspiciousReps","liftosaurCsvRaw","liftosaurRecords","cells","columnIndex","validateRecord","collectWarnings","groupedRecords","rawSets","firstSet","rawWarmupSets","isWarmupSet","rawWorkoutSets","buildSet","completedWeightValue","completedWeightUnit","optionalNumber","requiredReps","parseTimestamp","completedRepsTime","workoutDateTime","firstRecord","dayname","numericColumns","unitColumns","valueColumn","unitColumn","_ImportFromLink_importFromLink","base64","getDecodedData","_url$pathname$split$f","_url$pathname$split$f2","getDataFromShortUrl","_getDecodedData","referencedIds","hevySignatureHeaders","liftosaurSignatureHeaders","minTimestamp","existingHistory","ImportUtils_findDuplicates","existingStartTimes","duplicates","mid","_IndexedDBUtils_get","_IndexedDBUtils_getAllKeys","indexedDB","connection","handler","createObjectStore","_IndexedDBUtils_remove","_IndexedDBUtils_set","_IndexedDBUtils_setMany","runTransaction","db","IndexedDBUtils_initialize","transaction","objectStore","logIndexedDBError","errorDetails","withTransaction","_withTransaction","getAllKeys","getAll","put","pairs","_clearAuthToken","_getAuthToken","_setAuthToken","_auth","LiveActivityManager_updateLiveActivity","LiveActivityManager_getLiveActivityEntry","isNextSetWarmup","weightForPlates","exerciseImageUrl","canCompleteFromLiveActivity","currentReps","currentWeight","completedSets","targetRPE","targetTimer","isSetTimer","setTimerState","getReadyState","liveActivityEntry","TimedSet_toView","setTimerSince","getReadySince","restingSet","attributes","workoutStartTimestamp","historyEntryState","isAuto","subscriptions","EventManager_isAvailable","EventManager_log","_eventManager","fractionDigits","chain","WebPush_subscription","putRestTimerPush","RestTimerAlert_request","_volume","_vibration","_sound","_duration","_title","_body","task","_filteredStorageJson","_desired","structuredCloneLike","obj1","obj2","fromEntries","chKeys","obj1original","obj2original","newPath","ignoreKeys","currentObj1","currentObj2","keys1","keys2","ObjectUtils_isEmpty","theKeys","sortedKeys","copyObj","ArrayBuffer","isView","buffer","DataView","byteOffset","byteLength","tier1","tier2","_perfSampling","PerfSampling_decide","_currentScreen","_targetScreen","PerfProbeSubtreeActive","renderStartRef","mountedRef","PerfProbe_onCommit","Profiler","PerfSampling_decideFor","_durationMs","_window","_recent","_provider","windowActive","reducerMs","triggerLabel","triggerReducerMs","scheduleFlush","agg","byId","commits","sumMs","maxMs","mounts","renderCounts","renderChanges","flushTimer","TARGET_USER_IDS","renderComps","reducer_ms","comp","_n","_name","BIG_FIELDS","BASELINE_SHARD","OLD_BASELINE_SHARD_NAMES","ALL_SHARD_NAMES","indexedDBStore","setMany","IndexedDBUtils_setMany","shardKey","baseKey","manifestKey","serializeLegacy","parseLegacy","lastSyncedStorage","asBaseline","serverVersionsFetchedAt","parseBaseline","parseManifest","manifest","formatVersion","buildManifest","_assemble","_getAccountSummaries","_delete2","_saveFull","_flushSave","saveDelayMs","writeCache","oldBaselineShardsToDelete","scheduled","scheduledTimer","accountId","stringify_ms","stringifyMs","write_ms","writeMs","shards","t1","pushShard","extractPartial","legacyJson","manifestRaw","legacyRaw","legacy","assembledWithoutManifest","assemble","seedCache","assembled","loaded","oldBaselineShardsPresent","allKeys","_yield$Promise$all3","_yield$Promise$all4","partialRaw","historyRaw","programsRaw","statsRaw","baselineRaw","oldBaselineRaws","assembleStorage","lensBuilder","plannerStateOrGetter","loggedOnce","EDIT_ACTION_BY_DESC","EDIT_TEXT_ACTION_BY_DESC","onceAction","centered","SHAFT","COLLAR","plateSize","heightRatio","PlatesBarLayout_color","SLEEVE","KG_COLORS","LB_COLORS","googlename","redditname","trackedEvents","gtag","rdt","_appAttribution","AppAttribution_get","WatchHost_send","builtinProgramAgesKeys","builtinProgramDurationsKeys","lastBumpAt","rateLimitMs","inMs","PushRegistration_identityOf","syncing","deliveries","withPostIfNeeded","posted","lastPosted","localOriginalId","deliveryIds","deliveryId","newData","pendingOriginalId","registration","__ENV__","environment","javascript","source_map_enabled","code_version","__FULL_COMMIT_HASH__","guess_uncaught_frames","pld","RollbarUtils_checkIgnore","liftosaur_exception_id","Diagnostics_getLastState","Diagnostics_getLastValidationErrors","checkIgnore","RollbarUtils_load","_RollbarUtils_load","getExceptionData","_JSON$parse","isUncaught","firstArg","loadRollbar","_sets","within","_SignIn_apple","_SignIn_google","_SignOut_google","StringUtils_hashCode","letter","outer","nch","Uint32Array","spaces","indent2","resolveColor","direct","dashIndex","tail","fromSemantic","palette","FONT_WEIGHT_CLASSES","SIZE_PX","isDev","fragment","__DEV__","hasStyle","xl","SubscriptionPlan_planFromProductId","autoRenew","verdicts","newestValid","newest","SubscriptionReceipts_cleanupApple","hasApple","hasAppleSubscription","hasGoogle","hasGoogleSubscription","_subscriptionReceipts","verifyAppleReceipt","verifyGooglePurchaseToken","lastVersions","diffVersions","storageDiff","extractByVersions","filledVersionsDiff","duplicatedPrograms","duplicateInfo","SyncBaseline_MAX_AGE_MS","baseColors","isPageRenderContext","semanticColors","_tailwindColors","_tailwindSemanticGenerated","TAILWIND_PAGE_MARKER_CLASS","semanticVars","shape","buildSemanticVars","currentEnd","nextEnd","OsFontScale_get","Rem_set","darkSchemeQuery","matchMedia","func","lastRan","tooltip","isUndoingRef","_urlPolyfill","URLConstructor","URLPolyfill","parseURL","authority","userInfo","atIndex","username","colonIndex","hostname","port","portMatch","URLSearchParamsPolyfill","_parseFromString","pair","eqIndex","thisArg","iterator","_protocol","_hostname","_port","_pathname","_hash","_username","_password","baseP","urlPart","hashIndex","searchIndex","basePath","_searchParams","userinfo","modifiedOnActions","onAction","hookState","thunkDispatch","hhmmss","_componentName","PerfProbe_isRecording","SKIP_DEEP","PerfProbe_recordRender","_progressiveReveal","dbg","process","setCount","prevResetKey","setPrevResetKey","effectiveCount","lastBumpRef","retryTimer","lastEvent","ProgressiveReveal_onScroll","removeListener","idleTarget","cap","requestIdleCallback","cancelIdleCallback","SCALED_SPACINGS","SCALED_LEADINGS","setProperty","currentRem","_scaledSpacings","remSubscribe","remGet","remServerGet","fs","_screenName","markLoaded","setVisibleRecords","visibleRef","_e$nativeEvent","noKeyboardWindowHeight","showEvent","hideEvent","showSub","Keyboard","endCoordinates","hideSub","setHookState","performance","nodeRef","lastCheckRef","vh","WorkoutImpressionVisibility_isSeen","_workoutImpressionVisibility","storedUserId","lftIosAppVersion","webkit","messageHandlers","liftosaurMessage","postMessage","_WebPush_browserState","_WebPush_subscribe","_WebPush_subscription","_WebPush_unsubscribe","base64UrlToBytes","pushSubscription","_pushSubscription","getRegistration","pushManager","getSubscription","toJSON","endpoint","p256dh","vapidPublicKey","requestPermission","userVisibleOnly","applicationServerKey","unsubscribe","visibleHeight","visibleCenter","rowCenter","maxY","WorkoutExerciseUtils_getColor","_WorkoutFinish_run","_askHealthSync","askHealthSync","Thunk_finishProgramDay","stamp","uses","usesToLearn","hs","WorkoutHints_recordUse","available","shownTop","shownBottom","WorkoutProgressView_isSame","setAt","completedCount","wasCompleted","warmupIndex","findById","flatIndex","nextUnfinished","bestFor","sameDaySet","sameWeight","lastTimestamp","titleTop","stuckAt","_moved$splice","WorkoutStripReorder_currentAfterMove","tileWidth","_ordered$splice","_worklet_2612965693859_init_data","dropIndex","pruneTree","MutationObserver","mutations","mutation","Element","prune","addedNodes","childList","subtree","attributeFilter","FOCUSABLE","hasAttribute","isLiveStop","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","O","chunkIds","priority","notFulfilled","fulfilled","getter","definition","chunkId","promises","miniCssF","Function","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","toStringTag","loadStylesheet","fullhref","existingLinkTags","dataHref","rel","existingStyleTags","findStylesheet","oldTag","linkTag","errorType","realHref","insertBefore","createStylesheet","installedCssChunks","miniCss","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}